bids-validator-deno 2.3.1.dev0__tar.gz → 2.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/PKG-INFO +1 -1
  2. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/deno.json +2 -1
  3. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/pyproject.toml +1 -1
  4. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/access.ts +11 -3
  5. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/gzip.ts +1 -1
  6. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/openers.ts +42 -6
  7. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/context.ts +1 -1
  8. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/walk.ts +3 -0
  9. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/utils/memoize.ts +5 -5
  10. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/bids.ts +2 -0
  11. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/LICENSE +0 -0
  12. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/README.md +0 -0
  13. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/pdm_build.py +0 -0
  14. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/.git-meta.json +0 -0
  15. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/bids-validator.ts +0 -0
  16. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/access.test.ts +0 -0
  17. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/browser.test.ts +0 -0
  18. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/browser.ts +0 -0
  19. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/deno.test.ts +0 -0
  20. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/deno.ts +0 -0
  21. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/dwi.test.ts +0 -0
  22. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/dwi.ts +0 -0
  23. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/filetree.test.ts +0 -0
  24. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/filetree.ts +0 -0
  25. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/gzip.test.ts +0 -0
  26. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/ignore.test.ts +0 -0
  27. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/ignore.ts +0 -0
  28. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/inheritance.test.ts +0 -0
  29. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/inheritance.ts +0 -0
  30. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/json.test.ts +0 -0
  31. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/json.ts +0 -0
  32. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/nifti.test.ts +0 -0
  33. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/nifti.ts +0 -0
  34. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/openers.test.ts +0 -0
  35. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/repo.test.ts +0 -0
  36. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/repo.ts +0 -0
  37. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/streams.test.ts +0 -0
  38. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/streams.ts +0 -0
  39. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/tiff.test.ts +0 -0
  40. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/tiff.ts +0 -0
  41. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/tsv.test.ts +0 -0
  42. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/files/tsv.ts +0 -0
  43. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/issues/datasetIssues.test.ts +0 -0
  44. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/issues/datasetIssues.ts +0 -0
  45. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/issues/list.test.ts +0 -0
  46. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/issues/list.ts +0 -0
  47. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/main.ts +0 -0
  48. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/applyRules.test.ts +0 -0
  49. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/applyRules.ts +0 -0
  50. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/associations.test.ts +0 -0
  51. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/associations.ts +0 -0
  52. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/context.test.ts +0 -0
  53. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/datatypes.test.ts +0 -0
  54. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/datatypes.ts +0 -0
  55. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/entities.test.ts +0 -0
  56. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/entities.ts +0 -0
  57. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/expressionLanguage.test.ts +0 -0
  58. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/expressionLanguage.ts +0 -0
  59. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/fixtures.test.ts +0 -0
  60. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/tables.test.ts +0 -0
  61. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/tables.ts +0 -0
  62. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/schema/walk.test.ts +0 -0
  63. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/setup/loadSchema.test.ts +0 -0
  64. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/setup/loadSchema.ts +0 -0
  65. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/setup/options.test.ts +0 -0
  66. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/setup/options.ts +0 -0
  67. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/setup/requestPermissions.ts +0 -0
  68. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/summary/collectSubjectMetadata.ts +0 -0
  69. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/summary/summary.test.ts +0 -0
  70. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/summary/summary.ts +0 -0
  71. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/README.md +0 -0
  72. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/bom-utf16.tsv +0 -0
  73. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/bom-utf8.json +0 -0
  74. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/generate-filenames.ts +0 -0
  75. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/local/bids_examples.test.ts +0 -0
  76. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/local/common.ts +0 -0
  77. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/local/derivatives.test.ts +0 -0
  78. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/local/empty_files.test.ts +0 -0
  79. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/local/hed-integration.test.ts +0 -0
  80. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/local/nifti_rules.test.ts +0 -0
  81. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/local/valid_dataset.test.ts +0 -0
  82. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/local/valid_filenames.test.ts +0 -0
  83. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/local/valid_headers.test.ts +0 -0
  84. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/nullReadBytes.ts +0 -0
  85. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/regression.test.ts +0 -0
  86. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/schema-expression-language.test.ts +0 -0
  87. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/simple-dataset.ts +0 -0
  88. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/tests/utils.ts +0 -0
  89. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/types/check.ts +0 -0
  90. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/types/columns.test.ts +0 -0
  91. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/types/columns.ts +0 -0
  92. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/types/filetree.ts +0 -0
  93. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/types/issues.ts +0 -0
  94. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/types/schema.ts +0 -0
  95. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/types/validation-result.ts +0 -0
  96. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/utils/errors.ts +0 -0
  97. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/utils/logger.test.ts +0 -0
  98. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/utils/logger.ts +0 -0
  99. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/utils/objectPathHandler.ts +0 -0
  100. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/utils/output.ts +0 -0
  101. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/utils/queue.ts +0 -0
  102. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/bids.test.ts +0 -0
  103. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/citation.test.ts +0 -0
  104. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/citation.ts +0 -0
  105. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/filenameCase.test.ts +0 -0
  106. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/filenameCase.ts +0 -0
  107. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/filenameIdentify.test.ts +0 -0
  108. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/filenameIdentify.ts +0 -0
  109. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/filenameValidate.test.ts +0 -0
  110. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/filenameValidate.ts +0 -0
  111. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/hed.ts +0 -0
  112. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/internal/emptyFile.ts +0 -0
  113. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/internal/unusedFile.ts +0 -0
  114. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/json.ts +0 -0
  115. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/validators/validateFiles.test.ts +0 -0
  116. {bids_validator_deno-2.3.1.dev0 → bids_validator_deno-2.3.2}/src/version.ts +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bids-validator-deno
3
- Version: 2.3.1.dev0
3
+ Version: 2.3.2
4
4
  Summary: Typescript implementation of the BIDS validator
5
5
  Keywords: BIDS,BIDS validator
6
6
  Author: bids-standard developers
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bids/validator",
3
- "version": "2.3.1-dev",
3
+ "version": "2.3.2",
4
4
  "exports": {
5
5
  ".": "./src/bids-validator.ts",
6
6
  "./main": "./src/main.ts",
@@ -37,6 +37,7 @@
37
37
  "@libs/xml": "jsr:@libs/xml@^7.0.3",
38
38
  "@mango/nifti": "npm:@bids/nifti-reader-js@^0.6.9",
39
39
  "@std/assert": "jsr:@std/assert@^1.0.16",
40
+ "@std/async": "jsr:@std/async@^1.1.0",
40
41
  "@std/fmt": "jsr:@std/fmt@^1.0.8",
41
42
  "@std/fs": "jsr:@std/fs@^1.0.21",
42
43
  "@std/io": "jsr:@std/io@^0.225.2",
@@ -18,7 +18,7 @@ keywords = [
18
18
  "BIDS validator",
19
19
  ]
20
20
  dynamic = []
21
- version = "2.3.1-dev"
21
+ version = "2.3.2"
22
22
 
23
23
  [project.license]
24
24
  text = "MIT"
@@ -1,8 +1,9 @@
1
1
  import { type BIDSFile } from '../types/filetree.ts'
2
2
  import { type Issue } from '../types/issues.ts'
3
+ import { filememoize } from '../utils/memoize.ts'
4
+ import { logger } from '../utils/logger.ts'
3
5
 
4
6
  function IOErrorToIssue(err: { code: string; name: string }): Issue {
5
- const subcode = err.name
6
7
  let issueMessage: string | undefined = undefined
7
8
  if (err.code === 'ENOENT' || err.code === 'ELOOP') {
8
9
  issueMessage = 'Possible dangling symbolic link'
@@ -14,22 +15,29 @@ export async function openStream(
14
15
  file: BIDSFile,
15
16
  ): Promise<ReadableStream<Uint8Array<ArrayBuffer>>> {
16
17
  return file.stream().catch((err: any) => {
18
+ logger.debug(`Error opening stream from file ${file.path}: ${err}`)
17
19
  throw { location: file.path, ...IOErrorToIssue(err) }
18
20
  })
19
21
  }
20
22
 
21
- export async function readBytes(
23
+ async function _readBytes(
22
24
  file: BIDSFile,
23
25
  size: number,
24
26
  offset = 0,
25
27
  ): Promise<Uint8Array<ArrayBuffer>> {
26
28
  return file.readBytes(size, offset).catch((err: any) => {
29
+ logger.debug(`Error reading bytes from file ${file.path}: ${err}`)
27
30
  throw { location: file.path, ...IOErrorToIssue(err) }
28
31
  })
29
32
  }
30
33
 
31
- export async function readText(file: BIDSFile): Promise<string> {
34
+ export const readBytes = filememoize(_readBytes)
35
+
36
+ async function _readText(file: BIDSFile): Promise<string> {
32
37
  return file.text().catch((err: any) => {
38
+ logger.debug(`Error reading text from file ${file.path}: ${err}`)
33
39
  throw { location: file.path, ...IOErrorToIssue(err) }
34
40
  })
35
41
  }
42
+
43
+ export const readText = filememoize(_readText)
@@ -18,7 +18,7 @@ import { readBytes } from './access.ts'
18
18
  */
19
19
  export async function parseGzip(
20
20
  file: BIDSFile,
21
- maxBytes: number = 512,
21
+ maxBytes: number = 1024,
22
22
  ): Promise<Gzip | undefined> {
23
23
  const buf = await readBytes(file, maxBytes)
24
24
  const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)
@@ -3,9 +3,11 @@
3
3
  *
4
4
  * These classes implement stream, text and random bytes access to BIDS resources.
5
5
  */
6
+ import { retry } from '@std/async'
6
7
  import { join } from '@std/path'
7
8
  import { type FileOpener } from '../types/filetree.ts'
8
9
  import { createUTF8Stream } from './streams.ts'
10
+ import { logger } from '../utils/logger.ts'
9
11
 
10
12
  export class FsFileOpener implements FileOpener {
11
13
  path: string
@@ -97,6 +99,15 @@ export class BrowserFileOpener implements FileOpener {
97
99
  }
98
100
  }
99
101
 
102
+ class HttpError extends Error {
103
+ status: number
104
+
105
+ constructor(status: number, message: string) {
106
+ super(`HTTP Error ${status}: ${message}`)
107
+ this.status = status
108
+ }
109
+ }
110
+
100
111
  export class HTTPOpener implements FileOpener {
101
112
  url: string
102
113
  size: number
@@ -106,28 +117,53 @@ export class HTTPOpener implements FileOpener {
106
117
  this.size = size
107
118
  }
108
119
 
109
- async _fetch(headers = {}): Promise<Response> {
110
- return fetch(this.url, { headers }).then((response) => {
120
+ async _fetch(options: RequestInit = {}): Promise<Response> {
121
+ // Fetch with retries, for transient errors
122
+ return retry(async () => {
123
+ const response = await fetch(this.url, options)
111
124
  if (!response.ok || !response.body) {
112
- throw new Error(`Failed to fetch ${this.url}: ${response.status} ${response.statusText}`)
125
+ throw new HttpError(response.status, response.statusText)
113
126
  }
114
127
  return response
128
+ }, {
129
+ isRetriable: (error) => {
130
+ logger.info(`Failed to fetch ${this.url}: ${error}, retrying`)
131
+ return (
132
+ error instanceof TypeError ||
133
+ error instanceof HttpError && (error.status == 429 || error.status >= 500)
134
+ )
135
+ },
115
136
  })
116
137
  }
117
138
 
118
139
  async stream(): Promise<ReadableStream<Uint8Array<ArrayBuffer>>> {
140
+ // Streams should not timeout
119
141
  return this._fetch().then((response) => response.body!)
120
142
  }
121
143
 
122
144
  async text(): Promise<string> {
123
- return this._fetch().then((response) => response.text())
145
+ // Timeout after 5 seconds and retry; many connections can result in timeouts
146
+ return await retry(
147
+ () => this._fetch({ signal: AbortSignal.timeout(5000) }).then((response) => response.text()),
148
+ {
149
+ isRetriable: (error) => error instanceof DOMException && error.name === 'TimeoutError',
150
+ },
151
+ )
124
152
  }
125
153
 
126
154
  async readBytes(size: number, offset = 0): Promise<Uint8Array<ArrayBuffer>> {
127
155
  const headers = new Headers()
128
156
  headers.append('Range', `bytes=${offset}-${offset + size - 1}`)
129
- const response = await this._fetch({ headers })
130
- return new Uint8Array(await response.arrayBuffer())
157
+ // Timeout after 5 seconds and retry; many connections can result in timeouts
158
+ return await retry(
159
+ () =>
160
+ this._fetch({ headers, signal: AbortSignal.timeout(5000) }).then((response) =>
161
+ response.bytes()
162
+ ),
163
+ {
164
+ isRetriable: (error) => error instanceof DOMException && error.name === 'TimeoutError',
165
+ },
166
+ )
131
167
  }
132
168
  }
133
169
 
@@ -317,7 +317,7 @@ export class BIDSContext implements Context {
317
317
  if (!this.extension.endsWith('.gz')) {
318
318
  return
319
319
  }
320
- this.gzip = await parseGzip(this.file, 512).catch((error) => {
320
+ this.gzip = await parseGzip(this.file, 1024).catch((error) => {
321
321
  logger.debug('Error parsing gzip header', error)
322
322
  return undefined
323
323
  })
@@ -4,6 +4,7 @@ import type { DatasetIssues } from '../issues/datasetIssues.ts'
4
4
  import { NullFileOpener } from '../files/openers.ts'
5
5
  import { loadTSV } from '../files/tsv.ts'
6
6
  import { loadJSON } from '../files/json.ts'
7
+ import { readBytes, readText } from '../files/access.ts'
7
8
  import { queuedAsyncIterator } from '../utils/queue.ts'
8
9
 
9
10
  function* quickWalk(dir: FileTree): Generator<BIDSFile> {
@@ -54,6 +55,8 @@ async function* _walkFileTree(
54
55
  yield () => {
55
56
  loadTSV.cache.delete(fileTree.path)
56
57
  loadJSON.cache.delete(fileTree.path)
58
+ readBytes.cache.delete(fileTree.path)
59
+ readText.cache.delete(fileTree.path)
57
60
  }
58
61
  }
59
62
 
@@ -17,11 +17,11 @@ export const memoize = <A extends any[], R>(
17
17
  return cached
18
18
  }
19
19
 
20
- export function filememoize<F extends FileLike, T>(
21
- fn: (file: F, ...args: any[]) => T,
22
- ): WithCache<(file: F, ...args: any[]) => T> {
23
- const cache = new Map<string, Map<string, T>>()
24
- const cached = function (this: any, file: F, ...args: any[]): T {
20
+ export function filememoize<F extends FileLike, A extends any[], R>(
21
+ fn: (file: F, ...args: A) => R,
22
+ ): WithCache<(file: F, ...args: A) => R> {
23
+ const cache = new Map<string, Map<string, R>>()
24
+ const cached = function (this: any, file: F, ...args: A): R {
25
25
  let subcache = cache.get(file.parent.path)
26
26
  if (!subcache) {
27
27
  subcache = new Map()
@@ -107,6 +107,7 @@ export async function validate(
107
107
  return false
108
108
  })
109
109
 
110
+ logger.info('Performing file-level validation...')
110
111
  for await (const context of walkFileTree(dsContext, 20)) {
111
112
  if (
112
113
  dsContext.dataset_description.DatasetType == 'raw' &&
@@ -121,6 +122,7 @@ export async function validate(
121
122
  await summary.update(context)
122
123
  }
123
124
 
125
+ logger.info('Performing dataset-level validation...')
124
126
  for (const check of perDSChecks) {
125
127
  await check(schema as unknown as GenericSchema, dsContext)
126
128
  }