From 62523f7c548e4d6da3a7315560eed6aa0636d7f3 Mon Sep 17 00:00:00 2001 From: Daniel McCloy Date: Thu, 30 May 2024 14:09:40 -0500 Subject: [PATCH 1/6] [MRG] auto-add event_id key for BAD_ACQ_SKIP (#1258) --- doc/whats_new.rst | 3 +++ mne_bids/read.py | 9 ++++++++ mne_bids/tests/test_read.py | 44 ++++++++++++++++++++++++++++--------- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/doc/whats_new.rst b/doc/whats_new.rst index 317860aad..dd6e37a13 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -28,6 +28,7 @@ The following authors had contributed before. Thank you for sticking around! * `Laetitia Fesselier`_ * `Richard Höchenberger`_ * `Stefan Appelhoff`_ +* `Daniel McCloy`_ Detailed list of changes ~~~~~~~~~~~~~~~~~~~~~~~~ @@ -46,6 +47,8 @@ Detailed list of changes For example, If ``run=1`` is passed to MNE-BIDS, it will no longer be silently auto-converted to ``run-01``, by `Alex Rockhill`_ (:gh:`1215`) - MNE-BIDS will no longer warn about missing leading punctuation marks for extensions passed :class:`~mne_bids.BIDSPath`. For example, MNE-BIDS will now silently auto-convert ``edf`` to ```.edf``, by `Alex Rockhill`_ (:gh:`1215`) +- MNE-BIDS will no longer error during `~mne_bids.write_raw_bids` if there are ``BAD_ACQ_SKIP`` annotations in the raw file and no corresponding key in ``event_id``. + Instead, it will automatically add the necessary key and assign an unused integer event code to it. By `Daniel McCloy`_ (:gh:`1258`) 🛠 Requirements ^^^^^^^^^^^^^^^ diff --git a/mne_bids/read.py b/mne_bids/read.py index 45089d8fe..cf91f43d7 100644 --- a/mne_bids/read.py +++ b/mne_bids/read.py @@ -151,9 +151,18 @@ def _read_events(events, event_id, raw, bids_path=None): 'To specify custom event codes, please pass "event_id".' ) else: + special_annots = {"BAD_ACQ_SKIP"} desc_without_id = sorted( set(raw.annotations.description) - set(event_id.keys()) ) + # auto-add entries to `event_id` for "special" annotation values + # (but only if they're needed) + if set(desc_without_id) & special_annots: + for annot in special_annots: + # use a value guaranteed to not be in use + event_id = {annot: max(event_id.values()) + 90000} | event_id + # remove the "special" annots from the list of problematic annots + desc_without_id = sorted(set(desc_without_id) - special_annots) if desc_without_id: raise ValueError( f"The provided raw data contains annotations, but " diff --git a/mne_bids/tests/test_read.py b/mne_bids/tests/test_read.py index b5830bc78..560f71ac2 100644 --- a/mne_bids/tests/test_read.py +++ b/mne_bids/tests/test_read.py @@ -46,6 +46,15 @@ acq = "01" task = "testing" +sample_data_event_id = { + "Auditory/Left": 1, + "Auditory/Right": 2, + "Visual/Left": 3, + "Visual/Right": 4, + "Smiley": 5, + "Button": 32, +} + _bids_path = BIDSPath( subject=subject_id, session=session_id, run=run, acquisition=acq, task=task ) @@ -214,14 +223,6 @@ def test_get_head_mri_trans(tmp_path): """Test getting a trans object from BIDS data.""" nib = pytest.importorskip("nibabel") - event_id = { - "Auditory/Left": 1, - "Auditory/Right": 2, - "Visual/Left": 3, - "Visual/Right": 4, - "Smiley": 5, - "Button": 32, - } events_fname = op.join( data_path, "MEG", "sample", "sample_audvis_trunc_raw-eve.fif" ) @@ -234,7 +235,9 @@ def test_get_head_mri_trans(tmp_path): # Write it to BIDS raw = _read_raw_fif(raw_fname) bids_path = _bids_path.copy().update(root=tmp_path, datatype="meg", suffix="meg") - write_raw_bids(raw, bids_path, events=events, event_id=event_id, overwrite=False) + write_raw_bids( + raw, bids_path, events=events, event_id=sample_data_event_id, overwrite=False + ) # We cannot recover trans if no MRI has yet been written with pytest.raises(FileNotFoundError, match="Did not find"): @@ -300,7 +303,7 @@ def test_get_head_mri_trans(tmp_path): # sidecar, and also accept "nasion" instead of just "NAS" raw = _read_raw_fif(raw_fname) write_raw_bids( - raw, bids_path, events=events, event_id=event_id, overwrite=True + raw, bids_path, events=events, event_id=sample_data_event_id, overwrite=True ) # overwrite with new acq t1w_bids_path = write_anat( t1w_mgh, bids_path=t1w_bids_path, landmarks=landmarks, overwrite=True @@ -578,6 +581,27 @@ def test_keep_essential_annotations(tmp_path): assert raw_read.annotations[0]["description"] == raw.annotations[0]["description"] +@testing.requires_testing_data +def test_adding_essential_annotations_to_dict(tmp_path): + """Test that essential Annotations are auto-added to the `event_id` dictionary.""" + raw = _read_raw_fif(raw_fname) + annotations = mne.Annotations( + onset=[raw.times[0]], duration=[1], description=["BAD_ACQ_SKIP"] + ) + raw.set_annotations(annotations) + events = mne.find_events(raw) + event_id = sample_data_event_id.copy() + obj_id = id(event_id) + + # see that no error is raised for missing event_id key for BAD_ACQ_SKIP + bids_path = BIDSPath(subject="01", task="task", datatype="meg", root=tmp_path) + with pytest.warns(RuntimeWarning, match="Acquisition skips detected"): + write_raw_bids(raw, bids_path, overwrite=True, events=events, event_id=event_id) + # make sure we didn't modify the user-passed dict + assert event_id == sample_data_event_id + assert obj_id == id(event_id) + + @pytest.mark.filterwarnings(warning_str["channel_unit_changed"]) @testing.requires_testing_data def test_handle_scans_reading(tmp_path): From 95023a27b64966617f66674fa33639d6a505e5be Mon Sep 17 00:00:00 2001 From: Stefan Appelhoff Date: Mon, 3 Jun 2024 22:22:37 +0200 Subject: [PATCH 2/6] MAINT: Setup new way of releasing (#1259) add automatic release workflow --- .github/workflows/release.yml | 51 +++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 000000000..0cf02ae2d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,51 @@ +# Upload a Python Package using Twine when a release is created + +name: Build +on: # yamllint disable-line rule:truthy + release: + types: [published] + push: + branches: + - main + pull_request: + branches: + - main + +permissions: + contents: read + +jobs: + package: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install build twine + - run: python -m build --sdist --wheel + - run: twine check --strict dist/* + - uses: actions/upload-artifact@v4 + with: + name: dist + path: dist + + pypi-upload: + needs: package + runs-on: ubuntu-latest + if: github.event_name == 'release' + permissions: + id-token: write # for trusted publishing + environment: + name: pypi + url: https://pypi.org/p/mne + steps: + - uses: actions/download-artifact@v4 + with: + name: dist + path: dist + - uses: pypa/gh-action-pypi-publish@release/v1 + if: github.event_name == 'release' From 23526f913b6e83eea3c7e39dd1073cb86782ef58 Mon Sep 17 00:00:00 2001 From: Stefan Appelhoff Date: Tue, 4 Jun 2024 10:12:51 +0200 Subject: [PATCH 3/6] REL: 0.15.0 (#1260) * build docs in gh actions for easy artifact download * add release items * bump pre-commit version --- .github/workflows/release.yml | 2 +- .github/workflows/unit_tests.yml | 30 ++++++++++++++++++++++++++++++ .pre-commit-config.yaml | 2 +- LICENSE | 2 +- doc/_static/versions.json | 9 +++++++-- doc/whats_new.rst | 4 ++-- pyproject.toml | 4 ++-- 7 files changed, 44 insertions(+), 9 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0cf02ae2d..0ca6c661c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,6 +1,6 @@ # Upload a Python Package using Twine when a release is created -name: Build +name: build on: # yamllint disable-line rule:truthy release: types: [published] diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 19a71aeb1..6ea315d98 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -289,3 +289,33 @@ jobs: uses: codecov/codecov-action@v4 with: files: ./coverage.xml + + build_docs: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.12"] + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - uses: actions/cache@v4 + with: + path: ${{ env.pythonLocation }} + key: build_docs-0-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml') }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install --upgrade https://github.com/mne-tools/mne-python/archive/refs/heads/main.zip + python -m pip install -e .[test,doc] + - name: Build the documentation + run: | + make build-doc + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: documentation + path: doc/_build/html diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 01c291b5a..ad6a8a018 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.4.5 + rev: v0.4.7 hooks: - id: ruff name: ruff mne_bids/ diff --git a/LICENSE b/LICENSE index 4688dad05..a3ee63251 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ BSD 3-Clause License -Copyright (c) 2018-2023, mne-bids developers +Copyright (c) 2018, mne-bids developers All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/doc/_static/versions.json b/doc/_static/versions.json index 7225cce35..1fcfbdaa2 100644 --- a/doc/_static/versions.json +++ b/doc/_static/versions.json @@ -1,12 +1,17 @@ [ { - "name": "0.15 (devel)", + "name": "0.16 (devel)", "version": "dev", "url": "https://mne.tools/mne-bids/dev/" }, { - "name": "0.14 (stable)", + "name": "0.15 (stable)", "version": "stable", + "url": "https://mne.tools/mne-bids/v0.15/" + }, + { + "name": "0.14", + "version": "0.14", "url": "https://mne.tools/mne-bids/v0.14/" }, { diff --git a/doc/whats_new.rst b/doc/whats_new.rst index dd6e37a13..9a9e7a7be 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -17,18 +17,18 @@ Version 0.15 (unreleased) The following authors contributed for the first time. Thank you so much! 🤩 -* `Daniel McCloy`_ * `Mara Wolter`_ * `Julius Welzel`_ The following authors had contributed before. Thank you for sticking around! 🤘 * `Alex Rockhill`_ +* `Daniel McCloy`_ * `Eric Larson`_ * `Laetitia Fesselier`_ +* `Mathieu Scheltienne`_ * `Richard Höchenberger`_ * `Stefan Appelhoff`_ -* `Daniel McCloy`_ Detailed list of changes ~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/pyproject.toml b/pyproject.toml index 43046ea58..1a87c0f11 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ full = [ "pandas >= 1.3.2", "EDFlib-Python >= 1.0.6", # drop once mne <1.7 is no longer supported "edfio >= 0.2.1", - "defusedxml", # For reading EGI MFF data abd BrainVision monatges + "defusedxml", # For reading EGI MFF data and BrainVision montages ] # Dependencies for running the test infrastructure @@ -72,7 +72,7 @@ doc = [ "matplotlib", "pillow", "pandas", - "mne-nirs @ https://github.com/mne-tools/mne-nirs/archive/refs/heads/main.zip", + "mne-nirs", "seaborn", "openneuro-py", ] From 8ea1024afbd16426ea9e0676092a524717ce831d Mon Sep 17 00:00:00 2001 From: Stefan Appelhoff Date: Tue, 4 Jun 2024 11:11:25 +0200 Subject: [PATCH 4/6] run CI on tags, too --- .github/workflows/unit_tests.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 6ea315d98..ba9929177 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -7,6 +7,7 @@ concurrency: on: push: branches: ['**'] + tags: ['**'] pull_request: branches: ['**'] schedule: From db40a0490355ad19b1c7c8bdc94391d58698f249 Mon Sep 17 00:00:00 2001 From: Stefan Appelhoff Date: Tue, 4 Jun 2024 11:47:26 +0200 Subject: [PATCH 5/6] start developing 0.16 --- doc/whats_new.rst | 50 +++--------------- doc/whats_new_previous_releases.rst | 78 +++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 42 deletions(-) diff --git a/doc/whats_new.rst b/doc/whats_new.rst index 9a9e7a7be..d5e0526df 100644 --- a/doc/whats_new.rst +++ b/doc/whats_new.rst @@ -7,9 +7,9 @@ What's new? =========== -.. _changes_0_15: +.. _changes_0_16: -Version 0.15 (unreleased) +Version 0.16 (unreleased) ------------------------- 👩🏽‍💻 Authors @@ -17,17 +17,10 @@ Version 0.15 (unreleased) The following authors contributed for the first time. Thank you so much! 🤩 -* `Mara Wolter`_ -* `Julius Welzel`_ +* nobody yet The following authors had contributed before. Thank you for sticking around! 🤘 -* `Alex Rockhill`_ -* `Daniel McCloy`_ -* `Eric Larson`_ -* `Laetitia Fesselier`_ -* `Mathieu Scheltienne`_ -* `Richard Höchenberger`_ * `Stefan Appelhoff`_ Detailed list of changes @@ -36,54 +29,27 @@ Detailed list of changes 🚀 Enhancements ^^^^^^^^^^^^^^^ -- Including a description for ``onset`` and ``duration`` in the ``events.json`` file, by `Julius Welzel`_ (:gh:`1255`) +- nothing yet 🧐 API and behavior changes ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -- The experimental support for running MNE-BIDS examples from your browser using Binder has - been removed, by `Stefan Appelhoff`_ (:gh:`1202`) -- MNE-BIDS will no longer zero-pad ("zfill") entity indices passed to :class:`~mne_bids.BIDSPath`. - For example, If ``run=1`` is passed to MNE-BIDS, it will no longer be silently auto-converted to ``run-01``, by `Alex Rockhill`_ (:gh:`1215`) -- MNE-BIDS will no longer warn about missing leading punctuation marks for extensions passed :class:`~mne_bids.BIDSPath`. - For example, MNE-BIDS will now silently auto-convert ``edf`` to ```.edf``, by `Alex Rockhill`_ (:gh:`1215`) -- MNE-BIDS will no longer error during `~mne_bids.write_raw_bids` if there are ``BAD_ACQ_SKIP`` annotations in the raw file and no corresponding key in ``event_id``. - Instead, it will automatically add the necessary key and assign an unused integer event code to it. By `Daniel McCloy`_ (:gh:`1258`) +- nothing yet 🛠 Requirements ^^^^^^^^^^^^^^^ -- MNE-BIDS now requires Python 3.9 or higher. -- MNE-BIDS now requires MNE-Python 1.5.0 or higher. -- ``edfio`` replaces ``EDFlib-Python`` for export to EDF with MNE-Python >= 1.7.0. -- Installing ``mne-bids[full]`` will now also install ``defusedxml`` on all platforms. -- Version requirements for optional dependency packages have been bumped up, see installation instructions. +- nothing yet 🪲 Bug fixes ^^^^^^^^^^^^ -- The datatype in the dataframe returned by :func:`mne_bids.stats.count_events` is now - ``pandas.Int64Dtype`` instead of ``float64``, by `Eric Larson`_ (:gh:`1227`) -- The :func:`mne_bids.copyfiles.copyfile_ctf` now accounts for files with ``.{integer}_meg4`` extension, instead of only .meg4, - when renaming the files of a .ds folder, by `Mara Wolter`_ (:gh:`1230`) -- We fixed handling of time zones when reading ``*_scans.tsv`` files; specifically, non-UTC timestamps are now processed correctly, - by `Stefan Appelhoff`_ and `Richard Höchenberger`_ (:gh:`1240`) +- nothing yet ⚕️ Code health ^^^^^^^^^^^^^^ -- The configuration of MNE-BIDS has been consolidated from several files (e.g., ``setup.cfg``, - ``setup.py``, ``requirements.txt``) and is now specified in a standard ``pyproject.toml`` - file, by `Stefan Appelhoff`_ (:gh:`1202`) -- Linting and code formatting is now done entirely using ``ruff``. Previously used tools - (e.g., ``flake8``, ``black``) have been fully replaced, by `Stefan Appelhoff`_ (:gh:`1203`) -- The package build backend has been switched from ``setuptools`` to ``hatchling``. This - only affects users who build and install MNE-BIDS from source, and should not lead to - changed runtime behavior, by `Richard Höchenberger`_ (:gh:`1204`) -- Display of the version number on the website is now truncated for over-long version strings, - by `Daniel McCloy`_ (:gh:`1206`) -- The long deprecated ``events_data`` parameter has been fully removed from - :func:`~mne_bids.write_raw_bids` in favor of ``events``, by `Stefan Appelhoff`_ (:gh:`1229`) +- nothing yet :doc:`Find out what was new in previous releases ` diff --git a/doc/whats_new_previous_releases.rst b/doc/whats_new_previous_releases.rst index e6282b459..470608635 100644 --- a/doc/whats_new_previous_releases.rst +++ b/doc/whats_new_previous_releases.rst @@ -7,6 +7,84 @@ What was new in previous releases? ================================== +.. _changes_0_15: + +Version 0.15 (2024-06-04) +------------------------- + +👩🏽‍💻 Authors +~~~~~~~~~~~~~~~ + +The following authors contributed for the first time. Thank you so much! 🤩 + +* `Mara Wolter`_ +* `Julius Welzel`_ + +The following authors had contributed before. Thank you for sticking around! 🤘 + +* `Alex Rockhill`_ +* `Daniel McCloy`_ +* `Eric Larson`_ +* `Laetitia Fesselier`_ +* `Mathieu Scheltienne`_ +* `Richard Höchenberger`_ +* `Stefan Appelhoff`_ + +Detailed list of changes +~~~~~~~~~~~~~~~~~~~~~~~~ + +🚀 Enhancements +^^^^^^^^^^^^^^^ + +- Including a description for ``onset`` and ``duration`` in the ``events.json`` file, by `Julius Welzel`_ (:gh:`1255`) + +🧐 API and behavior changes +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- The experimental support for running MNE-BIDS examples from your browser using Binder has + been removed, by `Stefan Appelhoff`_ (:gh:`1202`) +- MNE-BIDS will no longer zero-pad ("zfill") entity indices passed to :class:`~mne_bids.BIDSPath`. + For example, If ``run=1`` is passed to MNE-BIDS, it will no longer be silently auto-converted to ``run-01``, by `Alex Rockhill`_ (:gh:`1215`) +- MNE-BIDS will no longer warn about missing leading punctuation marks for extensions passed :class:`~mne_bids.BIDSPath`. + For example, MNE-BIDS will now silently auto-convert ``edf`` to ```.edf``, by `Alex Rockhill`_ (:gh:`1215`) +- MNE-BIDS will no longer error during `~mne_bids.write_raw_bids` if there are ``BAD_ACQ_SKIP`` annotations in the raw file and no corresponding key in ``event_id``. + Instead, it will automatically add the necessary key and assign an unused integer event code to it. By `Daniel McCloy`_ (:gh:`1258`) + +🛠 Requirements +^^^^^^^^^^^^^^^ + +- MNE-BIDS now requires Python 3.9 or higher. +- MNE-BIDS now requires MNE-Python 1.5.0 or higher. +- ``edfio`` replaces ``EDFlib-Python`` for export to EDF with MNE-Python >= 1.7.0. +- Installing ``mne-bids[full]`` will now also install ``defusedxml`` on all platforms. +- Version requirements for optional dependency packages have been bumped up, see installation instructions. + +🪲 Bug fixes +^^^^^^^^^^^^ + +- The datatype in the dataframe returned by :func:`mne_bids.stats.count_events` is now + ``pandas.Int64Dtype`` instead of ``float64``, by `Eric Larson`_ (:gh:`1227`) +- The :func:`mne_bids.copyfiles.copyfile_ctf` now accounts for files with ``.{integer}_meg4`` extension, instead of only .meg4, + when renaming the files of a .ds folder, by `Mara Wolter`_ (:gh:`1230`) +- We fixed handling of time zones when reading ``*_scans.tsv`` files; specifically, non-UTC timestamps are now processed correctly, + by `Stefan Appelhoff`_ and `Richard Höchenberger`_ (:gh:`1240`) + +⚕️ Code health +^^^^^^^^^^^^^^ + +- The configuration of MNE-BIDS has been consolidated from several files (e.g., ``setup.cfg``, + ``setup.py``, ``requirements.txt``) and is now specified in a standard ``pyproject.toml`` + file, by `Stefan Appelhoff`_ (:gh:`1202`) +- Linting and code formatting is now done entirely using ``ruff``. Previously used tools + (e.g., ``flake8``, ``black``) have been fully replaced, by `Stefan Appelhoff`_ (:gh:`1203`) +- The package build backend has been switched from ``setuptools`` to ``hatchling``. This + only affects users who build and install MNE-BIDS from source, and should not lead to + changed runtime behavior, by `Richard Höchenberger`_ (:gh:`1204`) +- Display of the version number on the website is now truncated for over-long version strings, + by `Daniel McCloy`_ (:gh:`1206`) +- The long deprecated ``events_data`` parameter has been fully removed from + :func:`~mne_bids.write_raw_bids` in favor of ``events``, by `Stefan Appelhoff`_ (:gh:`1229`) + .. _changes_0_14: Version 0.14 (2023-11-16) From af7c246f754a26e7482bb991bbe3cd87b6c4b20e Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 22:01:16 +0000 Subject: [PATCH 6/6] [pre-commit.ci] pre-commit autoupdate (#1262) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updates: - [github.com/astral-sh/ruff-pre-commit: v0.4.7 → v0.4.8](https://github.com/astral-sh/ruff-pre-commit/compare/v0.4.7...v0.4.8) Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ad6a8a018..571d09691 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.4.7 + rev: v0.4.8 hooks: - id: ruff name: ruff mne_bids/