From 8a95c030e63b126a5eae137806957428d579505b Mon Sep 17 00:00:00 2001 From: Adrien Ferrand Date: Fri, 13 Oct 2023 15:57:42 +0200 Subject: [PATCH] Drop Python 3.7 support (#9792) * Drop Python 3.7 support * Fix lint and test * Check for venv generation * Update requirements * Update oldest constaints and compatibility tests runtime --- .../templates/jobs/extended-tests-jobs.yml | 11 +- .../templates/jobs/standard-tests-jobs.yml | 18 +- acme/acme/__init__.py | 8 - acme/setup.py | 3 +- certbot-apache/setup.py | 3 +- certbot-ci/setup.py | 3 +- certbot-compatibility-test/Dockerfile | 4 +- certbot-compatibility-test/setup.py | 3 +- certbot-dns-cloudflare/setup.py | 3 +- certbot-dns-digitalocean/setup.py | 3 +- .../_internal/tests/dns_dnsimple_test.py | 3 +- certbot-dns-dnsimple/setup.py | 3 +- .../_internal/tests/dns_dnsmadeeasy_test.py | 5 +- certbot-dns-dnsmadeeasy/setup.py | 3 +- .../_internal/tests/dns_gehirn_test.py | 5 +- certbot-dns-gehirn/setup.py | 3 +- certbot-dns-google/setup.py | 3 +- certbot-dns-linode/setup.py | 3 +- .../_internal/tests/dns_luadns_test.py | 3 +- certbot-dns-luadns/setup.py | 3 +- .../_internal/tests/dns_nsone_test.py | 5 +- certbot-dns-nsone/setup.py | 3 +- .../_internal/tests/dns_ovh_test.py | 4 +- certbot-dns-ovh/setup.py | 3 +- certbot-dns-rfc2136/setup.py | 3 +- certbot-dns-route53/setup.py | 3 +- .../_internal/tests/dns_sakuracloud_test.py | 5 +- certbot-dns-sakuracloud/setup.py | 3 +- .../certbot_nginx/_internal/nginxparser.py | 5 +- certbot-nginx/setup.py | 3 +- certbot/CHANGELOG.md | 2 +- certbot/certbot/__init__.py | 9 - .../certbot/_internal/display/completer.py | 5 +- certbot/certbot/_internal/main.py | 4 - certbot/certbot/_internal/plugins/disco.py | 4 +- certbot/certbot/plugins/dns_common_lexicon.py | 21 +- certbot/certbot/plugins/dns_test_common.py | 8 +- .../plugins/dns_test_common_lexicon.py | 12 +- certbot/setup.py | 9 +- letstest/setup.py | 3 +- pytest.ini | 7 +- tools/oldest_constraints.txt | 196 +++++----- tools/pinning/current/pyproject.toml | 10 +- tools/pinning/oldest/pyproject.toml | 4 +- tools/requirements.txt | 363 +++++++++--------- tools/venv.py | 2 +- tox.ini | 6 +- windows-installer/setup.py | 3 +- 48 files changed, 368 insertions(+), 430 deletions(-) diff --git a/.azure-pipelines/templates/jobs/extended-tests-jobs.yml b/.azure-pipelines/templates/jobs/extended-tests-jobs.yml index ae2249129..264919aae 100644 --- a/.azure-pipelines/templates/jobs/extended-tests-jobs.yml +++ b/.azure-pipelines/templates/jobs/extended-tests-jobs.yml @@ -8,9 +8,6 @@ jobs: - group: certbot-common strategy: matrix: - linux-py38: - PYTHON_VERSION: 3.8 - TOXENV: py38 linux-py39: PYTHON_VERSION: 3.9 TOXENV: py39 @@ -20,17 +17,13 @@ jobs: linux-isolated: TOXENV: 'isolated-{acme,certbot,apache,cloudflare,digitalocean,dnsimple,dnsmadeeasy,gehirn,google,linode,luadns,nsone,ovh,rfc2136,route53,sakuracloud,nginx}' linux-boulder-v2-integration-certbot-oldest: - PYTHON_VERSION: 3.7 + PYTHON_VERSION: 3.8 TOXENV: integration-certbot-oldest ACME_SERVER: boulder-v2 linux-boulder-v2-integration-nginx-oldest: - PYTHON_VERSION: 3.7 + PYTHON_VERSION: 3.8 TOXENV: integration-nginx-oldest ACME_SERVER: boulder-v2 - linux-boulder-v2-py37-integration: - PYTHON_VERSION: 3.7 - TOXENV: integration - ACME_SERVER: boulder-v2 linux-boulder-v2-py38-integration: PYTHON_VERSION: 3.8 TOXENV: integration diff --git a/.azure-pipelines/templates/jobs/standard-tests-jobs.yml b/.azure-pipelines/templates/jobs/standard-tests-jobs.yml index 0d6ac9690..6edf03544 100644 --- a/.azure-pipelines/templates/jobs/standard-tests-jobs.yml +++ b/.azure-pipelines/templates/jobs/standard-tests-jobs.yml @@ -4,9 +4,9 @@ jobs: PYTHON_VERSION: 3.11 strategy: matrix: - macos-py37-cover: + macos-py38-cover: IMAGE_NAME: macOS-12 - PYTHON_VERSION: 3.7 + PYTHON_VERSION: 3.8 TOXENV: cover # As of pip 23.1.0, builds started failing on macOS unless this flag was set. # See https://github.com/certbot/certbot/pull/9717#issuecomment-1610861794. @@ -14,11 +14,11 @@ jobs: macos-cover: IMAGE_NAME: macOS-12 TOXENV: cover - # See explanation under macos-py37-cover. + # See explanation under macos-py38-cover. PIP_USE_PEP517: "true" - windows-py37: + windows-py38: IMAGE_NAME: windows-2019 - PYTHON_VERSION: 3.7 + PYTHON_VERSION: 3.8 TOXENV: py-win windows-py39-cover: IMAGE_NAME: windows-2019 @@ -30,12 +30,12 @@ jobs: TOXENV: integration-certbot linux-oldest: IMAGE_NAME: ubuntu-22.04 - PYTHON_VERSION: 3.7 + PYTHON_VERSION: 3.8 TOXENV: oldest - linux-py37: + linux-py38: IMAGE_NAME: ubuntu-22.04 - PYTHON_VERSION: 3.7 - TOXENV: py37 + PYTHON_VERSION: 3.8 + TOXENV: py38 linux-cover: IMAGE_NAME: ubuntu-22.04 TOXENV: cover diff --git a/acme/acme/__init__.py b/acme/acme/__init__.py index cd250b3ca..1e21b5896 100644 --- a/acme/acme/__init__.py +++ b/acme/acme/__init__.py @@ -6,7 +6,6 @@ This module is an implementation of the `ACME protocol`_. """ import sys -import warnings # This code exists to keep backwards compatibility with people using acme.jose # before it became the standalone josepy package. @@ -20,10 +19,3 @@ for mod in list(sys.modules): # preserved (acme.jose.* is josepy.*) if mod == 'josepy' or mod.startswith('josepy.'): sys.modules['acme.' + mod.replace('josepy', 'jose', 1)] = sys.modules[mod] - -if sys.version_info[:2] == (3, 7): - warnings.warn( - "Python 3.7 support will be dropped in the next planned release of " - "acme. Please upgrade your Python version.", - PendingDeprecationWarning, - ) # pragma: no cover diff --git a/acme/setup.py b/acme/setup.py index 7b0797a72..a67fab48b 100644 --- a/acme/setup.py +++ b/acme/setup.py @@ -44,14 +44,13 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py index 02e044638..771a1d0be 100644 --- a/certbot-apache/setup.py +++ b/certbot-apache/setup.py @@ -30,7 +30,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -39,7 +39,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-ci/setup.py b/certbot-ci/setup.py index 3fddcf104..2cb8308c1 100644 --- a/certbot-ci/setup.py +++ b/certbot-ci/setup.py @@ -32,14 +32,13 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 3 - Alpha', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-compatibility-test/Dockerfile b/certbot-compatibility-test/Dockerfile index 0dfeddcff..091ab5f85 100644 --- a/certbot-compatibility-test/Dockerfile +++ b/certbot-compatibility-test/Dockerfile @@ -1,5 +1,5 @@ -FROM debian:buster -MAINTAINER Brad Warren +FROM docker.io/python:3.8-buster +LABEL maintainer="Brad Warren " # This does not include the dependencies needed to build cryptography. See # https://cryptography.io/en/latest/installation/#building-cryptography-on-linux diff --git a/certbot-compatibility-test/setup.py b/certbot-compatibility-test/setup.py index bf4caa30c..ca74fedb7 100644 --- a/certbot-compatibility-test/setup.py +++ b/certbot-compatibility-test/setup.py @@ -18,14 +18,13 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 3 - Alpha', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-cloudflare/setup.py b/certbot-dns-cloudflare/setup.py index ec24a643c..62b4d91c5 100644 --- a/certbot-dns-cloudflare/setup.py +++ b/certbot-dns-cloudflare/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-digitalocean/setup.py b/certbot-dns-digitalocean/setup.py index 129697b35..da7146cb5 100644 --- a/certbot-dns-digitalocean/setup.py +++ b/certbot-dns-digitalocean/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/tests/dns_dnsimple_test.py b/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/tests/dns_dnsimple_test.py index ff299ad49..e0d389be1 100644 --- a/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/tests/dns_dnsimple_test.py +++ b/certbot-dns-dnsimple/certbot_dns_dnsimple/_internal/tests/dns_dnsimple_test.py @@ -3,6 +3,7 @@ from unittest import mock import sys import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -16,7 +17,7 @@ TOKEN = 'foo' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - LOGIN_ERROR = HTTPError('401 Client Error: Unauthorized for url: ...') + LOGIN_ERROR = HTTPError('401 Client Error: Unauthorized for url: ...', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-dnsimple/setup.py b/certbot-dns-dnsimple/setup.py index 733340b93..d27f49562 100644 --- a/certbot-dns-dnsimple/setup.py +++ b/certbot-dns-dnsimple/setup.py @@ -41,7 +41,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -50,7 +50,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/tests/dns_dnsmadeeasy_test.py b/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/tests/dns_dnsmadeeasy_test.py index 286e65ed9..4adb70643 100644 --- a/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/tests/dns_dnsmadeeasy_test.py +++ b/certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy/_internal/tests/dns_dnsmadeeasy_test.py @@ -4,6 +4,7 @@ import sys from unittest import mock import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -19,8 +20,8 @@ SECRET_KEY = 'bar' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.') - LOGIN_ERROR = HTTPError(f'403 Client Error: Forbidden for url: {DOMAIN}.') + DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.', response=Response()) + LOGIN_ERROR = HTTPError(f'403 Client Error: Forbidden for url: {DOMAIN}.', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-dnsmadeeasy/setup.py b/certbot-dns-dnsmadeeasy/setup.py index 7d306117c..337b00460 100644 --- a/certbot-dns-dnsmadeeasy/setup.py +++ b/certbot-dns-dnsmadeeasy/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-gehirn/certbot_dns_gehirn/_internal/tests/dns_gehirn_test.py b/certbot-dns-gehirn/certbot_dns_gehirn/_internal/tests/dns_gehirn_test.py index 3d082049d..3df3c5431 100644 --- a/certbot-dns-gehirn/certbot_dns_gehirn/_internal/tests/dns_gehirn_test.py +++ b/certbot-dns-gehirn/certbot_dns_gehirn/_internal/tests/dns_gehirn_test.py @@ -5,6 +5,7 @@ import unittest from unittest import mock import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -20,8 +21,8 @@ API_SECRET = 'MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.') - LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.') + DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.', response=Response()) + LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-gehirn/setup.py b/certbot-dns-gehirn/setup.py index 639cb3a48..7938c06f0 100644 --- a/certbot-dns-gehirn/setup.py +++ b/certbot-dns-gehirn/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-google/setup.py b/certbot-dns-google/setup.py index 564b8ba99..1c6c76893 100644 --- a/certbot-dns-google/setup.py +++ b/certbot-dns-google/setup.py @@ -40,7 +40,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -49,7 +49,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-linode/setup.py b/certbot-dns-linode/setup.py index 80f7a3e70..668df1e35 100644 --- a/certbot-dns-linode/setup.py +++ b/certbot-dns-linode/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-luadns/certbot_dns_luadns/_internal/tests/dns_luadns_test.py b/certbot-dns-luadns/certbot_dns_luadns/_internal/tests/dns_luadns_test.py index 0b424e860..890616b5e 100644 --- a/certbot-dns-luadns/certbot_dns_luadns/_internal/tests/dns_luadns_test.py +++ b/certbot-dns-luadns/certbot_dns_luadns/_internal/tests/dns_luadns_test.py @@ -3,6 +3,7 @@ import sys from unittest import mock import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -17,7 +18,7 @@ TOKEN = 'foo' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - LOGIN_ERROR = HTTPError("401 Client Error: Unauthorized for url: ...") + LOGIN_ERROR = HTTPError("401 Client Error: Unauthorized for url: ...", response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-luadns/setup.py b/certbot-dns-luadns/setup.py index 9f7ccf85f..402070e00 100644 --- a/certbot-dns-luadns/setup.py +++ b/certbot-dns-luadns/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-nsone/certbot_dns_nsone/_internal/tests/dns_nsone_test.py b/certbot-dns-nsone/certbot_dns_nsone/_internal/tests/dns_nsone_test.py index ae0ff4c21..3f6e7e7c7 100644 --- a/certbot-dns-nsone/certbot_dns_nsone/_internal/tests/dns_nsone_test.py +++ b/certbot-dns-nsone/certbot_dns_nsone/_internal/tests/dns_nsone_test.py @@ -3,6 +3,7 @@ import sys from unittest import mock import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -17,8 +18,8 @@ API_KEY = 'foo' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.') - LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.') + DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.', response=Response()) + LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-nsone/setup.py b/certbot-dns-nsone/setup.py index 026697a10..52b03fa50 100644 --- a/certbot-dns-nsone/setup.py +++ b/certbot-dns-nsone/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-ovh/certbot_dns_ovh/_internal/tests/dns_ovh_test.py b/certbot-dns-ovh/certbot_dns_ovh/_internal/tests/dns_ovh_test.py index 2b054a304..a5d553cd9 100644 --- a/certbot-dns-ovh/certbot_dns_ovh/_internal/tests/dns_ovh_test.py +++ b/certbot-dns-ovh/certbot_dns_ovh/_internal/tests/dns_ovh_test.py @@ -3,6 +3,7 @@ from unittest import mock import sys import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -20,8 +21,7 @@ class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): DOMAIN_NOT_FOUND = Exception('Domain example.com not found') - LOGIN_ERROR = HTTPError('403 Client Error: Forbidden for url: https://eu.api.ovh.com/1.0/...') - + LOGIN_ERROR = HTTPError('403 Client Error: Forbidden for url: https://eu.api.ovh.com/1.0/...', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-ovh/setup.py b/certbot-dns-ovh/setup.py index 5495baf99..e4c615f3f 100644 --- a/certbot-dns-ovh/setup.py +++ b/certbot-dns-ovh/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-rfc2136/setup.py b/certbot-dns-rfc2136/setup.py index c74a29361..eaf651d0f 100644 --- a/certbot-dns-rfc2136/setup.py +++ b/certbot-dns-rfc2136/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-route53/setup.py b/certbot-dns-route53/setup.py index 1190822ec..05ea16eba 100644 --- a/certbot-dns-route53/setup.py +++ b/certbot-dns-route53/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/tests/dns_sakuracloud_test.py b/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/tests/dns_sakuracloud_test.py index e7e0b108e..44a36b9e0 100644 --- a/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/tests/dns_sakuracloud_test.py +++ b/certbot-dns-sakuracloud/certbot_dns_sakuracloud/_internal/tests/dns_sakuracloud_test.py @@ -3,6 +3,7 @@ import sys from unittest import mock import pytest +from requests import Response from requests.exceptions import HTTPError from certbot.compat import os @@ -18,8 +19,8 @@ API_SECRET = 'MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw' class AuthenticatorTest(test_util.TempDirTestCase, dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): - DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.') - LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.') + DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found for url: {DOMAIN}.', response=Response()) + LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.', response=Response()) def setUp(self): super().setUp() diff --git a/certbot-dns-sakuracloud/setup.py b/certbot-dns-sakuracloud/setup.py index d8fdd6651..ccc7efd13 100644 --- a/certbot-dns-sakuracloud/setup.py +++ b/certbot-dns-sakuracloud/setup.py @@ -39,7 +39,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -48,7 +48,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot-nginx/certbot_nginx/_internal/nginxparser.py b/certbot-nginx/certbot_nginx/_internal/nginxparser.py index 1c74cd367..6f2e73443 100644 --- a/certbot-nginx/certbot_nginx/_internal/nginxparser.py +++ b/certbot-nginx/certbot_nginx/_internal/nginxparser.py @@ -10,8 +10,8 @@ from typing import Iterable from typing import Iterator from typing import List from typing import overload +from typing import SupportsIndex from typing import Tuple -from typing import TYPE_CHECKING from typing import Union from pyparsing import Combine @@ -27,9 +27,6 @@ from pyparsing import stringEnd from pyparsing import White from pyparsing import ZeroOrMore -if TYPE_CHECKING: - from typing_extensions import SupportsIndex # typing.SupportsIndex not supported on Python 3.7 - logger = logging.getLogger(__name__) diff --git a/certbot-nginx/setup.py b/certbot-nginx/setup.py index 400d04e5e..03dda4d4b 100644 --- a/certbot-nginx/setup.py +++ b/certbot-nginx/setup.py @@ -28,7 +28,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Plugins', @@ -37,7 +37,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/certbot/CHANGELOG.md b/certbot/CHANGELOG.md index 3fbb107da..28a866731 100644 --- a/certbot/CHANGELOG.md +++ b/certbot/CHANGELOG.md @@ -10,7 +10,7 @@ Certbot adheres to [Semantic Versioning](https://semver.org/). ### Changed -* +* Support for Python 3.7 was removed. ### Fixed diff --git a/certbot/certbot/__init__.py b/certbot/certbot/__init__.py index d1a65fba7..39c239fa1 100644 --- a/certbot/certbot/__init__.py +++ b/certbot/certbot/__init__.py @@ -1,13 +1,4 @@ """Certbot client.""" -import sys -import warnings # version number like 1.2.3a0, must have at least 2 parts, like 1.2 __version__ = '2.8.0.dev0' - -if sys.version_info[:2] == (3, 7): - warnings.warn( - "Python 3.7 support will be dropped in the next planned release of " - "certbot. Please upgrade your Python version.", - PendingDeprecationWarning, - ) # pragma: no cover diff --git a/certbot/certbot/_internal/display/completer.py b/certbot/certbot/_internal/display/completer.py index 821aba780..7d26f0875 100644 --- a/certbot/certbot/_internal/display/completer.py +++ b/certbot/certbot/_internal/display/completer.py @@ -3,12 +3,9 @@ import glob from types import TracebackType from typing import Callable from typing import Iterator +from typing import Literal from typing import Optional from typing import Type -from typing import TYPE_CHECKING - -if TYPE_CHECKING: - from typing_extensions import Literal # readline module is not available on all systems try: diff --git a/certbot/certbot/_internal/main.py b/certbot/certbot/_internal/main.py index ef3626161..70332e32c 100644 --- a/certbot/certbot/_internal/main.py +++ b/certbot/certbot/_internal/main.py @@ -1863,10 +1863,6 @@ def main(cli_args: Optional[List[str]] = None) -> Optional[Union[str, int]]: if config.func != plugins_cmd: # pylint: disable=comparison-with-callable raise - if sys.version_info[:2] == (3, 7): - logger.warning("Python 3.7 support will be dropped in the next planned release " - "of Certbot - please upgrade your Python version.") - with make_displayer(config) as displayer: display_obj.set_display(displayer) diff --git a/certbot/certbot/_internal/plugins/disco.py b/certbot/certbot/_internal/plugins/disco.py index c0426bcd8..9454e176c 100644 --- a/certbot/certbot/_internal/plugins/disco.py +++ b/certbot/certbot/_internal/plugins/disco.py @@ -182,9 +182,9 @@ class PluginsRegistry(Mapping): plugin_paths = plugin_paths_string.split(':') if plugin_paths_string else [] # XXX should ensure this only happens once sys.path.extend(plugin_paths) - entry_points = list(importlib_metadata.entry_points( + entry_points = list(importlib_metadata.entry_points( # pylint: disable=unexpected-keyword-arg group=constants.SETUPTOOLS_PLUGINS_ENTRY_POINT)) - old_entry_points = list(importlib_metadata.entry_points( + old_entry_points = list(importlib_metadata.entry_points( # pylint: disable=unexpected-keyword-arg group=constants.OLD_SETUPTOOLS_PLUGINS_ENTRY_POINT)) for entry_point in entry_points + old_entry_points: try: diff --git a/certbot/certbot/plugins/dns_common_lexicon.py b/certbot/certbot/plugins/dns_common_lexicon.py index d61534a10..6e07e6dc4 100644 --- a/certbot/certbot/plugins/dns_common_lexicon.py +++ b/certbot/certbot/plugins/dns_common_lexicon.py @@ -30,9 +30,9 @@ try: from lexicon.config import ConfigResolver from lexicon.interfaces import Provider except ImportError: # pragma: no cover - Client = None - ConfigResolver = None - Provider = None + Client = None # type: ignore + ConfigResolver = None # type: ignore + Provider = None # type: ignore logger = logging.getLogger(__name__) @@ -148,19 +148,18 @@ def build_lexicon_config(lexicon_provider_name: str, .. deprecated:: 2.7.0 Please use certbot.plugins.dns_common_lexicon.LexiconDNSAuthenticator instead. """ - config: Union[ConfigResolver, Dict[str, Any]] = {'provider_name': lexicon_provider_name} - config.update(lexicon_options) - if not ConfigResolver: + config_dict: Dict[str, Any] = {'provider_name': lexicon_provider_name} + config_dict.update(lexicon_options) + if ConfigResolver is None: # Lexicon 2.x - config.update(provider_options) + config_dict.update(provider_options) + return config_dict else: # Lexicon 3.x provider_config: Dict[str, Any] = {} provider_config.update(provider_options) - config[lexicon_provider_name] = provider_config - config = ConfigResolver().with_dict(config).with_env() - - return config + config_dict[lexicon_provider_name] = provider_config + return ConfigResolver().with_dict(config_dict).with_env() class LexiconDNSAuthenticator(dns_common.DNSAuthenticator): diff --git a/certbot/certbot/plugins/dns_test_common.py b/certbot/certbot/plugins/dns_test_common.py index 24580f506..1502e2d3d 100644 --- a/certbot/certbot/plugins/dns_test_common.py +++ b/certbot/certbot/plugins/dns_test_common.py @@ -1,7 +1,7 @@ """Base test class for DNS authenticators.""" from typing import Any from typing import Mapping -from typing import TYPE_CHECKING +from typing import Protocol from unittest import mock import configobj @@ -14,12 +14,6 @@ from certbot.plugins.dns_common import DNSAuthenticator from certbot.tests import acme_util from certbot.tests import util as test_util -if TYPE_CHECKING: - from typing_extensions import Protocol -else: - Protocol = object - - DOMAIN = 'example.com' KEY = jose.JWKRSA.load(test_util.load_vector("rsa512_key.pem")) diff --git a/certbot/certbot/plugins/dns_test_common_lexicon.py b/certbot/certbot/plugins/dns_test_common_lexicon.py index f1de1b76e..27647d934 100644 --- a/certbot/certbot/plugins/dns_test_common_lexicon.py +++ b/certbot/certbot/plugins/dns_test_common_lexicon.py @@ -6,13 +6,14 @@ from typing import Any from typing import cast from typing import Generator from typing import List +from typing import Protocol from typing import Tuple -from typing import TYPE_CHECKING from unittest import mock from unittest.mock import MagicMock import warnings import josepy as jose +from requests import Response from requests.exceptions import HTTPError from requests.exceptions import RequestException @@ -27,18 +28,13 @@ with warnings.catch_warnings(): from certbot.plugins.dns_test_common import _AuthenticatorCallableTestCase from certbot.tests import util as test_util -if TYPE_CHECKING: # pragma: no cover - from typing_extensions import Protocol -else: - Protocol = object - DOMAIN = 'example.com' KEY = jose.JWKRSA.load(test_util.load_vector("rsa512_key.pem")) DOMAIN_NOT_FOUND = Exception('No domain found') GENERIC_ERROR = RequestException -LOGIN_ERROR = HTTPError('400 Client Error: ...') -UNKNOWN_LOGIN_ERROR = HTTPError('500 Surprise! Error: ...') +LOGIN_ERROR = HTTPError('400 Client Error: ...', response=Response()) +UNKNOWN_LOGIN_ERROR = HTTPError('500 Surprise! Error: ...', response=Response()) class _AuthenticatorCallableLexiconTestCase(_AuthenticatorCallableTestCase, Protocol): diff --git a/certbot/setup.py b/certbot/setup.py index 2c86a1446..ddc3ffe83 100644 --- a/certbot/setup.py +++ b/certbot/setup.py @@ -70,8 +70,7 @@ test_extras = [ 'coverage', 'mypy', 'pip', - # Our pinned version of pylint requires Python >= 3.7.2. - 'pylint ; python_full_version >= "3.7.2"', + 'pylint', 'pytest', 'pytest-cov', 'pytest-xdist', @@ -85,9 +84,6 @@ test_extras = [ 'types-requests', 'types-setuptools', 'types-six', - # typing-extensions is required to import typing.Protocol and make the mypy checks - # pass (along with pylint about non-existent objects) on Python 3.7 - 'typing-extensions', 'wheel', ] @@ -103,7 +99,7 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: Console', @@ -113,7 +109,6 @@ setup( 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/letstest/setup.py b/letstest/setup.py index 60434431d..33938617f 100644 --- a/letstest/setup.py +++ b/letstest/setup.py @@ -9,14 +9,13 @@ setup( author='Certbot Project', author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 5 - Production/Stable', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10', diff --git a/pytest.ini b/pytest.ini index ea038151c..c2bfe4da9 100644 --- a/pytest.ini +++ b/pytest.ini @@ -27,12 +27,9 @@ # is the latest version of that library. See # https://github.com/sphinx-doc/sphinxcontrib-devhelp/blob/1.0.2/setup.py#L69. # 6) Ignore DeprecationWarning from using pkg_resources API -# 7) Ignore our own PendingDeprecationWarning about Python 3.7 soon to be dropped. -# 8) Ignore DeprecationWarning for datetime.utcfromtimestamp() triggered +# 7) Ignore DeprecationWarning for datetime.utcfromtimestamp() triggered # when importing the pytz.tzinfo module # https://github.com/stub42/pytz/issues/105 -# 9) Boto3 is dropping support for Python 3.7 by end of 2023. Let's ignore the associated -# deprecation warning since we will also drop Python 3.7 soon. filterwarnings = error ignore:decodestring\(\) is a deprecated alias:DeprecationWarning:dns @@ -41,6 +38,4 @@ filterwarnings = ignore:update_symlinks is deprecated:PendingDeprecationWarning ignore:.*declare_namespace\(':DeprecationWarning ignore:pkg_resources is deprecated as an API:DeprecationWarning - ignore:Python 3.7 support will be dropped:PendingDeprecationWarning ignore:.*datetime.utcfromtimestamp\(\) is deprecated:DeprecationWarning:pytz.tzinfo - ignore:Boto3 will no longer support Python 3.7 diff --git a/tools/oldest_constraints.txt b/tools/oldest_constraints.txt index 9cdff4f24..d667873d4 100644 --- a/tools/oldest_constraints.txt +++ b/tools/oldest_constraints.txt @@ -1,102 +1,98 @@ # This file was generated by tools/pinning/oldest/repin.sh and can be updated using # that script. -apacheconfig==0.3.2 ; python_version >= "3.7" and python_version < "3.8" -appdirs==1.4.4 ; python_version >= "3.7" and python_version < "3.8" -asn1crypto==0.24.0 ; python_version >= "3.7" and python_version < "3.8" -astroid==2.15.6 ; python_full_version >= "3.7.2" and python_version < "3.8" -beautifulsoup4==4.12.2 ; python_version >= "3.7" and python_version < "3.8" -boto3==1.15.15 ; python_version >= "3.7" and python_version < "3.8" -botocore==1.18.15 ; python_version >= "3.7" and python_version < "3.8" -cachetools==5.3.1 ; python_version >= "3.7" and python_version < "3.8" -certifi==2023.7.22 ; python_version >= "3.7" and python_version < "3.8" -cffi==1.11.5 ; python_version >= "3.7" and python_version < "3.8" -chardet==3.0.4 ; python_version >= "3.7" and python_version < "3.8" -cloudflare==1.5.1 ; python_version >= "3.7" and python_version < "3.8" -colorama==0.4.6 ; python_version < "3.8" and sys_platform == "win32" and python_version >= "3.7" -configargparse==1.5.3 ; python_version >= "3.7" and python_version < "3.8" -configobj==5.0.6 ; python_version >= "3.7" and python_version < "3.8" -coverage==7.2.7 ; python_version >= "3.7" and python_version < "3.8" -cryptography==3.2.1 ; python_version >= "3.7" and python_version < "3.8" -cython==0.29.36 ; python_version >= "3.7" and python_version < "3.8" -dill==0.3.7 ; python_full_version >= "3.7.2" and python_version < "3.8" -distlib==0.3.7 ; python_version >= "3.7" and python_version < "3.8" -distro==1.0.1 ; python_version >= "3.7" and python_version < "3.8" -dns-lexicon==3.14.1 ; python_version >= "3.7" and python_version < "3.8" -dnspython==1.15.0 ; python_version >= "3.7" and python_version < "3.8" -exceptiongroup==1.1.3 ; python_version >= "3.7" and python_version < "3.8" -execnet==2.0.2 ; python_version >= "3.7" and python_version < "3.8" -filelock==3.12.2 ; python_version >= "3.7" and python_version < "3.8" -funcsigs==0.4 ; python_version >= "3.7" and python_version < "3.8" -future==0.18.3 ; python_version >= "3.7" and python_version < "3.8" -google-api-python-client==1.6.5 ; python_version >= "3.7" and python_version < "3.8" -google-auth==2.16.0 ; python_version >= "3.7" and python_version < "3.8" -httplib2==0.9.2 ; python_version >= "3.7" and python_version < "3.8" -idna==2.6 ; python_version >= "3.7" and python_version < "3.8" -importlib-metadata==4.6.4 ; python_version >= "3.7" and python_version < "3.8" -importlib-resources==5.12.0 ; python_version >= "3.7" and python_version < "3.8" -iniconfig==2.0.0 ; python_version >= "3.7" and python_version < "3.8" -ipaddress==1.0.16 ; python_version >= "3.7" and python_version < "3.8" -isort==5.11.5 ; python_full_version >= "3.7.2" and python_version < "3.8" -jmespath==0.10.0 ; python_version >= "3.7" and python_version < "3.8" -josepy==1.13.0 ; python_version >= "3.7" and python_version < "3.8" -lazy-object-proxy==1.9.0 ; python_full_version >= "3.7.2" and python_version < "3.8" -logger==1.4 ; python_version >= "3.7" and python_version < "3.8" -mccabe==0.7.0 ; python_full_version >= "3.7.2" and python_version < "3.8" -mypy-extensions==1.0.0 ; python_version >= "3.7" and python_version < "3.8" -mypy==1.4.1 ; python_version >= "3.7" and python_version < "3.8" -ndg-httpsclient==0.3.2 ; python_version >= "3.7" and python_version < "3.8" -oauth2client==4.1.3 ; python_version >= "3.7" and python_version < "3.8" -packaging==23.1 ; python_version >= "3.7" and python_version < "3.8" -parsedatetime==2.4 ; python_version >= "3.7" and python_version < "3.8" -pbr==1.8.0 ; python_version >= "3.7" and python_version < "3.8" -pip==23.2.1 ; python_version >= "3.7" and python_version < "3.8" -platformdirs==3.10.0 ; python_full_version >= "3.7.2" and python_version < "3.8" -pluggy==1.2.0 ; python_version >= "3.7" and python_version < "3.8" -ply==3.4 ; python_version >= "3.7" and python_version < "3.8" -py==1.11.0 ; python_version >= "3.7" and python_version < "3.8" -pyasn1-modules==0.3.0 ; python_version >= "3.7" and python_version < "3.8" -pyasn1==0.4.8 ; python_version >= "3.7" and python_version < "3.8" -pycparser==2.14 ; python_version >= "3.7" and python_version < "3.8" -pylint==2.17.5 ; python_full_version >= "3.7.2" and python_version < "3.8" -pyopenssl==17.5.0 ; python_version >= "3.7" and python_version < "3.8" -pyparsing==2.2.1 ; python_version >= "3.7" and python_version < "3.8" -pyrfc3339==1.0 ; python_version >= "3.7" and python_version < "3.8" -pytest-cov==4.1.0 ; python_version >= "3.7" and python_version < "3.8" -pytest-xdist==3.3.1 ; python_version >= "3.7" and python_version < "3.8" -pytest==7.4.2 ; python_version >= "3.7" and python_version < "3.8" -python-augeas==0.5.0 ; python_version >= "3.7" and python_version < "3.8" -python-dateutil==2.8.2 ; python_version >= "3.7" and python_version < "3.8" -python-digitalocean==1.11 ; python_version >= "3.7" and python_version < "3.8" -pytz==2019.3 ; python_version >= "3.7" and python_version < "3.8" -pywin32==306 ; python_version >= "3.7" and python_version < "3.8" and sys_platform == "win32" -pyyaml==6.0.1 ; python_version >= "3.7" and python_version < "3.8" -requests-file==1.5.1 ; python_version >= "3.7" and python_version < "3.8" -requests==2.20.0 ; python_version >= "3.7" and python_version < "3.8" -rsa==4.9 ; python_version >= "3.7" and python_version < "3.8" -s3transfer==0.3.7 ; python_version >= "3.7" and python_version < "3.8" -setuptools==41.6.0 ; python_version >= "3.7" and python_version < "3.8" -six==1.11.0 ; python_version >= "3.7" and python_version < "3.8" -soupsieve==2.4.1 ; python_version >= "3.7" and python_version < "3.8" -tldextract==3.5.0 ; python_version >= "3.7" and python_version < "3.8" -tomli==2.0.1 ; python_version < "3.8" and python_version >= "3.7" -tomlkit==0.12.1 ; python_full_version >= "3.7.2" and python_version < "3.8" -tox==1.9.2 ; python_version >= "3.7" and python_version < "3.8" -typed-ast==1.5.5 ; python_version < "3.8" and python_version >= "3.7" -types-cryptography==3.3.23.2 ; python_version >= "3.7" and python_version < "3.8" -types-httplib2==0.22.0.2 ; python_version >= "3.7" and python_version < "3.8" -types-pyopenssl==23.0.0.0 ; python_version >= "3.7" and python_version < "3.8" -types-pyrfc3339==1.1.1.5 ; python_version >= "3.7" and python_version < "3.8" -types-python-dateutil==2.8.19.14 ; python_version >= "3.7" and python_version < "3.8" -types-pytz==2023.3.0.1 ; python_version >= "3.7" and python_version < "3.8" -types-pywin32==306.0.0.4 ; python_version >= "3.7" and python_version < "3.8" -types-requests==2.31.0.2 ; python_version >= "3.7" and python_version < "3.8" -types-setuptools==68.2.0.0 ; python_version >= "3.7" and python_version < "3.8" -types-six==1.16.21.9 ; python_version >= "3.7" and python_version < "3.8" -types-urllib3==1.26.25.14 ; python_version >= "3.7" and python_version < "3.8" -typing-extensions==4.7.1 ; python_version < "3.8" and python_version >= "3.7" -uritemplate==3.0.1 ; python_version >= "3.7" and python_version < "3.8" -urllib3==1.24.2 ; python_version >= "3.7" and python_version < "3.8" -virtualenv==20.4.7 ; python_version >= "3.7" and python_version < "3.8" -wheel==0.33.6 ; python_version >= "3.7" and python_version < "3.8" -wrapt==1.15.0 ; python_full_version >= "3.7.2" and python_version < "3.8" -zipp==3.15.0 ; python_version >= "3.7" and python_version < "3.8" +apacheconfig==0.3.2 ; python_version >= "3.8" and python_version < "3.9" +asn1crypto==0.24.0 ; python_version >= "3.8" and python_version < "3.9" +astroid==3.0.0 ; python_version >= "3.8" and python_version < "3.9" +beautifulsoup4==4.12.2 ; python_version >= "3.8" and python_version < "3.9" +boto3==1.15.15 ; python_version >= "3.8" and python_version < "3.9" +botocore==1.18.15 ; python_version >= "3.8" and python_version < "3.9" +cachetools==5.3.1 ; python_version >= "3.8" and python_version < "3.9" +certifi==2023.7.22 ; python_version >= "3.8" and python_version < "3.9" +cffi==1.12.3 ; python_version >= "3.8" and python_version < "3.9" +chardet==3.0.4 ; python_version >= "3.8" and python_version < "3.9" +cloudflare==1.5.1 ; python_version >= "3.8" and python_version < "3.9" +colorama==0.4.6 ; python_version >= "3.8" and python_version < "3.9" and sys_platform == "win32" +configargparse==1.5.3 ; python_version >= "3.8" and python_version < "3.9" +configobj==5.0.6 ; python_version >= "3.8" and python_version < "3.9" +coverage==7.3.2 ; python_version >= "3.8" and python_version < "3.9" +cryptography==3.2.1 ; python_version >= "3.8" and python_version < "3.9" +cython==0.29.36 ; python_version >= "3.8" and python_version < "3.9" +dill==0.3.7 ; python_version >= "3.8" and python_version < "3.9" +distlib==0.3.7 ; python_version >= "3.8" and python_version < "3.9" +distro==1.0.1 ; python_version >= "3.8" and python_version < "3.9" +dns-lexicon==3.14.1 ; python_version >= "3.8" and python_version < "3.9" +dnspython==1.15.0 ; python_version >= "3.8" and python_version < "3.9" +exceptiongroup==1.1.3 ; python_version >= "3.8" and python_version < "3.9" +execnet==2.0.2 ; python_version >= "3.8" and python_version < "3.9" +filelock==3.12.4 ; python_version >= "3.8" and python_version < "3.9" +funcsigs==0.4 ; python_version >= "3.8" and python_version < "3.9" +future==0.18.3 ; python_version >= "3.8" and python_version < "3.9" +google-api-python-client==1.6.5 ; python_version >= "3.8" and python_version < "3.9" +google-auth==2.16.0 ; python_version >= "3.8" and python_version < "3.9" +httplib2==0.9.2 ; python_version >= "3.8" and python_version < "3.9" +idna==2.6 ; python_version >= "3.8" and python_version < "3.9" +importlib-metadata==4.6.4 ; python_version >= "3.8" and python_version < "3.9" +importlib-resources==6.1.0 ; python_version >= "3.8" and python_version < "3.9" +iniconfig==2.0.0 ; python_version >= "3.8" and python_version < "3.9" +ipaddress==1.0.16 ; python_version >= "3.8" and python_version < "3.9" +isort==5.12.0 ; python_version >= "3.8" and python_version < "3.9" +jmespath==0.10.0 ; python_version >= "3.8" and python_version < "3.9" +josepy==1.13.0 ; python_version >= "3.8" and python_version < "3.9" +logger==1.4 ; python_version >= "3.8" and python_version < "3.9" +mccabe==0.7.0 ; python_version >= "3.8" and python_version < "3.9" +mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "3.9" +mypy==1.5.1 ; python_version >= "3.8" and python_version < "3.9" +ndg-httpsclient==0.3.2 ; python_version >= "3.8" and python_version < "3.9" +oauth2client==4.1.3 ; python_version >= "3.8" and python_version < "3.9" +packaging==23.2 ; python_version >= "3.8" and python_version < "3.9" +parsedatetime==2.4 ; python_version >= "3.8" and python_version < "3.9" +pbr==1.8.0 ; python_version >= "3.8" and python_version < "3.9" +pip==23.2.1 ; python_version >= "3.8" and python_version < "3.9" +platformdirs==3.11.0 ; python_version >= "3.8" and python_version < "3.9" +pluggy==1.3.0 ; python_version >= "3.8" and python_version < "3.9" +ply==3.4 ; python_version >= "3.8" and python_version < "3.9" +py==1.11.0 ; python_version >= "3.8" and python_version < "3.9" +pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "3.9" +pyasn1==0.4.8 ; python_version >= "3.8" and python_version < "3.9" +pycparser==2.14 ; python_version >= "3.8" and python_version < "3.9" +pylint==3.0.1 ; python_version >= "3.8" and python_version < "3.9" +pyopenssl==17.5.0 ; python_version >= "3.8" and python_version < "3.9" +pyparsing==2.2.1 ; python_version >= "3.8" and python_version < "3.9" +pyrfc3339==1.0 ; python_version >= "3.8" and python_version < "3.9" +pytest-cov==4.1.0 ; python_version >= "3.8" and python_version < "3.9" +pytest-xdist==3.3.1 ; python_version >= "3.8" and python_version < "3.9" +pytest==7.4.2 ; python_version >= "3.8" and python_version < "3.9" +python-augeas==0.5.0 ; python_version >= "3.8" and python_version < "3.9" +python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "3.9" +python-digitalocean==1.11 ; python_version >= "3.8" and python_version < "3.9" +pytz==2019.3 ; python_version >= "3.8" and python_version < "3.9" +pywin32==306 ; python_version >= "3.8" and python_version < "3.9" and sys_platform == "win32" +pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "3.9" +requests-file==1.5.1 ; python_version >= "3.8" and python_version < "3.9" +requests==2.20.0 ; python_version >= "3.8" and python_version < "3.9" +rsa==4.9 ; python_version >= "3.8" and python_version < "3.9" +s3transfer==0.3.7 ; python_version >= "3.8" and python_version < "3.9" +setuptools==41.6.0 ; python_version >= "3.8" and python_version < "3.9" +six==1.11.0 ; python_version >= "3.8" and python_version < "3.9" +soupsieve==2.5 ; python_version >= "3.8" and python_version < "3.9" +tldextract==3.6.0 ; python_version >= "3.8" and python_version < "3.9" +tomli==2.0.1 ; python_version >= "3.8" and python_version < "3.9" +tomlkit==0.12.1 ; python_version >= "3.8" and python_version < "3.9" +tox==1.9.2 ; python_version >= "3.8" and python_version < "3.9" +types-cryptography==3.3.23.2 ; python_version >= "3.8" and python_version < "3.9" +types-httplib2==0.22.0.2 ; python_version >= "3.8" and python_version < "3.9" +types-pyopenssl==23.0.0.0 ; python_version >= "3.8" and python_version < "3.9" +types-pyrfc3339==1.1.1.5 ; python_version >= "3.8" and python_version < "3.9" +types-python-dateutil==2.8.19.14 ; python_version >= "3.8" and python_version < "3.9" +types-pytz==2023.3.1.1 ; python_version >= "3.8" and python_version < "3.9" +types-pywin32==306.0.0.4 ; python_version >= "3.8" and python_version < "3.9" +types-requests==2.31.0.6 ; python_version >= "3.8" and python_version < "3.9" +types-setuptools==68.2.0.0 ; python_version >= "3.8" and python_version < "3.9" +types-six==1.16.21.9 ; python_version >= "3.8" and python_version < "3.9" +types-urllib3==1.26.25.14 ; python_version >= "3.8" and python_version < "3.9" +typing-extensions==4.8.0 ; python_version >= "3.8" and python_version < "3.9" +uritemplate==3.0.1 ; python_version >= "3.8" and python_version < "3.9" +urllib3==1.24.2 ; python_version >= "3.8" and python_version < "3.9" +virtualenv==20.24.5 ; python_version >= "3.8" and python_version < "3.9" +wheel==0.33.6 ; python_version >= "3.8" and python_version < "3.9" +zipp==3.17.0 ; python_version >= "3.8" and python_version < "3.9" diff --git a/tools/pinning/current/pyproject.toml b/tools/pinning/current/pyproject.toml index 44d5dc9d1..2d908679c 100644 --- a/tools/pinning/current/pyproject.toml +++ b/tools/pinning/current/pyproject.toml @@ -6,7 +6,7 @@ authors = ["Certbot Project"] license = "Apache License 2.0" [tool.poetry.dependencies] -python = "^3.7" +python = "^3.8" # Local dependencies # Any local packages that have dependencies on other local packages must be @@ -58,7 +58,7 @@ setuptools-rust = "*" # # If this pinning is removed, we may still need to add a lower bound for the # pylint version. See https://github.com/certbot/certbot/pull/9229. -pylint = { version="2.15.5", python = ">=3.7.2" } +pylint = "2.15.5" # Bug in poetry, where still installes yanked versions from pypi (source: https://github.com/python-poetry/poetry/issues/2453) # this version of cryptography introduced a security vulnrability. @@ -75,6 +75,12 @@ poetry = "<1.3.0" # https://github.com/certbot/certbot/issues/9606. setuptools = "<67.5.0" +# Branch 4.x of tox introduces backward incompatibility changes. The tox.ini +# file in the project must be adapted accordingly before moving out of the 3.x +# branch. Once done, the following constraint should become tox >= 4 to keep +# deterministic builds. +tox = "<4" + [tool.poetry.dev-dependencies] [build-system] diff --git a/tools/pinning/oldest/pyproject.toml b/tools/pinning/oldest/pyproject.toml index 58e763be3..302014ae5 100644 --- a/tools/pinning/oldest/pyproject.toml +++ b/tools/pinning/oldest/pyproject.toml @@ -10,7 +10,7 @@ license = "Apache License 2.0" [tool.poetry.dependencies] # The Python version here should be kept in sync with the one used in our # oldest tests in tox.ini. -python = "<3.8 >= 3.7" +python = "<3.9 >= 3.8" # Local dependencies # Any local packages that have dependencies on other local packages must be @@ -48,7 +48,7 @@ apacheconfig = "0.3.2" asn1crypto = "0.24.0" boto3 = "1.15.15" botocore = "1.18.15" -cffi = "1.11.5" +cffi = "1.12.3" chardet = "3.0.4" cloudflare = "1.5.1" configobj = "5.0.6" diff --git a/tools/requirements.txt b/tools/requirements.txt index be328117e..af906a4ba 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -5,182 +5,187 @@ # requirements.txt so that is scanned by GitHub. See # https://docs.github.com/en/github/visualizing-repository-data-with-graphs/about-the-dependency-graph#supported-package-ecosystems # for more info. -alabaster==0.7.13 ; python_version >= "3.7" and python_version < "4.0" -apacheconfig==0.3.2 ; python_version >= "3.7" and python_version < "4.0" -appnope==0.1.3 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "darwin" -astroid==2.13.5 ; python_full_version >= "3.7.2" and python_version < "4.0" -attrs==23.1.0 ; python_version >= "3.7" and python_version < "4.0" -azure-core==1.29.4 ; python_version >= "3.7" and python_version < "4.0" -azure-devops==7.1.0b3 ; python_version >= "3.7" and python_version < "4.0" -babel==2.13.0 ; python_version >= "3.7" and python_version < "4.0" -backcall==0.2.0 ; python_version >= "3.7" and python_version < "4.0" -backports-cached-property==1.0.2 ; python_version >= "3.7" and python_version < "3.8" -bcrypt==4.0.1 ; python_version >= "3.7" and python_version < "4.0" -beautifulsoup4==4.12.2 ; python_version >= "3.7" and python_version < "4.0" -bleach==6.0.0 ; python_version >= "3.7" and python_version < "4.0" -boto3==1.28.60 ; python_version >= "3.7" and python_version < "4.0" -botocore==1.31.60 ; python_version >= "3.7" and python_version < "4.0" -cachecontrol==0.12.14 ; python_version >= "3.7" and python_version < "4.0" -cachetools==5.3.1 ; python_version >= "3.7" and python_version < "4.0" -cachy==0.3.0 ; python_version >= "3.7" and python_version < "4.0" -certifi==2023.7.22 ; python_version >= "3.7" and python_version < "4.0" -cffi==1.15.1 ; python_version >= "3.7" and python_version < "4.0" -charset-normalizer==3.3.0 ; python_version >= "3.7" and python_version < "4.0" -cleo==1.0.0a5 ; python_version >= "3.7" and python_version < "4.0" -cloudflare==2.12.4 ; python_version >= "3.7" and python_version < "4.0" -colorama==0.4.6 ; python_version < "4.0" and sys_platform == "win32" and python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0" and platform_system == "Windows" -configargparse==1.7 ; python_version >= "3.7" and python_version < "4.0" -configobj==5.0.8 ; python_version >= "3.7" and python_version < "4.0" -coverage==7.2.7 ; python_version >= "3.7" and python_version < "4.0" -crashtest==0.3.1 ; python_version >= "3.7" and python_version < "4.0" -cryptography==41.0.4 ; python_version >= "3.7" and python_version < "4.0" -cython==0.29.36 ; python_version >= "3.7" and python_version < "4.0" -decorator==5.1.1 ; python_version >= "3.7" and python_version < "4.0" -deprecated==1.2.14 ; python_version >= "3.7" and python_version < "4.0" -dill==0.3.7 ; python_full_version >= "3.7.2" and python_version < "4.0" -distlib==0.3.7 ; python_version >= "3.7" and python_version < "4.0" -distro==1.8.0 ; python_version >= "3.7" and python_version < "4.0" -dns-lexicon==3.14.1 ; python_version >= "3.7" and python_version < "4.0" -dnspython==2.3.0 ; python_version >= "3.7" and python_version < "4.0" -docutils==0.18.1 ; python_version >= "3.7" and python_version < "4.0" -dulwich==0.20.50 ; python_version >= "3.7" and python_version < "4.0" -exceptiongroup==1.1.3 ; python_version >= "3.7" and python_version < "3.11" -execnet==2.0.2 ; python_version >= "3.7" and python_version < "4.0" -fabric==3.2.2 ; python_version >= "3.7" and python_version < "4.0" -filelock==3.12.2 ; python_version >= "3.7" and python_version < "4.0" -google-api-core==2.12.0 ; python_version >= "3.7" and python_version < "4.0" -google-api-python-client==2.102.0 ; python_version >= "3.7" and python_version < "4.0" -google-auth-httplib2==0.1.1 ; python_version >= "3.7" and python_version < "4.0" -google-auth==2.23.2 ; python_version >= "3.7" and python_version < "4.0" -googleapis-common-protos==1.60.0 ; python_version >= "3.7" and python_version < "4.0" -html5lib==1.1 ; python_version >= "3.7" and python_version < "4.0" -httplib2==0.22.0 ; python_version >= "3.7" and python_version < "4.0" -idna==3.4 ; python_version >= "3.7" and python_version < "4.0" -imagesize==1.4.1 ; python_version >= "3.7" and python_version < "4.0" -importlib-metadata==4.13.0 ; python_version >= "3.7" and python_version < "4.0" -importlib-resources==5.12.0 ; python_version >= "3.7" and python_version < "4.0" -iniconfig==2.0.0 ; python_version >= "3.7" and python_version < "4.0" -invoke==2.2.0 ; python_version >= "3.7" and python_version < "4.0" -ipdb==0.13.13 ; python_version >= "3.7" and python_version < "4.0" -ipython==7.34.0 ; python_version >= "3.7" and python_version < "4.0" -isodate==0.6.1 ; python_version >= "3.7" and python_version < "4.0" -isort==5.11.5 ; python_full_version >= "3.7.2" and python_version < "4.0" -jaraco-classes==3.2.3 ; python_version >= "3.7" and python_version < "4.0" -jedi==0.19.1 ; python_version >= "3.7" and python_version < "4.0" -jeepney==0.8.0 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" -jinja2==3.1.2 ; python_version >= "3.7" and python_version < "4.0" -jmespath==1.0.1 ; python_version >= "3.7" and python_version < "4.0" -josepy==1.13.0 ; python_version >= "3.7" and python_version < "4.0" -jsonlines==3.1.0 ; python_version >= "3.7" and python_version < "4.0" -jsonpickle==3.0.2 ; python_version >= "3.7" and python_version < "4.0" -jsonschema==4.17.3 ; python_version >= "3.7" and python_version < "4.0" -keyring==24.1.1 ; python_version >= "3.7" and python_version < "4.0" -lazy-object-proxy==1.9.0 ; python_full_version >= "3.7.2" and python_version < "4.0" -lockfile==0.12.2 ; python_version >= "3.7" and python_version < "4.0" -markdown-it-py==2.2.0 ; python_version >= "3.7" and python_version < "4.0" -markupsafe==2.1.3 ; python_version >= "3.7" and python_version < "4.0" -matplotlib-inline==0.1.6 ; python_version >= "3.7" and python_version < "4.0" -mccabe==0.7.0 ; python_full_version >= "3.7.2" and python_version < "4.0" -mdurl==0.1.2 ; python_version >= "3.7" and python_version < "4.0" -more-itertools==9.1.0 ; python_version >= "3.7" and python_version < "4.0" -msgpack==1.0.5 ; python_version >= "3.7" and python_version < "4.0" -msrest==0.7.1 ; python_version >= "3.7" and python_version < "4.0" -mypy-extensions==1.0.0 ; python_version >= "3.7" and python_version < "4.0" -mypy==1.4.1 ; python_version >= "3.7" and python_version < "4.0" -oauthlib==3.2.2 ; python_version >= "3.7" and python_version < "4.0" -packaging==23.2 ; python_version >= "3.7" and python_version < "4.0" -paramiko==3.3.1 ; python_version >= "3.7" and python_version < "4.0" -parsedatetime==2.6 ; python_version >= "3.7" and python_version < "4.0" -parso==0.8.3 ; python_version >= "3.7" and python_version < "4.0" -pexpect==4.8.0 ; python_version >= "3.7" and python_version < "4.0" -pickleshare==0.7.5 ; python_version >= "3.7" and python_version < "4.0" -pip==23.2.1 ; python_version >= "3.7" and python_version < "4.0" -pkginfo==1.9.6 ; python_version >= "3.7" and python_version < "4.0" -pkgutil-resolve-name==1.3.10 ; python_version >= "3.7" and python_version < "3.9" -platformdirs==2.6.2 ; python_version < "4.0" and python_version >= "3.7" -pluggy==1.2.0 ; python_version >= "3.7" and python_version < "4.0" -ply==3.11 ; python_version >= "3.7" and python_version < "4.0" -poetry-core==1.3.2 ; python_version >= "3.7" and python_version < "4.0" -poetry-plugin-export==1.2.0 ; python_version >= "3.7" and python_version < "4.0" -poetry==1.2.2 ; python_version >= "3.7" and python_version < "4.0" -prompt-toolkit==3.0.39 ; python_version >= "3.7" and python_version < "4.0" -protobuf==4.24.4 ; python_version >= "3.7" and python_version < "4.0" -ptyprocess==0.7.0 ; python_version >= "3.7" and python_version < "4.0" -py==1.11.0 ; python_version >= "3.7" and python_version < "4.0" -pyasn1-modules==0.3.0 ; python_version >= "3.7" and python_version < "4.0" -pyasn1==0.5.0 ; python_version >= "3.7" and python_version < "4.0" -pycparser==2.21 ; python_version >= "3.7" and python_version < "4.0" -pygments==2.16.1 ; python_version >= "3.7" and python_version < "4.0" -pylev==1.4.0 ; python_version >= "3.7" and python_version < "4.0" -pylint==2.15.5 ; python_full_version >= "3.7.2" and python_version < "4.0" -pynacl==1.5.0 ; python_version >= "3.7" and python_version < "4.0" -pynsist==2.7 ; python_version >= "3.7" and python_version < "4.0" -pyopenssl==23.2.0 ; python_version >= "3.7" and python_version < "4.0" -pyparsing==3.1.1 ; python_version >= "3.7" and python_version < "4.0" -pyrfc3339==1.1 ; python_version >= "3.7" and python_version < "4.0" -pyrsistent==0.19.3 ; python_version >= "3.7" and python_version < "4.0" -pytest-cov==4.1.0 ; python_version >= "3.7" and python_version < "4.0" -pytest-xdist==3.3.1 ; python_version >= "3.7" and python_version < "4.0" -pytest==7.4.2 ; python_version >= "3.7" and python_version < "4.0" -python-augeas==1.1.0 ; python_version >= "3.7" and python_version < "4.0" -python-dateutil==2.8.2 ; python_version >= "3.7" and python_version < "4.0" -python-digitalocean==1.17.0 ; python_version >= "3.7" and python_version < "4.0" -pytz==2023.3.post1 ; python_version >= "3.7" and python_version < "4.0" -pywin32-ctypes==0.2.2 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" -pywin32==306 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" -pyyaml==6.0.1 ; python_version >= "3.7" and python_version < "4.0" -readme-renderer==37.3 ; python_version >= "3.7" and python_version < "4.0" -requests-download==0.1.2 ; python_version >= "3.7" and python_version < "4.0" -requests-file==1.5.1 ; python_version >= "3.7" and python_version < "4.0" -requests-oauthlib==1.3.1 ; python_version >= "3.7" and python_version < "4.0" -requests-toolbelt==0.9.1 ; python_version >= "3.7" and python_version < "4.0" -requests==2.31.0 ; python_version >= "3.7" and python_version < "4.0" -rfc3986==2.0.0 ; python_version >= "3.7" and python_version < "4.0" -rich==13.6.0 ; python_version >= "3.7" and python_version < "4.0" -rsa==4.9 ; python_version >= "3.7" and python_version < "4" -s3transfer==0.7.0 ; python_version >= "3.7" and python_version < "4.0" -secretstorage==3.3.3 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" -semantic-version==2.10.0 ; python_version >= "3.7" and python_version < "4.0" -setuptools-rust==1.7.0 ; python_version >= "3.7" and python_version < "4.0" -setuptools==67.4.0 ; python_version >= "3.7" and python_version < "4.0" -shellingham==1.5.3 ; python_version >= "3.7" and python_version < "4.0" -six==1.16.0 ; python_version >= "3.7" and python_version < "4.0" -snowballstemmer==2.2.0 ; python_version >= "3.7" and python_version < "4.0" -soupsieve==2.4.1 ; python_version >= "3.7" and python_version < "4.0" -sphinx-rtd-theme==1.3.0 ; python_version >= "3.7" and python_version < "4.0" -sphinx==5.3.0 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-applehelp==1.0.2 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-htmlhelp==2.0.0 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-jquery==4.1 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.7" and python_version < "4.0" -sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.7" and python_version < "4.0" -tldextract==3.6.0 ; python_version >= "3.7" and python_version < "4.0" -tomli==2.0.1 ; python_version >= "3.7" and python_full_version <= "3.11.0a6" -tomlkit==0.12.1 ; python_version < "4.0" and python_version >= "3.7" -tox==3.28.0 ; python_version >= "3.7" and python_version < "4.0" -traitlets==5.9.0 ; python_version >= "3.7" and python_version < "4.0" -twine==4.0.2 ; python_version >= "3.7" and python_version < "4.0" -typed-ast==1.5.5 ; python_version < "3.8" and python_version >= "3.7" -types-httplib2==0.22.0.2 ; python_version >= "3.7" and python_version < "4.0" -types-pyopenssl==23.2.0.2 ; python_version >= "3.7" and python_version < "4.0" -types-pyrfc3339==1.1.1.5 ; python_version >= "3.7" and python_version < "4.0" -types-python-dateutil==2.8.19.14 ; python_version >= "3.7" and python_version < "4.0" -types-pytz==2023.3.1.1 ; python_version >= "3.7" and python_version < "4.0" -types-pywin32==306.0.0.4 ; python_version >= "3.7" and python_version < "4.0" -types-requests==2.31.0.2 ; python_version >= "3.7" and python_version < "4.0" -types-setuptools==68.2.0.0 ; python_version >= "3.7" and python_version < "4.0" -types-six==1.16.21.9 ; python_version >= "3.7" and python_version < "4.0" -types-urllib3==1.26.25.14 ; python_version >= "3.7" and python_version < "4.0" -typing-extensions==4.7.1 ; python_version >= "3.7" and python_version < "4.0" -uritemplate==4.1.1 ; python_version >= "3.7" and python_version < "4.0" -urllib3==1.26.17 ; python_version >= "3.7" and python_version < "4.0" -virtualenv==20.21.1 ; python_version >= "3.7" and python_version < "4.0" -wcwidth==0.2.8 ; python_version >= "3.7" and python_version < "4.0" -webencodings==0.5.1 ; python_version >= "3.7" and python_version < "4.0" -wheel==0.41.2 ; python_version >= "3.7" and python_version < "4.0" -wrapt==1.15.0 ; python_version < "4.0" and python_version >= "3.7" -xattr==0.9.9 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "darwin" -yarg==0.1.9 ; python_version >= "3.7" and python_version < "4.0" -zipp==3.15.0 ; python_version >= "3.7" and python_version < "4.0" +alabaster==0.7.13 ; python_version >= "3.8" and python_version < "4.0" +apacheconfig==0.3.2 ; python_version >= "3.8" and python_version < "4.0" +appnope==0.1.3 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "darwin" +astroid==2.13.5 ; python_version >= "3.8" and python_version < "4.0" +asttokens==2.4.0 ; python_version >= "3.8" and python_version < "4.0" +attrs==23.1.0 ; python_version >= "3.8" and python_version < "4.0" +azure-core==1.29.4 ; python_version >= "3.8" and python_version < "4.0" +azure-devops==7.1.0b3 ; python_version >= "3.8" and python_version < "4.0" +babel==2.13.0 ; python_version >= "3.8" and python_version < "4.0" +backcall==0.2.0 ; python_version >= "3.8" and python_version < "4.0" +bcrypt==4.0.1 ; python_version >= "3.8" and python_version < "4.0" +beautifulsoup4==4.12.2 ; python_version >= "3.8" and python_version < "4.0" +boto3==1.28.62 ; python_version >= "3.8" and python_version < "4.0" +botocore==1.31.62 ; python_version >= "3.8" and python_version < "4.0" +cachecontrol==0.12.14 ; python_version >= "3.8" and python_version < "4.0" +cachetools==5.3.1 ; python_version >= "3.8" and python_version < "4.0" +cachy==0.3.0 ; python_version >= "3.8" and python_version < "4.0" +certifi==2023.7.22 ; python_version >= "3.8" and python_version < "4.0" +cffi==1.16.0 ; python_version >= "3.8" and python_version < "4.0" +charset-normalizer==3.3.0 ; python_version >= "3.8" and python_version < "4.0" +cleo==1.0.0a5 ; python_version >= "3.8" and python_version < "4.0" +cloudflare==2.12.4 ; python_version >= "3.8" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" or python_version >= "3.8" and python_version < "4.0" and platform_system == "Windows" +configargparse==1.7 ; python_version >= "3.8" and python_version < "4.0" +configobj==5.0.8 ; python_version >= "3.8" and python_version < "4.0" +coverage==7.3.2 ; python_version >= "3.8" and python_version < "4.0" +crashtest==0.3.1 ; python_version >= "3.8" and python_version < "4.0" +cryptography==41.0.4 ; python_version >= "3.8" and python_version < "4.0" +cython==0.29.36 ; python_version >= "3.8" and python_version < "4.0" +decorator==5.1.1 ; python_version >= "3.8" and python_version < "4.0" +deprecated==1.2.14 ; python_version >= "3.8" and python_version < "4.0" +dill==0.3.7 ; python_version >= "3.8" and python_version < "4.0" +distlib==0.3.7 ; python_version >= "3.8" and python_version < "4.0" +distro==1.8.0 ; python_version >= "3.8" and python_version < "4.0" +dns-lexicon==3.15.0 ; python_version >= "3.8" and python_version < "4.0" +dnspython==2.4.2 ; python_version >= "3.8" and python_version < "4.0" +docutils==0.18.1 ; python_version >= "3.8" and python_version < "4.0" +dulwich==0.20.50 ; python_version >= "3.8" and python_version < "4.0" +exceptiongroup==1.1.3 ; python_version >= "3.8" and python_version < "3.11" +execnet==2.0.2 ; python_version >= "3.8" and python_version < "4.0" +executing==2.0.0 ; python_version >= "3.8" and python_version < "4.0" +fabric==3.2.2 ; python_version >= "3.8" and python_version < "4.0" +filelock==3.12.4 ; python_version >= "3.8" and python_version < "4.0" +google-api-core==2.12.0 ; python_version >= "3.8" and python_version < "4.0" +google-api-python-client==2.102.0 ; python_version >= "3.8" and python_version < "4.0" +google-auth-httplib2==0.1.1 ; python_version >= "3.8" and python_version < "4.0" +google-auth==2.23.3 ; python_version >= "3.8" and python_version < "4.0" +googleapis-common-protos==1.60.0 ; python_version >= "3.8" and python_version < "4.0" +html5lib==1.1 ; python_version >= "3.8" and python_version < "4.0" +httplib2==0.22.0 ; python_version >= "3.8" and python_version < "4.0" +idna==3.4 ; python_version >= "3.8" and python_version < "4.0" +imagesize==1.4.1 ; python_version >= "3.8" and python_version < "4.0" +importlib-metadata==4.13.0 ; python_version >= "3.8" and python_version < "4.0" +importlib-resources==6.1.0 ; python_version >= "3.8" and python_version < "4.0" +iniconfig==2.0.0 ; python_version >= "3.8" and python_version < "4.0" +invoke==2.2.0 ; python_version >= "3.8" and python_version < "4.0" +ipdb==0.13.13 ; python_version >= "3.8" and python_version < "4.0" +ipython==8.12.3 ; python_version >= "3.8" and python_version < "4.0" +isodate==0.6.1 ; python_version >= "3.8" and python_version < "4.0" +isort==5.12.0 ; python_version >= "3.8" and python_version < "4.0" +jaraco-classes==3.3.0 ; python_version >= "3.8" and python_version < "4.0" +jedi==0.19.1 ; python_version >= "3.8" and python_version < "4.0" +jeepney==0.8.0 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "linux" +jinja2==3.1.2 ; python_version >= "3.8" and python_version < "4.0" +jmespath==1.0.1 ; python_version >= "3.8" and python_version < "4.0" +josepy==1.13.0 ; python_version >= "3.8" and python_version < "4.0" +jsonlines==4.0.0 ; python_version >= "3.8" and python_version < "4.0" +jsonpickle==3.0.2 ; python_version >= "3.8" and python_version < "4.0" +jsonschema-specifications==2023.7.1 ; python_version >= "3.8" and python_version < "4.0" +jsonschema==4.19.1 ; python_version >= "3.8" and python_version < "4.0" +keyring==24.2.0 ; python_version >= "3.8" and python_version < "4.0" +lazy-object-proxy==1.9.0 ; python_version >= "3.8" and python_version < "4.0" +lockfile==0.12.2 ; python_version >= "3.8" and python_version < "4.0" +markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0" +markupsafe==2.1.3 ; python_version >= "3.8" and python_version < "4.0" +matplotlib-inline==0.1.6 ; python_version >= "3.8" and python_version < "4.0" +mccabe==0.7.0 ; python_version >= "3.8" and python_version < "4.0" +mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0" +more-itertools==10.1.0 ; python_version >= "3.8" and python_version < "4.0" +msgpack==1.0.7 ; python_version >= "3.8" and python_version < "4.0" +msrest==0.7.1 ; python_version >= "3.8" and python_version < "4.0" +mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "4.0" +mypy==1.5.1 ; python_version >= "3.8" and python_version < "4.0" +nh3==0.2.14 ; python_version >= "3.8" and python_version < "4.0" +oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0" +packaging==23.2 ; python_version >= "3.8" and python_version < "4.0" +paramiko==3.3.1 ; python_version >= "3.8" and python_version < "4.0" +parsedatetime==2.6 ; python_version >= "3.8" and python_version < "4.0" +parso==0.8.3 ; python_version >= "3.8" and python_version < "4.0" +pexpect==4.8.0 ; python_version >= "3.8" and python_version < "4.0" +pickleshare==0.7.5 ; python_version >= "3.8" and python_version < "4.0" +pip==23.2.1 ; python_version >= "3.8" and python_version < "4.0" +pkginfo==1.9.6 ; python_version >= "3.8" and python_version < "4.0" +pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9" +platformdirs==2.6.2 ; python_version >= "3.8" and python_version < "4.0" +pluggy==1.3.0 ; python_version >= "3.8" and python_version < "4.0" +ply==3.11 ; python_version >= "3.8" and python_version < "4.0" +poetry-core==1.3.2 ; python_version >= "3.8" and python_version < "4.0" +poetry-plugin-export==1.2.0 ; python_version >= "3.8" and python_version < "4.0" +poetry==1.2.2 ; python_version >= "3.8" and python_version < "4.0" +prompt-toolkit==3.0.39 ; python_version >= "3.8" and python_version < "4.0" +protobuf==4.24.4 ; python_version >= "3.8" and python_version < "4.0" +ptyprocess==0.7.0 ; python_version >= "3.8" and python_version < "4.0" +pure-eval==0.2.2 ; python_version >= "3.8" and python_version < "4.0" +py==1.11.0 ; python_version >= "3.8" and python_version < "4.0" +pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0" +pyasn1==0.5.0 ; python_version >= "3.8" and python_version < "4.0" +pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0" +pygments==2.16.1 ; python_version >= "3.8" and python_version < "4.0" +pylev==1.4.0 ; python_version >= "3.8" and python_version < "4.0" +pylint==2.15.5 ; python_version >= "3.8" and python_version < "4.0" +pynacl==1.5.0 ; python_version >= "3.8" and python_version < "4.0" +pynsist==2.7 ; python_version >= "3.8" and python_version < "4.0" +pyopenssl==23.2.0 ; python_version >= "3.8" and python_version < "4.0" +pyotp==2.9.0 ; python_version >= "3.8" and python_version < "4.0" +pyparsing==3.1.1 ; python_version >= "3.8" and python_version < "4.0" +pyrfc3339==1.1 ; python_version >= "3.8" and python_version < "4.0" +pytest-cov==4.1.0 ; python_version >= "3.8" and python_version < "4.0" +pytest-xdist==3.3.1 ; python_version >= "3.8" and python_version < "4.0" +pytest==7.4.2 ; python_version >= "3.8" and python_version < "4.0" +python-augeas==1.1.0 ; python_version >= "3.8" and python_version < "4.0" +python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0" +python-digitalocean==1.17.0 ; python_version >= "3.8" and python_version < "4.0" +pytz==2023.3.post1 ; python_version >= "3.8" and python_version < "4.0" +pywin32-ctypes==0.2.2 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" +pywin32==306 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32" +pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0" +readme-renderer==42.0 ; python_version >= "3.8" and python_version < "4.0" +referencing==0.30.2 ; python_version >= "3.8" and python_version < "4.0" +requests-download==0.1.2 ; python_version >= "3.8" and python_version < "4.0" +requests-file==1.5.1 ; python_version >= "3.8" and python_version < "4.0" +requests-oauthlib==1.3.1 ; python_version >= "3.8" and python_version < "4.0" +requests-toolbelt==0.9.1 ; python_version >= "3.8" and python_version < "4.0" +requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0" +rfc3986==2.0.0 ; python_version >= "3.8" and python_version < "4.0" +rich==13.6.0 ; python_version >= "3.8" and python_version < "4.0" +rpds-py==0.10.4 ; python_version >= "3.8" and python_version < "4.0" +rsa==4.9 ; python_version >= "3.8" and python_version < "4" +s3transfer==0.7.0 ; python_version >= "3.8" and python_version < "4.0" +secretstorage==3.3.3 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "linux" +semantic-version==2.10.0 ; python_version >= "3.8" and python_version < "4.0" +setuptools-rust==1.7.0 ; python_version >= "3.8" and python_version < "4.0" +setuptools==67.4.0 ; python_version >= "3.8" and python_version < "4.0" +shellingham==1.5.3 ; python_version >= "3.8" and python_version < "4.0" +six==1.16.0 ; python_version >= "3.8" and python_version < "4.0" +snowballstemmer==2.2.0 ; python_version >= "3.8" and python_version < "4.0" +soupsieve==2.5 ; python_version >= "3.8" and python_version < "4.0" +sphinx-rtd-theme==1.3.0 ; python_version >= "3.8" and python_version < "4.0" +sphinx==7.1.2 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-applehelp==1.0.4 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-htmlhelp==2.0.1 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-jquery==4.1 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.8" and python_version < "4.0" +sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.8" and python_version < "4.0" +stack-data==0.6.3 ; python_version >= "3.8" and python_version < "4.0" +tldextract==3.6.0 ; python_version >= "3.8" and python_version < "4.0" +tomli==2.0.1 ; python_version >= "3.8" and python_full_version <= "3.11.0a6" +tomlkit==0.12.1 ; python_version >= "3.8" and python_version < "4.0" +tox==3.28.0 ; python_version >= "3.8" and python_version < "4.0" +traitlets==5.11.2 ; python_version >= "3.8" and python_version < "4.0" +twine==4.0.2 ; python_version >= "3.8" and python_version < "4.0" +types-httplib2==0.22.0.2 ; python_version >= "3.8" and python_version < "4.0" +types-pyopenssl==23.2.0.2 ; python_version >= "3.8" and python_version < "4.0" +types-pyrfc3339==1.1.1.5 ; python_version >= "3.8" and python_version < "4.0" +types-python-dateutil==2.8.19.14 ; python_version >= "3.8" and python_version < "4.0" +types-pytz==2023.3.1.1 ; python_version >= "3.8" and python_version < "4.0" +types-pywin32==306.0.0.4 ; python_version >= "3.8" and python_version < "4.0" +types-requests==2.31.0.6 ; python_version >= "3.8" and python_version < "4.0" +types-setuptools==68.2.0.0 ; python_version >= "3.8" and python_version < "4.0" +types-six==1.16.21.9 ; python_version >= "3.8" and python_version < "4.0" +types-urllib3==1.26.25.14 ; python_version >= "3.8" and python_version < "4.0" +typing-extensions==4.8.0 ; python_version >= "3.8" and python_version < "4.0" +uritemplate==4.1.1 ; python_version >= "3.8" and python_version < "4.0" +urllib3==1.26.17 ; python_version < "4.0" and python_version >= "3.8" +virtualenv==20.21.1 ; python_version >= "3.8" and python_version < "4.0" +wcwidth==0.2.8 ; python_version >= "3.8" and python_version < "4.0" +webencodings==0.5.1 ; python_version >= "3.8" and python_version < "4.0" +wheel==0.41.2 ; python_version >= "3.8" and python_version < "4.0" +wrapt==1.15.0 ; python_version >= "3.8" and python_version < "4.0" +xattr==0.9.9 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "darwin" +yarg==0.1.9 ; python_version >= "3.8" and python_version < "4.0" +zipp==3.17.0 ; python_version >= "3.8" and python_version < "4.0" diff --git a/tools/venv.py b/tools/venv.py index 244a13798..8a3650678 100755 --- a/tools/venv.py +++ b/tools/venv.py @@ -117,7 +117,7 @@ def _check_version(version_str): version = (int(search.group(1)), int(search.group(2))) - if version >= (3, 7): + if version >= (3, 8): return True print('Incompatible python version for Certbot found: {0}'.format(version_str)) diff --git a/tox.ini b/tox.ini index 302f56478..dc83a5d4e 100644 --- a/tox.ini +++ b/tox.ini @@ -56,10 +56,10 @@ commands = commands = {[testenv:py-win]commands} certbot-apache -[testenv:py3{,7,8,9,10,11}] +[testenv:py3{,8,9,10,11}] commands = {[testenv:py]commands} -[testenv:py3.{7,8,9,10,11}] +[testenv:py3.{8,9,10,11}] commands = {[testenv:py]commands} [testenv:oldest] @@ -69,7 +69,7 @@ commands = {[testenv:py]commands} # # This version should be kept in sync with the one declared in # tools/pinning/oldest/pyproject.toml. -basepython = python3.7 +basepython = python3.8 setenv = CERTBOT_OLDEST=1 commands = {[testenv:py]commands} diff --git a/windows-installer/setup.py b/windows-installer/setup.py index 05ac7f12a..e10c54b69 100644 --- a/windows-installer/setup.py +++ b/windows-installer/setup.py @@ -11,14 +11,13 @@ setup( author="Certbot Project", author_email='certbot-dev@eff.org', license='Apache License 2.0', - python_requires='>=3.7', + python_requires='>=3.8', classifiers=[ 'Development Status :: 4 - Beta', 'Intended Audience :: Developers', 'License :: OSI Approved :: Apache Software License', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.10',