Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-pypiserver for
openSUSE:Factory checked in at 2026-03-11 20:52:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-pypiserver (Old)
and /work/SRC/openSUSE:Factory/.python-pypiserver.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-pypiserver"
Wed Mar 11 20:52:44 2026 rev:11 rq:1338092 version:2.4.1
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-pypiserver/python-pypiserver.changes
2026-01-26 12:34:58.002794970 +0100
+++
/work/SRC/openSUSE:Factory/.python-pypiserver.new.8177/python-pypiserver.changes
2026-03-11 20:53:32.109533520 +0100
@@ -1,0 +2,22 @@
+Tue Mar 3 19:06:31 UTC 2026 - Dirk Müller <[email protected]>
+
+- update to 2.4.1:
+ * MAINT: Remove unused import LooseVersion from
+ distutils.version
+ * MAINT: chore: move mypy config from setup.cfg to
+ pyproject.toml
+ * MAINT: fix: cgi import error for Python3.13+
+ * MAINT: Fix partially broken tests from PRs #662 &
+ #675
+ * MAINT: fix: small fix for mdformat
+ * MAINT: Remove support for Python 3.8 & 3.9
+ * MAINT: Merge pull request #672 from parmsib/patch-1
+ * FIX: Fix compatibility with twine 1.7.0
+ * MAINT: Merge branch 'main' into patch-1
+ * MAINT: chore: Update setuptools requirement from
+ <71.0.0,>=40.0 to >=40.0,<81.0.0 in /requirements
+ * MAINT: fix whitespace in help output
+ * MAINT: chore: Bump waitress from 2.1.2 to 3.0.1 in
+ /docker
+
+-------------------------------------------------------------------
Old:
----
pypiserver-2.4.0.tar.gz
New:
----
pypiserver-2.4.1.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-pypiserver.spec ++++++
--- /var/tmp/diff_new_pack.Q9BKhX/_old 2026-03-11 20:53:32.649555799 +0100
+++ /var/tmp/diff_new_pack.Q9BKhX/_new 2026-03-11 20:53:32.653555964 +0100
@@ -26,7 +26,7 @@
%endif
%{?sle15_python_module_pythons}
Name: python-pypiserver%{psuffix}
-Version: 2.4.0
+Version: 2.4.1
Release: 0
Summary: Minimal PyPI server for uploading & downloading packages with
pip/easy_install
License: MIT
++++++ pypiserver-2.4.0.tar.gz -> pypiserver-2.4.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/.github/workflows/ci.yml
new/pypiserver-2.4.1/.github/workflows/ci.yml
--- old/pypiserver-2.4.0/.github/workflows/ci.yml 2025-08-18
14:31:52.000000000 +0200
+++ new/pypiserver-2.4.1/.github/workflows/ci.yml 2026-02-10
23:43:43.000000000 +0100
@@ -13,7 +13,7 @@
pull_request:
env:
- LAST_SUPPORTED_PYTHON: "3.12"
+ LAST_SUPPORTED_PYTHON: "3.13"
jobs:
test-python:
@@ -23,19 +23,17 @@
matrix:
# make sure to align the `python-version`s in the Matrix with
env.LAST_SUPPORTED_PYTHON
python-version: [
- "3.8",
- "3.9",
"3.10",
- "pypy3.9",
"3.11",
"3.12",
+ "3.13",
"3.x", # make sure to test the current stable Python version
]
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v5
- name: Set up Python ${{ matrix.python-version }}
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v6
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
@@ -50,9 +48,9 @@
# support
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v6
with:
# Use the current version of Python
python-version: ${{ env.LAST_SUPPORTED_PYTHON }}
@@ -96,9 +94,9 @@
test-docker:
runs-on: "ubuntu-latest"
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v5
- name: Set up Python
- uses: actions/setup-python@v4
+ uses: actions/setup-python@v6
with:
# Use the current version of Python
python-version: ${{ env.LAST_SUPPORTED_PYTHON }}
@@ -128,8 +126,8 @@
needs:
- "tests"
steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v4
+ - uses: actions/checkout@v5
+ - uses: actions/setup-python@v6
with:
python-version: ${{ env.LAST_SUPPORTED_PYTHON }}
@@ -160,7 +158,7 @@
needs:
- "tests"
steps:
- - uses: "actions/checkout@v3"
+ - uses: actions/checkout@v5
- id: docker-metadata
uses: docker/metadata-action@v5
@@ -235,7 +233,7 @@
needs:
- "tests"
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v5
- uses: softprops/action-gh-release@v1
with:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/CHANGES.rst
new/pypiserver-2.4.1/CHANGES.rst
--- old/pypiserver-2.4.0/CHANGES.rst 2025-08-18 14:31:52.000000000 +0200
+++ new/pypiserver-2.4.1/CHANGES.rst 2026-02-10 23:43:43.000000000 +0100
@@ -4,6 +4,22 @@
3.0.0 (tbd)
-----------
+2.4.1 (2026-02-10)
+--------------------------
+
+- 9e5b9bb MAINT: Remove unused import LooseVersion from distutils.version
(#681)
+- 945e23e MAINT: chore: move mypy config from setup.cfg to pyproject.toml
(#664)
+- dc4dadb MAINT: fix: cgi import error for Python3.13+ (#663)
+- a5a715f MAINT: Fix partially broken tests from PRs #662 & #675 (#677)
+- 1828884 MAINT: fix: small fix for `mdformat`
+- ba381b1 MAINT: Remove support for Python 3.8 & 3.9 (#675)
+- 7148a5c MAINT: Merge pull request #672 from parmsib/patch-1
+- e0591a3 FIX: Fix compatibility with twine 1.7.0 (#662)
+- b5a67a8 MAINT: Merge branch 'main' into patch-1
+- 53f134c MAINT: chore: Update setuptools requirement from <71.0.0,>=40.0 to
>=40.0,<81.0.0 in /requirements (#671)
+- 7af665c MAINT: fix whitespace in help output
+- 58f7162 MAINT: chore: Bump waitress from 2.1.2 to 3.0.1 in /docker (#615)
+
2.4.0 (2025-08-18)
--------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/README.md
new/pypiserver-2.4.1/README.md
--- old/pypiserver-2.4.0/README.md 2025-08-18 14:31:52.000000000 +0200
+++ new/pypiserver-2.4.1/README.md 2026-02-10 23:43:43.000000000 +0100
@@ -3,15 +3,15 @@
# [**pypiserver - minimal PyPI server for use with
pip/easy_install**](#pypiserver)
[](https://pypi.org/project/pypiserver/)
-[](https://pypi.org/project/pypiserver/)
+[](https://pypi.org/project/pypiserver/)
[](https://github.com/pypiserver/pypiserver/actions/workflows/ci.yml)
[](https://raw.githubusercontent.com/pypiserver/pypiserver/main/LICENSE.txt)
[](https://hub.docker.com/r/pypiserver/pypiserver/tags)
| name | description
|
| :---------- |
:----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-| Version | 2.4.0
|
-| Date: | 2025-08-18
|
+| Version | 2.4.1
|
+| Date: | 2026-02-10
|
| Source | <https://github.com/pypiserver/pypiserver>
|
| PyPI | <https://pypi.org/project/pypiserver/>
|
| Tests | <https://github.com/pypiserver/pypiserver/actions>
|
@@ -94,7 +94,7 @@
## Quickstart Installation and Usage
> [!IMPORTANT]
-> **pypiserver** works with Python 3.8+ and PyPy3.
+> **pypiserver** works with Python 3.10+ and PyPy3.
<!-- -->
@@ -286,7 +286,7 @@
--welcome HTML_FILE Use the contents of HTML_FILE as a custom welcome
message on the home page.
--cache-control AGE Add "Cache-Control: max-age=AGE" header to package
- downloads. Pip 6+ requires this for caching.AGE is
+ downloads. Pip 6+ requires this for caching. AGE is
specified in seconds.
--log-req-frmt FORMAT
A format-string selecting Http-Request properties to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/docker/docker-requirements.txt
new/pypiserver-2.4.1/docker/docker-requirements.txt
--- old/pypiserver-2.4.0/docker/docker-requirements.txt 2025-08-18
14:31:52.000000000 +0200
+++ new/pypiserver-2.4.1/docker/docker-requirements.txt 2026-02-10
23:43:43.000000000 +0100
@@ -7,5 +7,5 @@
# If a user overrides args but does not override the server arg, we fall back
to
# whatever bottle chooses as a default. Since the wsgiref server is not
# production-ready, install waitress as a fallback for these cases.
-waitress==2.1.2
+waitress==3.0.1
watchdog==1.0.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/docker/test_docker.py
new/pypiserver-2.4.1/docker/test_docker.py
--- old/pypiserver-2.4.0/docker/test_docker.py 2025-08-18 14:31:52.000000000
+0200
+++ new/pypiserver-2.4.1/docker/test_docker.py 2026-02-10 23:43:43.000000000
+0100
@@ -15,7 +15,6 @@
import pypiserver
import pytest
-
PYPISERVER_PROCESS_NAME = "pypi-server"
TEST_DEMO_PIP_PACKAGE = "pypiserver-mypkg"
TEST_DEMO_HEAVY_PIP_PACKAGE = "pypiserver-mypkg-heavy"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/pypiserver/__init__.py
new/pypiserver-2.4.1/pypiserver/__init__.py
--- old/pypiserver-2.4.0/pypiserver/__init__.py 2025-08-18 14:31:52.000000000
+0200
+++ new/pypiserver-2.4.1/pypiserver/__init__.py 2026-02-10 23:43:43.000000000
+0100
@@ -7,9 +7,9 @@
from pypiserver.bottle_wrapper import Bottle
from pypiserver.config import Config, RunConfig, strtobool
-version = __version__ = "2.4.0"
+version = __version__ = "2.4.1"
__version_info__ = tuple(_re.split("[.-]", __version__))
-__updated__ = "2025-08-18 14:31:51"
+__updated__ = "2026-02-10 23:43:42"
__title__ = "pypiserver"
__summary__ = "A minimal PyPI server for use with pip/easy_install."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/pypiserver/_app.py
new/pypiserver-2.4.1/pypiserver/_app.py
--- old/pypiserver-2.4.0/pypiserver/_app.py 2025-08-18 14:31:52.000000000
+0200
+++ new/pypiserver-2.4.1/pypiserver/_app.py 2026-02-10 23:43:43.000000000
+0100
@@ -178,8 +178,15 @@
f"Cannot upload {uf.raw_filename!r} since it already exists!
\n"
" You may start server with `--overwrite` option. "
)
+
+ http_code = 409
+ # twine 1.7.0+ expects status 400 to match compatibility with
pypi.org
+ # see: https://github.com/pypa/twine/issues/1265
+ if "twine" in request.headers.get("User-Agent", ""):
+ http_code = 400
+
raise HTTPError(
- 409,
+ http_code,
f"Package {uf.raw_filename!r} already exists!\n"
" You may start server with `--overwrite` option.",
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/pypiserver/bottle_wrapper/bottle.py
new/pypiserver-2.4.1/pypiserver/bottle_wrapper/bottle.py
--- old/pypiserver-2.4.0/pypiserver/bottle_wrapper/bottle.py 2025-08-18
14:31:52.000000000 +0200
+++ new/pypiserver-2.4.1/pypiserver/bottle_wrapper/bottle.py 2026-02-10
23:43:43.000000000 +0100
@@ -35,7 +35,7 @@
if _cmd_options.server and _cmd_options.server.startswith('gevent'):
import gevent.monkey; gevent.monkey.patch_all()
-import base64, cgi, email.utils, functools, hmac, itertools, mimetypes,\
+import base64, email.utils, functools, hmac, itertools, mimetypes,\
os, re, subprocess, sys, tempfile, threading, time, warnings, hashlib
from datetime import date as datedate, datetime, timedelta
@@ -43,6 +43,9 @@
from traceback import format_exc, print_exc
from unicodedata import normalize
+try: import legacy_cgi as cgi
+except ImportError: # pragma: no cover
+ import cgi
try: from simplejson import dumps as json_dumps, loads as json_lds
except ImportError: # pragma: no cover
@@ -3806,4 +3809,4 @@
-# THE END
\ No newline at end of file
+# THE END
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/pypiserver/config.py
new/pypiserver-2.4.1/pypiserver/config.py
--- old/pypiserver-2.4.0/pypiserver/config.py 2025-08-18 14:31:52.000000000
+0200
+++ new/pypiserver-2.4.1/pypiserver/config.py 2026-02-10 23:43:43.000000000
+0100
@@ -489,7 +489,7 @@
type=int,
help=(
'Add "Cache-Control: max-age=AGE" header to package downloads. '
- "Pip 6+ requires this for caching."
+ "Pip 6+ requires this for caching. "
"AGE is specified in seconds."
),
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/pypiserver/manage.py
new/pypiserver-2.4.1/pypiserver/manage.py
--- old/pypiserver-2.4.0/pypiserver/manage.py 2025-08-18 14:31:52.000000000
+0200
+++ new/pypiserver-2.4.1/pypiserver/manage.py 2026-02-10 23:43:43.000000000
+0100
@@ -6,7 +6,6 @@
import json
import os
import sys
-from distutils.version import LooseVersion
from pathlib import Path
from subprocess import call
from urllib.error import URLError
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/pyproject.toml
new/pypiserver-2.4.1/pyproject.toml
--- old/pypiserver-2.4.0/pyproject.toml 2025-08-18 14:31:52.000000000 +0200
+++ new/pypiserver-2.4.1/pyproject.toml 2026-02-10 23:43:43.000000000 +0100
@@ -25,3 +25,23 @@
)
)
'''
+
+[tool.mypy]
+check_untyped_defs = true
+follow_imports = "silent"
+ignore_missing_imports = true
+show_column_numbers = true
+disallow_untyped_calls = true
+disallow_untyped_defs = true
+disallow_incomplete_defs = true
+disallow_untyped_decorators = true
+strict_optional = true
+warn_redundant_casts = true
+warn_unused_ignores = true
+
+[[tool.mypy.overrides]]
+module = [
+ 'tests.*',
+ 'test_docker.*',
+]
+disallow_untyped_decorators = false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/requirements/test-requirements.txt
new/pypiserver-2.4.1/requirements/test-requirements.txt
--- old/pypiserver-2.4.0/requirements/test-requirements.txt 2025-08-18
14:31:52.000000000 +0200
+++ new/pypiserver-2.4.1/requirements/test-requirements.txt 2026-02-10
23:43:43.000000000 +0100
@@ -4,12 +4,12 @@
passlib>=1.6
pytest>=6.2.2
pytest-cov
-setuptools>=40.0,<71.0.0
+setuptools>=40.0,<81.0.0
tox
twine
webtest
wheel>=0.25.0
-build>=1.2.0; python_version >= '3.8'
+build>=1.2.0; python_version >= '3.10'
mdformat-gfm
mdformat-frontmatter
mdformat-footnote
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/setup.cfg
new/pypiserver-2.4.1/setup.cfg
--- old/pypiserver-2.4.0/setup.cfg 2025-08-18 14:31:52.000000000 +0200
+++ new/pypiserver-2.4.1/setup.cfg 2026-02-10 23:43:43.000000000 +0100
@@ -11,22 +11,3 @@
max-line-length = 80
per-file-ignores =
**/__init__.py:F401
-
-[mypy]
-check_untyped_defs = True
-follow_imports = silent
-ignore_missing_imports = True
-show_column_numbers = True
-disallow_untyped_calls = True
-disallow_untyped_defs = True
-disallow_incomplete_defs = True
-disallow_untyped_decorators = True
-strict_optional = True
-warn_redundant_casts = True
-warn_unused_ignores = True
-
-[mypy-tests.*]
-disallow_untyped_decorators = False
-
-[mypy-test_docker.*]
-disallow_untyped_decorators = False
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/setup.py
new/pypiserver-2.4.1/setup.py
--- old/pypiserver-2.4.0/setup.py 2025-08-18 14:31:52.000000000 +0200
+++ new/pypiserver-2.4.1/setup.py 2026-02-10 23:43:43.000000000 +0100
@@ -11,7 +11,7 @@
"twine",
"passlib>=1.6",
"webtest",
- "build>=1.2.0;python_version>='3.8'",
+ "build>=1.2.0;python_version>='3.10'",
]
setup_requires = [
@@ -22,7 +22,8 @@
install_requires = [
"pip>=7",
"packaging>=23.2",
- "importlib_resources;python_version>'3.8' and python_version<'3.12'",
+ "importlib_resources;python_version>='3.10' and python_version<'3.12'",
+ "legacy-cgi; python_version>='3.13'",
]
@@ -54,7 +55,7 @@
version=get_version(),
packages=find_packages(include=["pypiserver", "pypiserver.*"]),
package_data={"pypiserver": ["welcome.html"]},
- python_requires=">=3.8",
+ python_requires=">=3.10",
install_requires=install_requires,
setup_requires=setup_requires,
extras_require={"passlib": ["passlib>=1.6"], "cache": ["watchdog"]},
@@ -77,11 +78,10 @@
"Operating System :: POSIX",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
- "Programming Language :: Python :: 3.8",
- "Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
+ "Programming Language :: Python :: 3.13",
"Programming Language :: Python :: Implementation :: CPython",
"Programming Language :: Python :: Implementation :: PyPy",
"Topic :: Software Development :: Build Tools",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/tests/test_app.py
new/pypiserver-2.4.1/tests/test_app.py
--- old/pypiserver-2.4.0/tests/test_app.py 2025-08-18 14:31:52.000000000
+0200
+++ new/pypiserver-2.4.1/tests/test_app.py 2026-02-10 23:43:43.000000000
+0100
@@ -542,6 +542,21 @@
assert "Package 'foo_bar-1.0.tar.gz' already exists!" in
unescape(resp.text)
+def test_upload_conflict_on_existing_for_twine_compatibility(root, testapp):
+ package = "foo_bar-1.0.tar.gz"
+ root.join("foo_bar-1.0.tar.gz").write("")
+
+ resp = testapp.post(
+ "/",
+ params={":action": "file_upload"},
+ upload_files=[("content", package, b"")],
+ headers={"User-Agent": "twine"},
+ status=400,
+ )
+ assert resp.status_int == 400
+ assert "Package 'foo_bar-1.0.tar.gz' already exists!" in
unescape(resp.text)
+
+
@pytest.mark.parametrize(
"package", [f[0] for f in files if f[1] and "/" not in f[0]]
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/tests/test_core.py
new/pypiserver-2.4.1/tests/test_core.py
--- old/pypiserver-2.4.0/tests/test_core.py 2025-08-18 14:31:52.000000000
+0200
+++ new/pypiserver-2.4.1/tests/test_core.py 2026-02-10 23:43:43.000000000
+0100
@@ -12,7 +12,6 @@
)
from tests.doubles import Namespace
-
## Enable logging to detect any problems with it
##
__main__.init_logging()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/tests/test_init.py
new/pypiserver-2.4.1/tests/test_init.py
--- old/pypiserver-2.4.0/tests/test_init.py 2025-08-18 14:31:52.000000000
+0200
+++ new/pypiserver-2.4.1/tests/test_init.py 2026-02-10 23:43:43.000000000
+0100
@@ -10,7 +10,6 @@
# Third party imports
import pytest
-
# Local imports
import pypiserver
from pypiserver.config import Config
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/tests/test_server.py
new/pypiserver-2.4.1/tests/test_server.py
--- old/pypiserver-2.4.0/tests/test_server.py 2025-08-18 14:31:52.000000000
+0200
+++ new/pypiserver-2.4.1/tests/test_server.py 2026-02-10 23:43:43.000000000
+0100
@@ -11,6 +11,7 @@
- "new_server": starting a new server with any configurations on each test.
"""
+
import contextlib
import itertools
import os
@@ -145,7 +146,7 @@
@pytest.fixture(scope="module")
def wheel_file(project, tmp_path_factory):
distdir = tmp_path_factory.mktemp("dist")
- if re.match("^3\.7", sys.version):
+ if re.match(r"^3\.7", sys.version):
assert run_setup_py(project, f"bdist_wheel -d {distdir}") == 0
else:
assert (
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/pypiserver-2.4.0/tox.ini new/pypiserver-2.4.1/tox.ini
--- old/pypiserver-2.4.0/tox.ini 2025-08-18 14:31:52.000000000 +0200
+++ new/pypiserver-2.4.1/tox.ini 2026-02-10 23:43:43.000000000 +0100
@@ -1,5 +1,5 @@
[tox]
-envlist = py38, py39, py310, py311, py312, pypy3
+envlist = py310, py311, py312, py313, pypy3
[testenv]
deps=-r{toxinidir}/requirements/test.pip