v0.10.10
Five bug fixes, four of them for problems that shipped in 0.10.9 and were not reported.
AgilentRDLReader reads both report templates
The parser matched one OpenLab template's exact whitespace. Two failures followed:
- The newer "Sequence Summary Report" template has no left margin, so no row matched,
sample_namewas never bound, and reading raisedUnboundLocalError. - When a value did not fit its column the report continued it on a second physical line. The retention-time pattern required a digit after the decimal point, so those rows were skipped silently — on one real sample that dropped a peak carrying 68.9 % of the total area, on the template that appeared to work.
The parser now reads the report's box grammar: rules delimit records, bars delimit cells, wrapped lines are rejoined column-wise, columns resolve by header name, and each peak table is scoped to its own box so two detectors never merge. Tables split across page breaks are read whole. Both shipped example reports parse identically to before.
ShimadzuReader no longer crashes, and no longer misorders files
- Three debug-logging blocks committed in 0.10.9 opened a hardcoded path inside an unrelated repository, so
read()raisedFileNotFoundErrorfor every user who was not on the machine that produced them. - File enumeration used an unsorted glob, and
valuesare zipped against that list positionally — so reaction times were bound to whichever files the filesystem happened to list first, which differs between filesystems.
Handler.visualize() works on current matplotlib
It called plt.cm.get_cmap, removed in matplotlib 3.9, so every call raised AttributeError.
CI can run
The workflow installed with poetry against a hatchling project and tested a Python version the project rejects. It now uses uv across 3.11/3.12/3.13 on Linux, macOS and Windows — nine green legs.
matplotlib, pandas and requests are now declared; the package imported them without declaring them.
API
The public surface is unchanged: Handler, ChromAnalyzer, Molecule, Protein, to_enzymeml, and Handler.read_agilent() / Handler.visualize() all keep their signatures.
AgilentRDLReader lost three internal static methods of the old parser (extract_information, align_and_concatenate_columns, map_peak) and extract_wavelength now takes a list of lines. Behind unchanged signatures, read() returns more peaks on reports with wrapped cells — the correct count — warns instead of returning silently on an unrecognised template, and reports None rather than "" for a blank peak type.
Full changelog: v0.10.9...v0.10.10