Skip to content

Commit 025c211

Browse files
authored
Merge branch 'main' into main
2 parents a190f08 + c6de8ab commit 025c211

40 files changed

Lines changed: 333 additions & 289 deletions

.circleci/config.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,8 @@ jobs:
131131
- run:
132132
name: Check Qt
133133
command: |
134-
./tools/check_qt_import.sh PyQt6
134+
set -x
135+
./tools/check_qt_import.sh ${MNE_QT_BACKEND}
135136
# Load tiny cache so that ~/.mne does not need to be created below
136137
- restore_cache:
137138
keys:

.github/workflows/codeql-analysis.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444

4545
# Initializes the CodeQL tools for scanning.
4646
- name: Initialize CodeQL
47-
uses: github/codeql-action/init@v4.35.2
47+
uses: github/codeql-action/init@v4.35.4
4848
with:
4949
languages: ${{ matrix.language }}
5050
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -58,7 +58,7 @@ jobs:
5858
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
5959
# If this step fails, then you should remove it and run the build manually (see below)
6060
- name: Autobuild
61-
uses: github/codeql-action/autobuild@v4.35.2
61+
uses: github/codeql-action/autobuild@v4.35.4
6262

6363
# ℹ️ Command-line programs to run using the OS shell.
6464
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
@@ -71,4 +71,4 @@ jobs:
7171
# ./location_of_script_within_repo/buildscript.sh
7272

7373
- name: Perform CodeQL Analysis
74-
uses: github/codeql-action/analyze@v4.35.2
74+
uses: github/codeql-action/analyze@v4.35.4

.pre-commit-config.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
repos:
22
# Ruff mne
33
- repo: https://github.com/astral-sh/ruff-pre-commit
4-
rev: v0.15.12
4+
rev: v0.15.13
55
hooks:
66
- id: ruff-check
77
name: ruff lint mne
@@ -74,7 +74,7 @@ repos:
7474

7575
# zizmor
7676
- repo: https://github.com/woodruffw/zizmor-pre-commit
77-
rev: v1.24.1
77+
rev: v1.25.2
7878
hooks:
7979
- id: zizmor
8080
args: [--fix]

azure-pipelines.yml

Lines changed: 62 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -38,34 +38,27 @@ stages:
3838
- job: All
3939
pool:
4040
vmImage: 'ubuntu-latest'
41-
variables:
42-
PYTHON_VERSION: '3.11'
43-
PYTHON_ARCH: 'x64'
4441
steps:
45-
- bash: echo $(COMMIT_MSG)
4642
- task: UsePythonVersion@0
4743
inputs:
48-
versionSpec: $(PYTHON_VERSION)
49-
architecture: $(PYTHON_ARCH)
44+
versionSpec: '3.14'
45+
architecture: 'x64'
5046
addToPath: true
51-
displayName: 'Get Python'
47+
displayName: Get Python
5248
- bash: |
5349
set -eo pipefail
5450
python -m pip install --progress-bar off --upgrade pip build
55-
python -m pip install --progress-bar off -ve .[hdf5] --group=test
51+
python -m pip install --only-binary=":all:" --progress-bar off -ve .[hdf5] --group=test
5652
python -m pip uninstall -yq pytest-qt # don't want to set up display, etc. for this
5753
pre-commit install --install-hooks
5854
displayName: Install dependencies
59-
- bash: |
60-
make pre-commit
55+
- bash: make pre-commit
6156
displayName: make pre-commit
6257
condition: always()
63-
- bash: |
64-
make nesting
58+
- bash: make nesting
6559
displayName: make nesting
6660
condition: always()
67-
- bash: |
68-
make check-readme
61+
- bash: make check-readme
6962
displayName: make check-readme
7063
condition: always()
7164
- bash: mypy
@@ -75,7 +68,6 @@ stages:
7568
displayName: vulture
7669
condition: always()
7770

78-
7971
- stage: Test
8072
condition: and(succeeded(), eq(dependencies.Check.outputs['Skip.result.start_main'], 'true'))
8173
dependsOn: ['Style', 'Check']
@@ -89,57 +81,50 @@ stages:
8981
DISPLAY: ':99'
9082
OPENBLAS_NUM_THREADS: '1'
9183
OMP_NUM_THREADS: '1'
92-
MNE_TEST_ALLOW_SKIP: '^.*(PySide6 causes segfaults).*$'
84+
MNE_TEST_ALLOW_SKIP: '^$' # nothing
9385
MNE_BROWSER_PRECOMPUTE: 'false'
9486
steps:
9587
- bash: |
96-
set -eo pipefail
88+
set -xeo pipefail
9789
./tools/setup_xvfb.sh
9890
sudo apt install -yq tcsh
99-
displayName: 'Install Ubuntu dependencies'
100-
- bash: |
101-
source tools/get_minimal_commands.sh
102-
displayName: 'Install minimal commands'
91+
displayName: Install Ubuntu dependencies
92+
- bash: ./tools/get_minimal_commands.sh
93+
displayName: Get minimal commands
10394
- bash: |
10495
echo $PATH
10596
mne_surf2bem --version
10697
fsl_rigid_register --version
107-
displayName: 'Test minimal commands'
98+
displayName: Test minimal commands
10899
- task: UsePythonVersion@0
109100
inputs:
110101
versionSpec: '3.12'
111102
architecture: 'x64'
112103
addToPath: true
113-
displayName: 'Get Python'
114104
- bash: |
115-
set -eo pipefail
105+
set -xeo pipefail
116106
python -m pip install --progress-bar off --upgrade pip
117-
python -m pip install --progress-bar off "mne-qt-browser[opengl] @ git+https://github.com/mne-tools/mne-qt-browser.git" pyvista scikit-learn python-picard qtpy nibabel sphinx-gallery "PySide6!=6.8.0,!=6.8.0.1,!=6.8.1.1,!=6.9.1" pandas neo pymatreader antio defusedxml curryreader pymef
118-
python -m pip uninstall -yq mne
119-
python -m pip install --progress-bar off --upgrade -e . --group=test
120-
displayName: 'Install dependencies with pip'
107+
python -m pip install --progress-bar off --upgrade --only-binary=":all:" -e . --group=test "mne-qt-browser @ https://github.com/mne-tools/mne-qt-browser/archive/refs/heads/main.zip" pyvista scikit-learn python-picard qtpy nibabel sphinx-gallery "PySide6!=6.8.0,!=6.8.0.1,!=6.8.1.1,!=6.9.1" pandas neo pymatreader antio defusedxml curryreader pymef
108+
displayName: Install dependencies with pip
109+
- bash: ./tools/check_qt_import.sh PySide6
110+
displayName: Check Qt import
121111
- bash: |
122-
set -eo pipefail
112+
set -xeo pipefail
123113
mne sys_info -pd
124114
mne sys_info -pd | grep "qtpy .*(PySide6=.*)$"
125115
displayName: Print config
126-
- bash: |
127-
set -eo pipefail
128-
LD_DEBUG=libs python -c "from PySide6.QtWidgets import QApplication, QWidget; app = QApplication([]); import matplotlib; matplotlib.use('QtAgg'); import matplotlib.pyplot as plt; plt.figure()"
129-
- bash: source tools/get_testing_version.sh
130-
displayName: 'Get testing version'
116+
- bash: ./tools/get_testing_version.sh
117+
displayName: Get testing version
131118
- task: Cache@2
132119
inputs:
133120
key: $(testing_version)
134121
path: /home/vsts/mne_data
135-
displayName: 'Cache testing data'
136122
- bash: ./tools/github_actions_download.sh
137-
displayName: 'Get test data'
123+
displayName: Download testing data
138124
- script: pytest -m "ultraslowtest or pgtest" --tb=short --cov=mne --cov-report=xml -vv mne
139-
displayName: 'slow and mne-qt-browser tests'
140-
# Coverage
125+
displayName: slow and mne-qt-browser tests
141126
- bash: bash <(curl -s https://codecov.io/bash)
142-
displayName: 'Codecov'
127+
displayName: Codecov
143128
condition: succeededOrFailed()
144129

145130
- job: Linux_Qt_Bindings
@@ -148,59 +133,54 @@ stages:
148133
variables:
149134
DISPLAY: ':99'
150135
OPENBLAS_NUM_THREADS: '1'
151-
TEST_OPTIONS: "--tb=short --cov=mne --cov-report=xml --cov-append -vv mne/viz/_brain mne/viz/backends mne/viz/tests/test_evoked.py mne/gui mne/report"
152-
MNE_TEST_ALLOW_SKIP: '^.*(PySide6 causes segfaults).*$'
136+
TEST_OPTIONS: "--tb=short --cov=mne --cov-report=xml --cov-append -vv mne/gui mne/viz/_brain mne/viz/backends mne/viz/tests/test_evoked.py mne/report"
137+
MNE_TEST_ALLOW_SKIP: '^$' # nothing (can be overridden below)
153138
steps:
154139
- bash: ./tools/setup_xvfb.sh
155-
displayName: 'Install Ubuntu dependencies'
140+
displayName: Setup up Xvfb
156141
- task: UsePythonVersion@0
157142
inputs:
158-
versionSpec: '3.10'
143+
versionSpec: '3.14'
159144
architecture: 'x64'
160145
addToPath: true
161-
displayName: 'Get Python'
162146
- bash: |
163-
set -eo pipefail
147+
set -xeo pipefail
164148
python -m pip install --progress-bar off --upgrade pip
165-
python -m pip install --progress-bar off --upgrade --pre --only-binary=\"numpy,scipy,matplotlib,vtk\" numpy scipy matplotlib vtk
149+
python -m pip install --progress-bar off --upgrade --only-binary=":all:" -e .[full-pyside6] --group=test_extra "mne-qt-browser @ https://github.com/mne-tools/mne-qt-browser/archive/refs/heads/main.zip"
166150
python -c "import vtk"
167-
python -m pip install --progress-bar off --upgrade -ve .[full] --group=test_extra
168-
displayName: 'Install dependencies with pip'
151+
displayName: Install dependencies with pip
169152
- bash: |
170-
set -e
153+
set -xeo pipefail
171154
which mne
172155
mne sys_info -pd
173156
python ./tools/check_mne_location.py
174157
displayName: Print config
175-
- bash: source tools/get_testing_version.sh
176-
displayName: 'Get testing version'
158+
- bash: ./tools/get_testing_version.sh
159+
displayName: Get testing version
177160
- task: Cache@2
178161
inputs:
179162
key: $(testing_version)
180163
path: /home/vsts/mne_data
181-
displayName: 'Cache testing data'
182164
- bash: ./tools/github_actions_download.sh
183-
displayName: 'Get test data'
165+
displayName: Download testing data
166+
- bash: ./tools/check_qt_import.sh PySide6
167+
displayName: Check Qt import
184168
- bash: |
185-
set -eo pipefail
186-
python -m pip install PyQt6
187-
LD_DEBUG=libs python -c "from PyQt6.QtWidgets import QApplication, QWidget; app = QApplication([]); import matplotlib; matplotlib.use('QtAgg'); import matplotlib.pyplot as plt; plt.figure()"
188-
displayName: 'Check Qt import'
169+
set -xeo pipefail
170+
mne sys_info -pd
171+
mne sys_info -pd | grep "qtpy .* (PySide6=.*)$"
172+
export MNE_TEST_ALLOW_SKIP="^.*PySide6 causes segfaults.*$"
173+
PYTEST_QT_API=PySide6 pytest -m "not ultraslowtest" ${TEST_OPTIONS}
174+
python -m pip uninstall -yq PySide6
175+
displayName: PySide6
189176
- bash: |
190-
set -eo pipefail
177+
set -xeo pipefail
178+
python -m pip install PyQt6
191179
mne sys_info -pd
192180
mne sys_info -pd | grep "qtpy .* (PyQt6=.*)$"
193181
PYTEST_QT_API=PyQt6 pytest -m "not ultraslowtest" ${TEST_OPTIONS}
194182
python -m pip uninstall -yq PyQt6 PyQt6-sip PyQt6-Qt6
195-
displayName: 'PyQt6'
196-
- bash: |
197-
set -eo pipefail
198-
python -m pip install "PySide6!=6.8.0,!=6.8.0.1,!=6.9.1"
199-
mne sys_info -pd
200-
mne sys_info -pd | grep "qtpy .* (PySide6=.*)$"
201-
PYTEST_QT_API=PySide6 pytest -m "not ultraslowtest" ${TEST_OPTIONS}
202-
python -m pip uninstall -yq PySide6
203-
displayName: 'PySide6'
183+
displayName: PyQt6
204184
# PyQt5 leaves cruft behind, so run it last
205185
- bash: |
206186
set -eo pipefail
@@ -209,10 +189,9 @@ stages:
209189
mne sys_info -pd | grep "qtpy .* (PyQt5=.*)$"
210190
PYTEST_QT_API=PyQt5 pytest -m "not ultraslowtest" ${TEST_OPTIONS}
211191
python -m pip uninstall -yq PyQt5 PyQt5-sip PyQt5-Qt5
212-
displayName: 'PyQt5'
213-
# Coverage
192+
displayName: PyQt5
214193
- bash: bash <(curl -s https://codecov.io/bash)
215-
displayName: 'Codecov'
194+
displayName: Codecov
216195
condition: succeededOrFailed()
217196

218197
- job: Windows
@@ -224,53 +203,51 @@ stages:
224203
OPENBLAS_NUM_THREADS: '2'
225204
OMP_DYNAMIC: 'false'
226205
PYTHONUNBUFFERED: 1
227-
PYTHONIOENCODING: 'utf-8'
228206
AZURE_CI_WINDOWS: 'true'
229-
PYTHON_ARCH: 'x64'
230207
MNE_CI_KIND: $(TEST_MODE)
208+
MNE_TEST_ALLOW_SKIP: $(MNE_TEST_ALLOW_SKIP)
231209
timeoutInMinutes: 95
232210
strategy:
233211
maxParallel: 4
234212
matrix:
235213
3.11 pip:
236214
TEST_MODE: 'pip'
237215
PYTHON_VERSION: '3.11'
216+
MNE_TEST_ALLOW_SKIP: "^.*(Requires MNE-C|CUDA not| on Windows|MNE_FORCE_SERIAL|PySide6 causes segfaults).*$"
238217
3.13 pip pre:
239218
TEST_MODE: 'pip-pre'
240219
PYTHON_VERSION: '3.13'
220+
MNE_TEST_ALLOW_SKIP: "^.*(Requires (spm|brainstorm) dataset|Requires MNE-C|CUDA not|Numba not| on Windows|MNE_FORCE_SERIAL|PySide6 causes segfaults).*$"
241221
steps:
242222
- task: UsePythonVersion@0
243223
inputs:
244224
versionSpec: $(PYTHON_VERSION)
245-
architecture: $(PYTHON_ARCH)
225+
architecture: 'x64'
246226
addToPath: true
247-
displayName: 'Get Python'
248227
- bash: |
249-
set -eo pipefail
228+
set -xeo pipefail
250229
git clone --depth 1 https://github.com/pyvista/setup-headless-display-action.git
251230
MESA3D_VERSION=24.3.0 bash setup-headless-display-action/windows/install_opengl.sh
252231
displayName: Install OpenGL
253232
- bash: ./tools/azure_dependencies.sh
254-
displayName: Install dependencies with pip
255-
- script: pip install -e .
256-
displayName: 'Install MNE-Python dev'
233+
- script: pip install --only-binary=":all:" -e .
234+
displayName: Install mne
257235
- script: mne sys_info -pd
258-
displayName: 'Print config'
236+
displayName: Print config
259237
- script: python -c "import numpy; numpy.show_config()"
260238
displayName: Print NumPy config
261239
- script: python -c "import numpy; import scipy.linalg; import sklearn.neighbors; from threadpoolctl import threadpool_info; from pprint import pprint; pprint(threadpool_info())"
262240
displayName: Print threadpoolctl info
263-
- bash: source tools/get_testing_version.sh
264-
displayName: 'Get testing version'
241+
- bash: ./tools/get_testing_version.sh
265242
- task: Cache@2
266243
inputs:
267244
key: $(testing_version)
268245
path: C:\Users\VssAdministrator\mne_data
269-
displayName: 'Cache testing data'
246+
displayName: Cache testing data
270247
- bash: ./tools/github_actions_download.sh
271-
displayName: 'Get test data'
248+
displayName: Download testing data
272249
- script: pytest -m "not (slowtest or pgtest)" --tb=short --cov=mne --cov-report=xml -vv mne
273-
displayName: 'Run tests'
250+
displayName: Run tests
274251
- bash: bash <(curl -s https://codecov.io/bash)
275-
displayName: 'Codecov'
252+
displayName: Codecov
276253
condition: succeededOrFailed()

doc/changes/dev/13813.other.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Adding checks in :func:`mne.stats.permutation_t_test()` to warn the user when provided with bad input values, by `Himanshu Mahor`_.

doc/changes/dev/13891.other.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed the ``fun`` shape description in :meth:`mne.Epochs.apply_function`'s docstring, by :newcontrib:`Bhargav Kowshik`.

doc/changes/dev/13894.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix bug where ``picks`` was ignored in :meth:`mne.Epochs.apply_function` when ``channel_wise=False``, by `Thomas Binns`_.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Updated minimum for:
2+
3+
- Core dependency ``matplotlib >= 3.9``
4+
5+
Changes implemented via CI action created by `Thomas Binns`_.

doc/changes/names.inc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
.. _Beige Jin: https://github.com/BeiGeJin
4141
.. _Ben Beasley: https://github.com/musicinmybrain
4242
.. _Benedikt Ehinger: https://www.benediktehinger.de
43+
.. _Bhargav Kowshik: https://github.com/bkowshik
4344
.. _Bradley Voytek: https://github.com/voytek
4445
.. _Britta Westner: https://britta-wstnr.github.io
4546
.. _Bruno Aristimunha: https://bruaristimunha.github.io

doc/development/contributing.rst

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -587,12 +587,14 @@ deprecation period when the stated release is being prepared:
587587
parameter, and (if found) update them to use the new function / parameter.
588588

589589

590+
.. _`changelog-guide`:
591+
590592
Describe your changes in the changelog
591593
--------------------------------------
592594

593-
Include in your changeset a brief description of the change in the
594-
:ref:`changelog <whats_new>` using towncrier_ format, which aggregates small,
595-
properly-named ``.rst`` files to create a changelog. This can be
595+
Include in your changeset a brief description of the changes, which will appear in the
596+
:ref:`changelog <whats_new>`, using towncrier_ format. This aggregates small,
597+
properly named ``.rst`` files to create a changelog. This can be
596598
skipped for very minor changes like correcting typos in the documentation.
597599

598600
There are six separate sections for changes, based on change type.
@@ -1024,8 +1026,9 @@ down the road. Here are the guidelines:
10241026
you are specifically asked by a maintainer to PR into another branch (e.g.,
10251027
for backports or maintenance bugfixes to the current stable version).
10261028

1027-
- Don't forget to include in your PR a brief description of the change in the
1028-
:ref:`changelog <whats_new>` (:file:`doc/whats_new.rst`).
1029+
- Don't forget to include in your PR a brief description of the change in a
1030+
changelog entry (see :ref:`the changelog section <changelog-guide>` above
1031+
for instructions).
10291032

10301033
- Our community uses the following commit tags and conventions:
10311034

0 commit comments

Comments
 (0)