Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
665f9a5
placeholders
drammock Nov 14, 2025
5422e7a
use resolution:lowest-direct; pin 2 unpinned deps to ensure resolution
drammock Dec 19, 2025
ff35f56
install uv (and not micromamba) in old CI job
drammock Dec 19, 2025
9fc8487
don't set CONDA_ENV for old CI anymore
drammock Dec 19, 2025
7e0af0c
restore from lockfile when setting up old CI
drammock Dec 19, 2025
c5fb37c
elif
drammock Dec 19, 2025
e58a88e
Merge branch 'main' into old-ci
drammock Dec 19, 2025
7a342c6
update actions
drammock Dec 26, 2025
21eae2a
update dep pins to get uv export to actually work
drammock Dec 26, 2025
a736792
Merge branch 'main' into old-ci
tsbinns Jan 24, 2026
3a5bfe4
Pin to newer uv version
tsbinns Jan 24, 2026
316b8ad
Merge remote-tracking branch 'refs/remotes/drammock/old-ci' into old-ci
tsbinns Jan 24, 2026
b212272
Update ver tag
tsbinns Jan 24, 2026
2f5dbc9
Fix lock file name
tsbinns Jan 24, 2026
7688ec8
Add pip to venv
tsbinns Jan 24, 2026
85c20e9
Avoid empty groups arg
tsbinns Jan 24, 2026
3d34c08
Update deps from spec0
tsbinns Jan 24, 2026
e98514b
Update to lock file from export command
tsbinns Jan 24, 2026
431bc68
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jan 24, 2026
6e8845c
Return to uv pip compile command [ci skip]
tsbinns Jan 24, 2026
8a71e3d
Revert to lock file from export command [ci skip]
tsbinns Jan 24, 2026
be03ca5
Add extra dep pins
tsbinns Jan 25, 2026
32da34e
Add test group to lockfile
tsbinns Jan 25, 2026
22b9b71
Re-delete quantities in action
tsbinns Jan 25, 2026
fc3bf72
Move up venv activation
tsbinns Jan 25, 2026
04e60e6
Try have source activated
tsbinns Jan 25, 2026
c2485d1
Try have source activated
tsbinns Jan 25, 2026
4cfe966
Activate env in bash scripts
tsbinns Jan 25, 2026
8b94383
Update dep pins
tsbinns Jan 25, 2026
1b7be64
Add explicit PyQt5 to old test
tsbinns Jan 25, 2026
2371c90
Add dep pin
tsbinns Jan 25, 2026
a4c102f
Add dep pin
tsbinns Jan 25, 2026
63c3043
Use env var for Qt backend
tsbinns Jan 26, 2026
a501a75
Add h5py to test deps
tsbinns Jan 26, 2026
4d918b2
Merge branch 'main' into old-ci
tsbinns Jan 31, 2026
df7f3fa
Remove h5py from test deps
tsbinns Jan 31, 2026
6f19fe4
Remove environment_old.yml ver checks
tsbinns Jan 31, 2026
01f8d63
Upgrade pip version for minimal
tsbinns Jan 31, 2026
87dac63
Clean up old & minimal installation
tsbinns Jan 31, 2026
2c6d1e4
Upgrade pip version for minimal
tsbinns Jan 31, 2026
8395a68
Upgrade pip version for minimal
tsbinns Jan 31, 2026
29da1d2
Add Qt to minimal env
tsbinns Jan 31, 2026
f8ea7a7
Call shell scripts with source
tsbinns Jan 31, 2026
7e72395
Activate uv venv
tsbinns Jan 31, 2026
d0f6581
Try calling from bash after venv activation
tsbinns Jan 31, 2026
6cbd9c5
Restore venv activations within scripts
tsbinns Jan 31, 2026
c86482d
Bump min dep vers
tsbinns Jan 31, 2026
943dcb8
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jan 31, 2026
cd7799e
Bump min dep vers
tsbinns Jan 31, 2026
6b55620
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Jan 31, 2026
586f6a1
Token commit
tsbinns Jan 31, 2026
5ee1418
Token commit
tsbinns Jan 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion .github/workflows/spec_zero.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,11 @@ jobs:
python-version: '3.12'
- run: pip install packaging requests tomlkit
- run: python tools/dev/spec_zero_update_versions.py
- run: |
- name: Create lockfile for old CI
# uv pip compile requires setting the python version explicitly in the command :(
run: uv pip compile pyproject.toml --python "3.10" --python-platform "x86_64-unknown-linux-gnu" --group test --resolution lowest-direct --format pylock.toml --output-file tools/pylock.ci-old.toml
- name: check if files changed
run: |
git diff && git status --porcelain
if [[ $(git status --porcelain) ]]; then
echo "dirty=true" >> $GITHUB_OUTPUT
Expand Down
8 changes: 5 additions & 3 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,13 @@ jobs:
create-args: >-
python=${{ env.PYTHON_VERSION }}
-v
if: ${{ !startswith(matrix.kind, 'pip') }}
if: matrix.kind == 'conda' || matrix.kind == 'mamba'
timeout-minutes: 20
- run: bash ./tools/github_actions_dependencies.sh
- run: python ./tools/github_actions_check_old.py
- uses: astral-sh/setup-uv@v7
with:
version: ">=0.9"
if: matrix.kind == 'old'
- run: bash ./tools/github_actions_dependencies.sh
# Minimal commands on Linux (macOS stalls)
- run: bash ./tools/get_minimal_commands.sh
if: startswith(matrix.os, 'ubuntu') && matrix.kind != 'minimal' && matrix.kind != 'old'
Expand Down
22 changes: 11 additions & 11 deletions environment.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,32 +7,32 @@ dependencies:
- antio >=0.5.0
- curryreader >=0.1.2
- darkdetect
- decorator
- decorator >=5.1
- defusedxml
- dipy
- dipy >=0.8
- edfio >=0.4.10
- eeglabio
- filelock >=3.18.0
- h5io >=0.2.4
- h5py
- h5py >=2.4
- imageio >=2.6.1
- imageio-ffmpeg >=0.4.1
- ipyevents
- ipympl
- ipython !=8.7.0
- ipython >=2.0,!=8.7.0
- ipywidgets
- jinja2
- joblib
- jinja2 >=3.1
- joblib >=0.8
- jupyter
- lazy_loader >=0.3
- mamba
- matplotlib >=3.8
- mffpy >=0.5.7
- mne-qt-browser
- nibabel
- nibabel >=2.0
- nilearn
- nomkl
- numba
- numba >=0.35
- numpy >=1.26,<3
- openmeeg >=2.5.7
- packaging
Expand All @@ -45,7 +45,7 @@ dependencies:
- pymatreader
- PySide6 !=6.9.1
- python-neo
- python-picard
- python-picard >=0.4
- pyvista >=0.43
- pyvistaqt >=0.11
- qdarkstyle !=3.2.2
Expand All @@ -54,9 +54,9 @@ dependencies:
- scipy >=1.12
- sip
- snirf
- statsmodels
- statsmodels >=0.6
- threadpoolctl
- tqdm
- tqdm >=4.66
- traitlets
- trame
- trame-vtk
Expand Down
56 changes: 30 additions & 26 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
[build-system]
build-backend = "hatchling.build"
requires = ["hatch-vcs", "hatchling"]
requires = ["hatch-vcs", "hatchling >= 1.27"]

[dependency-groups]
dev = ["pip >= 25.1", "rcssmin", {include-group = "doc"}, {include-group = "test_extra"}]
dev = ["pip >= 25.1", "rcssmin >= 1.1", {include-group = "doc"}, {include-group = "test_extra"}]
# Dependencies for building the documentation
doc = [
"graphviz",
"intersphinx_registry >= 0.2405.27",
"ipython != 8.7.0", # also in "full-no-qt" and "test"
"memory_profiler",
"memory_profiler >= 0.16",
"mne-bids",
"mne-connectivity",
"mne-gui-addons",
"neo",
"numpydoc",
"openneuro-py",
"numpydoc >= 0.5",
"openneuro-py >= 2020.1",
"psutil",
"pydata_sphinx_theme >= 0.15.2",
"pygments >= 2.13",
Expand All @@ -24,7 +24,7 @@ doc = [
"pyxdf",
"pyzmq != 24.0.0",
"scikit-learn",
"seaborn != 0.11.2",
"seaborn >= 0.5, != 0.11.2",
"selenium >= 4.27.1",
"sphinx >= 6",
"sphinx-design",
Expand All @@ -36,21 +36,22 @@ doc = [
]
test = [
"codespell",
"ipython != 8.7.0", # for testing notebook backend; also in "full-no-qt" and "doc"
"mypy",
"numpydoc",
"ipython >= 8.20", # for testing notebook backend; also in "full-no-qt" and "doc"
"mypy >= 0.14",
"numpydoc >= 1.6",
"pillow >= 10.2",
"pre-commit",
"pytest >= 8.0",
"pytest-cov",
"pytest-qt",
"pytest-cov >= 4.1",
"pytest-qt >= 4.3",
"pytest-rerunfailures",
"pytest-timeout",
"ruff",
"pytest-timeout >= 2.2",
"ruff >= 0.1",
"toml-sort",
"tomli; python_version<'3.11'",
"twine",
"vulture",
"wheel",
"wheel >= 0.21",
]
# Dependencies for being able to run additional tests (rare/CIs/advanced devs)
# Changes here should be reflected in the mne/utils/config.py dev dependencies section
Expand All @@ -64,7 +65,7 @@ test_extra = [
"nbclient",
"nbformat",
"neo",
"nitime",
"nitime >= 0.7",
"pybv",
"snirf",
"sphinx-gallery",
Expand All @@ -90,15 +91,15 @@ classifiers = [
"Topic :: Software Development",
]
dependencies = [
"decorator",
"jinja2",
"decorator >= 5.1",
"jinja2 >= 3.1",
"lazy_loader >= 0.3",
"matplotlib >= 3.8", # released 2023-09-15, will become 3.9 on 2026-05-15
"numpy >= 1.26, < 3", # released 2023-09-16, will become 2.0 on 2026-06-16
"packaging",
"pooch >= 1.5",
"scipy >= 1.12", # released 2024-01-20, will become 1.13 on 2026-04-02
"tqdm",
"tqdm >= 4.66",
]
description = "MNE-Python project for MEG and EEG data analysis."
dynamic = ["version"]
Expand All @@ -117,6 +118,9 @@ maintainers = [{email = "dan@mccloy.info", name = "Dan McCloy"}]
name = "mne"
readme = {content-type = "text/x-rst", file = "README.rst"}
requires-python = ">= 3.10"
# ↑↑↑↑↑↑↑↑↑↑↑ when this changes, bump the `--python-version` in the `uv pip compile ...`
# command in `.github/workflows/spec_zero.yaml` (astral-sh/uv/#16333), and also the
# `--python` version in the `uv venv` command in `tools/github_actions_dependencies.sh`
scripts = {mne = "mne.commands.utils:main"}

[project.optional-dependencies]
Expand All @@ -133,42 +137,42 @@ full-no-qt = [
"curryreader >= 0.1.2",
"darkdetect",
"defusedxml",
"dipy",
"dipy >= 0.8",
"edfio >= 0.4.10",
"eeglabio",
"filelock >= 3.18.0",
"h5py",
"h5py >= 2.4",
"imageio >= 2.6.1",
"imageio-ffmpeg >= 0.4.1",
"ipyevents",
"ipympl",
"ipython != 8.7.0", # for notebook backend; also in "doc" and "test"
"ipython >= 2.0, != 8.7.0", # for notebook backend; also in "doc" and "test"
"ipywidgets",
"joblib",
"joblib >= 0.8",
"jupyter",
"mffpy >= 0.5.7",
"mne-qt-browser",
"mne[hdf5]",
"neo",
"nest-asyncio2",
"nibabel",
"nibabel >= 2.0",
"nilearn",
"numba",
"numba >= 0.35",
"openmeeg >= 2.5.7",
"pandas >= 2.2", # released 2024-01-20, will become 2.3 on 2027-06-05
"pillow", # for `Brain.save_image` and `mne.Report`
"pyarrow", # only needed to avoid a deprecation warning in pandas
"pybv",
"pyobjc-framework-Cocoa >= 5.2.0; platform_system == 'Darwin'",
"python-picard",
"python-picard >= 0.4",
"pyvista >= 0.43", # released 2023-12-07, will become 0.44 on 2026-07-07
"pyvistaqt >= 0.11", # released 2023-06-30, no newer version available
"qdarkstyle != 3.2.2",
"qtpy",
"scikit-learn >= 1.4", # released 2024-01-18, will become 1.5 on 2026-05-21
"sip",
"snirf",
"statsmodels",
"statsmodels >= 0.6",
"threadpoolctl",
"traitlets",
"trame",
Expand Down
4 changes: 4 additions & 0 deletions tools/check_qt_import.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
#!/bin/bash -ef

if [[ ${MNE_CI_KIND} == "old" ]]; then
source .venv/bin/activate
fi

if [[ "$1" == "" ]]; then
echo "Qt library must be provided as first argument"
exit 1
Expand Down
37 changes: 31 additions & 6 deletions tools/github_actions_dependencies.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ STD_ARGS="--progress-bar off --upgrade"
INSTALL_ARGS="-e"
if [ ! -z "$CONDA_ENV" ]; then
echo "Uninstalling MNE for CONDA_ENV=${CONDA_ENV}"
# This will fail if mne-base is not in the env (like in our minimial/old envs, so ||true them):
# This will fail if mne-base is not in the env (like in our minimal env, so ||true them):
echo "::group::Uninstalling MNE"
conda remove -c conda-forge --force -yq mne-base || true
python -m pip uninstall -y mne || true
Expand All @@ -16,15 +16,28 @@ if [ ! -z "$CONDA_ENV" ]; then
if [[ "${RUNNER_OS}" != "Windows" ]] && [[ "${CONDA_ENV}" != "environment_"* ]]; then
INSTALL_ARGS=""
fi
# If on minimal or old, just install testing deps
if [[ "${CONDA_ENV}" == *'environment_'* ]]; then
# If on minimal, just install testing deps
if [[ "${MNE_CI_KIND}" == "minimal" ]]; then
GROUP="test"
EXTRAS=""
STD_ARGS="--progress-bar off"
STD_ARGS="--progress-bar off ${MNE_QT_BACKEND}"
echo "::group::Upgrading pip installation"
python -m pip install --upgrade pip # upgrade pip to support --group
echo "::endgroup::"
else
GROUP="test_extra"
EXTRAS="[hdf5]"
fi
elif [[ "${MNE_CI_KIND}" == "old" ]]; then
GROUP="" # group "test" already included when pylock file generated
EXTRAS=""
STD_ARGS="--progress-bar off"
echo "::group::Syncing old environment dependencies from lockfile using uv"
uv venv --python 3.10
source .venv/bin/activate
uv pip sync ${SCRIPT_DIR}/pylock.ci-old.toml
uv pip install pip ${MNE_QT_BACKEND}
echo "::endgroup::"
elif [[ "${MNE_CI_KIND}" == "pip" ]]; then
GROUP="test_extra"
EXTRAS="[full-pyside6]"
Expand All @@ -36,13 +49,25 @@ else
EXTRAS=""
fi
echo ""

# until quantities releases...
if [[ "${MNE_CI_KIND}" != "old" ]]; then
STD_ARGS="$STD_ARGS git+https://github.com/python-quantities/python-quantities"
fi

echo "::group::Installing test dependencies using pip"
# Make sure we only pass non-empty groups argument
if [ -z "$GROUP" ]; then
GROUP_ARG=""
else
GROUP_ARG="--group=$GROUP"
fi

if [[ "${MNE_CI_KIND}" != "old" ]]; then
echo "::group::Installing test dependencies using pip"
else
echo "::group::Installing MNE in development mode using pip"
fi
set -x
python -m pip install $STD_ARGS $INSTALL_ARGS .$EXTRAS --group=$GROUP
python -m pip install $STD_ARGS $INSTALL_ARGS .$EXTRAS $GROUP_ARG
set +x
echo "::endgroup::"
4 changes: 4 additions & 0 deletions tools/github_actions_download.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
#!/bin/bash -ef

if [[ ${MNE_CI_KIND} == "old" ]]; then
source .venv/bin/activate
fi

if [ "${DEPS}" != "minimal" ]; then
python -c 'import mne; mne.datasets.testing.data_path(verbose=True)';
python -c "import mne; mne.datasets.misc.data_path(verbose=True)";
Expand Down
11 changes: 5 additions & 6 deletions tools/github_actions_env_vars.sh
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,13 @@ if [[ "$MNE_CI_KIND" == "pip"* ]]; then
else
echo "MNE_QT_BACKEND=PySide6" | tee -a $GITHUB_ENV
fi
elif [[ "$MNE_CI_KIND" == "old" ]]; then
echo "MNE_IGNORE_WARNINGS_IN_TESTS=true" | tee -a $GITHUB_ENV
echo "MNE_SKIP_NETWORK_TESTS=1" | tee -a $GITHUB_ENV
echo "MNE_QT_BACKEND=PyQt5" | tee -a $GITHUB_ENV
else # conda-like
echo "Setting conda env vars for $MNE_CI_KIND"
if [[ "$MNE_CI_KIND" == "old" ]]; then
echo "CONDA_ENV=tools/environment_old.yml" | tee -a $GITHUB_ENV
echo "MNE_IGNORE_WARNINGS_IN_TESTS=true" | tee -a $GITHUB_ENV
echo "MNE_SKIP_NETWORK_TESTS=1" | tee -a $GITHUB_ENV
echo "MNE_QT_BACKEND=PyQt5" | tee -a $GITHUB_ENV
elif [[ "$MNE_CI_KIND" == "minimal" ]]; then
if [[ "$MNE_CI_KIND" == "minimal" ]]; then
echo "CONDA_ENV=tools/environment_minimal.yml" | tee -a $GITHUB_ENV
echo "MNE_QT_BACKEND=PySide6" | tee -a $GITHUB_ENV
else # conda, mamba (use warning level for completeness)
Expand Down
4 changes: 4 additions & 0 deletions tools/github_actions_infos.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
#!/bin/bash -ef

if [[ ${MNE_CI_KIND} == "old" ]]; then
source .venv/bin/activate
fi

which mne
mne sys_info -pd
python -c "import numpy; numpy.show_config()"
3 changes: 3 additions & 0 deletions tools/github_actions_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@

set -eo pipefail

if [[ ${MNE_CI_KIND} == "old" ]]; then
source .venv/bin/activate
fi
if [[ "${CI_OS_NAME}" == "ubuntu"* ]]; then
CONDITION="not (ultraslowtest or pgtest)"
else # macOS or Windows
Expand Down
Loading