Skip to content

Commit d232223

Browse files
authored
Merge pull request #2104 from effigies/feat/warn-undefined-columns
feat(tsv): Warn on undefined columns
2 parents afbdac6 + 2c89920 commit d232223

File tree

3 files changed

+56
-10
lines changed

3 files changed

+56
-10
lines changed

bids-validator/src/issues/list.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,14 @@ export const bidsIssues: IssueDefinitionRecord = {
9696
severity: 'error',
9797
reason: 'A TSV file has extra columns which are not allowed for its file type',
9898
},
99+
TSV_ADDITIONAL_COLUMNS_MUST_DEFINE: {
100+
severity: 'error',
101+
reason: 'Additional TSV columns must be defined in the associated JSON sidecar for this file type',
102+
},
103+
TSV_ADDITIONAL_COLUMNS_UNDEFINED: {
104+
severity: 'warning',
105+
reason: 'A TSV file has extra columns which are not defined in its associated JSON sidecar',
106+
},
99107
TSV_INDEX_VALUE_NOT_UNIQUE: {
100108
severity: 'error',
101109
reason:

bids-validator/src/schema/tables.test.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ Deno.test('tables eval* tests', async (t) => {
149149
)
150150
})
151151

152-
await t.step('verify additional columns', () => {
152+
await t.step('verify not allowed additional columns', () => {
153153
const context = {
154154
path: '/sub-01/sub-01_scans.tsv',
155155
extension: '.tsv',
@@ -171,4 +171,35 @@ Deno.test('tables eval* tests', async (t) => {
171171
1,
172172
)
173173
})
174+
await t.step('verify allowed and allowed_if_defined additional columns', () => {
175+
const context = {
176+
path: '/sub-01/sub-01_scans.tsv',
177+
extension: '.tsv',
178+
sidecar: {'extra': {'description': 'a fun and whimsical extra column'}},
179+
columns: {
180+
onset: ['1', '2', 'n/a'],
181+
strain_rrid: ['RRID:SCR_012345', 'RRID:SCR_012345', 'n/a'],
182+
extra: [1, 2, 3]
183+
},
184+
dataset: { issues: new DatasetIssues() },
185+
}
186+
const rule = schemaDefs.rules.tabular_data.made_up.MadeUp
187+
rule.additional_columns = "allowed_if_defined"
188+
evalAdditionalColumns(rule, context, schema, 'rules.tabular_data.made_up.MadeUp')
189+
assertEquals(context.dataset.issues.size, 0)
190+
191+
context['sidecar'] = {}
192+
evalAdditionalColumns(rule, context, schema, 'rules.tabular_data.made_up.MadeUp')
193+
assertEquals(
194+
context.dataset.issues.get({ code: 'TSV_ADDITIONAL_COLUMNS_MUST_DEFINE' }).length,
195+
1,
196+
)
197+
198+
rule.additional_columns = "allowed"
199+
evalAdditionalColumns(rule, context, schema, 'rules.tabular_data.made_up.MadeUp')
200+
assertEquals(
201+
context.dataset.issues.get({ code: 'TSV_ADDITIONAL_COLUMNS_UNDEFINED' }).length,
202+
1,
203+
)
204+
})
174205
})

bids-validator/src/schema/tables.ts

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -238,25 +238,32 @@ export function evalAdditionalColumns(
238238
): void {
239239
if (context.extension !== '.tsv') return
240240
const headers = Object.keys(context?.columns)
241-
// hard coding allowed here feels bad
242-
if (!(rule.additional_columns === 'allowed') && rule.columns) {
241+
if (rule.columns) {
243242
const ruleHeadersNames = Object.keys(rule.columns).map(
244243
// @ts-expect-error
245244
(x) => schema.objects.columns[x].name,
246245
)
247246
let extraCols = headers.filter(
248247
(header) => !ruleHeadersNames.includes(header),
249248
)
250-
if (rule.additional_columns === 'allowed_if_defined') {
249+
250+
if (rule.additional_columns?.startsWith('allowed')) {
251251
extraCols = extraCols.filter((header) => !(header in context.sidecar))
252252
}
253+
const code = (
254+
rule.additional_columns === 'allowed'
255+
? 'TSV_ADDITIONAL_COLUMNS_UNDEFINED'
256+
: rule.additional_columns === 'allowed_if_defined'
257+
? 'TSV_ADDITIONAL_COLUMNS_MUST_DEFINE'
258+
: 'TSV_ADDITIONAL_COLUMNS_NOT_ALLOWED'
259+
)
260+
const issue = {
261+
code,
262+
location: context.path,
263+
rule: schemaPath,
264+
}
253265
for (const col of extraCols) {
254-
context.dataset.issues.add({
255-
code: 'TSV_ADDITIONAL_COLUMNS_NOT_ALLOWED',
256-
subCode: col,
257-
location: context.path,
258-
rule: schemaPath,
259-
})
266+
context.dataset.issues.add({ ...issue, subCode: col })
260267
}
261268
}
262269
}

0 commit comments

Comments
 (0)