Skip to content

Commit

Permalink
fix(json): Validate all JSON fields
Browse files Browse the repository at this point in the history
The JSON validation code strongly assumed it was validating sidecars,
not JSON files. These changes streamline the logic a bit to ensure that
sidecars and JSON files are treated the same, but the sidecar "origin"
code is skipped for JSON files.
  • Loading branch information
effigies committed Aug 12, 2024
1 parent b9a9f27 commit b6c175a
Showing 1 changed file with 43 additions and 45 deletions.
88 changes: 43 additions & 45 deletions bids-validator/src/schema/applyRules.ts
Original file line number Diff line number Diff line change
Expand Up @@ -449,91 +449,89 @@ function evalJsonCheck(

const json = sidecarRule ? context.sidecar : context.json
for (const [key, requirement] of Object.entries(rule.fields)) {
const severity = getFieldSeverity(requirement, context)
// @ts-expect-error
const metadataDef = schema.objects.metadata[key]
const keyName: string = metadataDef.name
if (severity && severity !== 'ignore' && !(keyName in json)) {
if (requirement.issue?.code && requirement.issue?.message) {
context.dataset.issues.add({
code: requirement.issue.code,
subCode: keyName,
location: context.path,
severity,
codeMessage: requirement.issue.message,
rule: schemaPath,
})
} else {
let code
if (severity === 'error') {
code = sidecarRule ? 'SIDECAR_KEY_REQUIRED' : 'JSON_KEY_REQUIRED'
} else if (severity === 'warning') {
code = sidecarRule ? 'SIDECAR_KEY_RECOMMENDED' : 'JSON_KEY_RECOMMENDED'
}
if (code) {
const value = json[keyName]
if (value === undefined) {
const severity = getFieldSeverity(requirement, context)
if (severity && severity !== 'ignore') {
if (requirement.issue?.code && requirement.issue?.message) {
context.dataset.issues.add({
code,
code: requirement.issue.code,
subCode: keyName,
location: context.path,
severity,
issueMessage: `missing ${keyName}`,
codeMessage: requirement.issue.message,
rule: schemaPath,
})
} else {
let code
if (severity === 'error') {
code = sidecarRule ? 'SIDECAR_KEY_REQUIRED' : 'JSON_KEY_REQUIRED'
} else if (severity === 'warning') {
code = sidecarRule ? 'SIDECAR_KEY_RECOMMENDED' : 'JSON_KEY_RECOMMENDED'
}
if (code) {
context.dataset.issues.add({
code,
subCode: keyName,
location: context.path,
severity,
rule: schemaPath,
})
}
}
}
}

/* Regardless of if key is required/recommended/optional, we do no
* further valdiation if it is not present in sidecar.
*/
if (!(keyName in context.sidecar)) {
return
/* Regardless of if key is required/recommended/optional, we do no
* further valdiation if it is not present in sidecar.
*/
continue
}

let originFileKey = ''
let originFile = ''
if (keyName in context.sidecarKeyOrigin) {
originFile = `${context.sidecarKeyOrigin[keyName]}`
originFileKey = `${originFile}:${keyName}`
} else {
if (sidecarRule && !(keyName in context.sidecarKeyOrigin)) {
logger.warning(
`sidecarKeyOrigin map failed to initialize for ${context.path} on key ${keyName}. Validation caching not active for this key.`,
)
}

if (context.dataset.sidecarKeyValidated.has(originFileKey)) {
return
const location = sidecarRule ? (context.sidecarKeyOrigin[keyName] ?? '') : context.path
const affects = sidecarRule ? [context.path] : undefined

const keyAddress = `${location}:${keyName}`

if (sidecarRule && context.dataset.sidecarKeyValidated.has(keyAddress)) {
continue
}

const validate = compile(metadataDef)
const result = validate(context.sidecar[keyName])
const result = validate(value)
if (result === false) {
const messageBase = `Failed for this file.key: ${originFileKey}`
if (!validate.errors) {
context.dataset.issues.add({
code: 'JSON_SCHEMA_VALIDATION_ERROR',
subCode: keyName,
location: context.path,
issueMessage: messageBase,
location: location,
rule: schemaPath,
affects: [originFile],
affects: affects,
})
} else {
for (let error of validate.errors) {
const message = 'message' in error ? `message: ${error['message']}` : ''
context.dataset.issues.add({
code: 'JSON_SCHEMA_VALIDATION_ERROR',
subCode: keyName,
location: context.path,
issueMessage: `${messageBase} ${message}`,
location: location,
issueMessage: message,
rule: schemaPath,
affects: [originFile],
affects: affects,
})
}
}
}
if (originFileKey) {
context.dataset.sidecarKeyValidated.add(originFileKey)
if (sidecarRule && location) {
context.dataset.sidecarKeyValidated.add(keyAddress)
}
}
}
Expand Down

0 comments on commit b6c175a

Please sign in to comment.