Changelog¶
All notable changes to this project are documented here. The format follows Keep a Changelog and the project uses Semantic Versioning.
[Unreleased]¶
[0.2.1] - 2026-11-05¶
Added¶
bulletins.latest,fetchandlatest_nametake asend=hook, likeRadarClient.- The
dpc_radar.archivelogger says which frames failed or could not be read, and why. The signed download link is never logged.
Fixed¶
MergingArchivecan be shared between threads. Its cache was not locked: under heavy thread switching,read()raisedKeyErrorand could crash the interpreter with a segmentation fault.MergingArchive.readtreats anOSError(no permission, a file removed while reading) as one unreadable frame, instead of losing the wholehourly()call.RadarClientandbulletinsraiseDpcRadarErrorwhen a 200 answer is not a JSON object, such as a proxy page or a body cut off.archive()now counts that as one failed frame instead of ending the run.archive()counts anOSErrorfrom a download,TimeoutErrorincluded, as one failed frame. Thesendhook contract is documented.
[0.2.0] - 2026-11-05¶
Added¶
archive:archive()downloads the CUM3 and SRT1 frames an archive on disk lacks (oldest first, frames that are gone written toabsent.txt, idempotent; reads Limen's layout andassenti.txt);MergingArchive.hourlygives the rain of every hour at lon/lat points, SRT1 rescaled so that each block adds up to its CUM3;split_block.history(extrahistory,numcodecs):SriHistoryreads the IT-DPC-SRI Zarr store (2010-2025) with no zarr or xarray;hourlywith the same signature asMergingArchive.hourly.bulletins(extrabulletins,shapely): the DPC criticality bulletin from its GitHub repository, today and tomorrow:latest,fetch,latest_name; eachZonewith its levels (map, hydro-geological, hydraulic, thunderstorms; 0-3), municipalities and shape;Bulletin.alerts()andBulletin.zone_at(lon, lat).
Changed¶
RainGrid.datais float32, as published: half the memory, and exactly the values Limen reads.
Fixed¶
- Compared with Limen's reader of IT-DPC-SRI, the first hour of a window now counts the frame issued at its start, and no hour after the window is returned.
[0.1.0] - 2026-11-04¶
Added¶
products: the DPC radar products (SRI, SRT1, CUM3/6/12/24), the requests offindLastProductByTypeanddownloadProduct, the parsers of their answers, andis_expiredfor a frame the DPC no longer keeps.DpcRadarError.grid:RainGrid, one frame as an array (NaN where there is no data), from its GeoTIFF;sample(median of the 3×3 pixels),peak,crop, andcheck(previous, max_step=), the frame-leveljump-signrule: the frame that jumps up is rejected, the one after a corrupted frame kept whole.discard_inconsistentkept for comparison with Limen.client:RadarClientwith an injectablehttpx.AsyncClient, retries with backoff on network errors and 429/5xx, asend=hook;latest(withcached=),at,download,last_product;ABSENTfor a frame the DPC no longer keeps, never retried.Product.period: 5 minutes for SRI and SRT1, 30 for the CUM products.- Core dependencies:
httpx,numpy,rasterio. benchmarks/: known cases of the DPC radar data (Melito and Lipari on 10 October 2026, the corrupted :30 CUM24 series, calm days, two suspect artefacts), a runner that scores cleaning methods on them, and Limen's current rule as a baseline (#2). Checked in CI.benchmarks:jump-sign, a frame-level check (#6): the frame that jumps up more than 150 mm in 30 minutes is rejected whole, the one after it kept. 17/18 confirmed checks (Limen today 8/18); on 96 whole-frame pairs it rejects the 44 corrupted :30 frames and no :00 frame.benchmarks.seasonruns a method on every pair of whole frames.
Documentation¶
- README rewritten for a wider audience: what the DPC radar is, the products,
a quick start, the traps, with maps and charts of the 10 October 2026 storm
in Reggio Calabria drawn from real frames by
docs/make_images.py. - Documentation site (MkDocs Material) with the API reference, published to
GitHub Pages by the
docsworkflow. - Roadmap with an analysis of where AI and machine learning can improve the library, and through it Limen.