diff --git a/.azure-pipelines/templates/jobs/extended-tests-jobs.yml b/.azure-pipelines/templates/jobs/extended-tests-jobs.yml index 5aa9fcb12..10d0de934 100644 --- a/.azure-pipelines/templates/jobs/extended-tests-jobs.yml +++ b/.azure-pipelines/templates/jobs/extended-tests-jobs.yml @@ -4,7 +4,7 @@ jobs: - name: IMAGE_NAME value: ubuntu-22.04 - name: PYTHON_VERSION - value: 3.13 + value: 3.14 - group: certbot-common strategy: matrix: @@ -14,6 +14,9 @@ jobs: linux-py312: PYTHON_VERSION: 3.12 TOXENV: py312 + linux-py313: + PYTHON_VERSION: 3.13 + TOXENV: py313 linux-isolated: TOXENV: 'isolated-acme,isolated-certbot,isolated-apache,isolated-cloudflare,isolated-digitalocean,isolated-dnsimple,isolated-dnsmadeeasy,isolated-gehirn,isolated-google,isolated-linode,isolated-luadns,isolated-nsone,isolated-ovh,isolated-rfc2136,isolated-route53,isolated-sakuracloud,isolated-nginx' linux-integration-certbot-oldest: @@ -31,7 +34,10 @@ jobs: linux-py312-integration: PYTHON_VERSION: 3.12 TOXENV: integration - # python 3.13 integration tests are not run here because they're run as + linux-py313-integration: + PYTHON_VERSION: 3.13 + TOXENV: integration + # python 3.14 integration tests are not run here because they're run as # part of the standard test suite nginx-compat: TOXENV: nginx_compat diff --git a/.azure-pipelines/templates/jobs/standard-tests-jobs.yml b/.azure-pipelines/templates/jobs/standard-tests-jobs.yml index b26333dd7..0902f04cd 100644 --- a/.azure-pipelines/templates/jobs/standard-tests-jobs.yml +++ b/.azure-pipelines/templates/jobs/standard-tests-jobs.yml @@ -1,7 +1,7 @@ jobs: - job: test variables: - PYTHON_VERSION: 3.13 + PYTHON_VERSION: 3.14 strategy: matrix: macos-cover: diff --git a/acme/pyproject.toml b/acme/pyproject.toml index be58bb516..8cea42102 100644 --- a/acme/pyproject.toml +++ b/acme/pyproject.toml @@ -21,6 +21,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", ] diff --git a/certbot-apache/pyproject.toml b/certbot-apache/pyproject.toml index 4dbcbdacc..b7e6ea821 100644 --- a/certbot-apache/pyproject.toml +++ b/certbot-apache/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-ci/pyproject.toml b/certbot-ci/pyproject.toml index b262aa3cf..ff4d04cea 100644 --- a/certbot-ci/pyproject.toml +++ b/certbot-ci/pyproject.toml @@ -20,6 +20,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", ] diff --git a/certbot-ci/src/certbot_integration_tests/.coveragerc b/certbot-ci/src/certbot_integration_tests/.coveragerc index 72f7c6adf..2916b8597 100644 --- a/certbot-ci/src/certbot_integration_tests/.coveragerc +++ b/certbot-ci/src/certbot_integration_tests/.coveragerc @@ -3,6 +3,8 @@ # the coverage: indeed, certbot is launched as a CLI from a subprocess. disable_warnings = module-not-imported,no-data-collected omit = **/*_test.py,**/tests/*,**/dns_common*,**/certbot_nginx/_internal/parser_obj.py +patch = subprocess +parallel = True [report] # Exclude unit tests in coverage during integration tests. diff --git a/certbot-compatibility-test/pyproject.toml b/certbot-compatibility-test/pyproject.toml index ae9faa2a9..fe21a27d6 100644 --- a/certbot-compatibility-test/pyproject.toml +++ b/certbot-compatibility-test/pyproject.toml @@ -21,6 +21,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", ] diff --git a/certbot-dns-cloudflare/pyproject.toml b/certbot-dns-cloudflare/pyproject.toml index e842c851f..59d3a72b8 100644 --- a/certbot-dns-cloudflare/pyproject.toml +++ b/certbot-dns-cloudflare/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-digitalocean/pyproject.toml b/certbot-dns-digitalocean/pyproject.toml index 3770bd742..adf97d33b 100644 --- a/certbot-dns-digitalocean/pyproject.toml +++ b/certbot-dns-digitalocean/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-dnsimple/pyproject.toml b/certbot-dns-dnsimple/pyproject.toml index 557ffa27c..5a6606f46 100644 --- a/certbot-dns-dnsimple/pyproject.toml +++ b/certbot-dns-dnsimple/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-dnsmadeeasy/pyproject.toml b/certbot-dns-dnsmadeeasy/pyproject.toml index 7176fb3b1..9e8deb81c 100644 --- a/certbot-dns-dnsmadeeasy/pyproject.toml +++ b/certbot-dns-dnsmadeeasy/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-gehirn/pyproject.toml b/certbot-dns-gehirn/pyproject.toml index 4cbd67199..7f263d79c 100644 --- a/certbot-dns-gehirn/pyproject.toml +++ b/certbot-dns-gehirn/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-google/pyproject.toml b/certbot-dns-google/pyproject.toml index cd0346218..37083fcdc 100644 --- a/certbot-dns-google/pyproject.toml +++ b/certbot-dns-google/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-linode/pyproject.toml b/certbot-dns-linode/pyproject.toml index f098b2173..50b8ae100 100644 --- a/certbot-dns-linode/pyproject.toml +++ b/certbot-dns-linode/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-luadns/pyproject.toml b/certbot-dns-luadns/pyproject.toml index 4d20cf8ee..7dd9a678c 100644 --- a/certbot-dns-luadns/pyproject.toml +++ b/certbot-dns-luadns/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-nsone/pyproject.toml b/certbot-dns-nsone/pyproject.toml index 9c5fc36a7..0a5022c43 100644 --- a/certbot-dns-nsone/pyproject.toml +++ b/certbot-dns-nsone/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-ovh/pyproject.toml b/certbot-dns-ovh/pyproject.toml index b98eaf715..78e327c68 100644 --- a/certbot-dns-ovh/pyproject.toml +++ b/certbot-dns-ovh/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-rfc2136/pyproject.toml b/certbot-dns-rfc2136/pyproject.toml index bf4716c3f..09f223cc7 100644 --- a/certbot-dns-rfc2136/pyproject.toml +++ b/certbot-dns-rfc2136/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-route53/pyproject.toml b/certbot-dns-route53/pyproject.toml index a6e1ad8b9..e4d27512c 100644 --- a/certbot-dns-route53/pyproject.toml +++ b/certbot-dns-route53/pyproject.toml @@ -28,6 +28,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-dns-sakuracloud/pyproject.toml b/certbot-dns-sakuracloud/pyproject.toml index 36ea00fc5..73342a46b 100644 --- a/certbot-dns-sakuracloud/pyproject.toml +++ b/certbot-dns-sakuracloud/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot-nginx/pyproject.toml b/certbot-nginx/pyproject.toml index 2818e37f1..a5c3d79ff 100644 --- a/certbot-nginx/pyproject.toml +++ b/certbot-nginx/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/certbot/pyproject.toml b/certbot/pyproject.toml index 3e7946e97..e93d832d2 100644 --- a/certbot/pyproject.toml +++ b/certbot/pyproject.toml @@ -23,6 +23,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", "Topic :: System :: Installation/Setup", diff --git a/letstest/pyproject.toml b/letstest/pyproject.toml index bd1d016ed..f3b4eb8c1 100644 --- a/letstest/pyproject.toml +++ b/letstest/pyproject.toml @@ -21,6 +21,7 @@ classifiers = [ "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", "Topic :: Security", ] diff --git a/newsfragments/10477.added b/newsfragments/10477.added new file mode 100644 index 000000000..9e9393248 --- /dev/null +++ b/newsfragments/10477.added @@ -0,0 +1 @@ +Support for Python 3.14 was added. diff --git a/pytest.ini b/pytest.ini index d7fe53494..381919e93 100644 --- a/pytest.ini +++ b/pytest.ini @@ -9,5 +9,10 @@ # deprecation warnings and gives time for plugins that don't use the deprecated # API to propagate, especially for plugins packaged as an external snap, before # we release breaking changes. +# +# 1) In v2.28.0, google-api-core added an annoying message that the current python's EOL +# is coming up. We deprecate python versions on schedule, so mostly this is just an +# annoyance for our own tests, and can probably be silenced forever. filterwarnings = error + ignore:You are using a Python version (.*) which Google will stop supporting:FutureWarning diff --git a/tools/oldest_constraints.txt b/tools/oldest_constraints.txt index d24c4f36d..ac72a441c 100644 --- a/tools/oldest_constraints.txt +++ b/tools/oldest_constraints.txt @@ -2,20 +2,20 @@ # that script. apacheconfig==0.3.2 ; python_version == "3.10" asn1crypto==0.24.0 ; python_version == "3.10" -astroid==3.3.11 ; python_version == "3.10" -attrs==25.3.0 ; python_version == "3.10" -beautifulsoup4==4.13.4 ; python_version == "3.10" +astroid==4.0.1 ; python_version == "3.10" +attrs==25.4.0 ; python_version == "3.10" +beautifulsoup4==4.14.2 ; python_version == "3.10" boto3==1.20.34 ; python_version == "3.10" botocore==1.23.34 ; python_version == "3.10" cachetools==5.5.2 ; python_version == "3.10" -certifi==2025.8.3 ; python_version == "3.10" +certifi==2025.10.5 ; python_version == "3.10" cffi==1.14.1 ; python_version == "3.10" chardet==3.0.4 ; python_version == "3.10" cloudflare==2.19.0 ; python_version == "3.10" colorama==0.4.6 ; (sys_platform == "win32" or platform_system == "Windows") and python_version == "3.10" configargparse==1.5.3 ; python_version == "3.10" configobj==5.0.6 ; python_version == "3.10" -coverage==7.10.4 ; python_version == "3.10" +coverage==7.11.0 ; python_version == "3.10" cryptography==43.0.0 ; python_version == "3.10" cython==0.29.37 ; python_version == "3.10" dill==0.4.0 ; python_version == "3.10" @@ -25,30 +25,30 @@ dns-lexicon==3.15.1 ; python_version == "3.10" dnspython==2.6.1 ; python_version == "3.10" exceptiongroup==1.3.0 ; python_version == "3.10" execnet==2.1.1 ; python_version == "3.10" -filelock==3.19.1 ; python_version == "3.10" +filelock==3.20.0 ; python_version == "3.10" funcsigs==0.4 ; python_version == "3.10" google-api-python-client==1.6.5 ; python_version == "3.10" google-auth==2.16.0 ; python_version == "3.10" httplib2==0.9.2 ; python_version == "3.10" idna==2.6 ; python_version == "3.10" -iniconfig==2.1.0 ; python_version == "3.10" +iniconfig==2.3.0 ; python_version == "3.10" ipaddress==1.0.16 ; python_version == "3.10" -isort==6.0.1 ; python_version == "3.10" +isort==7.0.0 ; python_version == "3.10" jmespath==0.10.0 ; python_version == "3.10" -josepy==2.1.0 ; python_version == "3.10" +josepy==2.2.0 ; python_version == "3.10" jsonlines==4.0.0 ; python_version == "3.10" jsonpickle==4.1.1 ; python_version == "3.10" mccabe==0.7.0 ; python_version == "3.10" mypy-extensions==1.1.0 ; python_version == "3.10" -mypy==1.17.1 ; python_version == "3.10" +mypy==1.18.2 ; python_version == "3.10" ndg-httpsclient==0.3.2 ; python_version == "3.10" oauth2client==4.1.3 ; python_version == "3.10" packaging==25.0 ; python_version == "3.10" parsedatetime==2.6 ; python_version == "3.10" pathspec==0.12.1 ; python_version == "3.10" pbr==1.8.0 ; python_version == "3.10" -pip==25.2 ; python_version == "3.10" -platformdirs==4.3.8 ; python_version == "3.10" +pip==25.3 ; python_version == "3.10" +platformdirs==4.5.0 ; python_version == "3.10" pluggy==1.6.0 ; python_version == "3.10" ply==3.4 ; python_version == "3.10" py==1.11.0 ; python_version == "3.10" @@ -56,42 +56,42 @@ pyasn1-modules==0.4.1 ; python_version == "3.10" pyasn1==0.4.8 ; python_version == "3.10" pycparser==2.14 ; python_version == "3.10" pygments==2.19.2 ; python_version == "3.10" -pylint==3.3.8 ; python_version == "3.10" +pylint==4.0.2 ; python_version == "3.10" pyopenssl==25.0.0 ; python_version == "3.10" pyotp==2.9.0 ; python_version == "3.10" pyparsing==2.4.7 ; python_version == "3.10" pyrfc3339==1.0 ; python_version == "3.10" -pytest-cov==6.2.1 ; python_version == "3.10" +pytest-cov==7.0.0 ; python_version == "3.10" pytest-xdist==3.8.0 ; python_version == "3.10" -pytest==8.4.1 ; python_version == "3.10" +pytest==8.4.2 ; python_version == "3.10" python-augeas==0.5.0 ; python_version == "3.10" python-dateutil==2.9.0.post0 ; python_version == "3.10" python-digitalocean==1.15.0 ; python_version == "3.10" pytz==2025.2 ; python_version == "3.10" pywin32==311 ; python_version == "3.10" and sys_platform == "win32" -pyyaml==6.0.2 ; python_version == "3.10" -requests-file==2.1.0 ; python_version == "3.10" +pyyaml==6.0.3 ; python_version == "3.10" +requests-file==3.0.1 ; python_version == "3.10" requests==2.25.1 ; python_version == "3.10" rsa==4.9.1 ; python_version == "3.10" -ruff==0.12.9 ; python_version == "3.10" +ruff==0.14.3 ; python_version == "3.10" s3transfer==0.5.2 ; python_version == "3.10" setuptools==80.9.0 ; python_version == "3.10" six==1.16.0 ; python_version == "3.10" -soupsieve==2.7 ; python_version == "3.10" +soupsieve==2.8 ; python_version == "3.10" tldextract==5.3.0 ; python_version == "3.10" -tomli==2.2.1 ; python_version == "3.10" +tomli==2.3.0 ; python_version == "3.10" tomlkit==0.13.3 ; python_version == "3.10" tox==3.28.0 ; python_version == "3.10" -types-httplib2==0.22.0.20250622 ; python_version == "3.10" -types-pyrfc3339==2.0.1.20241107 ; python_version == "3.10" -types-python-dateutil==2.9.0.20250809 ; python_version == "3.10" -types-pywin32==311.0.0.20250809 ; python_version == "3.10" +types-httplib2==0.31.0.20250913 ; python_version == "3.10" +types-pyrfc3339==2.0.1.20250825 ; python_version == "3.10" +types-python-dateutil==2.9.0.20251008 ; python_version == "3.10" +types-pywin32==311.0.0.20251008 ; python_version == "3.10" types-requests==2.31.0.6 ; python_version == "3.10" -types-setuptools==80.9.0.20250809 ; python_version == "3.10" +types-setuptools==80.9.0.20250822 ; python_version == "3.10" types-urllib3==1.26.25.14 ; python_version == "3.10" -typing-extensions==4.14.1 ; python_version == "3.10" +typing-extensions==4.15.0 ; python_version == "3.10" uritemplate==3.0.1 ; python_version == "3.10" urllib3==1.26.5 ; python_version == "3.10" -uv==0.8.11 ; python_version == "3.10" -virtualenv==20.34.0 ; python_version == "3.10" +uv==0.9.7 ; python_version == "3.10" +virtualenv==20.35.4 ; python_version == "3.10" wheel==0.45.1 ; python_version == "3.10" diff --git a/tools/pinning/current/pyproject.toml b/tools/pinning/current/pyproject.toml index 9b6d257db..8889cf620 100644 --- a/tools/pinning/current/pyproject.toml +++ b/tools/pinning/current/pyproject.toml @@ -41,10 +41,13 @@ letstest = {path = "../../../letstest"} # as a dependency here to ensure a version of cython is pinned for extra # stability. # -# We also pin back cython as is currently required by pyyaml. See -# https://github.com/yaml/pyyaml/pull/702 and -# https://github.com/yaml/pyyaml/issues/601. -cython = "<3.0" +# As of pyyaml 6.0.2, cython >= 3.0 is required for py >= 3.13, and < 3.0 for py < 3.13. +# See https://github.com/yaml/pyyaml/pull/808/files. +cython = [ + { version = "<3.0", python = "<3.13" }, + { version = ">=3.0", python = ">=3.13" } +] + # setuptools-rust is a build dependency of cryptography, and since we don't have # a great way of pinning build dependencies, we simply list it here to ensure a # working version. Note: if build dependencies of setuptools-rust break at some diff --git a/tools/pinning/oldest/pyproject.toml b/tools/pinning/oldest/pyproject.toml index ec027247c..b56625e1f 100644 --- a/tools/pinning/oldest/pyproject.toml +++ b/tools/pinning/oldest/pyproject.toml @@ -95,10 +95,13 @@ urllib3 = "1.26.5" # cython is a build dependency of pyyaml # -# We also pin back cython as is currently required by pyyaml. See -# https://github.com/yaml/pyyaml/pull/702 and -# https://github.com/yaml/pyyaml/issues/601. -cython = "<3.0" +# +# As of pyyaml 6.0.2, cython >= 3.0 is required for py >= 3.13, and < 3.0 for py < 3.13. +# See https://github.com/yaml/pyyaml/pull/808/files. +cython = [ + { version = "<3.0", python = "<3.13" }, + { version = ">=3.0", python = ">=3.13" } +] # Other dependencies # We add any dependencies that must be specified in this file for any another diff --git a/tools/requirements.txt b/tools/requirements.txt index 72189f97b..ae7c995cc 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -6,72 +6,73 @@ # https://docs.github.com/en/github/visualizing-repository-data-with-graphs/about-the-dependency-graph#supported-package-ecosystems # for more info. alabaster==1.0.0 ; python_version >= "3.10" and python_version < "4.0" -anyio==4.10.0 ; python_version >= "3.10" and python_version < "4.0" +anyio==4.11.0 ; python_version >= "3.10" and python_version < "4.0" apacheconfig==0.3.2 ; python_version >= "3.10" and python_version < "4.0" astroid==3.3.11 ; python_version >= "3.10" and python_version < "4.0" asttokens==3.0.0 ; python_version >= "3.10" and python_version < "4.0" -attrs==25.3.0 ; python_version >= "3.10" and python_version < "4.0" -azure-core==1.35.0 ; python_version >= "3.10" and python_version < "4.0" +attrs==25.4.0 ; python_version >= "3.10" and python_version < "4.0" +azure-core==1.36.0 ; python_version >= "3.10" and python_version < "4.0" azure-devops==7.1.0b4 ; python_version >= "3.10" and python_version < "4.0" babel==2.17.0 ; python_version >= "3.10" and python_version < "4.0" backports-tarfile==1.2.0 ; python_version >= "3.10" and python_version < "3.12" -bcrypt==4.3.0 ; python_version >= "3.10" and python_version < "4.0" -beautifulsoup4==4.13.4 ; python_version >= "3.10" and python_version < "4.0" -boto3==1.40.15 ; python_version >= "3.10" and python_version < "4.0" -botocore==1.40.15 ; python_version >= "3.10" and python_version < "4.0" +bcrypt==5.0.0 ; python_version >= "3.10" and python_version < "4.0" +beautifulsoup4==4.14.2 ; python_version >= "3.10" and python_version < "4.0" +boto3==1.40.65 ; python_version >= "3.10" and python_version < "4.0" +botocore==1.40.65 ; python_version >= "3.10" and python_version < "4.0" build==1.3.0 ; python_version >= "3.10" and python_version < "4.0" cachecontrol==0.14.3 ; python_version >= "3.10" and python_version < "4.0" -cachetools==5.5.2 ; python_version >= "3.10" and python_version < "4.0" -certifi==2025.8.3 ; python_version >= "3.10" and python_version < "4.0" -cffi==1.17.1 ; python_version >= "3.10" and python_version < "4.0" +cachetools==6.2.1 ; python_version >= "3.10" and python_version < "4.0" +certifi==2025.10.5 ; python_version >= "3.10" and python_version < "4.0" +cffi==2.0.0 ; python_version >= "3.10" and python_version < "4.0" chardet==5.2.0 ; python_version >= "3.10" and python_version < "4.0" -charset-normalizer==3.4.3 ; python_version >= "3.10" and python_version < "4.0" +charset-normalizer==3.4.4 ; python_version >= "3.10" and python_version < "4.0" cleo==2.1.0 ; python_version >= "3.10" and python_version < "4.0" -click==8.2.1 ; python_version >= "3.10" and python_version < "4.0" +click==8.3.0 ; python_version >= "3.10" and python_version < "4.0" cloudflare==2.19.4 ; python_version >= "3.10" and python_version < "4.0" colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" configargparse==1.7.1 ; python_version >= "3.10" and python_version < "4.0" configobj==5.0.9 ; python_version >= "3.10" and python_version < "4.0" -coverage==7.10.4 ; python_version >= "3.10" and python_version < "4.0" +coverage==7.11.0 ; python_version >= "3.10" and python_version < "4.0" crashtest==0.4.1 ; python_version >= "3.10" and python_version < "4.0" -cryptography==45.0.6 ; python_version >= "3.10" and python_version < "4.0" -cython==0.29.37 ; python_version >= "3.10" and python_version < "4.0" +cryptography==46.0.3 ; python_version >= "3.10" and python_version < "4.0" +cython==0.29.37 ; python_version >= "3.10" and python_version <= "3.12" +cython==3.1.6 ; python_version >= "3.13" and python_version < "4.0" decorator==5.2.1 ; python_version >= "3.10" and python_version < "4.0" -deprecated==1.2.18 ; python_version >= "3.10" and python_version < "4.0" +deprecated==1.3.1 ; python_version >= "3.10" and python_version < "4.0" dill==0.4.0 ; python_version >= "3.10" and python_version < "4.0" distlib==0.4.0 ; python_version >= "3.10" and python_version < "4.0" distro==1.9.0 ; python_version >= "3.10" and python_version < "4.0" dns-lexicon==3.21.1 ; python_version >= "3.10" and python_version < "4.0" -dnspython==2.7.0 ; python_version >= "3.10" and python_version < "4.0" +dnspython==2.8.0 ; python_version >= "3.10" and python_version < "4.0" docutils==0.21.2 ; python_version >= "3.10" and python_version < "4.0" -dulwich==0.22.8 ; python_version >= "3.10" and python_version < "4.0" +dulwich==0.24.8 ; python_version >= "3.10" and python_version < "4.0" exceptiongroup==1.3.0 ; python_version == "3.10" execnet==2.1.1 ; python_version >= "3.10" and python_version < "4.0" -executing==2.2.0 ; python_version >= "3.10" and python_version < "4.0" +executing==2.2.1 ; python_version >= "3.10" and python_version < "4.0" fabric==3.2.2 ; python_version >= "3.10" and python_version < "4.0" fastjsonschema==2.21.2 ; python_version >= "3.10" and python_version < "4.0" -filelock==3.19.1 ; python_version >= "3.10" and python_version < "4.0" -findpython==0.6.3 ; python_version >= "3.10" and python_version < "4.0" -google-api-core==2.25.1 ; python_version >= "3.10" and python_version < "4.0" -google-api-python-client==2.179.0 ; python_version >= "3.10" and python_version < "4.0" -google-auth-httplib2==0.2.0 ; python_version >= "3.10" and python_version < "4.0" -google-auth==2.40.3 ; python_version >= "3.10" and python_version < "4.0" -googleapis-common-protos==1.70.0 ; python_version >= "3.10" and python_version < "4.0" +filelock==3.20.0 ; python_version >= "3.10" and python_version < "4.0" +findpython==0.7.0 ; python_version >= "3.10" and python_version < "4.0" +google-api-core==2.28.1 ; python_version >= "3.10" and python_version < "4.0" +google-api-python-client==2.186.0 ; python_version >= "3.10" and python_version < "4.0" +google-auth-httplib2==0.2.1 ; python_version >= "3.10" and python_version < "4.0" +google-auth==2.42.1 ; python_version >= "3.10" and python_version < "4.0" +googleapis-common-protos==1.71.0 ; python_version >= "3.10" and python_version < "4.0" h11==0.16.0 ; python_version >= "3.10" and python_version < "4.0" httpcore==1.0.9 ; python_version >= "3.10" and python_version < "4.0" -httplib2==0.22.0 ; python_version >= "3.10" and python_version < "4.0" +httplib2==0.31.0 ; python_version >= "3.10" and python_version < "4.0" httpx==0.28.1 ; python_version >= "3.10" and python_version < "4.0" id==1.5.0 ; python_version >= "3.10" and python_version < "4.0" -idna==3.10 ; python_version >= "3.10" and python_version < "4.0" +idna==3.11 ; python_version >= "3.10" and python_version < "4.0" imagesize==1.4.1 ; python_version >= "3.10" and python_version < "4.0" importlib-metadata==8.7.0 ; python_version >= "3.10" and python_version < "3.12" -iniconfig==2.1.0 ; python_version >= "3.10" and python_version < "4.0" +iniconfig==2.3.0 ; python_version >= "3.10" and python_version < "4.0" installer==0.7.0 ; python_version >= "3.10" and python_version < "4.0" -invoke==2.2.0 ; python_version >= "3.10" and python_version < "4.0" +invoke==2.2.1 ; python_version >= "3.10" and python_version < "4.0" ipdb==0.13.13 ; python_version >= "3.10" and python_version < "4.0" ipython-pygments-lexers==1.1.1 ; python_version >= "3.11" and python_version < "4.0" ipython==8.37.0 ; python_version == "3.10" -ipython==9.4.0 ; python_version >= "3.11" and python_version < "4.0" +ipython==9.6.0 ; python_version >= "3.11" and python_version < "4.0" isodate==0.7.2 ; python_version >= "3.10" and python_version < "4.0" isort==5.13.2 ; python_version >= "3.10" and python_version < "4.0" jaraco-classes==3.4.0 ; python_version >= "3.10" and python_version < "4.0" @@ -81,83 +82,83 @@ jedi==0.19.2 ; python_version >= "3.10" and python_version < "4.0" jeepney==0.9.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "linux" jinja2==3.1.6 ; python_version >= "3.10" and python_version < "4.0" jmespath==1.0.1 ; python_version >= "3.10" and python_version < "4.0" -josepy==2.1.0 ; python_version >= "3.10" and python_version < "4.0" +josepy==2.2.0 ; python_version >= "3.10" and python_version < "4.0" jsonlines==4.0.0 ; python_version >= "3.10" and python_version < "4.0" jsonpickle==4.1.1 ; python_version >= "3.10" and python_version < "4.0" keyring==25.6.0 ; python_version >= "3.10" and python_version < "4.0" markdown-it-py==4.0.0 ; python_version >= "3.10" and python_version < "4.0" -markupsafe==3.0.2 ; python_version >= "3.10" and python_version < "4.0" -matplotlib-inline==0.1.7 ; python_version >= "3.10" and python_version < "4.0" +markupsafe==3.0.3 ; python_version >= "3.10" and python_version < "4.0" +matplotlib-inline==0.2.1 ; python_version >= "3.10" and python_version < "4.0" mccabe==0.7.0 ; python_version >= "3.10" and python_version < "4.0" mdurl==0.1.2 ; python_version >= "3.10" and python_version < "4.0" -more-itertools==10.7.0 ; python_version >= "3.10" and python_version < "4.0" -msgpack==1.1.1 ; python_version >= "3.10" and python_version < "4.0" +more-itertools==10.8.0 ; python_version >= "3.10" and python_version < "4.0" +msgpack==1.1.2 ; python_version >= "3.10" and python_version < "4.0" msrest==0.7.1 ; python_version >= "3.10" and python_version < "4.0" mypy-extensions==1.1.0 ; python_version >= "3.10" and python_version < "4.0" mypy==1.9.0 ; python_version >= "3.10" and python_version < "4.0" -nh3==0.3.0 ; python_version >= "3.10" and python_version < "4.0" +nh3==0.3.2 ; python_version >= "3.10" and python_version < "4.0" oauthlib==3.3.1 ; python_version >= "3.10" and python_version < "4.0" packaging==25.0 ; python_version >= "3.10" and python_version < "4.0" paramiko==4.0.0 ; python_version >= "3.10" and python_version < "4.0" parsedatetime==2.6 ; python_version >= "3.10" and python_version < "4.0" -parso==0.8.4 ; python_version >= "3.10" and python_version < "4.0" -pbs-installer==2025.8.18 ; python_version >= "3.10" and python_version < "4.0" +parso==0.8.5 ; python_version >= "3.10" and python_version < "4.0" +pbs-installer==2025.10.31 ; python_version >= "3.10" and python_version < "4.0" pexpect==4.9.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform != "win32" and sys_platform != "emscripten" -pip==25.2 ; python_version >= "3.10" and python_version < "4.0" +pip==25.3 ; python_version >= "3.10" and python_version < "4.0" pkginfo==1.12.1.2 ; python_version >= "3.10" and python_version < "4.0" -platformdirs==4.3.8 ; python_version >= "3.10" and python_version < "4.0" +platformdirs==4.5.0 ; python_version >= "3.10" and python_version < "4.0" pluggy==1.6.0 ; python_version >= "3.10" and python_version < "4.0" ply==3.11 ; python_version >= "3.10" and python_version < "4.0" -poetry-core==2.1.3 ; python_version >= "3.10" and python_version < "4.0" +poetry-core==2.2.1 ; python_version >= "3.10" and python_version < "4.0" poetry-plugin-export==1.9.0 ; python_version >= "3.10" and python_version < "4.0" -poetry==2.1.4 ; python_version >= "3.10" and python_version < "4.0" -prompt-toolkit==3.0.51 ; python_version >= "3.10" and python_version < "4.0" +poetry==2.2.1 ; python_version >= "3.10" and python_version < "4.0" +prompt-toolkit==3.0.52 ; python_version >= "3.10" and python_version < "4.0" proto-plus==1.26.1 ; python_version >= "3.10" and python_version < "4.0" -protobuf==6.32.0 ; python_version >= "3.10" and python_version < "4.0" +protobuf==6.33.0 ; python_version >= "3.10" and python_version < "4.0" ptyprocess==0.7.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform != "win32" and sys_platform != "emscripten" pure-eval==0.2.3 ; python_version >= "3.10" and python_version < "4.0" pyasn1-modules==0.4.2 ; python_version >= "3.10" and python_version < "4.0" pyasn1==0.6.1 ; python_version >= "3.10" and python_version < "4.0" -pycparser==2.22 ; python_version >= "3.10" and python_version < "4.0" +pycparser==2.23 ; python_version >= "3.10" and python_version < "4.0" and implementation_name != "PyPy" pygments==2.19.2 ; python_version >= "3.10" and python_version < "4.0" pylint==3.3.3 ; python_version >= "3.10" and python_version < "4.0" -pynacl==1.5.0 ; python_version >= "3.10" and python_version < "4.0" -pyopenssl==25.1.0 ; python_version >= "3.10" and python_version < "4.0" +pynacl==1.6.0 ; python_version >= "3.10" and python_version < "4.0" +pyopenssl==25.3.0 ; python_version >= "3.10" and python_version < "4.0" pyotp==2.9.0 ; python_version >= "3.10" and python_version < "4.0" -pyparsing==3.2.3 ; python_version >= "3.10" and python_version < "4.0" -pyproject-api==1.9.1 ; python_version >= "3.10" and python_version < "4.0" +pyparsing==3.2.5 ; python_version >= "3.10" and python_version < "4.0" +pyproject-api==1.10.0 ; python_version >= "3.10" and python_version < "4.0" pyproject-hooks==1.2.0 ; python_version >= "3.10" and python_version < "4.0" -pyrfc3339==2.0.1 ; python_version >= "3.10" and python_version < "4.0" -pytest-cov==6.2.1 ; python_version >= "3.10" and python_version < "4.0" +pyrfc3339==2.1.0 ; python_version >= "3.10" and python_version < "4.0" +pytest-cov==7.0.0 ; python_version >= "3.10" and python_version < "4.0" pytest-xdist==3.8.0 ; python_version >= "3.10" and python_version < "4.0" -pytest==8.4.1 ; python_version >= "3.10" and python_version < "4.0" +pytest==8.4.2 ; python_version >= "3.10" and python_version < "4.0" python-augeas==1.2.0 ; python_version >= "3.10" and python_version < "4.0" python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "4.0" python-digitalocean==1.17.0 ; python_version >= "3.10" and python_version < "4.0" pywin32-ctypes==0.2.3 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32" pywin32==311 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32" -pyyaml==6.0.2 ; python_version >= "3.10" and python_version < "4.0" -rapidfuzz==3.13.0 ; python_version >= "3.10" and python_version < "4.0" +pyyaml==6.0.3 ; python_version >= "3.10" and python_version < "4.0" +rapidfuzz==3.14.3 ; python_version >= "3.10" and python_version < "4.0" readme-renderer==44.0 ; python_version >= "3.10" and python_version < "4.0" -requests-file==2.1.0 ; python_version >= "3.10" and python_version < "4.0" +requests-file==3.0.1 ; python_version >= "3.10" and python_version < "4.0" requests-oauthlib==2.0.0 ; python_version >= "3.10" and python_version < "4.0" requests-toolbelt==1.0.0 ; python_version >= "3.10" and python_version < "4.0" requests==2.32.5 ; python_version >= "3.10" and python_version < "4.0" rfc3986==2.0.0 ; python_version >= "3.10" and python_version < "4.0" -rich==14.1.0 ; python_version >= "3.10" and python_version < "4.0" +rich==14.2.0 ; python_version >= "3.10" and python_version < "4.0" roman-numerals-py==3.1.0 ; python_version >= "3.11" and python_version < "4.0" rsa==4.9.1 ; python_version >= "3.10" and python_version < "4.0" -ruff==0.12.10 ; python_version >= "3.10" and python_version < "4.0" -s3transfer==0.13.1 ; python_version >= "3.10" and python_version < "4.0" -secretstorage==3.3.3 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "linux" +ruff==0.14.3 ; python_version >= "3.10" and python_version < "4.0" +s3transfer==0.14.0 ; python_version >= "3.10" and python_version < "4.0" +secretstorage==3.4.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "linux" semantic-version==2.10.0 ; python_version >= "3.10" and python_version < "4.0" -setuptools-rust==1.11.1 ; python_version >= "3.10" and python_version < "4.0" +setuptools-rust==1.12.0 ; python_version >= "3.10" and python_version < "4.0" setuptools==80.9.0 ; python_version >= "3.10" and python_version < "4.0" shellingham==1.5.4 ; python_version >= "3.10" and python_version < "4.0" six==1.17.0 ; python_version >= "3.10" and python_version < "4.0" sniffio==1.3.1 ; python_version >= "3.10" and python_version < "4.0" snowballstemmer==3.0.1 ; python_version >= "3.10" and python_version < "4.0" -soupsieve==2.7 ; python_version >= "3.10" and python_version < "4.0" +soupsieve==2.8 ; python_version >= "3.10" and python_version < "4.0" sphinx-rtd-theme==3.0.2 ; python_version >= "3.10" and python_version < "4.0" sphinx==8.1.3 ; python_version == "3.10" sphinx==8.2.3 ; python_version >= "3.11" and python_version < "4.0" @@ -170,27 +171,27 @@ sphinxcontrib-qthelp==2.0.0 ; python_version >= "3.10" and python_version < "4.0 sphinxcontrib-serializinghtml==2.0.0 ; python_version >= "3.10" and python_version < "4.0" stack-data==0.6.3 ; python_version >= "3.10" and python_version < "4.0" tldextract==5.3.0 ; python_version >= "3.10" and python_version < "4.0" -tomli==2.2.1 ; python_version == "3.10" +tomli==2.3.0 ; python_version == "3.10" tomlkit==0.13.3 ; python_version >= "3.10" and python_version < "4.0" -towncrier==24.8.0 ; python_version >= "3.10" and python_version < "4.0" -tox==4.27.0 ; python_version >= "3.10" and python_version < "4.0" +towncrier==25.8.0 ; python_version >= "3.10" and python_version < "4.0" +tox==4.32.0 ; python_version >= "3.10" and python_version < "4.0" traitlets==5.14.3 ; python_version >= "3.10" and python_version < "4.0" -trove-classifiers==2025.8.6.13 ; python_version >= "3.10" and python_version < "4.0" -twine==6.1.0 ; python_version >= "3.10" and python_version < "4.0" -types-httplib2==0.22.0.20250622 ; python_version >= "3.10" and python_version < "4.0" -types-pyrfc3339==2.0.1.20241107 ; python_version >= "3.10" and python_version < "4.0" -types-python-dateutil==2.9.0.20250822 ; python_version >= "3.10" and python_version < "4.0" -types-pywin32==311.0.0.20250822 ; python_version >= "3.10" and python_version < "4.0" -types-requests==2.32.4.20250809 ; python_version >= "3.10" and python_version < "4.0" +trove-classifiers==2025.9.11.17 ; python_version >= "3.10" and python_version < "4.0" +twine==6.2.0 ; python_version >= "3.10" and python_version < "4.0" +types-httplib2==0.31.0.20250913 ; python_version >= "3.10" and python_version < "4.0" +types-pyrfc3339==2.0.1.20250825 ; python_version >= "3.10" and python_version < "4.0" +types-python-dateutil==2.9.0.20251008 ; python_version >= "3.10" and python_version < "4.0" +types-pywin32==311.0.0.20251008 ; python_version >= "3.10" and python_version < "4.0" +types-requests==2.32.4.20250913 ; python_version >= "3.10" and python_version < "4.0" types-setuptools==80.9.0.20250822 ; python_version >= "3.10" and python_version < "4.0" -typing-extensions==4.14.1 ; python_version >= "3.10" and python_version < "4.0" +typing-extensions==4.15.0 ; python_version >= "3.10" and python_version < "4.0" uritemplate==4.2.0 ; python_version >= "3.10" and python_version < "4.0" urllib3==2.5.0 ; python_version >= "3.10" and python_version < "4.0" -uv==0.8.13 ; python_version >= "3.10" and python_version < "4.0" -virtualenv==20.32.0 ; python_version >= "3.10" and python_version < "4.0" -wcwidth==0.2.13 ; python_version >= "3.10" and python_version < "4.0" +uv==0.9.7 ; python_version >= "3.10" and python_version < "4.0" +virtualenv==20.35.4 ; python_version >= "3.10" and python_version < "4.0" +wcwidth==0.2.14 ; python_version >= "3.10" and python_version < "4.0" wheel==0.45.1 ; python_version >= "3.10" and python_version < "4.0" -wrapt==1.17.3 ; python_version >= "3.10" and python_version < "4.0" -xattr==1.2.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "darwin" +wrapt==2.0.0 ; python_version >= "3.10" and python_version < "4.0" +xattr==1.3.0 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "darwin" zipp==3.23.0 ; python_version >= "3.10" and python_version < "3.12" -zstandard==0.24.0 ; python_version >= "3.10" and python_version < "4.0" +zstandard==0.25.0 ; python_version >= "3.10" and python_version < "4.0" diff --git a/tox.ini b/tox.ini index 7bf0d34b0..00366755b 100644 --- a/tox.ini +++ b/tox.ini @@ -52,10 +52,10 @@ commands = commands = {[base]pytest} acme certbot certbot-dns-cloudflare certbot-dns-digitalocean certbot-dns-dnsimple certbot-dns-dnsmadeeasy certbot-dns-gehirn certbot-dns-google certbot-dns-linode certbot-dns-luadns certbot-dns-nsone certbot-dns-ovh certbot-dns-rfc2136 certbot-dns-route53 certbot-dns-sakuracloud certbot-nginx certbot-apache -[testenv:py3{,10,11,12,13}] +[testenv:py3{,10,11,12,13,14}] commands = {[testenv:py]commands} -[testenv:py3.{10,11,12,13}] +[testenv:py3.{10,11,12,13,14}] commands = {[testenv:py]commands} [testenv:oldest]