Skip to content

Commit c8a663a

Browse files
authored
nep29: drop py39 and support py312 (#5894)
* nep29: drop py39 and support py312 * update lockfiles * update benchmark config * fix tests * tmp benchmark workaround * bm_runner workaround * revert benchmark workaround + whatsnew entry
1 parent 4296238 commit c8a663a

File tree

17 files changed

+83
-83
lines changed

17 files changed

+83
-83
lines changed

Diff for: .github/workflows/ci-tests.yml

+4-4
Original file line numberDiff line numberDiff line change
@@ -35,18 +35,18 @@ jobs:
3535
fail-fast: false
3636
matrix:
3737
os: ["ubuntu-latest"]
38-
python-version: ["3.11"]
38+
python-version: ["3.12"]
3939
session: ["doctest", "gallery", "linkcheck"]
4040
include:
4141
- os: "ubuntu-latest"
42-
python-version: "3.11"
42+
python-version: "3.12"
4343
session: "tests"
4444
coverage: "--coverage"
4545
- os: "ubuntu-latest"
46-
python-version: "3.10"
46+
python-version: "3.11"
4747
session: "tests"
4848
- os: "ubuntu-latest"
49-
python-version: "3.9"
49+
python-version: "3.10"
5050
session: "tests"
5151

5252
env:

Diff for: .github/workflows/ci-wheels.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ jobs:
5252
strategy:
5353
fail-fast: false
5454
matrix:
55-
python-version: ["3.9", "3.10", "3.11"]
55+
python-version: ["3.10", "3.11", "3.12"]
5656
session: ["wheel"]
5757
env:
5858
ENV_NAME: "ci-wheels"

Diff for: benchmarks/asv.conf.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
// * No build-time environment variables.
2424
// * Is run in the same environment as the ASV install itself.
2525
"delegated_env_commands": [
26-
"PY_VER=3.11 nox --envdir={conf_dir}/.asv/env/nox01 --session=tests --install-only --no-error-on-external-run --verbose"
26+
"PY_VER=3.12 nox --envdir={conf_dir}/.asv/env/nox01 --session=tests --install-only --no-error-on-external-run --verbose"
2727
],
2828
// The parent directory of the above environment.
2929
// The most recently modified environment in the directory will be used.

Diff for: benchmarks/bm_runner.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ def _check_requirements(package: str) -> None:
6767

6868
def _prep_data_gen_env() -> None:
6969
"""Create or access a separate, unchanging environment for generating test data."""
70-
python_version = "3.11"
70+
python_version = "3.12"
7171
data_gen_var = "DATA_GEN_PYTHON"
7272
if data_gen_var in environ:
7373
echo("Using existing data generation environment.")

Diff for: docs/src/whatsnew/latest.rst

+4-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ This document explains the changes made to Iris for this release
7979
🔗 Dependencies
8080
===============
8181

82-
#. N/A
82+
#. `@bjlittle`_ dropped support for ``py39`` and adopted support for ``py312`` as per
83+
the `NEP-29`_ schedule. (:pull:`5894`)
8384

8485

8586
📚 Documentation
@@ -105,6 +106,7 @@ This document explains the changes made to Iris for this release
105106

106107
#. `@jfrost-mo`_ enabled colour output for pytest on GitHub Actions. (:pull:`5895`)
107108

109+
108110
.. comment
109111
Whatsnew author names (@github name) in alphabetical order. Note that,
110112
core dev names are automatically included by the common_links.inc:
@@ -120,3 +122,4 @@ This document explains the changes made to Iris for this release
120122
.. _NPY002: https://docs.astral.sh/ruff/rules/numpy-legacy-random/
121123
.. _numpydoc validation: https://numpydoc.readthedocs.io/en/latest/validation.html#
122124
.. _Dask version 2024.2.1: https://docs.dask.org/en/stable/changelog.html#v2024-2-1
125+
.. _NEP-29: https://numpy.org/neps/nep-0029-deprecation_policy.html#drop-schedule

Diff for: lib/iris/tests/test_coding_standards.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ def test_python_versions():
6969
Test is designed to fail whenever Iris' supported Python versions are
7070
updated, insisting that versions are updated EVERYWHERE in-sync.
7171
"""
72-
latest_supported = "3.11"
73-
all_supported = ["3.9", "3.10", latest_supported]
72+
latest_supported = "3.12"
73+
all_supported = ["3.10", "3.11", latest_supported]
7474

7575
root_dir = Path(__file__).parents[3]
7676
workflows_dir = root_dir / ".github" / "workflows"

Diff for: lib/iris/tests/unit/common/metadata/test__NamedTupleMeta.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ def _members(self):
4545
self.assertEqual(self.names(Metadata.__bases__), expected)
4646
expected = ["Metadata", "object"]
4747
self.assertEqual(self.names(Metadata.__mro__), expected)
48-
emsg = "Can't instantiate abstract class .* with abstract method.* _members"
48+
emsg = "Can't instantiate abstract class"
4949
with self.assertRaisesRegex(TypeError, emsg):
5050
_ = Metadata()
5151

Diff for: lib/iris/tests/unit/coords/test_Coord.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1124,7 +1124,7 @@ def test_copy_coord(self, ignore_axis, copy_or_from, result, sample_coord):
11241124

11251125
class Test___init____abstractmethod(tests.IrisTest):
11261126
def test(self):
1127-
emsg = "Can't instantiate abstract class Coord with abstract method.* __init__"
1127+
emsg = "Can't instantiate abstract class Coord"
11281128
with self.assertRaisesRegex(TypeError, emsg):
11291129
_ = Coord(points=[0, 1])
11301130

Diff for: lib/iris/tests/unit/coords/test__DimensionalMetadata.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,7 @@
2828

2929
class Test___init____abstractmethod(tests.IrisTest):
3030
def test(self):
31-
emsg = (
32-
"Can't instantiate abstract class _DimensionalMetadata with "
33-
"abstract methods __init__"
34-
)
31+
emsg = "Can't instantiate abstract class _DimensionalMetadata"
3532
with self.assertRaisesRegex(TypeError, emsg):
3633
_ = _DimensionalMetadata(0)
3734

Diff for: lib/iris/tests/unit/experimental/ugrid/load/test_load_mesh.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ def test_calls_load_meshes(self):
2424
args = [("file_1", "file_2"), "my_var_name"]
2525
with PARSE_UGRID_ON_LOAD.context():
2626
_ = load_mesh(args)
27-
self.assertTrue(self.load_meshes_mock.called_with(args))
27+
assert self.load_meshes_mock.call_count == 1
28+
assert self.load_meshes_mock.call_args == ((args, None),)
2829

2930
def test_returns_mesh(self):
3031
with PARSE_UGRID_ON_LOAD.context():

Diff for: noxfile.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
nox.options.reuse_existing_virtualenvs = True
1616

1717
#: Python versions we can run sessions under
18-
_PY_VERSIONS_ALL = ["3.9", "3.10", "3.11"]
18+
_PY_VERSIONS_ALL = ["3.10", "3.11", "3.12"]
1919
_PY_VERSION_LATEST = _PY_VERSIONS_ALL[-1]
2020

2121
#: One specific python version for docs builds

Diff for: pyproject.toml

+2-3
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ classifiers = [
2222
"Operating System :: Unix",
2323
"Programming Language :: Python",
2424
"Programming Language :: Python :: 3 :: Only",
25-
"Programming Language :: Python :: 3.9",
2625
"Programming Language :: Python :: 3.10",
2726
"Programming Language :: Python :: 3.11",
27+
"Programming Language :: Python :: 3.12",
2828
"Programming Language :: Python :: Implementation :: CPython",
2929
"Topic :: Scientific/Engineering",
3030
"Topic :: Scientific/Engineering :: Atmospheric Science",
@@ -50,7 +50,7 @@ keywords = [
5050
]
5151
license = {text = "BSD-3-Clause"}
5252
name = "scitools-iris"
53-
requires-python = ">=3.9"
53+
requires-python = ">=3.10"
5454

5555
[project.urls]
5656
Code = "https://github.com/SciTools/iris"
@@ -73,7 +73,6 @@ src = [
7373
"lib",
7474
"docs/src",
7575
]
76-
target-version = "py39"
7776

7877
[tool.ruff.format]
7978
preview = false

Diff for: requirements/iris.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
py311.yml
1+
py312.yml

Diff for: requirements/locks/py310-linux-64.lock

+5-5
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda
2323
https://conda.anaconda.org/conda-forge/linux-64/aom-3.8.2-h59595ed_0.conda#625e1fed28a5139aed71b3a76117ef84
2424
https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00
2525
https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4
26-
https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.0-hd590300_0.conda#a6d86d33ddb84cde21de214cce563823
26+
https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f
2727
https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995
2828
https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97
2929
https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699
@@ -155,7 +155,7 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.con
155155
https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99
156156
https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_0.conda#4d155b600b63bc6ba89d91fab74238f8
157157
https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441
158-
https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py310hc6cd4ac_0.conda#987a8359726157c7a7cdd198f882f82d
158+
https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py310hc6cd4ac_0.conda#bd1d71ee240be36f1d85c86177d6964f
159159
https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d
160160
https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52
161161
https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py310hff52083_1.tar.bz2#21b8fa2179290505e607f5ccd65b01b0
@@ -192,7 +192,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#
192192
https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20
193193
https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976
194194
https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py310h2372a71_0.conda#bd19b3096442ea342c4a5208379660b1
195-
https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff
195+
https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088
196196
https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e
197197
https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f
198198
https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174
@@ -290,7 +290,7 @@ https://conda.anaconda.org/conda-forge/linux-64/aiohttp-3.9.3-py310h2372a71_1.co
290290
https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py310h1f7b6fc_0.conda#31beda75384647959d5792a1a7dc571a
291291
https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3
292292
https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py310hd41b1e2_0.conda#85d2aaa7af046528d339da1e813c3a9f
293-
https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda#52dd56ce3afa6a52c2f3d3116875ff32
293+
https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.0-pyhd8ed1ab_0.conda#291ae1e1179a934cfb7dfbbb802206d6
294294
https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a
295295
https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda#9472bfd206a2b7bb8143835e37667054
296296
https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda#c306fd9cc90c0585171167d09135a827
@@ -305,7 +305,7 @@ https://conda.anaconda.org/conda-forge/linux-64/scipy-1.12.0-py310hb13e2d6_2.con
305305
https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py310hc3e127f_0.conda#fbc825d13cbcb2d5d3fbba22c83fd203
306306
https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860
307307
https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py310h1f7b6fc_4.conda#0ca55ca20891d393846695354b32ebc5
308-
https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.1-pyhd8ed1ab_0.conda#b0ad5ef44595ef37c3008fc04ecd2abf
308+
https://conda.anaconda.org/conda-forge/noarch/distributed-2024.4.0-pyhd8ed1ab_0.conda#5085b4511ddca32d600783bed80a420f
309309
https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.0-nompi_h7b237b1_0.conda#a5f1925a75d9fcf0bffd07a194f83895
310310
https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h38e077a_106.conda#23fe0f8b47e7b5527bcc1dfb6087dba6
311311
https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c

Diff for: requirements/locks/py311-linux-64.lock

+5-5
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ https://conda.anaconda.org/conda-forge/linux-64/alsa-lib-1.2.11-hd590300_1.conda
2323
https://conda.anaconda.org/conda-forge/linux-64/aom-3.8.2-h59595ed_0.conda#625e1fed28a5139aed71b3a76117ef84
2424
https://conda.anaconda.org/conda-forge/linux-64/attr-2.5.1-h166bdaf_1.tar.bz2#d9c69a24ad678ffce24c6543a0176b00
2525
https://conda.anaconda.org/conda-forge/linux-64/bzip2-1.0.8-hd590300_5.conda#69b8b6202a07720f448be700e300ccf4
26-
https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.0-hd590300_0.conda#a6d86d33ddb84cde21de214cce563823
26+
https://conda.anaconda.org/conda-forge/linux-64/c-ares-1.28.1-hd590300_0.conda#dcde58ff9a1f30b0037a2315d1846d1f
2727
https://conda.anaconda.org/conda-forge/linux-64/dav1d-1.2.1-hd590300_0.conda#418c6ca5929a611cbd69204907a83995
2828
https://conda.anaconda.org/conda-forge/linux-64/double-conversion-3.3.0-h59595ed_0.conda#c2f83a5ddadadcdb08fe05863295ee97
2929
https://conda.anaconda.org/conda-forge/linux-64/eigen-3.4.0-h00ab1b0_0.conda#b1b879d6d093f55dd40d58b5eb2f0699
@@ -155,7 +155,7 @@ https://conda.anaconda.org/conda-forge/noarch/cloudpickle-3.0.0-pyhd8ed1ab_0.con
155155
https://conda.anaconda.org/conda-forge/noarch/colorama-0.4.6-pyhd8ed1ab_0.tar.bz2#3faab06a954c2a04039983f2c4a50d99
156156
https://conda.anaconda.org/conda-forge/noarch/colorcet-3.1.0-pyhd8ed1ab_0.conda#4d155b600b63bc6ba89d91fab74238f8
157157
https://conda.anaconda.org/conda-forge/noarch/cycler-0.12.1-pyhd8ed1ab_0.conda#5cd86562580f274031ede6aa6aa24441
158-
https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.9-py311hb755f60_0.conda#c49924051b8336f6031eb3d019619cba
158+
https://conda.anaconda.org/conda-forge/linux-64/cython-3.0.10-py311hb755f60_0.conda#f3a8a500a2e743ff92f418f0eaf9bf71
159159
https://conda.anaconda.org/conda-forge/linux-64/dbus-1.13.6-h5008d03_3.tar.bz2#ecfff944ba3960ecb334b9a2663d708d
160160
https://conda.anaconda.org/conda-forge/noarch/distlib-0.3.8-pyhd8ed1ab_0.conda#db16c66b759a64dc5183d69cc3745a52
161161
https://conda.anaconda.org/conda-forge/linux-64/docutils-0.19-py311h38be061_1.tar.bz2#599159b0740e9b82e7eef0e8471be3c2
@@ -192,7 +192,7 @@ https://conda.anaconda.org/conda-forge/noarch/packaging-24.0-pyhd8ed1ab_0.conda#
192192
https://conda.anaconda.org/conda-forge/noarch/platformdirs-4.2.0-pyhd8ed1ab_0.conda#a0bc3eec34b0fab84be6b2da94e98e20
193193
https://conda.anaconda.org/conda-forge/noarch/pluggy-1.4.0-pyhd8ed1ab_0.conda#139e9feb65187e916162917bb2484976
194194
https://conda.anaconda.org/conda-forge/linux-64/psutil-5.9.8-py311h459d7ec_0.conda#9bc62d25dcf64eec484974a3123c9d57
195-
https://conda.anaconda.org/conda-forge/noarch/pycparser-2.21-pyhd8ed1ab_0.tar.bz2#076becd9e05608f8dc72757d5f3a91ff
195+
https://conda.anaconda.org/conda-forge/noarch/pycparser-2.22-pyhd8ed1ab_0.conda#844d9eb3b43095b031874477f7d70088
196196
https://conda.anaconda.org/conda-forge/noarch/pygments-2.17.2-pyhd8ed1ab_0.conda#140a7f159396547e9799aa98f9f0742e
197197
https://conda.anaconda.org/conda-forge/noarch/pyparsing-3.1.2-pyhd8ed1ab_0.conda#b9a4dacf97241704529131a0dfc0494f
198198
https://conda.anaconda.org/conda-forge/noarch/pyshp-2.3.1-pyhd8ed1ab_0.tar.bz2#92a889dc236a5197612bc85bee6d7174
@@ -288,7 +288,7 @@ https://conda.anaconda.org/conda-forge/linux-64/ukkonen-1.0.1-py311h9547e67_4.co
288288
https://conda.anaconda.org/conda-forge/linux-64/cftime-1.6.3-py311h1f0f07a_0.conda#b7e6d52b39e199238c3400cafaabafb3
289289
https://conda.anaconda.org/conda-forge/noarch/colorspacious-1.1.2-pyh24bf2e0_0.tar.bz2#b73afa0d009a51cabd3ec99c4d2ef4f3
290290
https://conda.anaconda.org/conda-forge/linux-64/contourpy-1.2.0-py311h9547e67_0.conda#40828c5b36ef52433e21f89943e09f33
291-
https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.3.1-pyhd8ed1ab_0.conda#52dd56ce3afa6a52c2f3d3116875ff32
291+
https://conda.anaconda.org/conda-forge/noarch/dask-core-2024.4.0-pyhd8ed1ab_0.conda#291ae1e1179a934cfb7dfbbb802206d6
292292
https://conda.anaconda.org/conda-forge/linux-64/gst-plugins-base-1.22.9-h8e1006c_0.conda#614b81f8ed66c56b640faee7076ad14a
293293
https://conda.anaconda.org/conda-forge/noarch/identify-2.5.35-pyhd8ed1ab_0.conda#9472bfd206a2b7bb8143835e37667054
294294
https://conda.anaconda.org/conda-forge/linux-64/libass-0.17.1-h8fe9dca_1.conda#c306fd9cc90c0585171167d09135a827
@@ -304,7 +304,7 @@ https://conda.anaconda.org/conda-forge/linux-64/shapely-2.0.3-py311h2032efe_0.co
304304
https://conda.anaconda.org/conda-forge/noarch/sphinxcontrib-apidoc-0.3.0-py_1.tar.bz2#855b087883443abb10f5faf6eef40860
305305
https://conda.anaconda.org/conda-forge/noarch/wslink-1.12.4-pyhd8ed1ab_0.conda#9c8a6235a36aaf096be3118daba08a7b
306306
https://conda.anaconda.org/conda-forge/linux-64/cf-units-3.2.0-py311h1f0f07a_4.conda#1e105c1a8ea2163507726144b401eb1b
307-
https://conda.anaconda.org/conda-forge/noarch/distributed-2024.3.1-pyhd8ed1ab_0.conda#b0ad5ef44595ef37c3008fc04ecd2abf
307+
https://conda.anaconda.org/conda-forge/noarch/distributed-2024.4.0-pyhd8ed1ab_0.conda#5085b4511ddca32d600783bed80a420f
308308
https://conda.anaconda.org/conda-forge/linux-64/esmf-8.6.0-nompi_h7b237b1_0.conda#a5f1925a75d9fcf0bffd07a194f83895
309309
https://conda.anaconda.org/conda-forge/linux-64/ffmpeg-6.1.1-gpl_h38e077a_106.conda#23fe0f8b47e7b5527bcc1dfb6087dba6
310310
https://conda.anaconda.org/conda-forge/linux-64/gtk2-2.24.33-h280cfa0_4.conda#410f86e58e880dcc7b0e910a8e89c05c

0 commit comments

Comments
 (0)