diff --git a/.circleci/config.yml b/.circleci/config.yml index 40ba933cf0d9..94090783b764 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -103,10 +103,10 @@ commands: - run: name: Install Python dependencies command: | - python -m pip install --user -r requirements/dev/build-requirements.txt + python -m pip install --user --group build python -m pip install --user \ numpy<< parameters.numpy_version >> \ - -r requirements/doc/doc-requirements.txt + --group doc python -m pip install --no-deps --user \ git+https://github.com/matplotlib/mpl-sphinx-theme.git diff --git a/.github/workflows/cygwin.yml b/.github/workflows/cygwin.yml index 4a5b79c0538e..e807dd85288f 100644 --- a/.github/workflows/cygwin.yml +++ b/.github/workflows/cygwin.yml @@ -143,7 +143,7 @@ jobs: uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: path: C:\cygwin\home\runneradmin\.cache\pip - key: Cygwin-py3.${{ matrix.python-minor-version }}-pip-${{ hashFiles('requirements/*/*.txt') }} + key: Cygwin-py3.${{ matrix.python-minor-version }}-pip-${{ hashFiles('pyproject.toml') }} restore-keys: ${{ matrix.os }}-py3.${{ matrix.python-minor-version }}-pip- - name: Cache ccache @@ -174,15 +174,13 @@ jobs: - name: Install Python dependencies shell: bash.exe -eo pipefail -o igncr "{0}" run: | - python -m pip install --upgrade pip setuptools wheel + python -m pip install --group build python -m pip install kiwisolver 'numpy>=1.22,<1.26' pillow importlib_resources - grep -v -F -e psutil requirements/testing/all.txt >requirements_test.txt - python -m pip install meson-python pybind11 export PATH="/usr/local/bin:$PATH" python -m pip install --no-build-isolation 'contourpy>=1.0.1' python -m pip install --upgrade cycler fonttools \ packaging pyparsing python-dateutil setuptools-scm \ - -r requirements_test.txt sphinx ipython + --group test sphinx ipython python -m pip install --upgrade pycairo 'cairocffi>=0.8' PyGObject && python -c 'import gi; gi.require_version("Gtk", "3.0"); from gi.repository import Gtk' && echo 'PyGObject is available' || diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index c803fcc6ba38..acbc0e26fa26 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -51,7 +51,7 @@ jobs: python-version: '3.11' - name: Install mypy - run: pip3 install -r requirements/testing/mypy.txt -r requirements/testing/all.txt + run: pip3 install --group typing - name: Set up reviewdog uses: reviewdog/action-setup@e04ffabe3898a0af8d0fb1af00c188831c4b5893 # v1.3.9 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 911fa69ec38b..ac42f7a88907 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -50,12 +50,12 @@ jobs: - name-suffix: "(Minimum Versions)" os: ubuntu-22.04 python-version: '3.11' - extra-requirements: '-c requirements/testing/minver.txt' + extra-requirements: 'python -m pip install --upgrade $PRE --group test-minver' delete-font-cache: true - os: ubuntu-22.04 python-version: '3.11' CFLAGS: "-fno-lto" # Ensure that disabling LTO works. - extra-requirements: '-r requirements/testing/extra.txt' + extra-requirements: 'python -m pip install --upgrade $PRE --prefer-binary --group test-extra' - os: ubuntu-22.04-arm python-version: '3.12' - os: ubuntu-22.04 @@ -170,7 +170,7 @@ jobs: if: startsWith(runner.os, 'Linux') with: path: ~/.cache/pip - key: ${{ matrix.os }}-py${{ matrix.python-version }}-pip-${{ hashFiles('requirements/*/*.txt') }} + key: ${{ matrix.os }}-py${{ matrix.python-version }}-pip-${{ hashFiles('pyproject.toml') }} restore-keys: | ${{ matrix.os }}-py${{ matrix.python-version }}-pip- - name: Cache pip @@ -178,7 +178,7 @@ jobs: if: startsWith(runner.os, 'macOS') with: path: ~/Library/Caches/pip - key: ${{ matrix.os }}-py${{ matrix.python-version }}-pip-${{ hashFiles('requirements/*/*.txt') }} + key: ${{ matrix.os }}-py${{ matrix.python-version }}-pip-${{ hashFiles('pyproject.toml') }} restore-keys: | ${{ matrix.os }}-py${{ matrix.python-version }}-pip- - name: Cache ccache @@ -215,12 +215,8 @@ jobs: # Install dependencies from PyPI. # Preinstall build requirements to enable no-build-isolation builds. - python -m pip install --upgrade $PRE \ - 'contourpy>=1.0.1' cycler fonttools kiwisolver importlib_resources \ - packaging pillow 'pyparsing!=3.1.0' python-dateutil setuptools-scm \ - 'meson-python>=0.13.1' 'pybind11>=2.13.2' \ - -r requirements/testing/all.txt \ - ${{ matrix.extra-requirements }} + python -m pip install --upgrade $PRE --group build --group test + ${{ matrix.extra-requirements }} # Install optional dependencies from PyPI. # Sphinx is needed to run sphinxext tests diff --git a/azure-pipelines.yml b/azure-pipelines.yml index cc0fbce11377..df9aa7a2b60c 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -74,8 +74,9 @@ stages: - bash: | python -m pip install --upgrade pip - python -m pip install --upgrade -r requirements/dev/build-requirements.txt - python -m pip install -r requirements/testing/all.txt -r requirements/testing/extra.txt + python -m pip install --upgrade --group build + python -m pip install --group test + python -m pip install --prefer-binary --group test-extra displayName: 'Install dependencies with pip' - bash: | diff --git a/doc/devel/development_setup.rst b/doc/devel/development_setup.rst index 45b95e48e7ff..92fd8d622fac 100644 --- a/doc/devel/development_setup.rst +++ b/doc/devel/development_setup.rst @@ -177,7 +177,7 @@ setup. Install the Python dependencies with :: - pip install -r requirements/dev/dev-requirements.txt + pip install --group dev Remember to activate the environment whenever you start working on Matplotlib! diff --git a/doc/devel/release_guide.rst b/doc/devel/release_guide.rst index 0e0ebb98fd1d..460ac194bb4e 100644 --- a/doc/devel/release_guide.rst +++ b/doc/devel/release_guide.rst @@ -420,7 +420,7 @@ To build the documentation you must have the tagged version installed, but build the docs from the ``ver-doc`` branch. An easy way to arrange this is:: pip install matplotlib - pip install -r requirements/doc/doc-requirements.txt + pip install --group doc git checkout v3.7.0-doc git clean -xfd make -Cdoc O="-t release -j$(nproc)" html latexpdf LATEXMKOPTS="-silent -f" diff --git a/doc/install/dependencies.rst b/doc/install/dependencies.rst index 2a68672a3be0..0bd268e48931 100644 --- a/doc/install/dependencies.rst +++ b/doc/install/dependencies.rst @@ -396,17 +396,11 @@ Documentation dependencies Python ------ -The additional Python packages required to build the -:ref:`documentation ` are listed in -:file:`doc-requirements.txt` and can be installed using :: - - pip install -r requirements/doc/doc-requirements.txt - -The content of :file:`doc-requirements.txt` is also shown below: - -.. include:: ../../requirements/doc/doc-requirements.txt - :literal: +The additional Python packages required to build the :ref:`documentation +` are listed in :file:`pyproject.toml` and can be +installed using :: + pip install --group doc .. _doc-dependencies-external: diff --git a/pyproject.toml b/pyproject.toml index 84e0b774f06c..c2a996deb2fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,10 +24,9 @@ classifiers=[ # When updating the list of dependencies, add an api_changes/development # entry and also update the following places: +# - the `build` and `test-minver` dependency groups below # - lib/matplotlib/__init__.py (matplotlib._check_versions()) -# - requirements/testing/minver.txt # - doc/devel/dependencies.rst -# - .github/workflows/tests.yml # - environment.yml dependencies = [ "contourpy >= 1.0.1", @@ -42,20 +41,6 @@ dependencies = [ ] requires-python = ">=3.11" -[project.optional-dependencies] -# Should be a copy of the build dependencies below. -dev = [ - "meson-python>=0.13.1,<0.17.0", - "pybind11>=2.13.2,!=2.13.3", - "setuptools_scm>=7", - # Not required by us but setuptools_scm without a version, cso _if_ - # installed, then setuptools_scm 8 requires at least this version. - # Unfortunately, we can't do a sort of minimum-if-installed dependency, so - # we need to keep this for now until setuptools_scm _fully_ drops - # setuptools. - "setuptools>=64", -] - [project.urls] "Homepage" = "https://matplotlib.org" "Download" = "https://matplotlib.org/stable/install/index.html" @@ -67,13 +52,137 @@ dev = [ [build-system] build-backend = "mesonpy" -# Also keep in sync with optional dependencies above. +# Also keep in sync with dependency groups below. requires = [ "meson-python>=0.13.1,<0.17.0", "pybind11>=2.13.2,!=2.13.3", "setuptools_scm>=7", ] +[dependency-groups] +build = [ + # Should be the same as `[project] dependencies` above. + "contourpy >= 1.0.1", + "cycler >= 0.10", + "fonttools >= 4.22.0", + "kiwisolver >= 1.3.1", + "numpy >= 1.25", + "packaging >= 20.0", + "pillow >= 9", + "pyparsing >= 3", + "python-dateutil >= 2.7", + + # Should be the same as `[build-system] requires` above. + "meson-python>=0.13.1,<0.17.0", + "pybind11>=2.13.2,!=2.13.3", + "setuptools_scm>=7", + # Not required by us but setuptools_scm without a version, so _if_ + # installed, then setuptools_scm 8 requires at least this version. + # Unfortunately, we can't do a sort of minimum-if-installed dependency, so + # we need to keep this for now until setuptools_scm _fully_ drops + # setuptools. + "setuptools>=64", +] +dev = [ + {include-group = "build"}, + {include-group = "doc"}, + {include-group = "test"}, + {include-group = "test-extra"}, + "ruff", +] +# Requirements for building docs +# +# You will first need a matching Matplotlib installation +# e.g (from the Matplotlib root directory) +# pip install --group build --no-build-isolation --editable . +# +# Install the documentation requirements with: +# pip install --group doc +# +doc = [ + "sphinx>=5.1.0,!=6.1.2", + "colorspacious", + "ipython", + "ipywidgets", + "ipykernel", + "numpydoc>=1.0", + "pydata-sphinx-theme~=0.15.0", + "mpl-sphinx-theme~=3.9.0", + "pyyaml", + "PyStemmer", + "sphinxcontrib-svg2pdfconverter>=1.1.0", + "sphinxcontrib-video>=0.2.1", + "sphinx-copybutton", + "sphinx-design", + "sphinx-gallery[parallel]>=0.12.0", + "sphinx-tags>=0.4.0", +] + +# pip requirements for all the CI builds +test = [ + "black<24", + "certifi", + "coverage!=6.3", + "psutil; sys_platform != 'cygwin'", + "pytest!=4.6.0,!=5.4.0,!=8.1.0", + "pytest-cov", + "pytest-rerunfailures", + "pytest-timeout", + "pytest-xdist", + "pytest-xvfb", + "tornado", +] + +# Extra pip requirements +test-extra = [ + "ipykernel", + # jupyter/nbconvert#1970 for the 7.3 series exclusions + "nbconvert[execute]!=6.0.0,!=6.0.1,!=7.3.0,!=7.3.1", + "nbformat!=5.0.0,!=5.0.1", + "pandas!=0.25.0", + "pikepdf", + "pytz", + "pywin32; sys_platform == 'win32'", + "xarray", +] + +# Extra pip requirements for the minimum-version CI run +test-minver = [ + "contourpy==1.0.1", + "cycler==0.10", + "fonttools==4.22.0", + "importlib-resources==3.2.0", + "kiwisolver==1.3.2", + "meson-python==0.13.1", + "meson==1.1.0", + "numpy==1.25.0", + "packaging==20.0", + "pillow==9.0.1", + "pyparsing==3.0.0", + "pytest==7.0.0", + "python-dateutil==2.7", + # Test ipython/matplotlib-inline before backend mapping moved to mpl. + # This should be tested for a reasonably long transition period, + # but we will eventually remove the test when we no longer support + # ipython/matplotlib-inline versions from before the transition. + "ipython==7.29.0", + "ipykernel==5.5.6", + "matplotlib-inline<0.1.7", +] + +# Extra pip requirements for the GitHub Actions mypy build +typing = [ + "mypy>=1.9", + "typing-extensions>=4.6", + # Extra stubs distributed separately from the main pypi package + "pandas-stubs", + "types-pillow", + "types-python-dateutil", + "types-psutil", + "sphinx", + {include-group = "build"}, +] + [tool.meson-python.args] install = ['--tags=data,python-runtime,runtime'] diff --git a/requirements/dev/build-requirements.txt b/requirements/dev/build-requirements.txt deleted file mode 100644 index 4d2a098c3c4f..000000000000 --- a/requirements/dev/build-requirements.txt +++ /dev/null @@ -1,3 +0,0 @@ -pybind11>=2.13.2,!=2.13.3 -meson-python -setuptools-scm diff --git a/requirements/dev/dev-requirements.txt b/requirements/dev/dev-requirements.txt deleted file mode 100644 index 3208949ba0e8..000000000000 --- a/requirements/dev/dev-requirements.txt +++ /dev/null @@ -1,5 +0,0 @@ --r build-requirements.txt --r ../doc/doc-requirements.txt --r ../testing/all.txt --r ../testing/extra.txt -ruff diff --git a/requirements/doc/doc-requirements.txt b/requirements/doc/doc-requirements.txt deleted file mode 100644 index 77cb606130b0..000000000000 --- a/requirements/doc/doc-requirements.txt +++ /dev/null @@ -1,26 +0,0 @@ -# Requirements for building docs -# -# You will first need a matching Matplotlib installation -# e.g (from the Matplotlib root directory) -# pip install --no-build-isolation --editable .[dev] -# -# Install the documentation requirements with: -# pip install -r requirements/doc/doc-requirements.txt -# -sphinx>=5.1.0,!=6.1.2 -colorspacious -ipython -ipywidgets -ipykernel -numpydoc>=1.0 -packaging>=20 -pydata-sphinx-theme~=0.15.0 -mpl-sphinx-theme~=3.9.0 -pyyaml -PyStemmer -sphinxcontrib-svg2pdfconverter>=1.1.0 -sphinxcontrib-video>=0.2.1 -sphinx-copybutton -sphinx-design -sphinx-gallery[parallel]>=0.12.0 -sphinx-tags>=0.4.0 diff --git a/requirements/testing/all.txt b/requirements/testing/all.txt deleted file mode 100644 index e386924a9b67..000000000000 --- a/requirements/testing/all.txt +++ /dev/null @@ -1,13 +0,0 @@ -# pip requirements for all the CI builds - -black<24 -certifi -coverage!=6.3 -psutil -pytest!=4.6.0,!=5.4.0,!=8.1.0 -pytest-cov -pytest-rerunfailures -pytest-timeout -pytest-xdist -pytest-xvfb -tornado diff --git a/requirements/testing/extra.txt b/requirements/testing/extra.txt deleted file mode 100644 index e0d84d71c781..000000000000 --- a/requirements/testing/extra.txt +++ /dev/null @@ -1,12 +0,0 @@ -# Extra pip requirements - ---prefer-binary -ipykernel -# jupyter/nbconvert#1970 for the 7.3 series exclusions -nbconvert[execute]!=6.0.0,!=6.0.1,!=7.3.0,!=7.3.1 -nbformat!=5.0.0,!=5.0.1 -pandas!=0.25.0 -pikepdf -pytz -pywin32; sys.platform == 'win32' -xarray diff --git a/requirements/testing/minver.txt b/requirements/testing/minver.txt deleted file mode 100644 index ee55f6c7b1bf..000000000000 --- a/requirements/testing/minver.txt +++ /dev/null @@ -1,23 +0,0 @@ -# Extra pip requirements for the minimum-version CI run - -contourpy==1.0.1 -cycler==0.10 -fonttools==4.22.0 -importlib-resources==3.2.0 -kiwisolver==1.3.2 -meson-python==0.13.1 -meson==1.1.0 -numpy==1.25.0 -packaging==20.0 -pillow==9.0.1 -pyparsing==3.0.0 -pytest==7.0.0 -python-dateutil==2.7 - -# Test ipython/matplotlib-inline before backend mapping moved to mpl. -# This should be tested for a reasonably long transition period, -# but we will eventually remove the test when we no longer support -# ipython/matplotlib-inline versions from before the transition. -ipython==7.29.0 -ipykernel==5.5.6 -matplotlib-inline<0.1.7 diff --git a/requirements/testing/mypy.txt b/requirements/testing/mypy.txt deleted file mode 100644 index 343517263f40..000000000000 --- a/requirements/testing/mypy.txt +++ /dev/null @@ -1,26 +0,0 @@ -# Extra pip requirements for the GitHub Actions mypy build - -mypy>=1.9 -typing-extensions>=4.6 - -# Extra stubs distributed separately from the main pypi package -pandas-stubs -types-pillow -types-python-dateutil -types-psutil - -sphinx - -# Default requirements, included here because mpl itself does not -# need to be installed for mypy to run, but deps are needed -# and pip has no --deps-only install command -contourpy>=1.0.1 -cycler>=0.10 -fonttools>=4.22.0 -kiwisolver>=1.3.1 -packaging>=20.0 -pillow>=9 -pyparsing>=3 -python-dateutil>=2.7 -setuptools_scm>=7 -setuptools>=64 diff --git a/tox.ini b/tox.ini index 1d527a19ff52..d002a60432f6 100644 --- a/tox.ini +++ b/tox.ini @@ -33,6 +33,6 @@ changedir = {tox_root} commands = python tools/stubtest.py usedevelop = False -deps = - -r requirements/testing/mypy.txt - -r requirements/testing/all.txt +dependency_groups = + test + typing