deps: remove pyjwt dependency (#9337)

* deps: remove pyjwt dependency

* pinning: strip extras from dependencies

`poetry export` outputs in requirements.txt format, which is now
apparently producing "dep[extra]==...". We are using this output
as the constraints file for pip and pip's new resolver does not
permit extras in the constraints file.

This change filters out the extras specifiers.

* repin current dependencies

* fix new pylint complaints

* silence lint about distutils.version

We have already deprecated the function and it'll be removed in
2.0.

* docs: set sphinx language to 'en'

this is emitting a warning and failing the build

* Revert "pinning: strip extras from dependencies"

This reverts commit 11268fd231.

* pin poetry back to avoid extras issue

* repin

* fix new mypy complaints in acme/
This commit is contained in:
alexzorin
2022-07-28 17:26:12 -07:00
committed by GitHub
parent e9e7a69c7b
commit 42a4d30267
15 changed files with 188 additions and 180 deletions
+1 -1
View File
@@ -408,7 +408,7 @@ class TLSALPN01Response(KeyAuthorizationChallengeResponse):
""" """
ID_PE_ACME_IDENTIFIER_V1 = b"1.3.6.1.5.5.7.1.30.1" ID_PE_ACME_IDENTIFIER_V1 = b"1.3.6.1.5.5.7.1.30.1"
ACME_TLS_1_PROTOCOL = "acme-tls/1" ACME_TLS_1_PROTOCOL = b"acme-tls/1"
@property @property
def h(self) -> bytes: def h(self) -> bytes:
+13 -7
View File
@@ -11,6 +11,7 @@ from typing import Callable
from typing import List from typing import List
from typing import Mapping from typing import Mapping
from typing import Optional from typing import Optional
from typing import Sequence
from typing import Set from typing import Set
from typing import Tuple from typing import Tuple
from typing import Union from typing import Union
@@ -39,7 +40,9 @@ class _DefaultCertSelection:
def __call__(self, connection: SSL.Connection) -> Optional[Tuple[crypto.PKey, crypto.X509]]: def __call__(self, connection: SSL.Connection) -> Optional[Tuple[crypto.PKey, crypto.X509]]:
server_name = connection.get_servername() server_name = connection.get_servername()
return self.certs.get(server_name, None) if server_name:
return self.certs.get(server_name, None)
return None # pragma: no cover
class SSLSocket: # pylint: disable=too-few-public-methods class SSLSocket: # pylint: disable=too-few-public-methods
@@ -60,7 +63,8 @@ class SSLSocket: # pylint: disable=too-few-public-methods
method: int = _DEFAULT_SSL_METHOD, method: int = _DEFAULT_SSL_METHOD,
alpn_selection: Optional[Callable[[SSL.Connection, List[bytes]], bytes]] = None, alpn_selection: Optional[Callable[[SSL.Connection, List[bytes]], bytes]] = None,
cert_selection: Optional[Callable[[SSL.Connection], cert_selection: Optional[Callable[[SSL.Connection],
Tuple[crypto.PKey, crypto.X509]]] = None Optional[Tuple[crypto.PKey,
crypto.X509]]]] = None
) -> None: ) -> None:
self.sock = sock self.sock = sock
self.alpn_selection = alpn_selection self.alpn_selection = alpn_selection
@@ -71,8 +75,8 @@ class SSLSocket: # pylint: disable=too-few-public-methods
raise ValueError("Both cert_selection and certs specified.") raise ValueError("Both cert_selection and certs specified.")
actual_cert_selection: Union[_DefaultCertSelection, actual_cert_selection: Union[_DefaultCertSelection,
Optional[Callable[[SSL.Connection], Optional[Callable[[SSL.Connection],
Tuple[crypto.PKey, Optional[Tuple[crypto.PKey,
crypto.X509]]]] = cert_selection crypto.X509]]]]] = cert_selection
if actual_cert_selection is None: if actual_cert_selection is None:
actual_cert_selection = _DefaultCertSelection(certs if certs else {}) actual_cert_selection = _DefaultCertSelection(certs if certs else {})
self.cert_selection = actual_cert_selection self.cert_selection = actual_cert_selection
@@ -157,7 +161,7 @@ class SSLSocket: # pylint: disable=too-few-public-methods
def probe_sni(name: bytes, host: bytes, port: int = 443, timeout: int = 300, # pylint: disable=too-many-arguments def probe_sni(name: bytes, host: bytes, port: int = 443, timeout: int = 300, # pylint: disable=too-many-arguments
method: int = _DEFAULT_SSL_METHOD, source_address: Tuple[str, int] = ('', 0), method: int = _DEFAULT_SSL_METHOD, source_address: Tuple[str, int] = ('', 0),
alpn_protocols: Optional[List[str]] = None) -> crypto.X509: alpn_protocols: Optional[Sequence[bytes]] = None) -> crypto.X509:
"""Probe SNI server for SSL certificate. """Probe SNI server for SSL certificate.
:param bytes name: Byte string to send as the server name in the :param bytes name: Byte string to send as the server name in the
@@ -170,7 +174,7 @@ def probe_sni(name: bytes, host: bytes, port: int = 443, timeout: int = 300, #
of source interface). See `socket.creation_connection` for more of source interface). See `socket.creation_connection` for more
info. Available only in Python 2.7+. info. Available only in Python 2.7+.
:param alpn_protocols: Protocols to request using ALPN. :param alpn_protocols: Protocols to request using ALPN.
:type alpn_protocols: `list` of `str` :type alpn_protocols: `Sequence` of `bytes`
:raises acme.errors.Error: In case of any problems. :raises acme.errors.Error: In case of any problems.
@@ -207,7 +211,9 @@ def probe_sni(name: bytes, host: bytes, port: int = 443, timeout: int = 300, #
client_ssl.shutdown() client_ssl.shutdown()
except SSL.Error as error: except SSL.Error as error:
raise errors.Error(error) raise errors.Error(error)
return client_ssl.get_peer_certificate() cert = client_ssl.get_peer_certificate()
assert cert # Appease mypy. We would have crashed out by now if there was no certificate.
return cert
def make_csr(private_key_pem: bytes, domains: Optional[Union[Set[str], List[str]]] = None, def make_csr(private_key_pem: bytes, domains: Optional[Union[Set[str], List[str]]] = None,
+11 -6
View File
@@ -46,10 +46,12 @@ class TLSServer(socketserver.TCPServer):
method=self.method)) method=self.method))
def _cert_selection(self, connection: SSL.Connection def _cert_selection(self, connection: SSL.Connection
) -> Tuple[crypto.PKey, crypto.X509]: # pragma: no cover ) -> Optional[Tuple[crypto.PKey, crypto.X509]]: # pragma: no cover
"""Callback selecting certificate for connection.""" """Callback selecting certificate for connection."""
server_name = connection.get_servername() server_name = connection.get_servername()
return self.certs.get(server_name, None) if server_name:
return self.certs.get(server_name, None)
return None
def server_bind(self) -> None: def server_bind(self) -> None:
self._wrap_sock() self._wrap_sock()
@@ -151,7 +153,7 @@ class TLSALPN01Server(TLSServer, ACMEServerMixin):
def __init__(self, server_address: Tuple[str, int], def __init__(self, server_address: Tuple[str, int],
certs: List[Tuple[crypto.PKey, crypto.X509]], certs: List[Tuple[crypto.PKey, crypto.X509]],
challenge_certs: Mapping[str, Tuple[crypto.PKey, crypto.X509]], challenge_certs: Mapping[bytes, Tuple[crypto.PKey, crypto.X509]],
ipv6: bool = False) -> None: ipv6: bool = False) -> None:
# We don't need to implement a request handler here because the work # We don't need to implement a request handler here because the work
# (including logging) is being done by wrapped socket set up in the # (including logging) is being done by wrapped socket set up in the
@@ -161,7 +163,8 @@ class TLSALPN01Server(TLSServer, ACMEServerMixin):
ipv6=ipv6) ipv6=ipv6)
self.challenge_certs = challenge_certs self.challenge_certs = challenge_certs
def _cert_selection(self, connection: SSL.Connection) -> Tuple[crypto.PKey, crypto.X509]: def _cert_selection(self, connection: SSL.Connection) -> Optional[Tuple[crypto.PKey,
crypto.X509]]:
# TODO: We would like to serve challenge cert only if asked for it via # TODO: We would like to serve challenge cert only if asked for it via
# ALPN. To do this, we need to retrieve the list of protos from client # ALPN. To do this, we need to retrieve the list of protos from client
# hello, but this is currently impossible with openssl [0], and ALPN # hello, but this is currently impossible with openssl [0], and ALPN
@@ -170,8 +173,10 @@ class TLSALPN01Server(TLSServer, ACMEServerMixin):
# handshake in alpn_selection() if ALPN protos are not what we expect. # handshake in alpn_selection() if ALPN protos are not what we expect.
# [0] https://github.com/openssl/openssl/issues/4952 # [0] https://github.com/openssl/openssl/issues/4952
server_name = connection.get_servername() server_name = connection.get_servername()
logger.debug("Serving challenge cert for server name %s", server_name) if server_name:
return self.challenge_certs[server_name] logger.debug("Serving challenge cert for server name %s", server_name)
return self.challenge_certs[server_name]
return None # pragma: no cover
def _alpn_selection(self, _connection: SSL.Connection, alpn_protos: List[bytes]) -> bytes: def _alpn_selection(self, _connection: SSL.Connection, alpn_protos: List[bytes]) -> bytes:
"""Callback to select alpn protocol.""" """Callback to select alpn protocol."""
+2 -2
View File
@@ -328,12 +328,12 @@ class TLSALPN01ResponseTest(unittest.TestCase):
mock_gethostbyname.assert_called_once_with('foo.com') mock_gethostbyname.assert_called_once_with('foo.com')
mock_probe_sni.assert_called_once_with( mock_probe_sni.assert_called_once_with(
host=b'127.0.0.1', port=self.response.PORT, name=b'foo.com', host=b'127.0.0.1', port=self.response.PORT, name=b'foo.com',
alpn_protocols=['acme-tls/1']) alpn_protocols=[b'acme-tls/1'])
self.response.probe_cert('foo.com', host='8.8.8.8') self.response.probe_cert('foo.com', host='8.8.8.8')
mock_probe_sni.assert_called_with( mock_probe_sni.assert_called_with(
host=b'8.8.8.8', port=mock.ANY, name=b'foo.com', host=b'8.8.8.8', port=mock.ANY, name=b'foo.com',
alpn_protocols=['acme-tls/1']) alpn_protocols=[b'acme-tls/1'])
@mock.patch('acme.challenges.TLSALPN01Response.probe_cert') @mock.patch('acme.challenges.TLSALPN01Response.probe_cert')
def test_simple_verify_false_on_probe_error(self, mock_probe_cert): def test_simple_verify_false_on_probe_error(self, mock_probe_cert):
@@ -125,7 +125,7 @@ def assert_equals_world_read_permissions(file1: str, file2: str) -> None:
mode_file1 = os.stat(file1).st_mode & 0o004 mode_file1 = os.stat(file1).st_mode & 0o004
mode_file2 = os.stat(file2).st_mode & 0o004 mode_file2 = os.stat(file2).st_mode & 0o004
else: else:
everybody = win32security.ConvertStringSidToSid(EVERYBODY_SID) everybody = win32security.ConvertStringSidToSid(EVERYBODY_SID) # pylint: disable=used-before-assignment
security1 = win32security.GetFileSecurity(file1, win32security.DACL_SECURITY_INFORMATION) security1 = win32security.GetFileSecurity(file1, win32security.DACL_SECURITY_INFORMATION)
dacl1 = security1.GetSecurityDescriptorDacl() dacl1 = security1.GetSecurityDescriptorDacl()
@@ -135,7 +135,7 @@ def assert_equals_world_read_permissions(file1: str, file2: str) -> None:
'TrusteeType': win32security.TRUSTEE_IS_USER, 'TrusteeType': win32security.TRUSTEE_IS_USER,
'Identifier': everybody, 'Identifier': everybody,
}) })
mode_file1 = mode_file1 & ntsecuritycon.FILE_GENERIC_READ mode_file1 = mode_file1 & ntsecuritycon.FILE_GENERIC_READ # pylint: disable=used-before-assignment
security2 = win32security.GetFileSecurity(file2, win32security.DACL_SECURITY_INFORMATION) security2 = win32security.GetFileSecurity(file2, win32security.DACL_SECURITY_INFORMATION)
dacl2 = security2.GetSecurityDescriptorDacl() dacl2 = security2.GetSecurityDescriptorDacl()
@@ -133,18 +133,9 @@ class ACMEServer:
acme_xdist['directory_url'] = BOULDER_V2_DIRECTORY_URL acme_xdist['directory_url'] = BOULDER_V2_DIRECTORY_URL
acme_xdist['challtestsrv_url'] = BOULDER_V2_CHALLTESTSRV_URL acme_xdist['challtestsrv_url'] = BOULDER_V2_CHALLTESTSRV_URL
acme_xdist['http_port'] = { acme_xdist['http_port'] = dict(zip(nodes, range(5200, 5200 + len(nodes))))
node: port for (node, port) in # pylint: disable=unnecessary-comprehension acme_xdist['https_port'] = dict(zip(nodes, range(5100, 5100 + len(nodes))))
zip(nodes, range(5200, 5200 + len(nodes))) acme_xdist['other_port'] = dict(zip(nodes, range(5300, 5300 + len(nodes))))
}
acme_xdist['https_port'] = {
node: port for (node, port) in # pylint: disable=unnecessary-comprehension
zip(nodes, range(5100, 5100 + len(nodes)))
}
acme_xdist['other_port'] = {
node: port for (node, port) in # pylint: disable=unnecessary-comprehension
zip(nodes, range(5300, 5300 + len(nodes)))
}
self.acme_xdist = acme_xdist self.acme_xdist = acme_xdist
@@ -38,7 +38,8 @@ class Authenticator(dns_common.DNSAuthenticator):
def __init__(self, *args: Any, **kwargs: Any) -> None: def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.r53 = boto3.client("route53") self.r53 = boto3.client("route53")
self._resource_records: DefaultDict[str, List[Dict[str, str]]] = collections.defaultdict(list) self._resource_records: DefaultDict[str, List[Dict[str, str]]] = \
collections.defaultdict(list)
def more_info(self) -> str: def more_info(self) -> str:
return "Solve a DNS01 challenge using AWS Route53" return "Solve a DNS01 challenge using AWS Route53"
+3 -3
View File
@@ -194,7 +194,7 @@ class _WindowsLockMechanism(_BaseLockMechanism):
low level APIs, and Python does not do it. As of Python 3.7 and below, Python developers low level APIs, and Python does not do it. As of Python 3.7 and below, Python developers
state that deleting a file opened by a process from another process is not possible with state that deleting a file opened by a process from another process is not possible with
os.open and io.open. os.open and io.open.
Consequently, mscvrt.locking is sufficient to obtain an effective lock, and the race Consequently, msvcrt.locking is sufficient to obtain an effective lock, and the race
condition encountered on Linux is not possible on Windows, leading to a simpler workflow. condition encountered on Linux is not possible on Windows, leading to a simpler workflow.
""" """
def acquire(self) -> None: def acquire(self) -> None:
@@ -209,7 +209,7 @@ class _WindowsLockMechanism(_BaseLockMechanism):
# This "type: ignore" is currently needed because msvcrt methods # This "type: ignore" is currently needed because msvcrt methods
# are only defined on Windows. See # are only defined on Windows. See
# https://github.com/python/typeshed/blob/16ae4c61201cd8b96b8b22cdfb2ab9e89ba5bcf2/stdlib/msvcrt.pyi. # https://github.com/python/typeshed/blob/16ae4c61201cd8b96b8b22cdfb2ab9e89ba5bcf2/stdlib/msvcrt.pyi.
msvcrt.locking(fd, msvcrt.LK_NBLCK, 1) # type: ignore msvcrt.locking(fd, msvcrt.LK_NBLCK, 1) # type: ignore # pylint: disable=used-before-assignment
except (IOError, OSError) as err: except (IOError, OSError) as err:
if fd: if fd:
os.close(fd) os.close(fd)
@@ -229,7 +229,7 @@ class _WindowsLockMechanism(_BaseLockMechanism):
# This "type: ignore" is currently needed because msvcrt methods # This "type: ignore" is currently needed because msvcrt methods
# are only defined on Windows. See # are only defined on Windows. See
# https://github.com/python/typeshed/blob/16ae4c61201cd8b96b8b22cdfb2ab9e89ba5bcf2/stdlib/msvcrt.pyi. # https://github.com/python/typeshed/blob/16ae4c61201cd8b96b8b22cdfb2ab9e89ba5bcf2/stdlib/msvcrt.pyi.
msvcrt.locking(self._fd, msvcrt.LK_UNLCK, 1) # type: ignore msvcrt.locking(self._fd, msvcrt.LK_UNLCK, 1) # type: ignore # pylint: disable=used-before-assignment
os.close(self._fd) os.close(self._fd)
try: try:
+2 -2
View File
@@ -47,7 +47,7 @@ class AnnotatedChallenge(jose.ImmutableMap):
class KeyAuthorizationAnnotatedChallenge(AnnotatedChallenge): class KeyAuthorizationAnnotatedChallenge(AnnotatedChallenge):
"""Client annotated `KeyAuthorizationChallenge` challenge.""" """Client annotated `KeyAuthorizationChallenge` challenge."""
__slots__ = ('challb', 'domain', 'account_key') __slots__ = ('challb', 'domain', 'account_key') # pylint: disable=redefined-slots-in-subclass
def response_and_validation(self, *args: Any, **kwargs: Any) -> Any: def response_and_validation(self, *args: Any, **kwargs: Any) -> Any:
"""Generate response and validation.""" """Generate response and validation."""
@@ -57,5 +57,5 @@ class KeyAuthorizationAnnotatedChallenge(AnnotatedChallenge):
class DNS(AnnotatedChallenge): class DNS(AnnotatedChallenge):
"""Client annotated "dns" ACME challenge.""" """Client annotated "dns" ACME challenge."""
__slots__ = ('challb', 'domain') __slots__ = ('challb', 'domain') # pylint: disable=redefined-slots-in-subclass
acme_type = challenges.DNS acme_type = challenges.DNS
@@ -38,14 +38,12 @@ class _AuthenticatorCallableTestCase(Protocol):
See See
https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertTrue https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertTrue
""" """
...
def assertEqual(self, *unused_args: Any) -> None: def assertEqual(self, *unused_args: Any) -> None:
""" """
See See
https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertEqual https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertEqual
""" """
...
class BaseAuthenticatorTest: class BaseAuthenticatorTest:
@@ -57,7 +57,6 @@ class _LexiconAwareTestCase(Protocol):
See See
https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertRaises https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertRaises
""" """
...
# These classes are intended to be subclassed/mixed in, so not all members are defined. # These classes are intended to be subclassed/mixed in, so not all members are defined.
+2 -2
View File
@@ -34,7 +34,7 @@ if _USE_DISTRO:
import distro import distro
if TYPE_CHECKING: if TYPE_CHECKING:
import distutils.version import distutils.version # pylint: disable=deprecated-module
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -624,7 +624,7 @@ def get_strict_version(normalized: str) -> "distutils.version.StrictVersion":
"removed in a future release.", DeprecationWarning) "removed in a future release.", DeprecationWarning)
with warnings.catch_warnings(): with warnings.catch_warnings():
warnings.simplefilter("ignore", DeprecationWarning) warnings.simplefilter("ignore", DeprecationWarning)
import distutils.version import distutils.version # pylint: disable=deprecated-module
# strict version ending with "a" and a number designates a pre-release # strict version ending with "a" and a number designates a pre-release
return distutils.version.StrictVersion(normalized.replace(".dev", "a")) return distutils.version.StrictVersion(normalized.replace(".dev", "a"))
+1 -1
View File
@@ -84,7 +84,7 @@ release = meta['version']
# #
# This is also used if you do content translation via gettext catalogs. # This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases. # Usually you set "language" from the command line for these cases.
language = None language = 'en'
# There are two options for replacing |today|: either, you set today to some # There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used: # non-false value, then it is used:
+8 -1
View File
@@ -62,7 +62,14 @@ mock = "*"
# https://github.com/python-poetry/poetry/issues/1584. This version is required # https://github.com/python-poetry/poetry/issues/1584. This version is required
# here in addition to certbot/setup.py because otherwise the pre-release # here in addition to certbot/setup.py because otherwise the pre-release
# version of poetry will not be installed. # version of poetry will not be installed.
poetry = ">=1.2.0a1" #
# Additionally, newer versions of poetry/poetry-core include package extras
# (e.g. "docker[ssh]") in its `poetry export` output which is valid for
# requirements files, but not constraints files. We are currently using that
# output as constraints so let's also pin back poetry and poetry-core until we
# have a better workaround.
poetry = "1.2.0a2"
poetry-core = "1.1.0a7"
# setuptools-rust is a build dependency of cryptography, and since we don't have # setuptools-rust is a build dependency of cryptography, and since we don't have
# a great way of pinning build dependencies, we simply list it here to ensure a # a great way of pinning build dependencies, we simply list it here to ensure a
# working version. Note: if build dependencies of setuptools-rust break at some # working version. Note: if build dependencies of setuptools-rust break at some
+138 -137
View File
@@ -7,190 +7,191 @@
# for more info. # for more info.
alabaster==0.7.12; python_version >= "3.7" alabaster==0.7.12; python_version >= "3.7"
apacheconfig==0.3.2; python_version >= "3.7" apacheconfig==0.3.2; python_version >= "3.7"
appdirs==1.4.4; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.4.0" appdirs==1.4.4; python_version >= "3.7" and python_version < "4.0"
appnope==0.1.2; python_version >= "3.7" and sys_platform == "darwin" appnope==0.1.3; python_version >= "3.7" and sys_platform == "darwin"
astroid==2.9.3; python_version >= "3.7" and python_full_version >= "3.6.2" astroid==2.11.7; python_version >= "3.7"
atomicwrites==1.4.0; python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.7" and python_full_version >= "3.4.0" atomicwrites==1.4.1; sys_platform == "win32" and python_version >= "3.7"
attrs==21.4.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" attrs==22.1.0; python_version >= "3.7"
awscli==1.22.75; python_version >= "3.6" awscli==1.25.40
awscli==1.25.40; python_version >= "3.7"
azure-devops==6.0.0b4; python_version >= "3.7" azure-devops==6.0.0b4; python_version >= "3.7"
babel==2.9.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.4.0" babel==2.10.3; python_version >= "3.7"
backcall==0.2.0; python_version >= "3.7" backcall==0.2.0; python_version >= "3.7"
bcrypt==3.2.0; python_version >= "3.7" bcrypt==3.2.2; python_version >= "3.7"
beautifulsoup4==4.10.0; python_full_version > "3.0.0" and python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0" and python_full_version > "3.0.0" beautifulsoup4==4.11.1; python_version >= "3.7"
bleach==4.1.0; python_version >= "3.7" bleach==5.0.1; python_version >= "3.7"
boto3==1.21.20; python_version >= "3.7" boto3==1.24.40; python_version >= "3.7"
botocore==1.24.20; python_version >= "3.7" botocore==1.27.40; python_version >= "3.7"
cachecontrol==0.12.10; python_version >= "3.7" and python_version < "4.0" cachecontrol==0.12.11; python_version >= "3.7" and python_version < "4.0"
cached-property==1.5.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" cached-property==1.5.2; python_version >= "3.7"
cachetools==5.0.0; python_version >= "3.7" and python_version < "4.0" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7") cachetools==5.2.0; python_version >= "3.7" and python_version < "4.0"
cachy==0.3.0; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.4.0" cachy==0.3.0; python_version >= "3.7" and python_version < "4.0"
certifi==2021.10.8; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7" or python_version >= "3.7" certifi==2022.6.15; python_version >= "3.7" and python_version < "4" or python_version >= "3.7"
cffi==1.15.0; python_version >= "3.7" or python_version >= "3.7" cffi==1.15.1; python_version >= "3.7"
charset-normalizer==2.0.12; python_full_version >= "3.6.0" and python_version >= "3.7" charset-normalizer==2.1.0; python_version >= "3.7" and python_version < "4"
cleo==1.0.0a4; python_version >= "3.7" and python_version < "4.0" cleo==1.0.0a5; python_version >= "3.7" and python_version < "4.0"
cloudflare==2.8.15; python_version >= "3.7" cloudflare==2.9.11; python_version >= "3.7"
colorama==0.4.3; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" or sys_platform == "win32" and python_full_version >= "3.6.2" and python_version >= "3.7" or python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" or python_full_version >= "3.5.0" and python_version >= "3.7" and sys_platform == "win32" or python_version >= "3.7" and python_full_version < "3.0.0" and platform_system == "Windows" or python_version >= "3.7" and python_full_version >= "3.5.0" and platform_system == "Windows" colorama==0.4.4; python_version >= "3.7"
configargparse==1.5.3; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" configargparse==1.5.3; python_version >= "3.7"
configobj==5.0.6; python_version >= "3.7" configobj==5.0.6; python_version >= "3.7"
coverage==6.3.2; python_version >= "3.7" or python_version >= "3.7" coverage==6.4.2; python_version >= "3.7"
crashtest==0.3.1; python_version >= "3.7" and python_version < "4.0" crashtest==0.3.1; python_version >= "3.7" and python_version < "4.0"
cryptography==36.0.2; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" cryptography==37.0.4
cython==0.29.28; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0") cryptography==37.0.4; python_version >= "3.7"
cython==0.29.31
decorator==5.1.1; python_version >= "3.7" decorator==5.1.1; python_version >= "3.7"
deprecated==1.2.13; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.4.0" dill==0.3.5.1; python_version >= "3.7"
distlib==0.3.4; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.7" distlib==0.3.5; python_version >= "3.7"
distro==1.7.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" or python_version >= "3.7" distro==1.7.0; python_version >= "3.7"
dns-lexicon==3.9.4; python_version >= "3.7" and python_version < "4.0" dns-lexicon==3.11.1; python_version >= "3.7" and python_version < "4.0"
dnspython==2.2.1; python_version >= "3.7" and python_version < "4.0" dnspython==2.2.1; python_version >= "3.7" and python_version < "4.0"
docker-compose==1.26.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" docker-compose==1.26.2; python_version >= "3.7"
docker==4.2.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" docker==4.2.2; python_version >= "3.7"
dockerpty==0.4.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" dockerpty==0.4.1; python_version >= "3.7"
docopt==0.6.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" docopt==0.6.2; python_version >= "3.7"
docutils==0.15.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7" or python_version >= "3.7" and python_full_version >= "3.4.0" docutils==0.16; python_version >= "3.7"
entrypoints==0.3; python_version >= "3.7" and python_version < "4.0" entrypoints==0.3; python_version >= "3.7" and python_version < "4.0"
execnet==1.9.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" execnet==1.9.0; python_version >= "3.7"
fabric==2.6.0; python_version >= "3.7" fabric==2.7.1; python_version >= "3.7"
filelock==3.6.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.5.0" or python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.7" and python_version < "4.0" filelock==3.7.1; python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0"
google-api-core==2.7.1; python_version >= "3.7" google-api-core==2.8.2; python_version >= "3.7"
google-api-python-client==2.41.0; python_version >= "3.7" google-api-python-client==2.55.0; python_version >= "3.7"
google-auth-httplib2==0.1.0; python_version >= "3.7" google-auth-httplib2==0.1.0; python_version >= "3.7"
google-auth==2.6.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7" google-auth==2.9.1; python_version >= "3.7"
googleapis-common-protos==1.55.0; python_version >= "3.7" googleapis-common-protos==1.56.4; python_version >= "3.7"
html5lib==1.1; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.5.0" html5lib==1.1; python_version >= "3.7" and python_version < "4.0"
httplib2==0.20.4; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" httplib2==0.20.4; python_version >= "3.7"
idna==3.3; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0" idna==3.3; python_version >= "3.7" and python_version < "4" or python_version >= "3.7" and python_version < "4.0"
imagesize==1.3.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.4.0" imagesize==1.4.1; python_version >= "3.7"
importlib-metadata==1.7.0; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "3.8" or python_version >= "3.7" and python_version < "3.8" and python_full_version >= "3.5.0" importlib-metadata==1.7.0; python_version >= "3.7" and python_version < "3.8"
iniconfig==1.1.1; python_version >= "3.7" iniconfig==1.1.1; python_version >= "3.7"
invoke==1.6.0; python_version >= "3.7" invoke==1.7.1; python_version >= "3.7"
ipdb==0.13.9; python_version >= "3.7" ipdb==0.13.9; python_version >= "3.7"
ipython==7.32.0; python_version >= "3.7" ipython==7.34.0; python_version >= "3.7"
isodate==0.6.1; python_version >= "3.7" isodate==0.6.1; python_version >= "3.7"
isort==5.10.1; python_full_version >= "3.6.2" and python_version < "4.0" and python_version >= "3.7" isort==5.10.1; python_version >= "3.7" and python_version < "4.0"
jedi==0.18.1; python_version >= "3.7" jedi==0.18.1; python_version >= "3.7"
jeepney==0.7.1; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" jeepney==0.8.0; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux"
jinja2==3.0.3; python_version >= "3.7" or python_version >= "3.7" jinja2==3.1.2; python_version >= "3.7"
jmespath==0.10.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7" jmespath==1.0.1; python_version >= "3.7"
josepy==1.13.0; python_version >= "3.7" josepy==1.13.0; python_version >= "3.7"
jsonlines==3.0.0; python_version >= "3.7" jsonlines==3.1.0; python_version >= "3.7"
jsonpickle==2.1.0; python_version >= "3.7" jsonpickle==2.2.0; python_version >= "3.7"
jsonschema==3.2.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" jsonschema==3.2.0; python_version >= "3.7"
keyring==22.3.0; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" keyring==22.3.0; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7"
lazy-object-proxy==1.7.1; python_version >= "3.7" and python_full_version >= "3.6.2" lazy-object-proxy==1.7.1; python_version >= "3.7"
lockfile==0.12.2 lockfile==0.12.2
markupsafe==2.1.1; python_version >= "3.7" markupsafe==2.1.1; python_version >= "3.7"
matplotlib-inline==0.1.3; python_version >= "3.7" matplotlib-inline==0.1.3; python_version >= "3.7"
mccabe==0.6.1; python_version >= "3.7" and python_full_version >= "3.6.2" mccabe==0.7.0; python_version >= "3.7"
mock==4.0.3; python_version >= "3.6" mock==4.0.3
msgpack==1.0.3; python_version >= "3.7" and python_version < "4.0" msgpack==1.0.4; python_version >= "3.7" and python_version < "4.0"
msrest==0.6.21; python_version >= "3.7" msrest==0.6.21; python_version >= "3.7"
mypy-extensions==0.4.3; python_version >= "3.7" mypy-extensions==0.4.3; python_version >= "3.7"
mypy==0.941; python_version >= "3.7" mypy==0.971; python_version >= "3.7"
oauth2client==4.1.3; python_version >= "3.7" oauth2client==4.1.3; python_version >= "3.7"
oauthlib==3.2.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.4.0" oauthlib==3.2.0; python_version >= "3.7"
packaging==20.9; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" or python_version >= "3.7" and python_full_version >= "3.5.0" packaging==20.9; python_version >= "3.7"
paramiko==2.10.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" or python_version >= "3.7" paramiko==2.11.0; python_version >= "3.7"
parsedatetime==2.6; python_version >= "3.7" parsedatetime==2.6; python_version >= "3.7"
parso==0.8.3; python_version >= "3.7" parso==0.8.3; python_version >= "3.7"
pathlib2==2.3.7.post1; python_version >= "3.7" pathlib2==2.3.7.post1; python_version >= "3.7"
pexpect==4.8.0; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" and sys_platform != "win32" pexpect==4.8.0; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" and sys_platform != "win32"
pickleshare==0.7.5; python_version >= "3.7" pickleshare==0.7.5; python_version >= "3.7"
pip==22.0.4; python_version >= "3.7" pip==22.2.1; python_version >= "3.7"
pkginfo==1.8.2; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" pkginfo==1.8.3; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7"
platformdirs==2.5.1; python_version >= "3.7" and python_full_version >= "3.6.2" platformdirs==2.5.2; python_version >= "3.7"
pluggy==1.0.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.5.0" or python_version >= "3.7" pluggy==1.0.0; python_version >= "3.7"
ply==3.11; python_version >= "3.7" ply==3.11; python_version >= "3.7"
poetry-core==1.1.0a7; python_version >= "3.7" and python_version < "4.0" poetry-core==1.1.0a7
poetry==1.2.0a2; python_version >= "3.6" and python_version < "4.0" poetry==1.2.0a2
prompt-toolkit==3.0.28; python_version >= "3.7" and python_full_version >= "3.6.2" prompt-toolkit==3.0.30; python_version >= "3.7"
protobuf==3.19.4; python_version >= "3.7" protobuf==4.21.4; python_version >= "3.7"
ptyprocess==0.7.0; 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_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" py==1.11.0; python_version >= "3.7"
pyasn1-modules==0.2.8; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7" or python_version >= "3.7" pyasn1-modules==0.2.8; python_version >= "3.7"
pyasn1==0.4.8; python_version >= "3.7" and python_version < "4" or python_version >= "3.7" pyasn1==0.4.8; python_version >= "3.7"
pycparser==2.21; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" pycparser==2.21; python_version >= "3.7"
pygithub==1.55; python_version >= "3.7" pygments==2.12.0; python_version >= "3.7"
pygments==2.11.2; python_version >= "3.7"
pyjwt==2.3.0; python_version >= "3.7"
pylev==1.4.0; python_version >= "3.7" and python_version < "4.0" pylev==1.4.0; python_version >= "3.7" and python_version < "4.0"
pylint==2.12.2; python_full_version >= "3.6.2" pylint==2.13.9
pynacl==1.5.0; python_version >= "3.7" or python_version >= "3.7" pylint==2.13.9; python_version >= "3.7"
pynacl==1.5.0; python_version >= "3.7"
pynsist==2.7; python_version >= "3.7" pynsist==2.7; python_version >= "3.7"
pyopenssl==22.0.0; python_version >= "3.7" pyopenssl==22.0.0; python_version >= "3.7"
pyparsing==3.0.7; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" or python_version >= "3.7" or python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.4.0" pyparsing==3.0.9; python_version >= "3.7"
pypiwin32==223; sys_platform == "win32" and python_version >= "3.6" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7") pypiwin32==223; sys_platform == "win32" and python_version >= "3.7"
pyrfc3339==1.1; python_version >= "3.7" pyrfc3339==1.1; python_version >= "3.7"
pyrsistent==0.18.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" pyrsistent==0.18.1; python_version >= "3.7"
pytest-cov==3.0.0; python_version >= "3.7" or python_version >= "3.7" pytest-cov==3.0.0; python_version >= "3.7"
pytest-forked==1.4.0; python_version >= "3.7" pytest-forked==1.4.0; python_version >= "3.7"
pytest-xdist==2.5.0; python_version >= "3.7" or python_version >= "3.7" pytest-xdist==2.5.0; python_version >= "3.7"
pytest==7.1.0; python_version >= "3.7" or python_version >= "3.7" pytest==7.1.2; python_version >= "3.7"
python-augeas==1.1.0; python_version >= "3.7" python-augeas==1.1.0; python_version >= "3.7"
python-dateutil==2.8.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.7" python-dateutil==2.8.2; python_version >= "3.7"
python-digitalocean==1.17.0; python_version >= "3.7" python-digitalocean==1.17.0; python_version >= "3.7"
python-dotenv==0.19.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" python-dotenv==0.20.0; python_version >= "3.7"
pytz==2021.3; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.4.0" or python_version >= "3.7" pytz==2022.1; python_version >= "3.7"
pywin32-ctypes==0.2.0; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32" pywin32-ctypes==0.2.0; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32"
pywin32==303; sys_platform == "win32" and python_version >= "3.7" or sys_platform == "win32" and python_version >= "3.6" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7") pywin32==304; sys_platform == "win32" and python_version >= "3.7"
pyyaml==5.4.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7" or python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.6.0" pyyaml==5.4.1; python_version >= "3.7"
readme-renderer==34.0; python_version >= "3.7" readme-renderer==35.0; python_version >= "3.7"
requests-download==0.1.2; python_version >= "3.7" requests-download==0.1.2; python_version >= "3.7"
requests-file==1.5.1; 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_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.4.0" requests-oauthlib==1.3.1; python_version >= "3.7"
requests-toolbelt==0.9.1; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" or python_version >= "3.7" requests-toolbelt==0.9.1; python_version >= "3.7"
requests==2.27.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7" or python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.6.0" requests==2.28.1; python_version >= "3.7" and python_version < "4"
rfc3986==2.0.0; python_version >= "3.7" rfc3986==2.0.0; python_version >= "3.7"
rsa==4.7.2; python_version >= "3.7" and python_version < "4" or python_version >= "3.5" and python_version < "4" and (python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.7") rsa==4.7.2; python_version >= "3.7" and python_version < "4"
s3transfer==0.5.2; python_version >= "3.7" s3transfer==0.6.0; python_version >= "3.7"
secretstorage==3.3.1; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" secretstorage==3.3.2; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux"
semantic-version==2.9.0; python_version >= "3.6" semantic-version==2.10.0; python_version >= "3.7"
setuptools-rust==1.1.2; python_version >= "3.6" setuptools-rust==1.4.1
setuptools==60.9.3; python_version >= "3.7" or python_version >= "3.7" or python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" or python_version >= "3.7" and python_full_version >= "3.6.2" or python_full_version >= "3.4.0" and python_version >= "3.7" setuptools==63.2.0; python_version >= "3.7"
shellingham==1.4.0; python_version >= "3.7" and python_version < "4.0" shellingham==1.4.0; python_version >= "3.7" and python_version < "4.0"
six==1.16.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" or python_full_version >= "3.3.0" and python_version >= "3.7" or python_version >= "3.7" and python_full_version >= "3.5.0" or python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.5.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.4.0" or python_full_version >= "3.6.0" and python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.3.0" six==1.16.0; python_version >= "3.7"
snowballstemmer==2.2.0; python_version >= "3.7" snowballstemmer==2.2.0; python_version >= "3.7"
soupsieve==2.3.1; python_full_version > "3.0.0" and python_version >= "3.7" soupsieve==2.3.2.post1; python_version >= "3.7"
sphinx-rtd-theme==1.0.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.4.0" sphinx-rtd-theme==1.0.0; python_version >= "3.7"
sphinx==4.3.2; python_version >= "3.7" or python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.4.0" sphinx==4.3.2; python_version >= "3.7"
sphinxcontrib-applehelp==1.0.2; python_version >= "3.7" sphinxcontrib-applehelp==1.0.2; python_version >= "3.7"
sphinxcontrib-devhelp==1.0.2; python_version >= "3.7" sphinxcontrib-devhelp==1.0.2; python_version >= "3.7"
sphinxcontrib-htmlhelp==2.0.0; python_version >= "3.7" sphinxcontrib-htmlhelp==2.0.0; python_version >= "3.7"
sphinxcontrib-jsmath==1.0.1; python_version >= "3.7" sphinxcontrib-jsmath==1.0.1; python_version >= "3.7"
sphinxcontrib-qthelp==1.0.3; python_version >= "3.7" sphinxcontrib-qthelp==1.0.3; python_version >= "3.7"
sphinxcontrib-serializinghtml==1.1.5; python_version >= "3.7" sphinxcontrib-serializinghtml==1.1.5; python_version >= "3.7"
texttable==1.6.4; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" texttable==1.6.4; python_version >= "3.7"
tldextract==3.2.0; python_version >= "3.7" and python_version < "4.0" tldextract==3.3.1; python_version >= "3.7" and python_version < "4.0"
toml==0.10.2; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.3.0" or python_version >= "3.7" and python_full_version >= "3.6.2" or python_version >= "3.7" and python_full_version >= "3.5.0" toml==0.10.2; python_version >= "3.7"
tomli==2.0.1; python_version >= "3.7" or python_version >= "3.7" tomli==2.0.1; python_version < "3.11" and python_version >= "3.7" or python_full_version <= "3.11.0a6" and python_version >= "3.7" or python_version >= "3.7"
tomlkit==0.10.0; python_version >= "3.7" and python_version < "4.0" tomlkit==0.11.1; python_version >= "3.7" and python_version < "4.0"
tox==3.24.5; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.5.0" tox==3.25.1; python_version >= "3.7"
tqdm==4.63.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.4.0" tqdm==4.64.0; python_version >= "3.7"
traitlets==5.1.1; python_version >= "3.7" traitlets==5.3.0; python_version >= "3.7"
twine==3.3.0; python_version >= "3.7" twine==3.3.0; python_version >= "3.7"
typed-ast==1.5.2; python_version >= "3.7" and python_version < "3.8" or implementation_name == "cpython" and python_version < "3.8" and python_version >= "3.7" and python_full_version >= "3.6.2" typed-ast==1.5.4; python_version >= "3.7" and python_version < "3.8" or implementation_name == "cpython" and python_version < "3.8" and python_version >= "3.7"
types-cryptography==3.3.18; python_version >= "3.7" types-cryptography==3.3.21; python_version >= "3.7"
types-mock==4.0.11; python_version >= "3.7" types-mock==4.0.15; python_version >= "3.7"
types-pyopenssl==22.0.0; python_version >= "3.7" types-pyopenssl==22.0.9; python_version >= "3.7"
types-pyrfc3339==1.1.1; python_version >= "3.7" types-pyrfc3339==1.1.1; python_version >= "3.7"
types-python-dateutil==2.8.9; python_version >= "3.7" types-python-dateutil==2.8.19; python_version >= "3.7"
types-pytz==2021.3.5; python_version >= "3.7" types-pytz==2022.1.2; python_version >= "3.7"
types-requests==2.27.12; python_version >= "3.7" types-requests==2.28.5; python_version >= "3.7"
types-setuptools==57.4.10; python_version >= "3.7" types-setuptools==63.2.2; python_version >= "3.7"
types-six==1.16.12; python_version >= "3.7" types-six==1.16.18; python_version >= "3.7"
types-urllib3==1.26.11; python_version >= "3.7" types-urllib3==1.26.17; python_version >= "3.7"
typing-extensions==4.1.1; python_version >= "3.7" or python_version >= "3.6" or python_version < "3.10" and python_full_version >= "3.6.2" and python_version >= "3.7" or python_version < "3.8" and python_version >= "3.7" typing-extensions==4.3.0; python_version >= "3.7" or python_version < "3.10" and python_version >= "3.7" or python_version < "3.8" and python_version >= "3.7"
uritemplate==4.1.1; python_version >= "3.7" uritemplate==4.1.1; python_version >= "3.7"
urllib3==1.26.8; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.7" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.7" urllib3==1.26.11; python_version >= "3.7" and python_version < "4"
virtualenv==20.4.4; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.5.0" virtualenv==20.4.4; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7"
wcwidth==0.2.5; python_version >= "3.7" and python_full_version >= "3.6.2" wcwidth==0.2.5; python_version >= "3.7"
webencodings==0.5.1; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.7" and python_version < "4.0" and python_full_version >= "3.5.0" or python_version >= "3.7" webencodings==0.5.1; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7"
websocket-client==0.59.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.7" or python_full_version >= "3.5.0" and python_version >= "3.7" websocket-client==0.59.0; python_version >= "3.7"
wheel==0.37.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.5.0" wheel==0.37.1; python_version >= "3.7"
wrapt==1.13.3; python_version >= "3.7" and python_full_version < "3.0.0" or python_version >= "3.7" and python_full_version >= "3.5.0" or python_version >= "3.7" and python_full_version >= "3.6.2" wrapt==1.14.1; python_version >= "3.7"
yarg==0.1.9; python_version >= "3.7" yarg==0.1.9; python_version >= "3.7"
zipp==3.7.0; python_version >= "3.7" and python_full_version < "3.0.0" and python_version < "3.8" or python_version >= "3.7" and python_version < "3.8" and python_full_version >= "3.5.0" zipp==3.8.1; python_version >= "3.7" and python_version < "3.8"
zope.component==5.0.1; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" zope.component==5.0.1; python_version >= "3.7"
zope.event==4.5.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" zope.event==4.5.0; python_version >= "3.7"
zope.hookable==5.1.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" zope.hookable==5.1.0; python_version >= "3.7"
zope.interface==5.4.0; python_version >= "3.7" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.7" zope.interface==5.4.0; python_version >= "3.7"