From 406c628f66851a3fa8438e0f062db1c732f62145 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Wed, 13 Nov 2024 10:38:44 -0500 Subject: [PATCH 01/15] fix: Restore legacy/ subdirectory, redirecting to legacy-validator --- .github/workflows/web_build.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/web_build.yml b/.github/workflows/web_build.yml index 4297bdcb..b99587a1 100644 --- a/.github/workflows/web_build.yml +++ b/.github/workflows/web_build.yml @@ -61,6 +61,13 @@ jobs: working-directory: dev/web - name: Nest dev inside stable run: mv dev/web/dist stable/web/dist/dev + - name: Add legacy/ redirect + run: | + mkdir $DIR + echo '' > $DIR/index.html + env: + DIR: stable/web/dist/legacy + URL: https://bids-standard.github.io/legacy-validator/ - name: Upload GitHub Pages artifact uses: actions/upload-pages-artifact@v3 with: From 646abea92bea0bf0ff4a262ea7807026f6a2aeb7 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Thu, 14 Nov 2024 15:46:04 -0500 Subject: [PATCH 02/15] feat: Pass ignore to filesToTree function This ensures that consistent ignores are created for web and test file trees. --- src/files/browser.ts | 2 +- src/files/filetree.test.ts | 17 ++++++++++++++++- src/files/filetree.ts | 16 +++++++++------- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/files/browser.ts b/src/files/browser.ts index 4a52b1dc..138c7ee2 100644 --- a/src/files/browser.ts +++ b/src/files/browser.ts @@ -52,7 +52,7 @@ export class BIDSFileBrowser implements BIDSFile { export async function fileListToTree(files: File[]): Promise { const ignore = new FileIgnoreRules([]) const root = new FileTree('/', '/', undefined) - const tree = filesToTree(files.map((f) => new BIDSFileBrowser(f, ignore, root))) + const tree = filesToTree(files.map((f) => new BIDSFileBrowser(f, ignore, root)), ignore) const bidsignore = tree.get('.bidsignore') if (bidsignore) { try { diff --git a/src/files/filetree.test.ts b/src/files/filetree.test.ts index b23307e3..8398e97c 100644 --- a/src/files/filetree.test.ts +++ b/src/files/filetree.test.ts @@ -1,6 +1,6 @@ import { assert, assertEquals } from '@std/assert' import type { FileIgnoreRules } from './ignore.ts' -import type { FileTree } from '../types/filetree.ts' +import type { BIDSFile, FileTree } from '../types/filetree.ts' import { filesToTree, pathsToTree } from './filetree.ts' Deno.test('FileTree generation', async (t) => { @@ -50,4 +50,19 @@ Deno.test('FileTree generation', async (t) => { assert(tree.contains(['sub-01', 'anat'])) assert(tree.contains(['sub-01', 'anat', 'sub-01_T1w.nii.gz'])) }) + await t.step('converts a list with ignores', async () => { + const tree = pathsToTree( + ['/dataset_description.json', '/README.md', '/.bidsignore', '/bad_file'], + ['bad_file'], + ) + assertEquals(tree.directories, []) + assertEquals(tree.files.map((f) => f.name), [ + 'dataset_description.json', + 'README.md', + '.bidsignore', + 'bad_file', + ]) + const bad_file = tree.get('bad_file') as BIDSFile + assert(bad_file.ignored) + }) }) diff --git a/src/files/filetree.ts b/src/files/filetree.ts index 045eca90..49d187ad 100644 --- a/src/files/filetree.ts +++ b/src/files/filetree.ts @@ -1,10 +1,10 @@ import { parse, SEPARATOR_PATTERN } from '@std/path' import * as posix from '@std/path/posix' import { type BIDSFile, FileTree } from '../types/filetree.ts' +import { FileIgnoreRules } from './ignore.ts' const nullFile = { size: 0, - ignored: false, stream: new ReadableStream(), text: () => Promise.resolve(''), readBytes: async (size: number, offset?: number) => new Uint8Array(), @@ -12,16 +12,18 @@ const nullFile = { viewed: false, } -export function pathToFile(path: string): BIDSFile { +export function pathToFile(path: string, ignored: boolean = false): BIDSFile { const name = path.split('/').pop() as string - return { name, path, ...nullFile } + return { name, path, ignored, ...nullFile } } -export function pathsToTree(paths: string[]): FileTree { - return filesToTree(paths.map(pathToFile)) +export function pathsToTree(paths: string[], ignore?: string[]): FileTree { + const ignoreRules = new FileIgnoreRules(ignore ?? []) + return filesToTree(paths.map((path) => pathToFile(path, ignoreRules.test(path)))) } -export function filesToTree(fileList: BIDSFile[]): FileTree { +export function filesToTree(fileList: BIDSFile[], ignore?: FileIgnoreRules): FileTree { + ignore = ignore ?? new FileIgnoreRules([]) const tree: FileTree = new FileTree('/', '/') for (const file of fileList) { const parts = parse(file.path) @@ -37,7 +39,7 @@ export function filesToTree(fileList: BIDSFile[]): FileTree { current = exists continue } - const newTree = new FileTree(posix.join(current.path, level), level, current) + const newTree = new FileTree(posix.join(current.path, level), level, current, ignore) current.directories.push(newTree) current = newTree } From d4f133c3d405ae3f14eb6c3d938851ffb5dba356 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Thu, 14 Nov 2024 15:52:00 -0500 Subject: [PATCH 03/15] rf: Uniformize bidsignore reading between web and Deno --- src/files/deno.ts | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/files/deno.ts b/src/files/deno.ts index f3065a1f..3895a0cd 100644 --- a/src/files/deno.ts +++ b/src/files/deno.ts @@ -151,17 +151,14 @@ async function _readFileTree( */ export async function readFileTree(rootPath: string): Promise { const ignore = new FileIgnoreRules([]) - try { - const ignoreFile = new BIDSFileDeno( - rootPath, - '.bidsignore', - ignore, - ) - ignore.add(await readBidsIgnore(ignoreFile)) - } catch (err) { - if (err && typeof err === 'object' && !('code' in err && err.code === 'ENOENT')) { - logger.error(`Failed to read '.bidsignore' file with the following error:\n${err}`) + const tree = await _readFileTree(rootPath, '/', ignore) + const bidsignore = tree.get('.bidsignore') + if (bidsignore) { + try { + ignore.add(await readBidsIgnore(bidsignore as BIDSFile)) + } catch (err) { + console.log(`Failed to read '.bidsignore' file with the following error:\n${err}`) } } - return _readFileTree(rootPath, '/', ignore) + return tree } From a0fac97df937e23f55a8c3693f0bd002526b3b5b Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Thu, 14 Nov 2024 16:36:29 -0500 Subject: [PATCH 04/15] test: Check that bidsignored files are accepted in scans.tsv --- src/tests/regression.test.ts | 44 ++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/tests/regression.test.ts diff --git a/src/tests/regression.test.ts b/src/tests/regression.test.ts new file mode 100644 index 00000000..3d245416 --- /dev/null +++ b/src/tests/regression.test.ts @@ -0,0 +1,44 @@ +import { assert } from '@std/assert' +import { pathsToTree } from '../files/filetree.ts' +import { validate } from '../validators/bids.ts' +import type { BIDSFile } from '../types/filetree.ts' + + +Deno.test('Regression tests', async (t) => { + await t.step('Verify ignored files in scans.tsv do not trigger error', async () => { + const paths = [ + '/dataset_description.json', + '/sub-01/anat/sub-01_T1w.nii.gz', + '/sub-01/anat/sub-01_CT.nii.gz', // unknown file + '/sub-01/sub-01_scans.tsv', + ] + const ignore = ['*_CT.nii.gz'] + const scans_content = 'filename\nanat/sub-01_T1w.nii.gz\nanat/sub-01_CT.nii.gz\n' + + // Without ignore, NOT_INCLUDED is triggered for CT, but the scans file is happy + let ds = pathsToTree(paths) + let scans_tsv = ds.get('sub-01/sub-01_scans.tsv') as BIDSFile + scans_tsv.text = () => Promise.resolve(scans_content) + let result = await validate(ds, { + datasetPath: '/dataset', + debug: 'ERROR', + ignoreNiftiHeaders: true, + blacklistModalities: [], + }) + assert(result.issues.get({ code: 'NOT_INCLUDED' }).length == 1) + assert(result.issues.get({ code: 'SCANS_FILENAME_NOT_MATCH_DATASET' }).length == 0) + + // With ignore, NOT_INCLUDED is not triggered for CT, and the scans file is still happy + ds = pathsToTree(paths, ignore) + scans_tsv = ds.get('sub-01/sub-01_scans.tsv') as BIDSFile + scans_tsv.text = () => Promise.resolve(scans_content) + result = await validate(ds, { + datasetPath: '/dataset', + debug: 'ERROR', + ignoreNiftiHeaders: true, + blacklistModalities: [], + }) + assert(result.issues.get({ code: 'NOT_INCLUDED' }).length == 0) + assert(result.issues.get({ code: 'SCANS_FILENAME_NOT_MATCH_DATASET' }).length == 0) + }) +}) From ddf4a58032a02d91792b2e76903a49fa84c998d3 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Thu, 14 Nov 2024 19:17:00 -0500 Subject: [PATCH 05/15] doc: Configure scriv for changelog management --- changelog.d/scriv.ini | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 changelog.d/scriv.ini diff --git a/changelog.d/scriv.ini b/changelog.d/scriv.ini new file mode 100644 index 00000000..1a8cf2d2 --- /dev/null +++ b/changelog.d/scriv.ini @@ -0,0 +1,4 @@ +[scriv] +format = md +main_branches = master, main, dev +version = literal: deno.json: version From d3b672ac90ea85ee6b9532ae760f06a7c7e73a9c Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Thu, 14 Nov 2024 19:17:16 -0500 Subject: [PATCH 06/15] doc: Add changelog entry for #113 --- changelog.d/20241114_165444_effigies.md | 42 +++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 changelog.d/20241114_165444_effigies.md diff --git a/changelog.d/20241114_165444_effigies.md b/changelog.d/20241114_165444_effigies.md new file mode 100644 index 00000000..b30ac257 --- /dev/null +++ b/changelog.d/20241114_165444_effigies.md @@ -0,0 +1,42 @@ + + + + + + +### Fixed + +- Improve handling of `.bidsignore` files in the web validator. + Ignores matching directories but not the files they contained could fail to match. + (#113) + + From 868b2d9f9db441599326d6732911c38f95ae9a87 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Thu, 14 Nov 2024 19:23:10 -0500 Subject: [PATCH 07/15] doc: Add Infrastructure changelog category --- changelog.d/scriv.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.d/scriv.ini b/changelog.d/scriv.ini index 1a8cf2d2..c344e62c 100644 --- a/changelog.d/scriv.ini +++ b/changelog.d/scriv.ini @@ -2,3 +2,4 @@ format = md main_branches = master, main, dev version = literal: deno.json: version +categories = Added, Changed, Fixed, Deprecated, Removed, Security, Infrastructure From abea32ba8e4caf53a299a5e7c1d709fbcdae0910 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Thu, 14 Nov 2024 19:25:10 -0500 Subject: [PATCH 08/15] doc: Add changelog entry for scriv --- changelog.d/20241114_192344_effigies_scriv.md | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 changelog.d/20241114_192344_effigies_scriv.md diff --git a/changelog.d/20241114_192344_effigies_scriv.md b/changelog.d/20241114_192344_effigies_scriv.md new file mode 100644 index 00000000..b4c968c0 --- /dev/null +++ b/changelog.d/20241114_192344_effigies_scriv.md @@ -0,0 +1,46 @@ + + + + + + + + +### Infrastructure + +- Adopting [scriv](https://scriv.readthedocs.io/en/latest/) for changelog + management. From a2b842dd40c16ebf16bcfd5d4cf027cee80a10e6 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Thu, 14 Nov 2024 21:07:29 -0500 Subject: [PATCH 09/15] doc: Update contributing with branch/commit/changelog conventions --- .github/CONTRIBUTING.md | 91 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 8bca6d6f..3873f44f 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -161,6 +161,93 @@ git push -u origin feat/short-desc Open PR, set base branch to `dev`. +### Conventions for branches, commits and changelogs + +The following conventions are intended to make contributions legible to other contributors +and, ultimately, users. +They are also there to help you, as a contributor, focus on doing one task at a time. + +The following are common types of contributions, sorted roughly by order of interest +to the reader: + +| Contribution type | Branch prefix | Commit prefix | Changelog section | +|-------------------|---------------|---------------|-------------------------| +| Bug fix | `fix/` | `fix:` | Fixed | +| Feature | `feat/` | `feat:` | Added | +| Documentation | `doc/` | `doc:` | Added or Infrastructure | +| Refactor | `rf/` | `rf:` | Changed | +| Testing | `test/` | `test:` | Changed | +| Style-only | `sty/` | `style:` | Infrastructure | +| Maintenance | `chore/` | `chore:` | Infrastructure | + +If you are contributing a bug-fix, it can help focus your efforts to name your branch +`fix/problem-with-X`, and start commit messages where you write fixes with `fix:`. +Similarly, branches and commits that focus on features, documentation, refactors, +and so on, all have prefixes that help your reader understand what you were trying to do. + +If you find your contribution spanning more than one of these sections, +it might be worth breaking into multiple pull requests. +Exceptions include tests and documentation relevant to the main thrust of the PR, +which are always welcome. + +None of this is set in stone, and we all make mistakes, so don't worry about +following it to the letter. +We will let you know if your contribution is doing too many things and work with +you to split it into more manageable pieces. + +#### Changelog entries + +We are using the [scriv] changelog management tool to help keep our changelog organized. + +Most pull requests will deserve changelog entries, and some may deserve more than one. +Scriv allows changelog entries to be made as part of the pull request, which gives +the contributor and the reviewer a chance to consider the impact of the pull request. + +To add an entry, run: + +``` +scriv create --edit +``` + +(If you're wondering how to install `scriv`, we recommend using [uvx scriv][].) + +Your editor will open a Markdown file with commented sections. +Find the appropriate section(s) for your contribution and write a 1-3 line description. + +#### Style contributions + +Style changes in code can be a source of frustration. +Some editors will reformat entire files when a single line is changed, +swamping the meaningful change with a large number of cosmetic changes. + +We have provided a [`.editorconfig`](https://editorconfig.org) file in the repository, +which should be respected by [most editors](https://editorconfig.org/#pre-installed), +and there are plugins available for [others](https://editorconfig.org/#download). +Additionally, we use `deno fmt` to format the code in this repository. +Using an autoformatter like this helps avoid (ongoing) disagreements over style preferences +so we can focus on the content of the work. + +Even with these, it is possible that when you go to commit your changes, +you have changed more than you intended to. +One reason this can happen is that we might have forgetten to autoformat our code. + +One tool for this situation is `git add --patch` (or `-p`). +This tool shows you each change in turn, allowing you to decide whether or not to +"stage" the change. Stage only the chunks containing the pieces you meant to change, +and commit those. You can then `git checkout .` to discard the remaining changes. + +It is sometimes unavoidable to reformat large portions of code. +In these cases, please make a style-only commit, +followed by a commit with the meaningful changes. +This will speed up review significantly. + +Overall, a style-only pull request should be a rare event, +typically when adopting or upgrading an autoformatter. +This will generally have the effect of introducing merge conflicts, +so we may refrain from doing it for a while. +If you're feeling the urge, it's best to ask! + + [link_git]: https://git-scm.com/ [link_handbook]: https://guides.github.com/introduction/git-handbook/ [link_swc_intro]: http://swcarpentry.github.io/git-novice/ @@ -168,3 +255,7 @@ Open PR, set base branch to `dev`. [link_pullrequest]: https://help.github.com/articles/creating-a-pull-request-from-a-fork [link_fork]: https://help.github.com/articles/fork-a-repo/ [link_clone]: https://help.github.com/articles/cloning-a-repository +[conventional commits]: https://www.conventionalcommits.org/en/v1.0.0/ +[git blame]: https://docs.github.com/en/repositories/working-with-files/using-files/viewing-a-file#viewing-the-line-by-line-revision-history-for-a-file +[scriv]: https://scriv.readthedocs.io/en/latest/ +[uvx]: https://docs.astral.sh/uv/guides/tools/ From f8e2997d701ad0850768d258b1ac521984988e47 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Tue, 3 Dec 2024 21:48:55 -0500 Subject: [PATCH 10/15] fix(deno): Truncate BIDSFileDeno.readBytes() value on EOF --- src/files/deno.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/files/deno.ts b/src/files/deno.ts index 3895a0cd..ebae2dfb 100644 --- a/src/files/deno.ts +++ b/src/files/deno.ts @@ -93,14 +93,17 @@ export class BIDSFileDeno implements BIDSFile { /** * Read bytes in a range efficiently from a given file + * + * Reads up to size bytes, starting at offset. + * If EOF is encountered, the resulting array may be smaller. */ async readBytes(size: number, offset = 0): Promise { const handle = this.#openHandle() const buf = new Uint8Array(size) await handle.seek(offset, Deno.SeekMode.Start) - await handle.read(buf) + const nbytes = await handle.read(buf) ?? 0 handle.close() - return buf + return buf.subarray(0, nbytes) } /** From 07efb463d1349b2b9b2c511d34ccf907224a1c92 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Tue, 3 Dec 2024 21:49:48 -0500 Subject: [PATCH 11/15] test: Add a test file with a couple kB of header extensions --- src/files/nifti.test.ts | 19 +++++++++++++++++++ tests/data/big_header.nii.gz | Bin 0 -> 119 bytes 2 files changed, 19 insertions(+) create mode 100644 tests/data/big_header.nii.gz diff --git a/src/files/nifti.test.ts b/src/files/nifti.test.ts index 909c49b5..df80f759 100644 --- a/src/files/nifti.test.ts +++ b/src/files/nifti.test.ts @@ -53,4 +53,23 @@ Deno.test('Test loading nifti header', async (t) => { }) assertObjectMatch(error, { key: 'NIFTI_HEADER_UNREADABLE' }) }) + + await t.step('Tolerate big headers', async () => { + const path = 'big_header.nii.gz' + const root = './tests/data/' + const file = new BIDSFileDeno(root, path, ignore) + let error: any = undefined + const header = await loadHeader(file) + assert(header !== undefined) + assertObjectMatch(header, { + dim: [3, 1, 1, 1, 1, 1, 1], + pixdim: [1, 1, 1, 1, 1, 1, 1], + shape: [1, 1, 1], + voxel_sizes: [1, 1, 1], + dim_info: { freq: 0, phase: 0, slice: 0 }, + xyzt_units: { xyz: 'unknown', t: 'unknown' }, + qform_code: 0, + sform_code: 2, + }) + }) }) diff --git a/tests/data/big_header.nii.gz b/tests/data/big_header.nii.gz new file mode 100644 index 0000000000000000000000000000000000000000..9821d7f44c3a76492af80547b5ff516478a1166d GIT binary patch literal 119 zcmb2|=3oE;mjB&}DGFQ$#s-TVLVTHcxDp!Ks@d3Tc3c)!>R(m;pu(qO4ckv1k0Yh!=&BCY3>yK{mGiyNG1tK#Un_TJf+&Hb*u6w_iw11NFBX~97`hEtx? Jm{bHA7y!u0CG!9P literal 0 HcmV?d00001 From 34c15a6fad6c93705b6192f47bd9cfbc8937486c Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Tue, 3 Dec 2024 21:51:17 -0500 Subject: [PATCH 12/15] fix: Prevent gzip decompressor from hanging --- src/files/nifti.ts | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/files/nifti.ts b/src/files/nifti.ts index 58a05895..edea1537 100644 --- a/src/files/nifti.ts +++ b/src/files/nifti.ts @@ -11,20 +11,24 @@ async function extract(buffer: Uint8Array, nbytes: number): Promise const stream = new ReadableStream({ start(controller) { controller.enqueue(buffer) + controller.close() }, }) const reader = stream.pipeThrough(new DecompressionStream('gzip')).getReader() let offset = 0 - while (offset < nbytes) { - const { value, done } = await reader.read() - if (done) { - break + try { + while (offset < nbytes) { + const { value, done } = await reader.read() + if (done || !value) { + break + } + result.set(value.subarray(0, Math.min(value.length, nbytes - offset)), offset) + offset += value.length } - result.set(value.subarray(0, Math.min(value.length, nbytes - offset)), offset) - offset += value.length + } finally { + await reader.cancel() } - await reader.cancel() - return result + return result.subarray(0, offset) } export async function loadHeader(file: BIDSFile): Promise { From 3c1db5bc48afc2561d44d75527f8f611d5e5bd06 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Tue, 3 Dec 2024 21:55:03 -0500 Subject: [PATCH 13/15] fix: Truncate NIfTI header data to avoid extensions --- src/files/nifti.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/files/nifti.ts b/src/files/nifti.ts index edea1537..e3d58b57 100644 --- a/src/files/nifti.ts +++ b/src/files/nifti.ts @@ -1,4 +1,4 @@ -import { isCompressed, readHeader } from '@mango/nifti' +import { isCompressed, isNIFTI1, isNIFTI2, NIFTI1, NIFTI2 } from '@mango/nifti' import type { BIDSFile } from '../types/filetree.ts' import { logger } from '../utils/logger.ts' import type { NiftiHeader } from '@bids/schema/context' @@ -34,8 +34,16 @@ async function extract(buffer: Uint8Array, nbytes: number): Promise export async function loadHeader(file: BIDSFile): Promise { try { const buf = await file.readBytes(1024) - const data = isCompressed(buf.buffer) ? await extract(buf, 540) : buf - const header = readHeader(data.buffer) + const data = isCompressed(buf.buffer) ? await extract(buf, 540) : buf.slice(0, 540) + let header + if (isNIFTI1(data.buffer)) { + header = new NIFTI1() + // Truncate to 348 bytes to avoid attempting to parse extensions + header.readHeader(data.buffer.slice(0, 348)) + } else if (isNIFTI2(data.buffer)) { + header = new NIFTI2() + header.readHeader(data.buffer) + } if (!header) { throw { key: 'NIFTI_HEADER_UNREADABLE' } } From 9963e7dc424c74bcd956e80c44494bf44d21f806 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Wed, 4 Dec 2024 11:09:45 -0500 Subject: [PATCH 14/15] Add changelog entry --- .../20241204_103403_effigies_nifti_headers.md | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 changelog.d/20241204_103403_effigies_nifti_headers.md diff --git a/changelog.d/20241204_103403_effigies_nifti_headers.md b/changelog.d/20241204_103403_effigies_nifti_headers.md new file mode 100644 index 00000000..e5f74285 --- /dev/null +++ b/changelog.d/20241204_103403_effigies_nifti_headers.md @@ -0,0 +1,49 @@ + + + + +### Fixed + +- Resolve issue with parsing headers of NIfTI files with large extensions. + Fixes [issue 126]. + +[issue 126]: https://github.com/bids-standard/bids-validator/issues/126 + + + + + From 3fe26146db5ea852dbd0762ffe66299ce3be6f46 Mon Sep 17 00:00:00 2001 From: Chris Markiewicz Date: Thu, 5 Dec 2024 16:52:10 -0500 Subject: [PATCH 15/15] chore: Bump @bids/schema v1.0.0 --- deno.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deno.json b/deno.json index efa64b82..f4c6804d 100644 --- a/deno.json +++ b/deno.json @@ -28,7 +28,7 @@ }, "imports": { "@ajv": "npm:ajv@8.17.1", - "@bids/schema": "jsr:@bids/schema@0.11.3+2", + "@bids/schema": "jsr:@bids/schema@1.0.0", "@cliffy/command": "jsr:@effigies/cliffy-command@1.0.0-dev.8", "@cliffy/table": "jsr:@effigies/cliffy-table@1.0.0-dev.5", "@hed/validator": "npm:hed-validator@3.15.5",