1
0
mirror of https://github.com/certbot/certbot.git synced 2026-01-26 07:41:33 +03:00

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
This commit is contained in:
Adrien Ferrand
2023-10-13 15:57:42 +02:00
committed by GitHub
parent d9d825ac50
commit 8a95c030e6
48 changed files with 368 additions and 430 deletions

View File

@@ -8,9 +8,6 @@ jobs:
- group: certbot-common - group: certbot-common
strategy: strategy:
matrix: matrix:
linux-py38:
PYTHON_VERSION: 3.8
TOXENV: py38
linux-py39: linux-py39:
PYTHON_VERSION: 3.9 PYTHON_VERSION: 3.9
TOXENV: py39 TOXENV: py39
@@ -20,17 +17,13 @@ jobs:
linux-isolated: linux-isolated:
TOXENV: 'isolated-{acme,certbot,apache,cloudflare,digitalocean,dnsimple,dnsmadeeasy,gehirn,google,linode,luadns,nsone,ovh,rfc2136,route53,sakuracloud,nginx}' 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: linux-boulder-v2-integration-certbot-oldest:
PYTHON_VERSION: 3.7 PYTHON_VERSION: 3.8
TOXENV: integration-certbot-oldest TOXENV: integration-certbot-oldest
ACME_SERVER: boulder-v2 ACME_SERVER: boulder-v2
linux-boulder-v2-integration-nginx-oldest: linux-boulder-v2-integration-nginx-oldest:
PYTHON_VERSION: 3.7 PYTHON_VERSION: 3.8
TOXENV: integration-nginx-oldest TOXENV: integration-nginx-oldest
ACME_SERVER: boulder-v2 ACME_SERVER: boulder-v2
linux-boulder-v2-py37-integration:
PYTHON_VERSION: 3.7
TOXENV: integration
ACME_SERVER: boulder-v2
linux-boulder-v2-py38-integration: linux-boulder-v2-py38-integration:
PYTHON_VERSION: 3.8 PYTHON_VERSION: 3.8
TOXENV: integration TOXENV: integration

View File

@@ -4,9 +4,9 @@ jobs:
PYTHON_VERSION: 3.11 PYTHON_VERSION: 3.11
strategy: strategy:
matrix: matrix:
macos-py37-cover: macos-py38-cover:
IMAGE_NAME: macOS-12 IMAGE_NAME: macOS-12
PYTHON_VERSION: 3.7 PYTHON_VERSION: 3.8
TOXENV: cover TOXENV: cover
# As of pip 23.1.0, builds started failing on macOS unless this flag was set. # 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. # See https://github.com/certbot/certbot/pull/9717#issuecomment-1610861794.
@@ -14,11 +14,11 @@ jobs:
macos-cover: macos-cover:
IMAGE_NAME: macOS-12 IMAGE_NAME: macOS-12
TOXENV: cover TOXENV: cover
# See explanation under macos-py37-cover. # See explanation under macos-py38-cover.
PIP_USE_PEP517: "true" PIP_USE_PEP517: "true"
windows-py37: windows-py38:
IMAGE_NAME: windows-2019 IMAGE_NAME: windows-2019
PYTHON_VERSION: 3.7 PYTHON_VERSION: 3.8
TOXENV: py-win TOXENV: py-win
windows-py39-cover: windows-py39-cover:
IMAGE_NAME: windows-2019 IMAGE_NAME: windows-2019
@@ -30,12 +30,12 @@ jobs:
TOXENV: integration-certbot TOXENV: integration-certbot
linux-oldest: linux-oldest:
IMAGE_NAME: ubuntu-22.04 IMAGE_NAME: ubuntu-22.04
PYTHON_VERSION: 3.7 PYTHON_VERSION: 3.8
TOXENV: oldest TOXENV: oldest
linux-py37: linux-py38:
IMAGE_NAME: ubuntu-22.04 IMAGE_NAME: ubuntu-22.04
PYTHON_VERSION: 3.7 PYTHON_VERSION: 3.8
TOXENV: py37 TOXENV: py38
linux-cover: linux-cover:
IMAGE_NAME: ubuntu-22.04 IMAGE_NAME: ubuntu-22.04
TOXENV: cover TOXENV: cover

View File

@@ -6,7 +6,6 @@ This module is an implementation of the `ACME protocol`_.
""" """
import sys import sys
import warnings
# This code exists to keep backwards compatibility with people using acme.jose # This code exists to keep backwards compatibility with people using acme.jose
# before it became the standalone josepy package. # before it became the standalone josepy package.
@@ -20,10 +19,3 @@ for mod in list(sys.modules):
# preserved (acme.jose.* is josepy.*) # preserved (acme.jose.* is josepy.*)
if mod == 'josepy' or mod.startswith('josepy.'): if mod == 'josepy' or mod.startswith('josepy.'):
sys.modules['acme.' + mod.replace('josepy', 'jose', 1)] = sys.modules[mod] 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

View File

@@ -44,14 +44,13 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Intended Audience :: Developers', 'Intended Audience :: Developers',
'License :: OSI Approved :: Apache Software License', 'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -30,7 +30,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -39,7 +39,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -32,14 +32,13 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 3 - Alpha', 'Development Status :: 3 - Alpha',
'Intended Audience :: Developers', 'Intended Audience :: Developers',
'License :: OSI Approved :: Apache Software License', 'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -1,5 +1,5 @@
FROM debian:buster FROM docker.io/python:3.8-buster
MAINTAINER Brad Warren <bmw@eff.org> LABEL maintainer="Brad Warren <bmw@eff.org>"
# This does not include the dependencies needed to build cryptography. See # This does not include the dependencies needed to build cryptography. See
# https://cryptography.io/en/latest/installation/#building-cryptography-on-linux # https://cryptography.io/en/latest/installation/#building-cryptography-on-linux

View File

@@ -18,14 +18,13 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 3 - Alpha', 'Development Status :: 3 - Alpha',
'Intended Audience :: Developers', 'Intended Audience :: Developers',
'License :: OSI Approved :: Apache Software License', 'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -39,7 +39,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -48,7 +48,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -39,7 +39,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -48,7 +48,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -3,6 +3,7 @@ from unittest import mock
import sys import sys
import pytest import pytest
from requests import Response
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from certbot.compat import os from certbot.compat import os
@@ -16,7 +17,7 @@ TOKEN = 'foo'
class AuthenticatorTest(test_util.TempDirTestCase, class AuthenticatorTest(test_util.TempDirTestCase,
dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): 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): def setUp(self):
super().setUp() super().setUp()

View File

@@ -41,7 +41,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -50,7 +50,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -4,6 +4,7 @@ import sys
from unittest import mock from unittest import mock
import pytest import pytest
from requests import Response
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from certbot.compat import os from certbot.compat import os
@@ -19,8 +20,8 @@ SECRET_KEY = 'bar'
class AuthenticatorTest(test_util.TempDirTestCase, class AuthenticatorTest(test_util.TempDirTestCase,
dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest):
DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found 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}.') LOGIN_ERROR = HTTPError(f'403 Client Error: Forbidden for url: {DOMAIN}.', response=Response())
def setUp(self): def setUp(self):
super().setUp() super().setUp()

View File

@@ -39,7 +39,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -48,7 +48,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -5,6 +5,7 @@ import unittest
from unittest import mock from unittest import mock
import pytest import pytest
from requests import Response
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from certbot.compat import os from certbot.compat import os
@@ -20,8 +21,8 @@ API_SECRET = 'MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw'
class AuthenticatorTest(test_util.TempDirTestCase, class AuthenticatorTest(test_util.TempDirTestCase,
dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest):
DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found 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}.') LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.', response=Response())
def setUp(self): def setUp(self):
super().setUp() super().setUp()

View File

@@ -39,7 +39,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -48,7 +48,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -40,7 +40,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -49,7 +49,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -39,7 +39,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -48,7 +48,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -3,6 +3,7 @@ import sys
from unittest import mock from unittest import mock
import pytest import pytest
from requests import Response
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from certbot.compat import os from certbot.compat import os
@@ -17,7 +18,7 @@ TOKEN = 'foo'
class AuthenticatorTest(test_util.TempDirTestCase, class AuthenticatorTest(test_util.TempDirTestCase,
dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): 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): def setUp(self):
super().setUp() super().setUp()

View File

@@ -39,7 +39,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -48,7 +48,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -3,6 +3,7 @@ import sys
from unittest import mock from unittest import mock
import pytest import pytest
from requests import Response
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from certbot.compat import os from certbot.compat import os
@@ -17,8 +18,8 @@ API_KEY = 'foo'
class AuthenticatorTest(test_util.TempDirTestCase, class AuthenticatorTest(test_util.TempDirTestCase,
dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest):
DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found 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}.') LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.', response=Response())
def setUp(self): def setUp(self):
super().setUp() super().setUp()

View File

@@ -39,7 +39,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -48,7 +48,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -3,6 +3,7 @@ from unittest import mock
import sys import sys
import pytest import pytest
from requests import Response
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from certbot.compat import os from certbot.compat import os
@@ -20,8 +21,7 @@ class AuthenticatorTest(test_util.TempDirTestCase,
dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest):
DOMAIN_NOT_FOUND = Exception('Domain example.com not found') 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): def setUp(self):
super().setUp() super().setUp()

View File

@@ -39,7 +39,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -48,7 +48,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -39,7 +39,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -48,7 +48,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -39,7 +39,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -48,7 +48,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -3,6 +3,7 @@ import sys
from unittest import mock from unittest import mock
import pytest import pytest
from requests import Response
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from certbot.compat import os from certbot.compat import os
@@ -18,8 +19,8 @@ API_SECRET = 'MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw'
class AuthenticatorTest(test_util.TempDirTestCase, class AuthenticatorTest(test_util.TempDirTestCase,
dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest): dns_test_common_lexicon.BaseLexiconDNSAuthenticatorTest):
DOMAIN_NOT_FOUND = HTTPError(f'404 Client Error: Not Found 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}.') LOGIN_ERROR = HTTPError(f'401 Client Error: Unauthorized for url: {DOMAIN}.', response=Response())
def setUp(self): def setUp(self):
super().setUp() super().setUp()

View File

@@ -39,7 +39,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -48,7 +48,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -10,8 +10,8 @@ from typing import Iterable
from typing import Iterator from typing import Iterator
from typing import List from typing import List
from typing import overload from typing import overload
from typing import SupportsIndex
from typing import Tuple from typing import Tuple
from typing import TYPE_CHECKING
from typing import Union from typing import Union
from pyparsing import Combine from pyparsing import Combine
@@ -27,9 +27,6 @@ from pyparsing import stringEnd
from pyparsing import White from pyparsing import White
from pyparsing import ZeroOrMore from pyparsing import ZeroOrMore
if TYPE_CHECKING:
from typing_extensions import SupportsIndex # typing.SupportsIndex not supported on Python 3.7
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)

View File

@@ -28,7 +28,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Plugins', 'Environment :: Plugins',
@@ -37,7 +37,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -10,7 +10,7 @@ Certbot adheres to [Semantic Versioning](https://semver.org/).
### Changed ### Changed
* * Support for Python 3.7 was removed.
### Fixed ### Fixed

View File

@@ -1,13 +1,4 @@
"""Certbot client.""" """Certbot client."""
import sys
import warnings
# version number like 1.2.3a0, must have at least 2 parts, like 1.2 # version number like 1.2.3a0, must have at least 2 parts, like 1.2
__version__ = '2.8.0.dev0' __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

View File

@@ -3,12 +3,9 @@ import glob
from types import TracebackType from types import TracebackType
from typing import Callable from typing import Callable
from typing import Iterator from typing import Iterator
from typing import Literal
from typing import Optional from typing import Optional
from typing import Type 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 # readline module is not available on all systems
try: try:

View File

@@ -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 if config.func != plugins_cmd: # pylint: disable=comparison-with-callable
raise 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: with make_displayer(config) as displayer:
display_obj.set_display(displayer) display_obj.set_display(displayer)

View File

@@ -182,9 +182,9 @@ class PluginsRegistry(Mapping):
plugin_paths = plugin_paths_string.split(':') if plugin_paths_string else [] plugin_paths = plugin_paths_string.split(':') if plugin_paths_string else []
# XXX should ensure this only happens once # XXX should ensure this only happens once
sys.path.extend(plugin_paths) 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)) 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)) group=constants.OLD_SETUPTOOLS_PLUGINS_ENTRY_POINT))
for entry_point in entry_points + old_entry_points: for entry_point in entry_points + old_entry_points:
try: try:

View File

@@ -30,9 +30,9 @@ try:
from lexicon.config import ConfigResolver from lexicon.config import ConfigResolver
from lexicon.interfaces import Provider from lexicon.interfaces import Provider
except ImportError: # pragma: no cover except ImportError: # pragma: no cover
Client = None Client = None # type: ignore
ConfigResolver = None ConfigResolver = None # type: ignore
Provider = None Provider = None # type: ignore
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -148,19 +148,18 @@ def build_lexicon_config(lexicon_provider_name: str,
.. deprecated:: 2.7.0 .. deprecated:: 2.7.0
Please use certbot.plugins.dns_common_lexicon.LexiconDNSAuthenticator instead. Please use certbot.plugins.dns_common_lexicon.LexiconDNSAuthenticator instead.
""" """
config: Union[ConfigResolver, Dict[str, Any]] = {'provider_name': lexicon_provider_name} config_dict: Dict[str, Any] = {'provider_name': lexicon_provider_name}
config.update(lexicon_options) config_dict.update(lexicon_options)
if not ConfigResolver: if ConfigResolver is None:
# Lexicon 2.x # Lexicon 2.x
config.update(provider_options) config_dict.update(provider_options)
return config_dict
else: else:
# Lexicon 3.x # Lexicon 3.x
provider_config: Dict[str, Any] = {} provider_config: Dict[str, Any] = {}
provider_config.update(provider_options) provider_config.update(provider_options)
config[lexicon_provider_name] = provider_config config_dict[lexicon_provider_name] = provider_config
config = ConfigResolver().with_dict(config).with_env() return ConfigResolver().with_dict(config_dict).with_env()
return config
class LexiconDNSAuthenticator(dns_common.DNSAuthenticator): class LexiconDNSAuthenticator(dns_common.DNSAuthenticator):

View File

@@ -1,7 +1,7 @@
"""Base test class for DNS authenticators.""" """Base test class for DNS authenticators."""
from typing import Any from typing import Any
from typing import Mapping from typing import Mapping
from typing import TYPE_CHECKING from typing import Protocol
from unittest import mock from unittest import mock
import configobj import configobj
@@ -14,12 +14,6 @@ from certbot.plugins.dns_common import DNSAuthenticator
from certbot.tests import acme_util from certbot.tests import acme_util
from certbot.tests import util as test_util from certbot.tests import util as test_util
if TYPE_CHECKING:
from typing_extensions import Protocol
else:
Protocol = object
DOMAIN = 'example.com' DOMAIN = 'example.com'
KEY = jose.JWKRSA.load(test_util.load_vector("rsa512_key.pem")) KEY = jose.JWKRSA.load(test_util.load_vector("rsa512_key.pem"))

View File

@@ -6,13 +6,14 @@ from typing import Any
from typing import cast from typing import cast
from typing import Generator from typing import Generator
from typing import List from typing import List
from typing import Protocol
from typing import Tuple from typing import Tuple
from typing import TYPE_CHECKING
from unittest import mock from unittest import mock
from unittest.mock import MagicMock from unittest.mock import MagicMock
import warnings import warnings
import josepy as jose import josepy as jose
from requests import Response
from requests.exceptions import HTTPError from requests.exceptions import HTTPError
from requests.exceptions import RequestException from requests.exceptions import RequestException
@@ -27,18 +28,13 @@ with warnings.catch_warnings():
from certbot.plugins.dns_test_common import _AuthenticatorCallableTestCase from certbot.plugins.dns_test_common import _AuthenticatorCallableTestCase
from certbot.tests import util as test_util 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' DOMAIN = 'example.com'
KEY = jose.JWKRSA.load(test_util.load_vector("rsa512_key.pem")) KEY = jose.JWKRSA.load(test_util.load_vector("rsa512_key.pem"))
DOMAIN_NOT_FOUND = Exception('No domain found') DOMAIN_NOT_FOUND = Exception('No domain found')
GENERIC_ERROR = RequestException GENERIC_ERROR = RequestException
LOGIN_ERROR = HTTPError('400 Client Error: ...') LOGIN_ERROR = HTTPError('400 Client Error: ...', response=Response())
UNKNOWN_LOGIN_ERROR = HTTPError('500 Surprise! Error: ...') UNKNOWN_LOGIN_ERROR = HTTPError('500 Surprise! Error: ...', response=Response())
class _AuthenticatorCallableLexiconTestCase(_AuthenticatorCallableTestCase, Protocol): class _AuthenticatorCallableLexiconTestCase(_AuthenticatorCallableTestCase, Protocol):

View File

@@ -70,8 +70,7 @@ test_extras = [
'coverage', 'coverage',
'mypy', 'mypy',
'pip', 'pip',
# Our pinned version of pylint requires Python >= 3.7.2. 'pylint',
'pylint ; python_full_version >= "3.7.2"',
'pytest', 'pytest',
'pytest-cov', 'pytest-cov',
'pytest-xdist', 'pytest-xdist',
@@ -85,9 +84,6 @@ test_extras = [
'types-requests', 'types-requests',
'types-setuptools', 'types-setuptools',
'types-six', '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', 'wheel',
] ]
@@ -103,7 +99,7 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Environment :: Console', 'Environment :: Console',
@@ -113,7 +109,6 @@ setup(
'Operating System :: POSIX :: Linux', 'Operating System :: POSIX :: Linux',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -9,14 +9,13 @@ setup(
author='Certbot Project', author='Certbot Project',
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 5 - Production/Stable', 'Development Status :: 5 - Production/Stable',
'Intended Audience :: Developers', 'Intended Audience :: Developers',
'License :: OSI Approved :: Apache Software License', 'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',

View File

@@ -27,12 +27,9 @@
# is the latest version of that library. See # is the latest version of that library. See
# https://github.com/sphinx-doc/sphinxcontrib-devhelp/blob/1.0.2/setup.py#L69. # https://github.com/sphinx-doc/sphinxcontrib-devhelp/blob/1.0.2/setup.py#L69.
# 6) Ignore DeprecationWarning from using pkg_resources API # 6) Ignore DeprecationWarning from using pkg_resources API
# 7) Ignore our own PendingDeprecationWarning about Python 3.7 soon to be dropped. # 7) Ignore DeprecationWarning for datetime.utcfromtimestamp() triggered
# 8) Ignore DeprecationWarning for datetime.utcfromtimestamp() triggered
# when importing the pytz.tzinfo module # when importing the pytz.tzinfo module
# https://github.com/stub42/pytz/issues/105 # 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 = filterwarnings =
error error
ignore:decodestring\(\) is a deprecated alias:DeprecationWarning:dns ignore:decodestring\(\) is a deprecated alias:DeprecationWarning:dns
@@ -41,6 +38,4 @@ filterwarnings =
ignore:update_symlinks is deprecated:PendingDeprecationWarning ignore:update_symlinks is deprecated:PendingDeprecationWarning
ignore:.*declare_namespace\(':DeprecationWarning ignore:.*declare_namespace\(':DeprecationWarning
ignore:pkg_resources is deprecated as an API: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:.*datetime.utcfromtimestamp\(\) is deprecated:DeprecationWarning:pytz.tzinfo
ignore:Boto3 will no longer support Python 3.7

View File

@@ -1,102 +1,98 @@
# This file was generated by tools/pinning/oldest/repin.sh and can be updated using # This file was generated by tools/pinning/oldest/repin.sh and can be updated using
# that script. # that script.
apacheconfig==0.3.2 ; python_version >= "3.7" and python_version < "3.8" apacheconfig==0.3.2 ; python_version >= "3.8" and python_version < "3.9"
appdirs==1.4.4 ; python_version >= "3.7" and python_version < "3.8" asn1crypto==0.24.0 ; python_version >= "3.8" and python_version < "3.9"
asn1crypto==0.24.0 ; python_version >= "3.7" and python_version < "3.8" astroid==3.0.0 ; python_version >= "3.8" and python_version < "3.9"
astroid==2.15.6 ; python_full_version >= "3.7.2" and python_version < "3.8" beautifulsoup4==4.12.2 ; python_version >= "3.8" and python_version < "3.9"
beautifulsoup4==4.12.2 ; python_version >= "3.7" and python_version < "3.8" boto3==1.15.15 ; python_version >= "3.8" and python_version < "3.9"
boto3==1.15.15 ; python_version >= "3.7" and python_version < "3.8" botocore==1.18.15 ; python_version >= "3.8" and python_version < "3.9"
botocore==1.18.15 ; python_version >= "3.7" and python_version < "3.8" cachetools==5.3.1 ; python_version >= "3.8" and python_version < "3.9"
cachetools==5.3.1 ; python_version >= "3.7" and python_version < "3.8" certifi==2023.7.22 ; python_version >= "3.8" and python_version < "3.9"
certifi==2023.7.22 ; python_version >= "3.7" and python_version < "3.8" cffi==1.12.3 ; python_version >= "3.8" and python_version < "3.9"
cffi==1.11.5 ; python_version >= "3.7" and python_version < "3.8" chardet==3.0.4 ; python_version >= "3.8" and python_version < "3.9"
chardet==3.0.4 ; python_version >= "3.7" and python_version < "3.8" cloudflare==1.5.1 ; python_version >= "3.8" and python_version < "3.9"
cloudflare==1.5.1 ; python_version >= "3.7" and python_version < "3.8" colorama==0.4.6 ; python_version >= "3.8" and python_version < "3.9" and sys_platform == "win32"
colorama==0.4.6 ; python_version < "3.8" and sys_platform == "win32" and python_version >= "3.7" configargparse==1.5.3 ; python_version >= "3.8" and python_version < "3.9"
configargparse==1.5.3 ; python_version >= "3.7" and python_version < "3.8" configobj==5.0.6 ; python_version >= "3.8" and python_version < "3.9"
configobj==5.0.6 ; python_version >= "3.7" and python_version < "3.8" coverage==7.3.2 ; python_version >= "3.8" and python_version < "3.9"
coverage==7.2.7 ; python_version >= "3.7" and python_version < "3.8" cryptography==3.2.1 ; python_version >= "3.8" and python_version < "3.9"
cryptography==3.2.1 ; python_version >= "3.7" and python_version < "3.8" cython==0.29.36 ; python_version >= "3.8" and python_version < "3.9"
cython==0.29.36 ; python_version >= "3.7" and python_version < "3.8" dill==0.3.7 ; python_version >= "3.8" and python_version < "3.9"
dill==0.3.7 ; python_full_version >= "3.7.2" and python_version < "3.8" distlib==0.3.7 ; python_version >= "3.8" and python_version < "3.9"
distlib==0.3.7 ; python_version >= "3.7" and python_version < "3.8" distro==1.0.1 ; python_version >= "3.8" and python_version < "3.9"
distro==1.0.1 ; python_version >= "3.7" and python_version < "3.8" dns-lexicon==3.14.1 ; python_version >= "3.8" and python_version < "3.9"
dns-lexicon==3.14.1 ; python_version >= "3.7" and python_version < "3.8" dnspython==1.15.0 ; python_version >= "3.8" and python_version < "3.9"
dnspython==1.15.0 ; python_version >= "3.7" and python_version < "3.8" exceptiongroup==1.1.3 ; python_version >= "3.8" and python_version < "3.9"
exceptiongroup==1.1.3 ; python_version >= "3.7" and python_version < "3.8" execnet==2.0.2 ; python_version >= "3.8" and python_version < "3.9"
execnet==2.0.2 ; python_version >= "3.7" and python_version < "3.8" filelock==3.12.4 ; python_version >= "3.8" and python_version < "3.9"
filelock==3.12.2 ; python_version >= "3.7" and python_version < "3.8" funcsigs==0.4 ; python_version >= "3.8" and python_version < "3.9"
funcsigs==0.4 ; python_version >= "3.7" and python_version < "3.8" future==0.18.3 ; python_version >= "3.8" and python_version < "3.9"
future==0.18.3 ; python_version >= "3.7" and python_version < "3.8" google-api-python-client==1.6.5 ; python_version >= "3.8" and python_version < "3.9"
google-api-python-client==1.6.5 ; python_version >= "3.7" and python_version < "3.8" google-auth==2.16.0 ; python_version >= "3.8" and python_version < "3.9"
google-auth==2.16.0 ; python_version >= "3.7" and python_version < "3.8" httplib2==0.9.2 ; python_version >= "3.8" and python_version < "3.9"
httplib2==0.9.2 ; python_version >= "3.7" and python_version < "3.8" idna==2.6 ; python_version >= "3.8" and python_version < "3.9"
idna==2.6 ; python_version >= "3.7" and python_version < "3.8" importlib-metadata==4.6.4 ; python_version >= "3.8" and python_version < "3.9"
importlib-metadata==4.6.4 ; python_version >= "3.7" and python_version < "3.8" importlib-resources==6.1.0 ; python_version >= "3.8" and python_version < "3.9"
importlib-resources==5.12.0 ; python_version >= "3.7" and python_version < "3.8" iniconfig==2.0.0 ; python_version >= "3.8" and python_version < "3.9"
iniconfig==2.0.0 ; python_version >= "3.7" and python_version < "3.8" ipaddress==1.0.16 ; python_version >= "3.8" and python_version < "3.9"
ipaddress==1.0.16 ; python_version >= "3.7" and python_version < "3.8" isort==5.12.0 ; python_version >= "3.8" and python_version < "3.9"
isort==5.11.5 ; python_full_version >= "3.7.2" and python_version < "3.8" jmespath==0.10.0 ; python_version >= "3.8" and python_version < "3.9"
jmespath==0.10.0 ; python_version >= "3.7" and python_version < "3.8" josepy==1.13.0 ; python_version >= "3.8" and python_version < "3.9"
josepy==1.13.0 ; python_version >= "3.7" and python_version < "3.8" logger==1.4 ; python_version >= "3.8" and python_version < "3.9"
lazy-object-proxy==1.9.0 ; python_full_version >= "3.7.2" and python_version < "3.8" mccabe==0.7.0 ; python_version >= "3.8" and python_version < "3.9"
logger==1.4 ; python_version >= "3.7" and python_version < "3.8" mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "3.9"
mccabe==0.7.0 ; python_full_version >= "3.7.2" and python_version < "3.8" mypy==1.5.1 ; python_version >= "3.8" and python_version < "3.9"
mypy-extensions==1.0.0 ; python_version >= "3.7" and python_version < "3.8" ndg-httpsclient==0.3.2 ; python_version >= "3.8" and python_version < "3.9"
mypy==1.4.1 ; python_version >= "3.7" and python_version < "3.8" oauth2client==4.1.3 ; python_version >= "3.8" and python_version < "3.9"
ndg-httpsclient==0.3.2 ; python_version >= "3.7" and python_version < "3.8" packaging==23.2 ; python_version >= "3.8" and python_version < "3.9"
oauth2client==4.1.3 ; python_version >= "3.7" and python_version < "3.8" parsedatetime==2.4 ; python_version >= "3.8" and python_version < "3.9"
packaging==23.1 ; python_version >= "3.7" and python_version < "3.8" pbr==1.8.0 ; python_version >= "3.8" and python_version < "3.9"
parsedatetime==2.4 ; python_version >= "3.7" and python_version < "3.8" pip==23.2.1 ; python_version >= "3.8" and python_version < "3.9"
pbr==1.8.0 ; python_version >= "3.7" and python_version < "3.8" platformdirs==3.11.0 ; python_version >= "3.8" and python_version < "3.9"
pip==23.2.1 ; python_version >= "3.7" and python_version < "3.8" pluggy==1.3.0 ; python_version >= "3.8" and python_version < "3.9"
platformdirs==3.10.0 ; python_full_version >= "3.7.2" and python_version < "3.8" ply==3.4 ; python_version >= "3.8" and python_version < "3.9"
pluggy==1.2.0 ; python_version >= "3.7" and python_version < "3.8" py==1.11.0 ; python_version >= "3.8" and python_version < "3.9"
ply==3.4 ; python_version >= "3.7" and python_version < "3.8" pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "3.9"
py==1.11.0 ; python_version >= "3.7" and python_version < "3.8" pyasn1==0.4.8 ; python_version >= "3.8" and python_version < "3.9"
pyasn1-modules==0.3.0 ; python_version >= "3.7" and python_version < "3.8" pycparser==2.14 ; python_version >= "3.8" and python_version < "3.9"
pyasn1==0.4.8 ; python_version >= "3.7" and python_version < "3.8" pylint==3.0.1 ; python_version >= "3.8" and python_version < "3.9"
pycparser==2.14 ; python_version >= "3.7" and python_version < "3.8" pyopenssl==17.5.0 ; python_version >= "3.8" and python_version < "3.9"
pylint==2.17.5 ; python_full_version >= "3.7.2" and python_version < "3.8" pyparsing==2.2.1 ; python_version >= "3.8" and python_version < "3.9"
pyopenssl==17.5.0 ; python_version >= "3.7" and python_version < "3.8" pyrfc3339==1.0 ; python_version >= "3.8" and python_version < "3.9"
pyparsing==2.2.1 ; python_version >= "3.7" and python_version < "3.8" pytest-cov==4.1.0 ; python_version >= "3.8" and python_version < "3.9"
pyrfc3339==1.0 ; python_version >= "3.7" and python_version < "3.8" pytest-xdist==3.3.1 ; python_version >= "3.8" and python_version < "3.9"
pytest-cov==4.1.0 ; python_version >= "3.7" and python_version < "3.8" pytest==7.4.2 ; python_version >= "3.8" and python_version < "3.9"
pytest-xdist==3.3.1 ; python_version >= "3.7" and python_version < "3.8" python-augeas==0.5.0 ; python_version >= "3.8" and python_version < "3.9"
pytest==7.4.2 ; python_version >= "3.7" and python_version < "3.8" python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "3.9"
python-augeas==0.5.0 ; python_version >= "3.7" and python_version < "3.8" python-digitalocean==1.11 ; python_version >= "3.8" and python_version < "3.9"
python-dateutil==2.8.2 ; python_version >= "3.7" and python_version < "3.8" pytz==2019.3 ; python_version >= "3.8" and python_version < "3.9"
python-digitalocean==1.11 ; python_version >= "3.7" and python_version < "3.8" pywin32==306 ; python_version >= "3.8" and python_version < "3.9" and sys_platform == "win32"
pytz==2019.3 ; python_version >= "3.7" and python_version < "3.8" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "3.9"
pywin32==306 ; python_version >= "3.7" and python_version < "3.8" and sys_platform == "win32" requests-file==1.5.1 ; python_version >= "3.8" and python_version < "3.9"
pyyaml==6.0.1 ; python_version >= "3.7" and python_version < "3.8" requests==2.20.0 ; python_version >= "3.8" and python_version < "3.9"
requests-file==1.5.1 ; python_version >= "3.7" and python_version < "3.8" rsa==4.9 ; python_version >= "3.8" and python_version < "3.9"
requests==2.20.0 ; python_version >= "3.7" and python_version < "3.8" s3transfer==0.3.7 ; python_version >= "3.8" and python_version < "3.9"
rsa==4.9 ; python_version >= "3.7" and python_version < "3.8" setuptools==41.6.0 ; python_version >= "3.8" and python_version < "3.9"
s3transfer==0.3.7 ; python_version >= "3.7" and python_version < "3.8" six==1.11.0 ; python_version >= "3.8" and python_version < "3.9"
setuptools==41.6.0 ; python_version >= "3.7" and python_version < "3.8" soupsieve==2.5 ; python_version >= "3.8" and python_version < "3.9"
six==1.11.0 ; python_version >= "3.7" and python_version < "3.8" tldextract==3.6.0 ; python_version >= "3.8" and python_version < "3.9"
soupsieve==2.4.1 ; python_version >= "3.7" and python_version < "3.8" tomli==2.0.1 ; python_version >= "3.8" and python_version < "3.9"
tldextract==3.5.0 ; python_version >= "3.7" and python_version < "3.8" tomlkit==0.12.1 ; python_version >= "3.8" and python_version < "3.9"
tomli==2.0.1 ; python_version < "3.8" and python_version >= "3.7" tox==1.9.2 ; python_version >= "3.8" and python_version < "3.9"
tomlkit==0.12.1 ; python_full_version >= "3.7.2" and python_version < "3.8" types-cryptography==3.3.23.2 ; python_version >= "3.8" and python_version < "3.9"
tox==1.9.2 ; python_version >= "3.7" and python_version < "3.8" types-httplib2==0.22.0.2 ; python_version >= "3.8" and python_version < "3.9"
typed-ast==1.5.5 ; python_version < "3.8" and python_version >= "3.7" types-pyopenssl==23.0.0.0 ; python_version >= "3.8" and python_version < "3.9"
types-cryptography==3.3.23.2 ; python_version >= "3.7" and python_version < "3.8" types-pyrfc3339==1.1.1.5 ; python_version >= "3.8" and python_version < "3.9"
types-httplib2==0.22.0.2 ; python_version >= "3.7" and python_version < "3.8" types-python-dateutil==2.8.19.14 ; python_version >= "3.8" and python_version < "3.9"
types-pyopenssl==23.0.0.0 ; python_version >= "3.7" and python_version < "3.8" types-pytz==2023.3.1.1 ; python_version >= "3.8" and python_version < "3.9"
types-pyrfc3339==1.1.1.5 ; python_version >= "3.7" and python_version < "3.8" types-pywin32==306.0.0.4 ; python_version >= "3.8" and python_version < "3.9"
types-python-dateutil==2.8.19.14 ; python_version >= "3.7" and python_version < "3.8" types-requests==2.31.0.6 ; python_version >= "3.8" and python_version < "3.9"
types-pytz==2023.3.0.1 ; python_version >= "3.7" and python_version < "3.8" types-setuptools==68.2.0.0 ; python_version >= "3.8" and python_version < "3.9"
types-pywin32==306.0.0.4 ; python_version >= "3.7" and python_version < "3.8" types-six==1.16.21.9 ; python_version >= "3.8" and python_version < "3.9"
types-requests==2.31.0.2 ; python_version >= "3.7" and python_version < "3.8" types-urllib3==1.26.25.14 ; python_version >= "3.8" and python_version < "3.9"
types-setuptools==68.2.0.0 ; python_version >= "3.7" and python_version < "3.8" typing-extensions==4.8.0 ; python_version >= "3.8" and python_version < "3.9"
types-six==1.16.21.9 ; python_version >= "3.7" and python_version < "3.8" uritemplate==3.0.1 ; python_version >= "3.8" and python_version < "3.9"
types-urllib3==1.26.25.14 ; python_version >= "3.7" and python_version < "3.8" urllib3==1.24.2 ; python_version >= "3.8" and python_version < "3.9"
typing-extensions==4.7.1 ; python_version < "3.8" and python_version >= "3.7" virtualenv==20.24.5 ; python_version >= "3.8" and python_version < "3.9"
uritemplate==3.0.1 ; python_version >= "3.7" and python_version < "3.8" wheel==0.33.6 ; python_version >= "3.8" and python_version < "3.9"
urllib3==1.24.2 ; python_version >= "3.7" and python_version < "3.8" zipp==3.17.0 ; python_version >= "3.8" and python_version < "3.9"
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"

View File

@@ -6,7 +6,7 @@ authors = ["Certbot Project"]
license = "Apache License 2.0" license = "Apache License 2.0"
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.7" python = "^3.8"
# Local dependencies # Local dependencies
# Any local packages that have dependencies on other local packages must be # 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 # 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. 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) # 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. # this version of cryptography introduced a security vulnrability.
@@ -75,6 +75,12 @@ poetry = "<1.3.0"
# https://github.com/certbot/certbot/issues/9606. # https://github.com/certbot/certbot/issues/9606.
setuptools = "<67.5.0" 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] [tool.poetry.dev-dependencies]
[build-system] [build-system]

View File

@@ -10,7 +10,7 @@ license = "Apache License 2.0"
[tool.poetry.dependencies] [tool.poetry.dependencies]
# The Python version here should be kept in sync with the one used in our # The Python version here should be kept in sync with the one used in our
# oldest tests in tox.ini. # oldest tests in tox.ini.
python = "<3.8 >= 3.7" python = "<3.9 >= 3.8"
# Local dependencies # Local dependencies
# Any local packages that have dependencies on other local packages must be # Any local packages that have dependencies on other local packages must be
@@ -48,7 +48,7 @@ apacheconfig = "0.3.2"
asn1crypto = "0.24.0" asn1crypto = "0.24.0"
boto3 = "1.15.15" boto3 = "1.15.15"
botocore = "1.18.15" botocore = "1.18.15"
cffi = "1.11.5" cffi = "1.12.3"
chardet = "3.0.4" chardet = "3.0.4"
cloudflare = "1.5.1" cloudflare = "1.5.1"
configobj = "5.0.6" configobj = "5.0.6"

View File

@@ -5,182 +5,187 @@
# requirements.txt so that is scanned by GitHub. See # 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 # https://docs.github.com/en/github/visualizing-repository-data-with-graphs/about-the-dependency-graph#supported-package-ecosystems
# for more info. # for more info.
alabaster==0.7.13 ; 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.7" 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.7" and python_version < "4.0" and sys_platform == "darwin" appnope==0.1.3 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "darwin"
astroid==2.13.5 ; python_full_version >= "3.7.2" and python_version < "4.0" astroid==2.13.5 ; python_version >= "3.8" and python_version < "4.0"
attrs==23.1.0 ; python_version >= "3.7" and python_version < "4.0" asttokens==2.4.0 ; python_version >= "3.8" and python_version < "4.0"
azure-core==1.29.4 ; python_version >= "3.7" and python_version < "4.0" attrs==23.1.0 ; python_version >= "3.8" and python_version < "4.0"
azure-devops==7.1.0b3 ; python_version >= "3.7" and python_version < "4.0" azure-core==1.29.4 ; python_version >= "3.8" and python_version < "4.0"
babel==2.13.0 ; python_version >= "3.7" and python_version < "4.0" azure-devops==7.1.0b3 ; python_version >= "3.8" and python_version < "4.0"
backcall==0.2.0 ; python_version >= "3.7" and python_version < "4.0" babel==2.13.0 ; python_version >= "3.8" and python_version < "4.0"
backports-cached-property==1.0.2 ; python_version >= "3.7" and python_version < "3.8" backcall==0.2.0 ; python_version >= "3.8" and python_version < "4.0"
bcrypt==4.0.1 ; python_version >= "3.7" 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.7" and python_version < "4.0" beautifulsoup4==4.12.2 ; python_version >= "3.8" and python_version < "4.0"
bleach==6.0.0 ; python_version >= "3.7" and python_version < "4.0" boto3==1.28.62 ; python_version >= "3.8" and python_version < "4.0"
boto3==1.28.60 ; python_version >= "3.7" and python_version < "4.0" botocore==1.31.62 ; python_version >= "3.8" 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.8" 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.8" 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.8" 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.8" and python_version < "4.0"
certifi==2023.7.22 ; python_version >= "3.7" and python_version < "4.0" cffi==1.16.0 ; python_version >= "3.8" 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.8" 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.8" 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.8" and python_version < "4.0"
cloudflare==2.12.4 ; python_version >= "3.7" 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"
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.8" and python_version < "4.0"
configargparse==1.7 ; python_version >= "3.7" and python_version < "4.0" configobj==5.0.8 ; python_version >= "3.8" and python_version < "4.0"
configobj==5.0.8 ; python_version >= "3.7" and python_version < "4.0" coverage==7.3.2 ; python_version >= "3.8" 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.8" 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.8" 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.8" 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.8" 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.8" and python_version < "4.0"
deprecated==1.2.14 ; python_version >= "3.7" and python_version < "4.0" dill==0.3.7 ; python_version >= "3.8" 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.8" 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.8" and python_version < "4.0"
distro==1.8.0 ; python_version >= "3.7" and python_version < "4.0" dns-lexicon==3.15.0 ; python_version >= "3.8" and python_version < "4.0"
dns-lexicon==3.14.1 ; python_version >= "3.7" and python_version < "4.0" dnspython==2.4.2 ; python_version >= "3.8" 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.8" 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.8" 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.8" and python_version < "3.11"
exceptiongroup==1.1.3 ; python_version >= "3.7" and python_version < "3.11" execnet==2.0.2 ; python_version >= "3.8" and python_version < "4.0"
execnet==2.0.2 ; python_version >= "3.7" 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.7" and python_version < "4.0" fabric==3.2.2 ; python_version >= "3.8" and python_version < "4.0"
filelock==3.12.2 ; python_version >= "3.7" 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.7" 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.7" 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.7" and python_version < "4.0" google-auth-httplib2==0.1.1 ; python_version >= "3.8" and python_version < "4.0"
google-auth==2.23.2 ; python_version >= "3.7" 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.7" 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.7" and python_version < "4.0" html5lib==1.1 ; python_version >= "3.8" and python_version < "4.0"
httplib2==0.22.0 ; python_version >= "3.7" and python_version < "4.0" httplib2==0.22.0 ; python_version >= "3.8" and python_version < "4.0"
idna==3.4 ; python_version >= "3.7" and python_version < "4.0" idna==3.4 ; python_version >= "3.8" and python_version < "4.0"
imagesize==1.4.1 ; python_version >= "3.7" 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.7" and python_version < "4.0" importlib-metadata==4.13.0 ; python_version >= "3.8" and python_version < "4.0"
importlib-resources==5.12.0 ; python_version >= "3.7" 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.7" 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.7" 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.7" and python_version < "4.0" ipdb==0.13.13 ; python_version >= "3.8" and python_version < "4.0"
ipython==7.34.0 ; python_version >= "3.7" 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.7" and python_version < "4.0" isodate==0.6.1 ; python_version >= "3.8" and python_version < "4.0"
isort==5.11.5 ; python_full_version >= "3.7.2" and python_version < "4.0" isort==5.12.0 ; python_version >= "3.8" and python_version < "4.0"
jaraco-classes==3.2.3 ; python_version >= "3.7" 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.7" 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.7" and python_version < "4.0" and sys_platform == "linux" jeepney==0.8.0 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "linux"
jinja2==3.1.2 ; python_version >= "3.7" and python_version < "4.0" jinja2==3.1.2 ; python_version >= "3.8" and python_version < "4.0"
jmespath==1.0.1 ; python_version >= "3.7" 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.7" and python_version < "4.0" josepy==1.13.0 ; python_version >= "3.8" and python_version < "4.0"
jsonlines==3.1.0 ; python_version >= "3.7" 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.7" and python_version < "4.0" jsonpickle==3.0.2 ; python_version >= "3.8" and python_version < "4.0"
jsonschema==4.17.3 ; python_version >= "3.7" and python_version < "4.0" jsonschema-specifications==2023.7.1 ; python_version >= "3.8" and python_version < "4.0"
keyring==24.1.1 ; python_version >= "3.7" and python_version < "4.0" jsonschema==4.19.1 ; python_version >= "3.8" and python_version < "4.0"
lazy-object-proxy==1.9.0 ; python_full_version >= "3.7.2" and python_version < "4.0" keyring==24.2.0 ; python_version >= "3.8" and python_version < "4.0"
lockfile==0.12.2 ; python_version >= "3.7" and python_version < "4.0" lazy-object-proxy==1.9.0 ; python_version >= "3.8" and python_version < "4.0"
markdown-it-py==2.2.0 ; python_version >= "3.7" and python_version < "4.0" lockfile==0.12.2 ; python_version >= "3.8" and python_version < "4.0"
markupsafe==2.1.3 ; python_version >= "3.7" and python_version < "4.0" markdown-it-py==3.0.0 ; python_version >= "3.8" and python_version < "4.0"
matplotlib-inline==0.1.6 ; python_version >= "3.7" and python_version < "4.0" markupsafe==2.1.3 ; python_version >= "3.8" and python_version < "4.0"
mccabe==0.7.0 ; python_full_version >= "3.7.2" and python_version < "4.0" matplotlib-inline==0.1.6 ; python_version >= "3.8" and python_version < "4.0"
mdurl==0.1.2 ; python_version >= "3.7" and python_version < "4.0" mccabe==0.7.0 ; python_version >= "3.8" and python_version < "4.0"
more-itertools==9.1.0 ; python_version >= "3.7" and python_version < "4.0" mdurl==0.1.2 ; python_version >= "3.8" and python_version < "4.0"
msgpack==1.0.5 ; python_version >= "3.7" and python_version < "4.0" more-itertools==10.1.0 ; python_version >= "3.8" and python_version < "4.0"
msrest==0.7.1 ; python_version >= "3.7" and python_version < "4.0" msgpack==1.0.7 ; python_version >= "3.8" and python_version < "4.0"
mypy-extensions==1.0.0 ; python_version >= "3.7" and python_version < "4.0" msrest==0.7.1 ; python_version >= "3.8" and python_version < "4.0"
mypy==1.4.1 ; python_version >= "3.7" and python_version < "4.0" mypy-extensions==1.0.0 ; python_version >= "3.8" and python_version < "4.0"
oauthlib==3.2.2 ; python_version >= "3.7" and python_version < "4.0" mypy==1.5.1 ; python_version >= "3.8" and python_version < "4.0"
packaging==23.2 ; python_version >= "3.7" and python_version < "4.0" nh3==0.2.14 ; python_version >= "3.8" and python_version < "4.0"
paramiko==3.3.1 ; python_version >= "3.7" and python_version < "4.0" oauthlib==3.2.2 ; python_version >= "3.8" and python_version < "4.0"
parsedatetime==2.6 ; python_version >= "3.7" and python_version < "4.0" packaging==23.2 ; python_version >= "3.8" and python_version < "4.0"
parso==0.8.3 ; python_version >= "3.7" and python_version < "4.0" paramiko==3.3.1 ; python_version >= "3.8" and python_version < "4.0"
pexpect==4.8.0 ; python_version >= "3.7" and python_version < "4.0" parsedatetime==2.6 ; python_version >= "3.8" and python_version < "4.0"
pickleshare==0.7.5 ; python_version >= "3.7" and python_version < "4.0" parso==0.8.3 ; python_version >= "3.8" and python_version < "4.0"
pip==23.2.1 ; python_version >= "3.7" and python_version < "4.0" pexpect==4.8.0 ; python_version >= "3.8" and python_version < "4.0"
pkginfo==1.9.6 ; python_version >= "3.7" and python_version < "4.0" pickleshare==0.7.5 ; python_version >= "3.8" and python_version < "4.0"
pkgutil-resolve-name==1.3.10 ; python_version >= "3.7" and python_version < "3.9" pip==23.2.1 ; python_version >= "3.8" and python_version < "4.0"
platformdirs==2.6.2 ; python_version < "4.0" and python_version >= "3.7" pkginfo==1.9.6 ; python_version >= "3.8" and python_version < "4.0"
pluggy==1.2.0 ; python_version >= "3.7" and python_version < "4.0" pkgutil-resolve-name==1.3.10 ; python_version >= "3.8" and python_version < "3.9"
ply==3.11 ; python_version >= "3.7" and python_version < "4.0" platformdirs==2.6.2 ; python_version >= "3.8" and python_version < "4.0"
poetry-core==1.3.2 ; python_version >= "3.7" and python_version < "4.0" pluggy==1.3.0 ; python_version >= "3.8" and python_version < "4.0"
poetry-plugin-export==1.2.0 ; python_version >= "3.7" and python_version < "4.0" ply==3.11 ; python_version >= "3.8" and python_version < "4.0"
poetry==1.2.2 ; python_version >= "3.7" and python_version < "4.0" poetry-core==1.3.2 ; python_version >= "3.8" and python_version < "4.0"
prompt-toolkit==3.0.39 ; python_version >= "3.7" and python_version < "4.0" poetry-plugin-export==1.2.0 ; python_version >= "3.8" and python_version < "4.0"
protobuf==4.24.4 ; python_version >= "3.7" and python_version < "4.0" poetry==1.2.2 ; python_version >= "3.8" and python_version < "4.0"
ptyprocess==0.7.0 ; python_version >= "3.7" and python_version < "4.0" prompt-toolkit==3.0.39 ; python_version >= "3.8" and python_version < "4.0"
py==1.11.0 ; python_version >= "3.7" and python_version < "4.0" protobuf==4.24.4 ; python_version >= "3.8" and python_version < "4.0"
pyasn1-modules==0.3.0 ; python_version >= "3.7" and python_version < "4.0" ptyprocess==0.7.0 ; python_version >= "3.8" and python_version < "4.0"
pyasn1==0.5.0 ; python_version >= "3.7" and python_version < "4.0" pure-eval==0.2.2 ; python_version >= "3.8" and python_version < "4.0"
pycparser==2.21 ; python_version >= "3.7" and python_version < "4.0" py==1.11.0 ; python_version >= "3.8" and python_version < "4.0"
pygments==2.16.1 ; python_version >= "3.7" and python_version < "4.0" pyasn1-modules==0.3.0 ; python_version >= "3.8" and python_version < "4.0"
pylev==1.4.0 ; python_version >= "3.7" and python_version < "4.0" pyasn1==0.5.0 ; python_version >= "3.8" and python_version < "4.0"
pylint==2.15.5 ; python_full_version >= "3.7.2" and python_version < "4.0" pycparser==2.21 ; python_version >= "3.8" and python_version < "4.0"
pynacl==1.5.0 ; python_version >= "3.7" and python_version < "4.0" pygments==2.16.1 ; python_version >= "3.8" and python_version < "4.0"
pynsist==2.7 ; python_version >= "3.7" and python_version < "4.0" pylev==1.4.0 ; python_version >= "3.8" and python_version < "4.0"
pyopenssl==23.2.0 ; python_version >= "3.7" and python_version < "4.0" pylint==2.15.5 ; python_version >= "3.8" and python_version < "4.0"
pyparsing==3.1.1 ; python_version >= "3.7" and python_version < "4.0" pynacl==1.5.0 ; python_version >= "3.8" and python_version < "4.0"
pyrfc3339==1.1 ; python_version >= "3.7" and python_version < "4.0" pynsist==2.7 ; python_version >= "3.8" and python_version < "4.0"
pyrsistent==0.19.3 ; python_version >= "3.7" and python_version < "4.0" pyopenssl==23.2.0 ; python_version >= "3.8" and python_version < "4.0"
pytest-cov==4.1.0 ; python_version >= "3.7" and python_version < "4.0" pyotp==2.9.0 ; python_version >= "3.8" and python_version < "4.0"
pytest-xdist==3.3.1 ; python_version >= "3.7" and python_version < "4.0" pyparsing==3.1.1 ; python_version >= "3.8" and python_version < "4.0"
pytest==7.4.2 ; python_version >= "3.7" and python_version < "4.0" pyrfc3339==1.1 ; python_version >= "3.8" and python_version < "4.0"
python-augeas==1.1.0 ; python_version >= "3.7" and python_version < "4.0" pytest-cov==4.1.0 ; python_version >= "3.8" and python_version < "4.0"
python-dateutil==2.8.2 ; python_version >= "3.7" and python_version < "4.0" pytest-xdist==3.3.1 ; python_version >= "3.8" and python_version < "4.0"
python-digitalocean==1.17.0 ; python_version >= "3.7" and python_version < "4.0" pytest==7.4.2 ; python_version >= "3.8" and python_version < "4.0"
pytz==2023.3.post1 ; python_version >= "3.7" and python_version < "4.0" python-augeas==1.1.0 ; python_version >= "3.8" and python_version < "4.0"
pywin32-ctypes==0.2.2 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" python-dateutil==2.8.2 ; python_version >= "3.8" and python_version < "4.0"
pywin32==306 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" python-digitalocean==1.17.0 ; python_version >= "3.8" and python_version < "4.0"
pyyaml==6.0.1 ; python_version >= "3.7" and python_version < "4.0" pytz==2023.3.post1 ; python_version >= "3.8" and python_version < "4.0"
readme-renderer==37.3 ; python_version >= "3.7" and python_version < "4.0" pywin32-ctypes==0.2.2 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32"
requests-download==0.1.2 ; python_version >= "3.7" and python_version < "4.0" pywin32==306 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "win32"
requests-file==1.5.1 ; python_version >= "3.7" and python_version < "4.0" pyyaml==6.0.1 ; python_version >= "3.8" and python_version < "4.0"
requests-oauthlib==1.3.1 ; python_version >= "3.7" and python_version < "4.0" readme-renderer==42.0 ; python_version >= "3.8" and python_version < "4.0"
requests-toolbelt==0.9.1 ; python_version >= "3.7" and python_version < "4.0" referencing==0.30.2 ; python_version >= "3.8" and python_version < "4.0"
requests==2.31.0 ; python_version >= "3.7" and python_version < "4.0" requests-download==0.1.2 ; python_version >= "3.8" and python_version < "4.0"
rfc3986==2.0.0 ; python_version >= "3.7" and python_version < "4.0" requests-file==1.5.1 ; python_version >= "3.8" and python_version < "4.0"
rich==13.6.0 ; python_version >= "3.7" and python_version < "4.0" requests-oauthlib==1.3.1 ; python_version >= "3.8" and python_version < "4.0"
rsa==4.9 ; python_version >= "3.7" and python_version < "4" requests-toolbelt==0.9.1 ; python_version >= "3.8" and python_version < "4.0"
s3transfer==0.7.0 ; python_version >= "3.7" and python_version < "4.0" requests==2.31.0 ; python_version >= "3.8" and python_version < "4.0"
secretstorage==3.3.3 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" rfc3986==2.0.0 ; python_version >= "3.8" and python_version < "4.0"
semantic-version==2.10.0 ; python_version >= "3.7" and python_version < "4.0" rich==13.6.0 ; python_version >= "3.8" and python_version < "4.0"
setuptools-rust==1.7.0 ; python_version >= "3.7" and python_version < "4.0" rpds-py==0.10.4 ; python_version >= "3.8" and python_version < "4.0"
setuptools==67.4.0 ; python_version >= "3.7" and python_version < "4.0" rsa==4.9 ; python_version >= "3.8" and python_version < "4"
shellingham==1.5.3 ; python_version >= "3.7" and python_version < "4.0" s3transfer==0.7.0 ; python_version >= "3.8" and python_version < "4.0"
six==1.16.0 ; python_version >= "3.7" and python_version < "4.0" secretstorage==3.3.3 ; python_version >= "3.8" and python_version < "4.0" and sys_platform == "linux"
snowballstemmer==2.2.0 ; python_version >= "3.7" and python_version < "4.0" semantic-version==2.10.0 ; python_version >= "3.8" and python_version < "4.0"
soupsieve==2.4.1 ; python_version >= "3.7" and python_version < "4.0" setuptools-rust==1.7.0 ; python_version >= "3.8" and python_version < "4.0"
sphinx-rtd-theme==1.3.0 ; python_version >= "3.7" and python_version < "4.0" setuptools==67.4.0 ; python_version >= "3.8" and python_version < "4.0"
sphinx==5.3.0 ; python_version >= "3.7" and python_version < "4.0" shellingham==1.5.3 ; python_version >= "3.8" and python_version < "4.0"
sphinxcontrib-applehelp==1.0.2 ; python_version >= "3.7" and python_version < "4.0" six==1.16.0 ; python_version >= "3.8" and python_version < "4.0"
sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.7" and python_version < "4.0" snowballstemmer==2.2.0 ; python_version >= "3.8" and python_version < "4.0"
sphinxcontrib-htmlhelp==2.0.0 ; python_version >= "3.7" and python_version < "4.0" soupsieve==2.5 ; python_version >= "3.8" and python_version < "4.0"
sphinxcontrib-jquery==4.1 ; python_version >= "3.7" and python_version < "4.0" sphinx-rtd-theme==1.3.0 ; python_version >= "3.8" and python_version < "4.0"
sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.7" and python_version < "4.0" sphinx==7.1.2 ; python_version >= "3.8" and python_version < "4.0"
sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.7" and python_version < "4.0" sphinxcontrib-applehelp==1.0.4 ; python_version >= "3.8" and python_version < "4.0"
sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.7" and python_version < "4.0" sphinxcontrib-devhelp==1.0.2 ; python_version >= "3.8" and python_version < "4.0"
tldextract==3.6.0 ; python_version >= "3.7" and python_version < "4.0" sphinxcontrib-htmlhelp==2.0.1 ; python_version >= "3.8" and python_version < "4.0"
tomli==2.0.1 ; python_version >= "3.7" and python_full_version <= "3.11.0a6" sphinxcontrib-jquery==4.1 ; python_version >= "3.8" and python_version < "4.0"
tomlkit==0.12.1 ; python_version < "4.0" and python_version >= "3.7" sphinxcontrib-jsmath==1.0.1 ; python_version >= "3.8" and python_version < "4.0"
tox==3.28.0 ; python_version >= "3.7" and python_version < "4.0" sphinxcontrib-qthelp==1.0.3 ; python_version >= "3.8" and python_version < "4.0"
traitlets==5.9.0 ; python_version >= "3.7" and python_version < "4.0" sphinxcontrib-serializinghtml==1.1.5 ; python_version >= "3.8" and python_version < "4.0"
twine==4.0.2 ; python_version >= "3.7" and python_version < "4.0" stack-data==0.6.3 ; python_version >= "3.8" and python_version < "4.0"
typed-ast==1.5.5 ; python_version < "3.8" and python_version >= "3.7" tldextract==3.6.0 ; python_version >= "3.8" and python_version < "4.0"
types-httplib2==0.22.0.2 ; python_version >= "3.7" and python_version < "4.0" tomli==2.0.1 ; python_version >= "3.8" and python_full_version <= "3.11.0a6"
types-pyopenssl==23.2.0.2 ; python_version >= "3.7" and python_version < "4.0" tomlkit==0.12.1 ; python_version >= "3.8" and python_version < "4.0"
types-pyrfc3339==1.1.1.5 ; python_version >= "3.7" and python_version < "4.0" tox==3.28.0 ; python_version >= "3.8" and python_version < "4.0"
types-python-dateutil==2.8.19.14 ; python_version >= "3.7" and python_version < "4.0" traitlets==5.11.2 ; python_version >= "3.8" and python_version < "4.0"
types-pytz==2023.3.1.1 ; python_version >= "3.7" and python_version < "4.0" twine==4.0.2 ; python_version >= "3.8" and python_version < "4.0"
types-pywin32==306.0.0.4 ; python_version >= "3.7" and python_version < "4.0" types-httplib2==0.22.0.2 ; python_version >= "3.8" and python_version < "4.0"
types-requests==2.31.0.2 ; python_version >= "3.7" and python_version < "4.0" types-pyopenssl==23.2.0.2 ; python_version >= "3.8" and python_version < "4.0"
types-setuptools==68.2.0.0 ; python_version >= "3.7" and python_version < "4.0" types-pyrfc3339==1.1.1.5 ; python_version >= "3.8" and python_version < "4.0"
types-six==1.16.21.9 ; python_version >= "3.7" and python_version < "4.0" types-python-dateutil==2.8.19.14 ; python_version >= "3.8" and python_version < "4.0"
types-urllib3==1.26.25.14 ; python_version >= "3.7" and python_version < "4.0" types-pytz==2023.3.1.1 ; python_version >= "3.8" and python_version < "4.0"
typing-extensions==4.7.1 ; python_version >= "3.7" and python_version < "4.0" types-pywin32==306.0.0.4 ; python_version >= "3.8" and python_version < "4.0"
uritemplate==4.1.1 ; python_version >= "3.7" and python_version < "4.0" types-requests==2.31.0.6 ; python_version >= "3.8" and python_version < "4.0"
urllib3==1.26.17 ; python_version >= "3.7" and python_version < "4.0" types-setuptools==68.2.0.0 ; python_version >= "3.8" and python_version < "4.0"
virtualenv==20.21.1 ; python_version >= "3.7" and python_version < "4.0" types-six==1.16.21.9 ; python_version >= "3.8" and python_version < "4.0"
wcwidth==0.2.8 ; python_version >= "3.7" and python_version < "4.0" types-urllib3==1.26.25.14 ; python_version >= "3.8" and python_version < "4.0"
webencodings==0.5.1 ; python_version >= "3.7" and python_version < "4.0" typing-extensions==4.8.0 ; python_version >= "3.8" and python_version < "4.0"
wheel==0.41.2 ; python_version >= "3.7" and python_version < "4.0" uritemplate==4.1.1 ; python_version >= "3.8" and python_version < "4.0"
wrapt==1.15.0 ; python_version < "4.0" and python_version >= "3.7" urllib3==1.26.17 ; python_version < "4.0" and python_version >= "3.8"
xattr==0.9.9 ; python_version >= "3.7" and python_version < "4.0" and sys_platform == "darwin" virtualenv==20.21.1 ; python_version >= "3.8" and python_version < "4.0"
yarg==0.1.9 ; python_version >= "3.7" and python_version < "4.0" wcwidth==0.2.8 ; python_version >= "3.8" and python_version < "4.0"
zipp==3.15.0 ; python_version >= "3.7" 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"

View File

@@ -117,7 +117,7 @@ def _check_version(version_str):
version = (int(search.group(1)), int(search.group(2))) version = (int(search.group(1)), int(search.group(2)))
if version >= (3, 7): if version >= (3, 8):
return True return True
print('Incompatible python version for Certbot found: {0}'.format(version_str)) print('Incompatible python version for Certbot found: {0}'.format(version_str))

View File

@@ -56,10 +56,10 @@ commands =
commands = commands =
{[testenv:py-win]commands} certbot-apache {[testenv:py-win]commands} certbot-apache
[testenv:py3{,7,8,9,10,11}] [testenv:py3{,8,9,10,11}]
commands = {[testenv:py]commands} commands = {[testenv:py]commands}
[testenv:py3.{7,8,9,10,11}] [testenv:py3.{8,9,10,11}]
commands = {[testenv:py]commands} commands = {[testenv:py]commands}
[testenv:oldest] [testenv:oldest]
@@ -69,7 +69,7 @@ commands = {[testenv:py]commands}
# #
# This version should be kept in sync with the one declared in # This version should be kept in sync with the one declared in
# tools/pinning/oldest/pyproject.toml. # tools/pinning/oldest/pyproject.toml.
basepython = python3.7 basepython = python3.8
setenv = CERTBOT_OLDEST=1 setenv = CERTBOT_OLDEST=1
commands = {[testenv:py]commands} commands = {[testenv:py]commands}

View File

@@ -11,14 +11,13 @@ setup(
author="Certbot Project", author="Certbot Project",
author_email='certbot-dev@eff.org', author_email='certbot-dev@eff.org',
license='Apache License 2.0', license='Apache License 2.0',
python_requires='>=3.7', python_requires='>=3.8',
classifiers=[ classifiers=[
'Development Status :: 4 - Beta', 'Development Status :: 4 - Beta',
'Intended Audience :: Developers', 'Intended Audience :: Developers',
'License :: OSI Approved :: Apache Software License', 'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python', 'Programming Language :: Python',
'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.7',
'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.8',
'Programming Language :: Python :: 3.9', 'Programming Language :: Python :: 3.9',
'Programming Language :: Python :: 3.10', 'Programming Language :: Python :: 3.10',