File-processing commands (transform, rename, drop, select,
resize, impute, combine, replace, recompress) show a progress
bar with frame count, elapsed and remaining time when run in a terminal
progress= keyword on Pipeline.run() and the operations functions:
a callable receiving (frames_done, frames_total, path) after each
input frame
transform --strict (and strict=True on Pipeline.run()) makes
preflight warnings fail the run before anything is written
validate on directories pairs frames by GPS span across files instead
of pairing whole files by their first frame, so two productions of the
same data compare equal even when their file boundaries differ; a frame
without a counterpart is reported as unmatched_frame (a whole file as
unmatched_file, as before)
transform preflight warnings say where a missing channel was looked
for: in the input, or after a named earlier stage
gwframe transform INPUT... -o DIR [STAGE [OPTIONS]]... applies a
chain of rename, drop, select, impute, fill-gaps and resize
stages in a single read/write pass; --compression/--level set the
output compression, --file-duration/--prefix re-chunk the output
into PREFIX-GPS-DURATION.gwf files, --dry-run shows the plan, and
@FILE splices in a recipe of stages. The stage chain is checked
against the first file's channel list before anything is read
fill-gaps [-f VALUE] [--invalid] stage: inserts constant-valued
frames across gaps in GPS time (like GStreamer's audiorate) so
re-chunked output stays contiguous; --invalid flags the inserted
data on ADC channels via dataValid
gwframe.pipeline: Pipeline and the Stage classes behind
transform, usable from Python
Frame.frame_spec (read-only); assigning Frame.frame_number now
takes effect on write
resize merges consecutive contiguous frames when the target duration
is longer than the source (the last frame of a file may be shorter),
and raises ValueError when a frame's duration is not a whole
multiple of a shorter target instead of silently dropping the
remainder
aux_mask=True on read(), read_bytes(), read_frames() and
FrameReader.read() decodes a CDS-style "dataValid" auxiliary vector
on ADC channels into the TimeSeries mask, combined with the
channel-level flag; vectors that don't look like a mask are ignored
aux_mask=True on Frame.add_channel(), write(), write_bytes()
and FrameWriter.write() stores a partial mask on an ADC channel as an
auxiliary vector (1/16 s blocks for integer rates divisible by 16 Hz,
one value per sample otherwise) instead of flagging the whole channel
read_frames(aux_mask=True) re-encodes decoded masks in the yielded
frames, so read-modify-write pipelines preserve partial masks
FrameWriter.discard(): abandon a file mid-write, removing the
temporary file instead of finalizing a truncated one; the writer can
be reopened afterwards
close() on the output file stream, so the table of contents is
written explicitly rather than on destruction
A failed open or write raises OSError with the C errno frameCPP
reported (e.g. ENOSPC when the disk is full) instead of a
ValueError or RuntimeError carrying it only in the message
A write failure while finalizing a file, for example on a full disk,
no longer terminates the process: frameCPP raised it from the stream
destructor, which ran when the writer was closed, discarded, or the
interpreter exited
Fix thread-safety of shared FrameReader/FrameWriter objects — the
bindings release the GIL around frame I/O, so concurrent use of a shared
stream from multiple threads could corrupt reads or crash; stream access
is now serialized per object
FrameWriter now raises ValueError when a frame's channel set differs
from the frames already written — the GWF table of contents cannot
represent per-frame channel sets, and such writes silently produced
unreadable files
Fix written files being created with mode 0600 regardless of umask — the
temporary file used for atomic writes now gets standard umask-respecting
permissions, so output frames are no longer unreadable by group/other
gwframe validate command to check two GWF files or directories for
consistency, comparing channel sets, frame structure, per-channel metadata,
sample data, and dataValid masks
gwframe.compare module with compare_files() and compare_paths()
returning structured comparison results for programmatic use
gwframe inspect now marks invalid (dataValid != 0) ADC channels in the
-vvv detail table, with new -vvvv (invalid-channel report) and -vvvvv
(per-frame data preview) verbosity levels
ChannelInfo.data_valid / ChannelInfo.is_valid and
gwframe.inspect.get_invalid_channels() exposing the ADC dataValid flag
Fix dangling pointer bugs in the frameCPP read bindings — six read/TOC
methods returned pointers whose backing memory was freed on return, which
could cause crashes or corrupted reads
Fix build failure with scikit-build-core 1.0.0 by replacing the removed
cmake.minimum-version and cmake.verbose config keys