diff --git a/changelog.d/20250605_155304_rosswilsonblair_valid_missing_entities.md b/changelog.d/20250605_155304_rosswilsonblair_valid_missing_entities.md new file mode 100644 index 00000000..f0d9619f --- /dev/null +++ b/changelog.d/20250605_155304_rosswilsonblair_valid_missing_entities.md @@ -0,0 +1,47 @@ + + + + +### Fixed + +- Categorically prevent required entities on metadata files to more closely follow inheritance principle. +- Also skip required entities on all derivative files. + + + + + diff --git a/src/validators/filenameValidate.test.ts b/src/validators/filenameValidate.test.ts index af741e52..aca4fdcc 100644 --- a/src/validators/filenameValidate.test.ts +++ b/src/validators/filenameValidate.test.ts @@ -2,7 +2,7 @@ import type { FileTree } from '../types/filetree.ts' import type { GenericSchema } from '../types/schema.ts' import { assertEquals } from '@std/assert' import { BIDSContext } from '../schema/context.ts' -import { type atRoot, type entityLabelCheck, missingLabel } from './filenameValidate.ts' +import { type entityLabelCheck, missingLabel } from './filenameValidate.ts' import type { BIDSFileDeno } from '../files/deno.ts' import { pathToFile } from '../files/filetree.ts' import type { FileIgnoreRules } from '../files/ignore.ts' diff --git a/src/validators/filenameValidate.ts b/src/validators/filenameValidate.ts index 10338478..da76c08d 100644 --- a/src/validators/filenameValidate.ts +++ b/src/validators/filenameValidate.ts @@ -9,7 +9,6 @@ const sidecarExtensions = ['.json', '.tsv', '.bvec', '.bval'] const CHECKS: ContextCheckFunction[] = [ missingLabel, - atRoot, entityLabelCheck, checkRules, reconstructionFailure, @@ -25,13 +24,6 @@ export async function filenameValidate( return Promise.resolve() } -export function isAtRoot(context: BIDSContext) { - if (context.file.path.split(SEPARATOR_PATTERN).length !== 2) { - return false - } - return true -} - export async function missingLabel( schema: GenericSchema, context: BIDSContext, @@ -57,15 +49,6 @@ export async function missingLabel( return Promise.resolve() } -export function atRoot(schema: GenericSchema, context: BIDSContext) { - /* - if (fileIsAtRoot && !sidecarExtensions.includes(context.extension)) { - // create issue for data file in root of dataset - } - */ - return Promise.resolve() -} - export function lookupEntityLiteral(name: string, schema: GenericSchema) { if ( schema.objects && @@ -203,9 +186,9 @@ function entityRuleIssue( const fileEntities = Object.keys(context.entities) const ruleEntities = Object.keys(rule.entities).map((key) => lookupEntityLiteral(key, schema)) - // skip required entity checks if file is at root. - // No requirements for inherited sidecars at this level. - if (!isAtRoot(context)) { + // skip required entity checks for 'metadata' per inheritance rules 1 + 2 + // Also skip for all deriv files. + if (!sidecarExtensions.includes(context.extension) && !path.includes('rules.deriv.')) { const ruleEntitiesRequired = Object.entries(rule.entities) .filter(([_, v]) => v === 'required') .map(([k, _]) => lookupEntityLiteral(k, schema))