Establish one invariant across the Drawable hierarchy: x is always a
numpy ndarray, y is always a list of per-channel ndarrays, and empty
data is the same types with zero length.
- Drawable: x starts as empty ndarray; min/max helpers return 0 on
empty data instead of raising; drop contradictory isinstance(self.y,
list) branches
- ADC_Result/Accumulation: empty constructors build ndarray x; full
constructors coerce x/y/y_square with numpy.asarray; Accumulation
get_ydata/get_yerr return empty ndarrays and no longer crash on
empty statistics-less accumulations
- MeasurementResult: fix get_lineplotdata to return the accumulated
means (previously the never-populated self.y, so the GUI line plot
could never draw); remove dead float/int branches in CSV and HDF
writers
- Error_Result: get_xdata/get_ydata return ndarrays
Add unittest coverage for the invariant, empty-state accessors,
constructor coercion, line plot data, CSV output and HDF round-trip.
Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
- raise instead of silent None for unsupported operands and empty negation
- validate before acquiring lock in Accumulation operators (no RLock leak)
- Accumulation._copy_provenance helper, ADC_Result._copy_metadata for all result paths
- shared _sandbox_stdout_redirect contextmanager for sandboxed scripts
- TemperatureMonitor dead code removal (gtk helper, traceback, unused properties)
- new unit tests incl. lock-freedom regression test
- gitignore sphinx generated doc/_autosummary/ and doc/damaris/