Skip to content

Commit db2f895

Browse files
committed
Bump minimum Python to 3.10
1 parent e5225b4 commit db2f895

29 files changed

+77
-127
lines changed

.circleci/config.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,9 @@ commands:
216216
#
217217

218218
jobs:
219-
docs-python39:
219+
docs-python310:
220220
docker:
221-
- image: cimg/python:3.9
221+
- image: cimg/python:3.10
222222
resource_class: large
223223
steps:
224224
- checkout
@@ -259,4 +259,4 @@ workflows:
259259
jobs:
260260
# NOTE: If you rename this job, then you must update the `if` condition
261261
# and `circleci-jobs` option in `.github/workflows/circleci.yml`.
262-
- docs-python39
262+
- docs-python310

.github/workflows/cibuildwheel.yml

+3-11
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ jobs:
4646
- uses: actions/setup-python@v5
4747
name: Install Python
4848
with:
49-
python-version: 3.9
49+
python-version: '3.10'
5050

5151
# Something changed somewhere that prevents the downloaded-at-build-time
5252
# licenses from being included in built wheels, so pre-download them so
@@ -158,22 +158,14 @@ jobs:
158158
CIBW_BUILD: "cp310-*"
159159
CIBW_ARCHS: ${{ matrix.cibw_archs }}
160160

161-
- name: Build wheels for CPython 3.9
162-
uses: pypa/cibuildwheel@7e5a838a63ac8128d71ab2dfd99e4634dd1bca09 # v2.19.2
163-
with:
164-
package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }}
165-
env:
166-
CIBW_BUILD: "cp39-*"
167-
CIBW_ARCHS: ${{ matrix.cibw_archs }}
168-
169161
- name: Build wheels for PyPy
170162
uses: pypa/cibuildwheel@7e5a838a63ac8128d71ab2dfd99e4634dd1bca09 # v2.19.2
171163
with:
172164
package-dir: dist/${{ needs.build_sdist.outputs.SDIST_NAME }}
173165
env:
174-
CIBW_BUILD: "pp39-*"
166+
CIBW_BUILD: "pp310-*"
175167
CIBW_ARCHS: ${{ matrix.cibw_archs }}
176-
if: matrix.cibw_archs != 'aarch64'
168+
if: matrix.cibw_archs != 'aarch64' && matrix.os != 'windows-latest'
177169

178170
- uses: actions/upload-artifact@v4
179171
with:

.github/workflows/circleci.yml

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name: "CircleCI artifact handling"
33
on: [status]
44
jobs:
55
circleci_artifacts_redirector_job:
6-
if: "${{ github.event.context == 'ci/circleci: docs-python39' }}"
6+
if: "${{ github.event.context == 'ci/circleci: docs-python310' }}"
77
permissions:
88
statuses: write
99
runs-on: ubuntu-latest
@@ -16,11 +16,11 @@ jobs:
1616
repo-token: ${{ secrets.GITHUB_TOKEN }}
1717
api-token: ${{ secrets.CIRCLECI_TOKEN }}
1818
artifact-path: 0/doc/build/html/index.html
19-
circleci-jobs: docs-python39
19+
circleci-jobs: docs-python310
2020
job-title: View the built docs
2121

2222
post_warnings_as_review:
23-
if: "${{ github.event.context == 'ci/circleci: docs-python39' }}"
23+
if: "${{ github.event.context == 'ci/circleci: docs-python310' }}"
2424
permissions:
2525
contents: read
2626
checks: write

.github/workflows/cygwin.yml

+4-2
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,12 @@ jobs:
4949
test-cygwin:
5050
runs-on: windows-latest
5151
name: Python 3.${{ matrix.python-minor-version }} on Cygwin
52+
# Enable these when Cygwin has Python 3.12.
5253
if: >-
5354
github.event_name == 'workflow_dispatch' ||
54-
github.event_name == 'schedule' ||
55+
(false && github.event_name == 'schedule') ||
5556
(
57+
false &&
5658
github.repository == 'matplotlib/matplotlib' &&
5759
!contains(github.event.head_commit.message, '[ci skip]') &&
5860
!contains(github.event.head_commit.message, '[skip ci]') &&
@@ -72,7 +74,7 @@ jobs:
7274
)
7375
strategy:
7476
matrix:
75-
python-minor-version: [9]
77+
python-minor-version: [12]
7678

7779
steps:
7880
- name: Fix line endings

.github/workflows/mypy-stubtest.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ jobs:
1616
- name: Set up Python 3
1717
uses: actions/setup-python@v5
1818
with:
19-
python-version: 3.9
19+
python-version: '3.10'
2020

2121
- name: Set up reviewdog
2222
uses: reviewdog/action-setup@v1
@@ -30,7 +30,7 @@ jobs:
3030
run: |
3131
set -o pipefail
3232
tox -e stubtest | \
33-
sed -e "s!.tox/stubtest/lib/python3.9/site-packages!lib!g" | \
33+
sed -e "s!.tox/stubtest/lib/python3.10/site-packages!lib!g" | \
3434
reviewdog \
3535
-efm '%Eerror: %m' \
3636
-efm '%CStub: in file %f:%l' \

.github/workflows/reviewdog.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ jobs:
1717
- name: Set up Python 3
1818
uses: actions/setup-python@v5
1919
with:
20-
python-version: 3.9
20+
python-version: '3.10'
2121

2222
- name: Install flake8
2323
run: pip3 install -r requirements/testing/flake8.txt
@@ -42,7 +42,7 @@ jobs:
4242
- name: Set up Python 3
4343
uses: actions/setup-python@v5
4444
with:
45-
python-version: 3.9
45+
python-version: '3.10'
4646

4747
- name: Install mypy
4848
run: pip3 install -r requirements/testing/mypy.txt -r requirements/testing/all.txt

.github/workflows/tests.yml

+14-17
Original file line numberDiff line numberDiff line change
@@ -50,31 +50,28 @@ jobs:
5050
include:
5151
- name-suffix: "(Minimum Versions)"
5252
os: ubuntu-20.04
53-
python-version: 3.9
53+
python-version: '3.10'
5454
extra-requirements: '-c requirements/testing/minver.txt'
55-
pyqt5-ver: '==5.12.2 sip==5.0.0' # oldest versions with a Py3.9 wheel.
56-
pyqt6-ver: '==6.1.0 PyQt6-Qt6==6.1.0'
57-
pyside2-ver: '==5.15.1' # oldest version with working Py3.9 wheel.
58-
pyside6-ver: '==6.0.0'
5955
delete-font-cache: true
56+
# Oldest versions with Py3.10 wheels.
57+
pyqt5-ver: '==5.15.5 sip==6.3.0'
58+
pyqt6-ver: '==6.2.0 PyQt6-Qt6==6.2.0'
59+
pyside2-ver: '==5.15.2.1'
60+
pyside6-ver: '==6.2.0'
6061
- os: ubuntu-20.04
61-
python-version: 3.9
62+
python-version: '3.10'
6263
# One CI run tests ipython/matplotlib-inline before backend mapping moved to mpl
63-
extra-requirements: '-r requirements/testing/extra.txt "ipython==7.19" "matplotlib-inline<0.1.7"'
64+
extra-requirements:
65+
-r requirements/testing/extra.txt
66+
"ipython==7.29.0"
67+
"ipykernel==5.5.6"
68+
"matplotlib-inline<0.1.7"
6469
CFLAGS: "-fno-lto" # Ensure that disabling LTO works.
6570
# https://github.com/matplotlib/matplotlib/pull/26052#issuecomment-1574595954
6671
# https://www.riverbankcomputing.com/pipermail/pyqt/2023-November/045606.html
6772
pyqt6-ver: '!=6.5.1,!=6.6.0'
6873
# https://bugreports.qt.io/projects/PYSIDE/issues/PYSIDE-2346
6974
pyside6-ver: '!=6.5.1'
70-
- os: ubuntu-20.04
71-
python-version: '3.10'
72-
extra-requirements: '-r requirements/testing/extra.txt'
73-
# https://github.com/matplotlib/matplotlib/pull/26052#issuecomment-1574595954
74-
# https://www.riverbankcomputing.com/pipermail/pyqt/2023-November/045606.html
75-
pyqt6-ver: '!=6.5.1,!=6.6.0'
76-
# https://bugreports.qt.io/projects/PYSIDE/issues/PYSIDE-2346
77-
pyside6-ver: '!=6.5.1'
7875
- os: ubuntu-22.04
7976
python-version: '3.11'
8077
# https://www.riverbankcomputing.com/pipermail/pyqt/2023-November/045606.html
@@ -88,8 +85,8 @@ jobs:
8885
pyqt6-ver: '!=6.6.0'
8986
# https://bugreports.qt.io/projects/PYSIDE/issues/PYSIDE-2346
9087
pyside6-ver: '!=6.5.1'
91-
- os: macos-12 # This runnre is on Intel chips.
92-
python-version: 3.9
88+
- os: macos-12 # This runner is on Intel chips.
89+
python-version: '3.10'
9390
# https://bugreports.qt.io/projects/PYSIDE/issues/PYSIDE-2346
9491
pyside6-ver: '!=6.5.1'
9592
- os: macos-14 # This runner is on M1 (arm64) chips.

azure-pipelines.yml

+2-11
Original file line numberDiff line numberDiff line change
@@ -49,29 +49,20 @@ stages:
4949
- job: Pytest
5050
strategy:
5151
matrix:
52-
Linux_py39:
53-
vmImage: 'ubuntu-20.04' # keep one job pinned to the oldest image
54-
python.version: '3.9'
5552
Linux_py310:
56-
vmImage: 'ubuntu-latest'
53+
vmImage: 'ubuntu-20.04' # keep one job pinned to the oldest image
5754
python.version: '3.10'
5855
Linux_py311:
5956
vmImage: 'ubuntu-latest'
6057
python.version: '3.11'
61-
macOS_py39:
62-
vmImage: 'macOS-latest'
63-
python.version: '3.9'
6458
macOS_py310:
6559
vmImage: 'macOS-latest'
6660
python.version: '3.10'
6761
macOS_py311:
6862
vmImage: 'macOS-latest'
6963
python.version: '3.11'
70-
Windows_py39:
71-
vmImage: 'windows-2019' # keep one job pinned to the oldest image
72-
python.version: '3.9'
7364
Windows_py310:
74-
vmImage: 'windows-latest'
65+
vmImage: 'windows-2019' # keep one job pinned to the oldest image
7566
python.version: '3.10'
7667
Windows_py311:
7768
vmImage: 'windows-latest'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
Increase to minimum supported versions of dependencies
2+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
3+
4+
For Matplotlib 3.10, the :ref:`minimum supported versions <dependencies>` are
5+
being bumped:
6+
7+
+------------+-----------------+----------------+
8+
| Dependency | min in mpl3.9 | min in mpl3.10 |
9+
+============+=================+================+
10+
| Python | 3.9 | 3.10 |
11+
+------------+-----------------+----------------+
12+
13+
This is consistent with our :ref:`min_deps_policy` and `SPEC0
14+
<https://scientific-python.org/specs/spec-0000/>`__

doc/devel/testing.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ Using tox
252252

253253
`Tox <https://tox.readthedocs.io/en/latest/>`_ is a tool for running tests
254254
against multiple Python environments, including multiple versions of Python
255-
(e.g., 3.7, 3.8) and even different Python implementations altogether
255+
(e.g., 3.10, 3.11) and even different Python implementations altogether
256256
(e.g., CPython, PyPy, Jython, etc.), as long as all these versions are
257257
available on your system's $PATH (consider using your system package manager,
258258
e.g. apt-get, yum, or Homebrew, to install them).
@@ -269,7 +269,7 @@ You can also run tox on a subset of environments:
269269

270270
.. code-block:: bash
271271
272-
$ tox -e py38,py39
272+
$ tox -e py310,py311
273273
274274
Tox processes everything serially so it can take a long time to test
275275
several environments. To speed it up, you might try using a new,

doc/install/dependencies.rst

+1-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ When installing through a package manager like ``pip`` or ``conda``, the
2020
mandatory dependencies are automatically installed. This list is mainly for
2121
reference.
2222

23-
* `Python <https://www.python.org/downloads/>`_ (>= 3.9)
23+
* `Python <https://www.python.org/downloads/>`_ (>= 3.10)
2424
* `contourpy <https://pypi.org/project/contourpy/>`_ (>= 1.0.1)
2525
* `cycler <https://matplotlib.org/cycler/>`_ (>= 0.10.0)
2626
* `dateutil <https://pypi.org/project/python-dateutil/>`_ (>= 2.7)
@@ -30,8 +30,6 @@ reference.
3030
* `packaging <https://pypi.org/project/packaging/>`_ (>= 20.0)
3131
* `Pillow <https://pillow.readthedocs.io/en/latest/>`_ (>= 8.0)
3232
* `pyparsing <https://pypi.org/project/pyparsing/>`_ (>= 2.3.1)
33-
* `importlib-resources <https://pypi.org/project/importlib-resources/>`_
34-
(>= 3.2.0; only required on Python < 3.10)
3533

3634

3735
.. _optional_dependencies:

doc/install/index.rst

+2-2
Original file line numberDiff line numberDiff line change
@@ -267,9 +267,9 @@ at the Terminal.app command line::
267267

268268
You should see something like ::
269269

270-
3.6.0 /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/matplotlib/__init__.py
270+
3.10.0 /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/matplotlib/__init__.py
271271

272-
where ``3.6.0`` is the Matplotlib version you just installed, and the path
272+
where ``3.10.0`` is the Matplotlib version you just installed, and the path
273273
following depends on whether you are using Python.org Python, Homebrew or
274274
Macports. If you see another version, or you get an error like ::
275275

environment.yml

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ dependencies:
2424
- pygobject
2525
- pyparsing>=2.3.1
2626
- pyqt
27+
- python>=3.10
2728
- python-dateutil>=2.1
2829
- setuptools_scm
2930
- wxpython

galleries/users_explain/customizing.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -234,8 +234,8 @@ def plotting_function():
234234
#
235235
# 4. :file:`{INSTALL}/matplotlib/mpl-data/matplotlibrc`, where
236236
# :file:`{INSTALL}` is something like
237-
# :file:`/usr/lib/python3.9/site-packages` on Linux, and maybe
238-
# :file:`C:\\Python39\\Lib\\site-packages` on Windows. Every time you
237+
# :file:`/usr/lib/python3.10/site-packages` on Linux, and maybe
238+
# :file:`C:\\Python310\\Lib\\site-packages` on Windows. Every time you
239239
# install matplotlib, this file will be overwritten, so if you want
240240
# your customizations to be saved, please move this file to your
241241
# user-specific matplotlib directory.

lib/matplotlib/_api/__init__.pyi

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from collections.abc import Callable, Generator, Mapping, Sequence
22
from typing import Any, Iterable, TypeVar, overload
3+
from typing_extensions import Self # < Py 3.11
34

45
from numpy.typing import NDArray
56

@@ -25,9 +26,8 @@ class classproperty(Any):
2526
fdel: None = ...,
2627
doc: str | None = None,
2728
): ...
28-
# Replace return with Self when py3.9 is dropped
2929
@overload
30-
def __get__(self, instance: None, owner: None) -> classproperty: ...
30+
def __get__(self, instance: None, owner: None) -> Self: ...
3131
@overload
3232
def __get__(self, instance: object, owner: type[object]) -> Any: ...
3333
@property

lib/matplotlib/_api/deprecation.pyi

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
from collections.abc import Callable
22
import contextlib
3-
from typing import Any, TypedDict, TypeVar, overload
3+
from typing import Any, ParamSpec, TypedDict, TypeVar, overload
44
from typing_extensions import (
5-
ParamSpec, # < Py 3.10
65
Unpack, # < Py 3.11
76
)
87

lib/matplotlib/axis.pyi

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from collections.abc import Callable, Iterable, Sequence
22
import datetime
33
from typing import Any, Literal, overload
4+
from typing_extensions import Self # < Py 3.11
45

56
import numpy as np
67
from numpy.typing import ArrayLike
@@ -93,9 +94,8 @@ class Ticker:
9394

9495
class _LazyTickList:
9596
def __init__(self, major: bool) -> None: ...
96-
# Replace return with Self when py3.9 is dropped
9797
@overload
98-
def __get__(self, instance: None, owner: None) -> _LazyTickList: ...
98+
def __get__(self, instance: None, owner: None) -> Self: ...
9999
@overload
100100
def __get__(self, instance: Axis, owner: type[Axis]) -> list[Tick]: ...
101101

lib/matplotlib/backends/registry.py

+2-8
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,8 @@ def _read_entry_points(self):
132132
# [project.entry-points."matplotlib.backend"]
133133
# inline = "matplotlib_inline.backend_inline"
134134
import importlib.metadata as im
135-
import sys
136-
137-
# entry_points group keyword not available before Python 3.10
138-
group = "matplotlib.backend"
139-
if sys.version_info >= (3, 10):
140-
entry_points = im.entry_points(group=group)
141-
else:
142-
entry_points = im.entry_points().get(group, ())
135+
136+
entry_points = im.entry_points(group="matplotlib.backend")
143137
entries = [(entry.name, entry.value) for entry in entry_points]
144138

145139
# For backward compatibility, if matplotlib-inline and/or ipympl are installed

lib/matplotlib/dviread.pyi

+3-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ from enum import Enum
55
from collections.abc import Generator
66

77
from typing import NamedTuple
8+
from typing_extensions import Self # < Py 3.11
89

910
class _dvistate(Enum):
1011
pre: int
@@ -47,8 +48,7 @@ class Dvi:
4748
fonts: dict[int, DviFont]
4849
state: _dvistate
4950
def __init__(self, filename: str | os.PathLike, dpi: float | None) -> None: ...
50-
# Replace return with Self when py3.9 is dropped
51-
def __enter__(self) -> Dvi: ...
51+
def __enter__(self) -> Self: ...
5252
def __exit__(self, etype, evalue, etrace) -> None: ...
5353
def __iter__(self) -> Generator[Page, None, None]: ...
5454
def close(self) -> None: ...
@@ -83,8 +83,7 @@ class PsFont(NamedTuple):
8383
filename: str
8484

8585
class PsfontsMap:
86-
# Replace return with Self when py3.9 is dropped
87-
def __new__(cls, filename: str | os.PathLike) -> PsfontsMap: ...
86+
def __new__(cls, filename: str | os.PathLike) -> Self: ...
8887
def __getitem__(self, texname: bytes) -> PsFont: ...
8988

9089
def find_tex_file(filename: str | os.PathLike) -> str: ...

0 commit comments

Comments
 (0)