From 41cc88afa1a5d17d01f6d9b04bfb461e8a0a4e9c Mon Sep 17 00:00:00 2001 From: ohemorange Date: Thu, 6 Aug 2026 10:51:24 -0700 Subject: [PATCH] repin to sweep in latest updates (#10748) The manual changes I made: - Expand list of allowed types in `crypto_util.verify_signed_payload` to match return types of `cryptography.x509.load_pem_x509_certificate.public_key`, which have the new mldsa and mlkem types. This required updating cryptography to 47, and updating a couple pins in oldest to match that requirement. We have other options we could do since we're only using the new version for the types for now, but since we will certainly need that version soon, let's just update now. We could also consider casting `public_key` and only allowing the two specific types we can actually, but this seems fine and doesn't require breaking changes. - Revert ruff defaults to pre-16.0.0 version (see #10749) --- acme/pyproject.toml | 2 +- certbot/setup.py | 2 +- certbot/src/certbot/crypto_util.py | 10 ++- newsfragments/10748.changed | 1 + ruff.toml | 3 + tools/oldest_constraints.txt | 81 +++++++++--------- tools/pinning/oldest/pyproject.toml | 6 +- tools/requirements.txt | 122 ++++++++++++++-------------- 8 files changed, 120 insertions(+), 107 deletions(-) create mode 100644 newsfragments/10748.changed diff --git a/acme/pyproject.toml b/acme/pyproject.toml index c6a6deaec..d75a2e705 100644 --- a/acme/pyproject.toml +++ b/acme/pyproject.toml @@ -26,7 +26,7 @@ classifiers = [ "Topic :: Security", ] dependencies = [ - "cryptography>=43.0.0", + "cryptography>=47.0.0", "josepy>=2.0.0", # PyOpenSSL>=25.0.0 is just needed to satisfy mypy right now so this dependency can probably be # relaxed to >=24.0.0 if needed. diff --git a/certbot/setup.py b/certbot/setup.py index c7016dda1..6542a4e60 100644 --- a/certbot/setup.py +++ b/certbot/setup.py @@ -29,7 +29,7 @@ install_requires = [ f'acme>={version}', 'ConfigArgParse>=1.5.3', 'configobj>=5.0.6', - 'cryptography>=43.0.0', + 'cryptography>=47.0.0', 'distro>=1.7.0', 'importlib_metadata>=8.6.1; python_version < "3.10"', 'josepy>=2.0.0', diff --git a/certbot/src/certbot/crypto_util.py b/certbot/src/certbot/crypto_util.py index 436ab9475..95fc33bb5 100644 --- a/certbot/src/certbot/crypto_util.py +++ b/certbot/src/certbot/crypto_util.py @@ -25,6 +25,12 @@ from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.primitives.asymmetric.dsa import DSAPublicKey from cryptography.hazmat.primitives.asymmetric.ec import ECDSA from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePublicKey +from cryptography.hazmat.primitives.asymmetric.mldsa import ( + MLDSA44PublicKey, + MLDSA65PublicKey, + MLDSA87PublicKey, +) +from cryptography.hazmat.primitives.asymmetric.mlkem import MLKEM768PublicKey, MLKEM1024PublicKey from cryptography.hazmat.primitives.asymmetric.padding import PKCS1v15 from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicKey from cryptography.hazmat.primitives.serialization import Encoding @@ -346,7 +352,9 @@ def verify_renewable_cert_sig(renewable_cert: interfaces.RenewableCert) -> None: def verify_signed_payload(public_key: Union[DSAPublicKey, 'Ed25519PublicKey', 'Ed448PublicKey', - EllipticCurvePublicKey, RSAPublicKey, + EllipticCurvePublicKey, MLDSA44PublicKey, + MLDSA65PublicKey, MLDSA87PublicKey, MLKEM768PublicKey, + MLKEM1024PublicKey, RSAPublicKey, 'X25519PublicKey', 'X448PublicKey'], signature: bytes, payload: bytes, signature_hash_algorithm: hashes.HashAlgorithm) -> None: diff --git a/newsfragments/10748.changed b/newsfragments/10748.changed new file mode 100644 index 000000000..c285023d8 --- /dev/null +++ b/newsfragments/10748.changed @@ -0,0 +1 @@ +certbot and its acme library now require cryptography>=47.0.0. diff --git a/ruff.toml b/ruff.toml index 5746249de..e44d91922 100644 --- a/ruff.toml +++ b/ruff.toml @@ -3,6 +3,9 @@ line-length = 100 extend-exclude = ['tools', 'letstest'] [lint] +# Revert default rules to pre-16.0.0 version. Expanding the list to match the new defaults is +# tracked by https://github.com/certbot/certbot/issues/10749. +select = ["E4", "E7", "E9", "F"] # Check for PEP 585 style annotations to prevent regressions in # https://github.com/certbot/certbot/issues/10195 extend-select = ["UP006"] diff --git a/tools/oldest_constraints.txt b/tools/oldest_constraints.txt index 9cb5c80ae..e293fe304 100644 --- a/tools/oldest_constraints.txt +++ b/tools/oldest_constraints.txt @@ -1,32 +1,33 @@ # This file was generated by tools/pinning/oldest/repin.sh and can be updated using # that script. -annotated-types==0.7.0 ; python_version == "3.10" -anyio==4.12.1 ; python_version == "3.10" +annotated-types==0.8.0 ; python_version == "3.10" +anyio==4.14.2 ; python_version == "3.10" apacheconfig==0.3.2 ; python_version == "3.10" asn1crypto==0.24.0 ; python_version == "3.10" +ast-serialize==0.6.0 ; python_version == "3.10" astroid==4.0.4 ; python_version == "3.10" -beautifulsoup4==4.14.3 ; python_version == "3.10" +beautifulsoup4==4.15.0 ; 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==2026.2.25 ; python_version == "3.10" -cffi==1.14.1 ; python_version == "3.10" +certifi==2026.7.22 ; python_version == "3.10" +cffi==2.0.0 ; python_version == "3.10" chardet==3.0.4 ; python_version == "3.10" cloudflare==4.0.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.13.4 ; python_version == "3.10" -cryptography==43.0.0 ; python_version == "3.10" +coverage==7.15.3 ; python_version == "3.10" +cryptography==47.0.0 ; python_version == "3.10" cython==0.29.37 ; python_version == "3.10" dill==0.4.1 ; python_version == "3.10" -distlib==0.4.0 ; python_version == "3.10" +distlib==0.4.3 ; python_version == "3.10" distro==1.7.0 ; python_version == "3.10" dns-lexicon==3.15.1 ; python_version == "3.10" dnspython==2.6.1 ; python_version == "3.10" exceptiongroup==1.3.1 ; python_version == "3.10" execnet==2.1.2 ; python_version == "3.10" -filelock==3.25.0 ; python_version == "3.10" +filelock==3.32.2 ; 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" @@ -40,67 +41,67 @@ ipaddress==1.0.16 ; python_version == "3.10" isort==8.0.1 ; python_version == "3.10" jmespath==0.10.0 ; python_version == "3.10" josepy==2.2.0 ; python_version == "3.10" -jsonpickle==4.1.1 ; python_version == "3.10" -librt==0.8.1 ; python_version == "3.10" and platform_python_implementation != "PyPy" +jsonpickle==4.1.2 ; python_version == "3.10" +librt==0.13.0 ; python_version == "3.10" and platform_python_implementation != "PyPy" mccabe==0.7.0 ; python_version == "3.10" mypy-extensions==1.1.0 ; python_version == "3.10" -mypy==1.19.1 ; python_version == "3.10" +mypy==2.3.0 ; python_version == "3.10" ndg-httpsclient==0.3.2 ; python_version == "3.10" oauth2client==4.1.3 ; python_version == "3.10" -packaging==26.0 ; python_version == "3.10" +packaging==26.3 ; python_version == "3.10" parsedatetime==2.6 ; python_version == "3.10" -pathspec==1.0.4 ; python_version == "3.10" +pathspec==1.1.1 ; python_version == "3.10" pbr==1.8.0 ; python_version == "3.10" -pip==26.0.1 ; python_version == "3.10" -platformdirs==4.9.2 ; python_version == "3.10" +pip==26.2.1 ; python_version == "3.10" +platformdirs==4.11.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" pyasn1-modules==0.4.1 ; python_version == "3.10" pyasn1==0.4.8 ; python_version == "3.10" pycparser==2.14 ; python_version == "3.10" -pydantic-core==2.41.5 ; python_version == "3.10" -pydantic==2.12.5 ; python_version == "3.10" -pygments==2.19.2 ; python_version == "3.10" -pylint==4.0.5 ; python_version == "3.10" -pyopenssl==25.0.0 ; python_version == "3.10" -pyotp==2.9.0 ; python_version == "3.10" +pydantic-core==2.46.4 ; python_version == "3.10" +pydantic==2.13.4 ; python_version == "3.10" +pygments==2.20.0 ; python_version == "3.10" +pylint==4.0.6 ; python_version == "3.10" +pyopenssl==26.1.0 ; python_version == "3.10" +pyotp==2.10.0 ; python_version == "3.10" pyparsing==3.0.0 ; python_version == "3.10" pyrfc3339==1.0 ; python_version == "3.10" -pytest-cov==7.0.0 ; python_version == "3.10" +pytest-cov==7.1.0 ; python_version == "3.10" pytest-xdist==3.8.0 ; python_version == "3.10" -pytest==9.0.2 ; python_version == "3.10" +pytest==9.1.1 ; 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" -python-discovery==1.1.0 ; python_version == "3.10" -pytz==2026.1.post1 ; python_version == "3.10" -pywin32==311 ; python_version == "3.10" and sys_platform == "win32" +python-discovery==1.5.1 ; python_version == "3.10" +pytz==2026.3.post1 ; python_version == "3.10" +pywin32==312 ; python_version == "3.10" and sys_platform == "win32" 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.15.4 ; python_version == "3.10" +ruff==0.16.1 ; python_version == "3.10" s3transfer==0.5.2 ; python_version == "3.10" -setuptools==82.0.0 ; python_version == "3.10" +setuptools==83.0.0 ; python_version == "3.10" six==1.16.0 ; python_version == "3.10" sniffio==1.3.1 ; python_version == "3.10" -soupsieve==2.8.3 ; python_version == "3.10" +soupsieve==2.9.1 ; python_version == "3.10" tldextract==5.3.1 ; python_version == "3.10" -tomli==2.4.0 ; python_version == "3.10" -tomlkit==0.14.0 ; python_version == "3.10" +tomli==2.4.1 ; python_version == "3.10" +tomlkit==0.15.1 ; python_version == "3.10" tox==3.28.0 ; python_version == "3.10" -types-httplib2==0.31.2.20260125 ; python_version == "3.10" +types-httplib2==0.32.0.20260720 ; python_version == "3.10" types-pyrfc3339==2.0.1.20250825 ; python_version == "3.10" -types-python-dateutil==2.9.0.20260302 ; python_version == "3.10" -types-pywin32==311.0.0.20251008 ; python_version == "3.10" +types-python-dateutil==2.9.0.20260716 ; python_version == "3.10" +types-pywin32==312.0.0.20260724 ; python_version == "3.10" types-requests==2.31.0.6 ; python_version == "3.10" -types-setuptools==82.0.0.20260210 ; python_version == "3.10" +types-setuptools==83.0.0.20260724 ; python_version == "3.10" types-urllib3==1.26.25.14 ; python_version == "3.10" -typing-extensions==4.15.0 ; python_version == "3.10" +typing-extensions==4.16.0 ; python_version == "3.10" typing-inspection==0.4.2 ; python_version == "3.10" uritemplate==3.0.1 ; python_version == "3.10" urllib3==1.26.5 ; python_version == "3.10" -uv==0.10.8 ; python_version == "3.10" -virtualenv==21.1.0 ; python_version == "3.10" -wheel==0.46.3 ; python_version == "3.10" +uv==0.12.2 ; python_version == "3.10" +virtualenv==21.7.1 ; python_version == "3.10" +wheel==0.47.0 ; python_version == "3.10" diff --git a/tools/pinning/oldest/pyproject.toml b/tools/pinning/oldest/pyproject.toml index b3534b96f..1f6bc2b57 100644 --- a/tools/pinning/oldest/pyproject.toml +++ b/tools/pinning/oldest/pyproject.toml @@ -57,11 +57,11 @@ asn1crypto = "0.24.0" # we were already ignoring debian 11 for our boto* versions; this uses the versions from ubuntu 22 boto3 = "1.20.34" botocore = "1.23.34" -cffi = "1.14.1" +cffi = "2.0.0" chardet = "3.0.4" cloudflare = "4.0.0" configobj = "5.0.6" -cryptography = "43.0.0" +cryptography = "47.0.0" distro = "1.7.0" dns-lexicon = "3.15.1" dnspython = "2.6.1" @@ -75,7 +75,7 @@ ndg-httpsclient = "0.3.2" parsedatetime = "2.6" pbr = "1.8.0" ply = "3.4" -pyOpenSSL = "25.0.0" +pyOpenSSL = "26.1.0" pyRFC3339 = "1.0" pyasn1 = "0.4.8" pycparser = "2.14" diff --git a/tools/requirements.txt b/tools/requirements.txt index 2c972e6ec..a1b230d1e 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -6,65 +6,65 @@ # 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" -annotated-types==0.7.0 ; python_version >= "3.10" and python_version < "4.0" -anyio==4.13.0 ; python_version >= "3.10" and python_version < "4.0" +annotated-types==0.8.0 ; python_version >= "3.10" and python_version < "4.0" +anyio==4.14.2 ; 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.1 ; python_version >= "3.10" and python_version < "4.0" +asttokens==3.0.2 ; python_version >= "3.10" and python_version < "4.0" babel==2.18.0 ; python_version >= "3.10" and python_version < "4.0" backports-tarfile==1.2.0 ; python_version >= "3.10" and python_version < "3.12" -backports-zstd==1.5.0 ; python_version >= "3.10" and python_version < "3.14" +backports-zstd==1.6.0 ; python_version >= "3.10" and python_version < "3.14" bcrypt==5.0.0 ; python_version >= "3.10" and python_version < "4.0" beautifulsoup4==4.15.0 ; python_version >= "3.10" and python_version < "4.0" -boto3==1.43.26 ; python_version >= "3.10" and python_version < "4.0" -botocore==1.43.26 ; python_version >= "3.10" and python_version < "4.0" +boto3==1.43.65 ; python_version >= "3.10" and python_version < "4.0" +botocore==1.43.65 ; python_version >= "3.10" and python_version < "4.0" build==1.5.0 ; python_version >= "3.10" and python_version < "4.0" cachecontrol==0.14.4 ; python_version >= "3.10" and python_version < "4.0" -cachetools==7.1.4 ; python_version >= "3.10" and python_version < "4.0" -certifi==2026.5.20 ; python_version >= "3.10" and python_version < "4.0" -cffi==2.0.0 ; python_version >= "3.10" and python_version < "4.0" -charset-normalizer==3.4.7 ; python_version >= "3.10" and python_version < "4.0" +cachetools==7.1.7 ; python_version >= "3.10" and python_version < "4.0" +certifi==2026.7.22 ; python_version >= "3.10" and python_version < "4.0" +cffi==2.1.1 ; python_version >= "3.10" and python_version < "4.0" +charset-normalizer==3.4.9 ; python_version >= "3.10" and python_version < "4.0" cleo==2.1.0 ; python_version >= "3.10" and python_version < "4.0" -click==8.4.1 ; python_version >= "3.10" and python_version < "4.0" -cloudflare==5.2.0 ; python_version >= "3.10" and python_version < "4.0" +click==8.4.2 ; python_version >= "3.10" and python_version < "4.0" +cloudflare==5.6.0 ; 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.5 ; python_version >= "3.10" and python_version < "4.0" configobj==5.0.9 ; python_version >= "3.10" and python_version < "4.0" -coverage==7.14.1 ; python_version >= "3.10" and python_version < "4.0" +coverage==7.15.3 ; python_version >= "3.10" and python_version < "4.0" crashtest==0.4.1 ; python_version >= "3.10" and python_version < "4.0" -cryptography==48.0.1 ; python_version >= "3.10" and python_version < "4.0" +cryptography==50.0.0 ; python_version >= "3.10" and python_version < "4.0" cython==0.29.37 ; python_version >= "3.10" and python_version <= "3.12" -cython==3.2.5 ; python_version >= "3.13" and python_version < "4.0" +cython==3.2.9 ; python_version >= "3.13" and python_version < "4.0" decorator==5.3.1 ; 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.1 ; python_version >= "3.10" and python_version < "4.0" -distlib==0.4.2 ; python_version >= "3.10" and python_version < "4.0" +distlib==0.4.3 ; 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.25.2 ; 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" docutils==0.22.4 ; python_version >= "3.11" and python_version < "4.0" -dulwich==1.2.6 ; python_version >= "3.10" and python_version < "4.0" +dulwich==1.2.12 ; python_version >= "3.10" and python_version < "4.0" exceptiongroup==1.3.1 ; python_version == "3.10" execnet==2.1.2 ; 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.3 ; python_version >= "3.10" and python_version < "4.0" -fastjsonschema==2.21.2 ; python_version >= "3.10" and python_version < "4.0" -filelock==3.29.3 ; python_version >= "3.10" and python_version < "4.0" +fastjsonschema==2.22.1 ; python_version >= "3.10" and python_version < "4.0" +filelock==3.32.2 ; python_version >= "3.10" and python_version < "4.0" findpython==0.8.0 ; python_version >= "3.10" and python_version < "4.0" -google-api-core==2.31.0 ; python_version >= "3.10" and python_version < "4.0" -google-api-python-client==2.197.0 ; python_version >= "3.10" and python_version < "4.0" +google-api-core==2.33.0 ; python_version >= "3.10" and python_version < "4.0" +google-api-python-client==2.198.0 ; python_version >= "3.10" and python_version < "4.0" google-auth-httplib2==0.4.0 ; python_version >= "3.10" and python_version < "4.0" -google-auth==2.53.0 ; python_version >= "3.10" and python_version < "4.0" +google-auth==2.56.2 ; python_version >= "3.10" and python_version < "4.0" googleapis-common-protos==1.75.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.31.2 ; python_version >= "3.10" and python_version < "4.0" +httplib2==0.32.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.6.1 ; python_version >= "3.10" and python_version < "4.0" idna==3.18 ; python_version >= "3.10" and python_version < "4.0" -imagesize==1.5.0 ; python_version >= "3.13" and python_version < "4.0" -imagesize==2.0.0 ; python_version >= "3.10" and python_version <= "3.12" +imagesize==1.5.0 ; python_version >= "3.14" and python_version < "4.0" +imagesize==2.0.0 ; python_version >= "3.10" and python_version < "3.14" importlib-metadata==9.0.0 ; python_version >= "3.10" and python_version < "3.12" iniconfig==2.3.0 ; python_version >= "3.10" and python_version < "4.0" installer==1.0.1 ; python_version >= "3.10" and python_version < "4.0" @@ -72,11 +72,11 @@ 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.39.0 ; python_version == "3.10" -ipython==9.14.1 ; python_version >= "3.11" and python_version < "4.0" +ipython==9.16.1 ; python_version >= "3.11" 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" jaraco-context==6.1.2 ; python_version >= "3.10" and python_version < "4.0" -jaraco-functools==4.5.0 ; python_version >= "3.10" and python_version < "4.0" +jaraco-functools==4.6.0 ; python_version >= "3.10" and python_version < "4.0" jedi==0.20.0 ; 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" @@ -93,48 +93,48 @@ more-itertools==11.1.0 ; python_version >= "3.10" and python_version < "4.0" msgpack==1.2.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.5 ; python_version >= "3.10" and python_version < "4.0" -packaging==26.2 ; python_version >= "3.10" and python_version < "4.0" +nh3==0.3.6 ; python_version >= "3.10" and python_version < "4.0" +packaging==26.3 ; python_version >= "3.10" and python_version < "4.0" paramiko==5.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.7 ; python_version >= "3.10" and python_version < "4.0" -pbs-installer==2026.6.2 ; python_version >= "3.10" and python_version < "4.0" +pbs-installer==2026.7.28 ; 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==26.1.2 ; python_version >= "3.10" and python_version < "4.0" +pip==26.2.1 ; 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.10.0 ; python_version >= "3.10" and python_version < "4.0" +platformdirs==4.11.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.4.0 ; python_version >= "3.10" and python_version < "4.0" poetry-plugin-export==1.10.0 ; python_version >= "3.10" and python_version < "4.0" poetry==2.4.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.28.0 ; python_version >= "3.10" and python_version < "4.0" -protobuf==7.35.0 ; python_version >= "3.10" and python_version < "4.0" -psutil==7.2.2 ; python_version >= "3.11" and python_version < "4.0" and sys_platform != "emscripten" +prompt-toolkit==3.0.53 ; python_version >= "3.10" and python_version < "4.0" +proto-plus==1.28.2 ; python_version >= "3.10" and python_version < "4.0" +protobuf==7.35.1 ; python_version >= "3.10" and python_version < "4.0" +psutil==7.2.2 ; python_version >= "3.11" and python_version < "4.0" and sys_platform != "emscripten" and sys_platform != "cygwin" 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.3 ; python_version >= "3.10" and python_version < "4.0" +pyasn1==0.6.4 ; python_version >= "3.10" and python_version < "4.0" pycparser==3.0 ; python_version >= "3.10" and python_version < "4.0" and implementation_name != "PyPy" pydantic-core==2.46.4 ; python_version >= "3.10" and python_version < "4.0" pydantic==2.13.4 ; python_version >= "3.10" and python_version < "4.0" pygments==2.20.0 ; python_version >= "3.10" and python_version < "4.0" pylint==3.3.3 ; python_version >= "3.10" and python_version < "4.0" pynacl==1.6.2 ; python_version >= "3.10" and python_version < "4.0" -pyopenssl==26.2.0 ; python_version >= "3.10" and python_version < "4.0" -pyotp==2.9.0 ; python_version >= "3.10" and python_version < "4.0" +pyopenssl==26.4.0 ; python_version >= "3.10" and python_version < "4.0" +pyotp==2.10.0 ; python_version >= "3.10" and python_version < "4.0" pyparsing==3.3.2 ; python_version >= "3.10" and python_version < "4.0" -pyproject-api==1.10.1 ; python_version >= "3.10" and python_version < "4.0" +pyproject-api==1.11.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.1.0 ; python_version >= "3.10" and python_version < "4.0" pytest-cov==7.1.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==9.0.3 ; python_version >= "3.10" and python_version < "4.0" +pytest==9.1.1 ; 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" -python-discovery==1.4.0 ; python_version >= "3.10" and python_version < "4.0" +python-discovery==1.5.1 ; 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==312 ; python_version >= "3.10" and python_version < "4.0" and sys_platform == "win32" pyyaml==6.0.3 ; python_version >= "3.10" and python_version < "4.0" @@ -147,17 +147,17 @@ requests==2.34.2 ; python_version >= "3.10" and python_version < "4.0" rfc3986==2.0.0 ; python_version >= "3.10" and python_version < "4.0" rich==15.0.0 ; python_version >= "3.10" and python_version < "4.0" roman-numerals==4.1.0 ; python_version >= "3.11" and python_version < "4.0" -ruff==0.15.16 ; python_version >= "3.10" and python_version < "4.0" -s3transfer==0.18.0 ; python_version >= "3.10" and python_version < "4.0" +ruff==0.16.1 ; python_version >= "3.10" and python_version < "4.0" +s3transfer==0.19.2 ; python_version >= "3.10" and python_version < "4.0" secretstorage==3.5.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.12.1 ; python_version >= "3.10" and python_version < "4.0" -setuptools==82.0.1 ; python_version >= "3.10" and python_version < "4.0" +setuptools-rust==1.13.0 ; python_version >= "3.10" and python_version < "4.0" +setuptools==83.0.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.1.1 ; python_version >= "3.10" and python_version < "4.0" -soupsieve==2.8.4 ; python_version >= "3.10" and python_version < "4.0" +soupsieve==2.9.1 ; python_version >= "3.10" and python_version < "4.0" sphinx-rtd-theme==3.1.0 ; python_version >= "3.10" and python_version < "4.0" sphinx==8.1.3 ; python_version == "3.10" sphinx==9.0.4 ; python_version == "3.11" @@ -173,26 +173,26 @@ stack-data==0.6.3 ; python_version >= "3.10" and python_version < "4.0" tldextract==5.3.1 ; python_version >= "3.10" and python_version < "4.0" tomli-w==1.2.0 ; python_version >= "3.10" and python_version < "4.0" tomli==2.4.1 ; python_version == "3.10" -tomlkit==0.15.0 ; python_version >= "3.10" and python_version < "4.0" +tomlkit==0.15.1 ; python_version >= "3.10" and python_version < "4.0" towncrier==25.8.0 ; python_version >= "3.10" and python_version < "4.0" -tox==4.55.1 ; python_version >= "3.10" and python_version < "4.0" -traitlets==5.15.1 ; python_version >= "3.10" and python_version < "4.0" +tox==4.58.0 ; python_version >= "3.10" and python_version < "4.0" +traitlets==5.16.1 ; python_version >= "3.10" and python_version < "4.0" trove-classifiers==2026.6.1.19 ; 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.2.20260408 ; python_version >= "3.10" and python_version < "4.0" +twine==7.0.0 ; python_version >= "3.10" and python_version < "4.0" +types-httplib2==0.32.0.20260720 ; 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.20260518 ; python_version >= "3.10" and python_version < "4.0" -types-pywin32==312.0.0.20260609 ; python_version >= "3.10" and python_version < "4.0" -types-requests==2.33.0.20260518 ; python_version >= "3.10" and python_version < "4.0" -types-setuptools==82.0.0.20260518 ; python_version >= "3.10" and python_version < "4.0" -typing-extensions==4.15.0 ; python_version >= "3.10" and python_version < "4.0" +types-python-dateutil==2.9.0.20260716 ; python_version >= "3.10" and python_version < "4.0" +types-pywin32==312.0.0.20260724 ; python_version >= "3.10" and python_version < "4.0" +types-requests==2.33.0.20260712 ; python_version >= "3.10" and python_version < "4.0" +types-setuptools==83.0.0.20260724 ; python_version >= "3.10" and python_version < "4.0" +typing-extensions==4.16.0 ; python_version >= "3.10" and python_version < "4.0" typing-inspection==0.4.2 ; python_version >= "3.10" and python_version < "4.0" uritemplate==4.2.0 ; python_version >= "3.10" and python_version < "4.0" urllib3==2.7.0 ; python_version >= "3.10" and python_version < "4.0" -uv==0.11.20 ; python_version >= "3.10" and python_version < "4.0" -virtualenv==21.4.2 ; python_version >= "3.10" and python_version < "4.0" -wcwidth==0.8.1 ; python_version >= "3.10" and python_version < "4.0" +uv==0.12.2 ; python_version >= "3.10" and python_version < "4.0" +virtualenv==21.7.1 ; python_version >= "3.10" and python_version < "4.0" +wcwidth==0.8.2 ; python_version >= "3.10" and python_version < "4.0" wheel==0.47.0 ; python_version >= "3.10" and python_version < "4.0" -wrapt==2.2.1 ; python_version >= "3.10" and python_version < "4.0" +wrapt==2.3.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==4.1.0 ; python_version >= "3.10" and python_version < "3.12"