diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0bd1f1d4715be3b5f6a614316072f8d39ff3f7f7..cc43a5a9719687566b48b3348d6cf4c662c07018 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -171,6 +171,12 @@ test:3.9: <<: *test_template +test:3.10: + stage: test + image: pauldmccarthy/fsleyes-py310-wxpy4-gtk3 + <<: *test_template + + test:build-pypi-dist: stage: test image: pauldmccarthy/fsleyes-py37-wxpy4-gtk3 diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 56ce3f6b90c9afe77eabd6b0ea60d5cfad824f5f..1d1ae7c2123250837e0a6e0b705f828a7ff91e55 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -2,6 +2,18 @@ This document contains the ``fslpy`` release history in reverse chronological order. +3.8.0 (Under development) +------------------------- + + +Changed +^^^^^^^ + + +* BIDS and ``dcm2niix`` ``.json`` sidecar files with control characters + are now accepted. + + 3.7.0 (Friday 20th August 2021) ------------------------------- diff --git a/README.rst b/README.rst index 493d7e30eaee4c13e023bf05c1972d92e62deb02..26cd046795fc3f68f429a40662428bfd71bfa17d 100644 --- a/README.rst +++ b/README.rst @@ -19,7 +19,7 @@ programming library written in Python. It is used by `FSLeyes <https://git.fmrib.ox.ac.uk/fsl/fsleyes/fsleyes/>`_. -``fslpy`` is tested against Python versions 3.7, 3.8 and 3.9. +``fslpy`` is tested against Python versions 3.7, 3.8, 3.9, and 3.10. Installation diff --git a/fsl/data/image.py b/fsl/data/image.py index e21ad87c2cf34cfe629ecba94e7cf2890cfb0472..80cffb6a97efb7964c32d846af9715c19d3f5d0a 100644 --- a/fsl/data/image.py +++ b/fsl/data/image.py @@ -1569,7 +1569,7 @@ def loadMetadata(image): jsonfile = op.join(dirname, '{}.json'.format(basename)) if op.exists(jsonfile): with open(jsonfile, 'rt') as f: - return json.load(f) + return json.load(f, strict=False) return {} diff --git a/fsl/utils/bids.py b/fsl/utils/bids.py index 671fb4c28650d912ff1579ab350cf5e99ae0c116..61fc12830aa324848d0a3b32c7d350a800fc2b4b 100644 --- a/fsl/utils/bids.py +++ b/fsl/utils/bids.py @@ -187,7 +187,7 @@ def isBIDSFile(filename, strict=True): def loadMetadataFile(filename): """Load ``filename`` (assumed to be JSON), returning its contents. """ with open(filename, 'rt') as f: - return json.load(f) + return json.load(f, strict=False) def loadMetadata(filename): diff --git a/tests/test_bids.py b/tests/test_bids.py index 4a2bc1e10c76bf03027962eb8cb2f7c4a4551bd8..52c6bb444e329a3ee89b5a57b126a1bffab6ed63 100644 --- a/tests/test_bids.py +++ b/tests/test_bids.py @@ -110,6 +110,21 @@ def test_loadMetadata(): assert fslbids.loadMetadata(t1) == {**meta4, **meta2, **meta1} +def test_loadMetadata_control_characters(): + dd = Path('dataset_description.json') + t1 = Path('sub-01/func/sub-01_task-stim_bold.nii.gz') + json1 = Path('sub-01/func/sub-01_task-stim_bold.json') + meta1 = {"a" : "1", "b" : "2\x19\x20"} + smeta1 = '{"a" : "1", "b" : "2\x19\x20"}' + + with tempdir(): + dd.touch() + Path(op.dirname(t1)).mkdir(parents=True) + t1.touch() + assert fslbids.loadMetadata(t1) == {} + json1.write_text(smeta1) + assert fslbids.loadMetadata(t1) == meta1 + def test_loadMetadata_symlinked(): ddreal = Path('a') diff --git a/tests/test_image.py b/tests/test_image.py index 34a5482ce8f63a7d66ed83d881f9a575680a55ab..6f7e07b4c87c2f90075f9156dadfbfb0b6df72f9 100644 --- a/tests/test_image.py +++ b/tests/test_image.py @@ -1484,6 +1484,21 @@ def test_loadMeta_badJSON(): assert list(img.metaKeys()) == [] +def test_loadMeta_control_characters(): + with tempdir(): + make_image('image.nii.gz') + + with open('image.json', 'wt') as f: + f.write('{"a" : 1, "b" : "abc\x19\x1b"}') + + # bad json should not cause failure + img = fslimage.Image('image.nii.gz', loadMeta=True) + + assert list(img.metaKeys()) == ['a', 'b'] + assert img.getMeta('a') == 1 + assert img.getMeta('b') == 'abc\x19\x1b' + + def test_loadMetadata(): with tempdir(): make_image('image.nii.gz')