Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions src/did/+did2/+convert/+migrators/daqmetadatareader.m
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@
%
% Renames the v1 `ndi_daqmetadatareader_class` field on the
% daqmetadatareader property block to the V_delta-required
% `reader_class` field. The v1 `tab_separated_file_parameter` field
% has no V_delta counterpart and is dropped (per
% docs/v2/RFC-step6d-ci-pipeline.md decision-default Q1: drop v1
% fields that V_delta does not declare).
% `reader_class` field. Preserves the optional v1
% `tab_separated_file_parameter` field as a V_delta pass-through:
% it is the "lazy hook" for TSV-per-epoch metadata sources and
% real v1 corpora populate it. See
% `did-schema/schemas/V_delta/conversions/from_did_v1/daqmetadatareader.md`
% and `did-schema#50` for the V_delta-side decision to keep the
% field rather than force per-doc synthesis of a
% `daqmetadatareader_tsv` subclass.

arguments
preBody (1,1) struct
Expand All @@ -31,5 +35,9 @@
if isfield(block, 'metadata_names')
newBlock.metadata_names = char(block.metadata_names);
end
if isfield(block, 'tab_separated_file_parameter')
newBlock.tab_separated_file_parameter = ...
char(block.tab_separated_file_parameter);
end
v2Body.daqmetadatareader = newBlock;
end
35 changes: 35 additions & 0 deletions tests/+did2/+unittest/testMigrators.m
Original file line number Diff line number Diff line change
Expand Up @@ -151,10 +151,45 @@ function testDaqmetadatareaderRenamesReaderClass(testCase)
'ndi.daq.metadatareader.RayoLabStims');
verifyFalse(testCase, isfield(out.daqmetadatareader, ...
'ndi_daqmetadatareader_class'));
% tab_separated_file_parameter is the optional V_delta "lazy hook"
% field for TSV-per-epoch metadata sources. Real v1 corpora populate
% it; the migrator preserves the value rather than dropping (see
% did-schema#50).
verifyTrue(testCase, isfield(out.daqmetadatareader, ...
'tab_separated_file_parameter'));
verifyEqual(testCase, ...
out.daqmetadatareader.tab_separated_file_parameter, 'something');
end

function testDaqmetadatareaderTabSeparatedHookAbsentStaysAbsent(testCase)
% A v1 body without the optional TSV hook should not gain an empty
% one after migration.
v1 = wrap('daqmetadatareader', 'daqmetadatareader', struct( ...
'ndi_daqmetadatareader_class', 'ndi.daq.metadatareader'));
out = did2.convert.migrators.daqmetadatareader( ...
did2.convert.universalRenames(v1));
verifyEqual(testCase, out.daqmetadatareader.reader_class, ...
'ndi.daq.metadatareader');
verifyFalse(testCase, isfield(out.daqmetadatareader, ...
'tab_separated_file_parameter'));
end

function testDaqmetadatareaderTabSeparatedHookRoundtripsAlreadyVDelta(testCase)
% A body already in V_delta shape (reader_class +
% tab_separated_file_parameter) should pass through the migrator
% unchanged.
v1 = wrap('daqmetadatareader', 'daqmetadatareader', struct( ...
'reader_class', 'ndi.daq.metadatareader', ...
'tab_separated_file_parameter', 'epoch_metadata.tsv'));
out = did2.convert.migrators.daqmetadatareader( ...
did2.convert.universalRenames(v1));
verifyEqual(testCase, out.daqmetadatareader.reader_class, ...
'ndi.daq.metadatareader');
verifyEqual(testCase, ...
out.daqmetadatareader.tab_separated_file_parameter, ...
'epoch_metadata.tsv');
end

function testElementRenamesAndCoerces(testCase)
v1 = wrap('element', 'element', struct( ...
'ndi_element_class', 'ndi.probe.timeseries.mfdaq', ...
Expand Down
Loading