diff options
author | alexzorin <alex@zorin.id.au> | 2022-07-29 03:26:12 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-07-29 03:26:12 +0300 |
commit | 42a4d30267c731b80fe73c1d38add046d0bd0899 (patch) | |
tree | 7badc467c3ec6f1a11584cbc7c11e9afed875f1e | |
parent | e9e7a69c7bb5cdac8215692d4bda9a661c0189c1 (diff) |
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 11268fd23160ac53fd8dad7a2ff15e453678e159.
* pin poetry back to avoid extras issue
* repin
* fix new mypy complaints in acme/
-rw-r--r-- | acme/acme/challenges.py | 2 | ||||
-rw-r--r-- | acme/acme/crypto_util.py | 20 | ||||
-rw-r--r-- | acme/acme/standalone.py | 17 | ||||
-rw-r--r-- | acme/tests/challenges_test.py | 4 | ||||
-rw-r--r-- | certbot-ci/certbot_integration_tests/certbot_tests/assertions.py | 4 | ||||
-rwxr-xr-x | certbot-ci/certbot_integration_tests/utils/acme_server.py | 15 | ||||
-rw-r--r-- | certbot-dns-route53/certbot_dns_route53/_internal/dns_route53.py | 3 | ||||
-rw-r--r-- | certbot/certbot/_internal/lock.py | 6 | ||||
-rw-r--r-- | certbot/certbot/achallenges.py | 4 | ||||
-rw-r--r-- | certbot/certbot/plugins/dns_test_common.py | 2 | ||||
-rw-r--r-- | certbot/certbot/plugins/dns_test_common_lexicon.py | 1 | ||||
-rw-r--r-- | certbot/certbot/util.py | 4 | ||||
-rw-r--r-- | certbot/docs/conf.py | 2 | ||||
-rw-r--r-- | tools/pinning/current/pyproject.toml | 9 | ||||
-rw-r--r-- | tools/requirements.txt | 275 |
15 files changed, 188 insertions, 180 deletions
diff --git a/acme/acme/challenges.py b/acme/acme/challenges.py index 9000b370a..91c3e6f24 100644 --- a/acme/acme/challenges.py +++ b/acme/acme/challenges.py @@ -408,7 +408,7 @@ class TLSALPN01Response(KeyAuthorizationChallengeResponse): """ 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 def h(self) -> bytes: diff --git a/acme/acme/crypto_util.py b/acme/acme/crypto_util.py index 956366469..754f70e46 100644 --- a/acme/acme/crypto_util.py +++ b/acme/acme/crypto_util.py @@ -11,6 +11,7 @@ from typing import Callable from typing import List from typing import Mapping from typing import Optional +from typing import Sequence from typing import Set from typing import Tuple from typing import Union @@ -39,7 +40,9 @@ class _DefaultCertSelection: def __call__(self, connection: SSL.Connection) -> Optional[Tuple[crypto.PKey, crypto.X509]]: 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 @@ -60,7 +63,8 @@ class SSLSocket: # pylint: disable=too-few-public-methods method: int = _DEFAULT_SSL_METHOD, alpn_selection: Optional[Callable[[SSL.Connection, List[bytes]], bytes]] = None, cert_selection: Optional[Callable[[SSL.Connection], - Tuple[crypto.PKey, crypto.X509]]] = None + Optional[Tuple[crypto.PKey, + crypto.X509]]]] = None ) -> None: self.sock = sock 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.") actual_cert_selection: Union[_DefaultCertSelection, Optional[Callable[[SSL.Connection], - Tuple[crypto.PKey, - crypto.X509]]]] = cert_selection + Optional[Tuple[crypto.PKey, + crypto.X509]]]]] = cert_selection if actual_cert_selection is None: actual_cert_selection = _DefaultCertSelection(certs if certs else {}) 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 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. :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 info. Available only in Python 2.7+. :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. @@ -207,7 +211,9 @@ def probe_sni(name: bytes, host: bytes, port: int = 443, timeout: int = 300, # client_ssl.shutdown() except SSL.Error as 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, diff --git a/acme/acme/standalone.py b/acme/acme/standalone.py index a23f6d603..62174813f 100644 --- a/acme/acme/standalone.py +++ b/acme/acme/standalone.py @@ -46,10 +46,12 @@ class TLSServer(socketserver.TCPServer): method=self.method)) 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.""" 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: self._wrap_sock() @@ -151,7 +153,7 @@ class TLSALPN01Server(TLSServer, ACMEServerMixin): def __init__(self, server_address: Tuple[str, int], 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: # 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 @@ -161,7 +163,8 @@ class TLSALPN01Server(TLSServer, ACMEServerMixin): ipv6=ipv6) 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 # 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 @@ -170,8 +173,10 @@ class TLSALPN01Server(TLSServer, ACMEServerMixin): # handshake in alpn_selection() if ALPN protos are not what we expect. # [0] https://github.com/openssl/openssl/issues/4952 server_name = connection.get_servername() - logger.debug("Serving challenge cert for server name %s", server_name) - return self.challenge_certs[server_name] + if 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: """Callback to select alpn protocol.""" diff --git a/acme/tests/challenges_test.py b/acme/tests/challenges_test.py index d7815a6c3..36cd1e376 100644 --- a/acme/tests/challenges_test.py +++ b/acme/tests/challenges_test.py @@ -328,12 +328,12 @@ class TLSALPN01ResponseTest(unittest.TestCase): mock_gethostbyname.assert_called_once_with('foo.com') mock_probe_sni.assert_called_once_with( 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') mock_probe_sni.assert_called_with( 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') def test_simple_verify_false_on_probe_error(self, mock_probe_cert): diff --git a/certbot-ci/certbot_integration_tests/certbot_tests/assertions.py b/certbot-ci/certbot_integration_tests/certbot_tests/assertions.py index 3650f64f0..3563b30af 100644 --- a/certbot-ci/certbot_integration_tests/certbot_tests/assertions.py +++ b/certbot-ci/certbot_integration_tests/certbot_tests/assertions.py @@ -125,7 +125,7 @@ def assert_equals_world_read_permissions(file1: str, file2: str) -> None: mode_file1 = os.stat(file1).st_mode & 0o004 mode_file2 = os.stat(file2).st_mode & 0o004 else: - everybody = win32security.ConvertStringSidToSid(EVERYBODY_SID) + everybody = win32security.ConvertStringSidToSid(EVERYBODY_SID) # pylint: disable=used-before-assignment security1 = win32security.GetFileSecurity(file1, win32security.DACL_SECURITY_INFORMATION) dacl1 = security1.GetSecurityDescriptorDacl() @@ -135,7 +135,7 @@ def assert_equals_world_read_permissions(file1: str, file2: str) -> None: 'TrusteeType': win32security.TRUSTEE_IS_USER, '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) dacl2 = security2.GetSecurityDescriptorDacl() diff --git a/certbot-ci/certbot_integration_tests/utils/acme_server.py b/certbot-ci/certbot_integration_tests/utils/acme_server.py index 9e56e3036..8994d0ef0 100755 --- a/certbot-ci/certbot_integration_tests/utils/acme_server.py +++ b/certbot-ci/certbot_integration_tests/utils/acme_server.py @@ -133,18 +133,9 @@ class ACMEServer: acme_xdist['directory_url'] = BOULDER_V2_DIRECTORY_URL acme_xdist['challtestsrv_url'] = BOULDER_V2_CHALLTESTSRV_URL - acme_xdist['http_port'] = { - node: port for (node, port) in # pylint: disable=unnecessary-comprehension - zip(nodes, range(5200, 5200 + 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))) - } + acme_xdist['http_port'] = dict(zip(nodes, range(5200, 5200 + len(nodes)))) + acme_xdist['https_port'] = dict(zip(nodes, range(5100, 5100 + len(nodes)))) + acme_xdist['other_port'] = dict(zip(nodes, range(5300, 5300 + len(nodes)))) self.acme_xdist = acme_xdist diff --git a/certbot-dns-route53/certbot_dns_route53/_internal/dns_route53.py b/certbot-dns-route53/certbot_dns_route53/_internal/dns_route53.py index cbe22271f..fc2fe5821 100644 --- a/certbot-dns-route53/certbot_dns_route53/_internal/dns_route53.py +++ b/certbot-dns-route53/certbot_dns_route53/_internal/dns_route53.py @@ -38,7 +38,8 @@ class Authenticator(dns_common.DNSAuthenticator): def __init__(self, *args: Any, **kwargs: Any) -> None: super().__init__(*args, **kwargs) 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: return "Solve a DNS01 challenge using AWS Route53" diff --git a/certbot/certbot/_internal/lock.py b/certbot/certbot/_internal/lock.py index 95c44856f..960be4346 100644 --- a/certbot/certbot/_internal/lock.py +++ b/certbot/certbot/_internal/lock.py @@ -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 state that deleting a file opened by a process from another process is not possible with 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. """ def acquire(self) -> None: @@ -209,7 +209,7 @@ class _WindowsLockMechanism(_BaseLockMechanism): # This "type: ignore" is currently needed because msvcrt methods # are only defined on Windows. See # 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: if fd: os.close(fd) @@ -229,7 +229,7 @@ class _WindowsLockMechanism(_BaseLockMechanism): # This "type: ignore" is currently needed because msvcrt methods # are only defined on Windows. See # 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) try: diff --git a/certbot/certbot/achallenges.py b/certbot/certbot/achallenges.py index 73666825c..081fa1c46 100644 --- a/certbot/certbot/achallenges.py +++ b/certbot/certbot/achallenges.py @@ -47,7 +47,7 @@ class AnnotatedChallenge(jose.ImmutableMap): class KeyAuthorizationAnnotatedChallenge(AnnotatedChallenge): """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: """Generate response and validation.""" @@ -57,5 +57,5 @@ class KeyAuthorizationAnnotatedChallenge(AnnotatedChallenge): class DNS(AnnotatedChallenge): """Client annotated "dns" ACME challenge.""" - __slots__ = ('challb', 'domain') + __slots__ = ('challb', 'domain') # pylint: disable=redefined-slots-in-subclass acme_type = challenges.DNS diff --git a/certbot/certbot/plugins/dns_test_common.py b/certbot/certbot/plugins/dns_test_common.py index ae8a69b79..a2ab84dcb 100644 --- a/certbot/certbot/plugins/dns_test_common.py +++ b/certbot/certbot/plugins/dns_test_common.py @@ -38,14 +38,12 @@ class _AuthenticatorCallableTestCase(Protocol): See https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertTrue """ - ... def assertEqual(self, *unused_args: Any) -> None: """ See https://docs.python.org/3/library/unittest.html#unittest.TestCase.assertEqual """ - ... class BaseAuthenticatorTest: diff --git a/certbot/certbot/plugins/dns_test_common_lexicon.py b/certbot/certbot/plugins/dns_test_common_lexicon.py index 7d844d133..01f4c6d61 100644 --- a/certbot/certbot/plugins/dns_test_common_lexicon.py +++ b/certbot/certbot/plugins/dns_test_common_lexicon.py @@ -57,7 +57,6 @@ class _LexiconAwareTestCase(Protocol): See 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. diff --git a/certbot/certbot/util.py b/certbot/certbot/util.py index 242dfef5a..9a6c5de78 100644 --- a/certbot/certbot/util.py +++ b/certbot/certbot/util.py @@ -34,7 +34,7 @@ if _USE_DISTRO: import distro if TYPE_CHECKING: - import distutils.version + import distutils.version # pylint: disable=deprecated-module logger = logging.getLogger(__name__) @@ -624,7 +624,7 @@ def get_strict_version(normalized: str) -> "distutils.version.StrictVersion": "removed in a future release.", DeprecationWarning) with warnings.catch_warnings(): 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 return distutils.version.StrictVersion(normalized.replace(".dev", "a")) diff --git a/certbot/docs/conf.py b/certbot/docs/conf.py index 08bb3705a..de9e287fc 100644 --- a/certbot/docs/conf.py +++ b/certbot/docs/conf.py @@ -84,7 +84,7 @@ release = meta['version'] # # This is also used if you do content translation via gettext catalogs. # 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 # non-false value, then it is used: diff --git a/tools/pinning/current/pyproject.toml b/tools/pinning/current/pyproject.toml index b5959bc20..95b236c10 100644 --- a/tools/pinning/current/pyproject.toml +++ b/tools/pinning/current/pyproject.toml @@ -62,7 +62,14 @@ mock = "*" # https://github.com/python-poetry/poetry/issues/1584. This version is required # here in addition to certbot/setup.py because otherwise the pre-release # 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 # a great way of pinning build dependencies, we simply list it here to ensure a # working version. Note: if build dependencies of setuptools-rust break at some diff --git a/tools/requirements.txt b/tools/requirements.txt index d57f3a600..0bc823444 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -7,190 +7,191 @@ # for more info. alabaster==0.7.12; 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" -appnope==0.1.2; python_version >= "3.7" and sys_platform == "darwin" -astroid==2.9.3; python_version >= "3.7" and python_full_version >= "3.6.2" -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" -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" -awscli==1.22.75; python_version >= "3.6" +appdirs==1.4.4; python_version >= "3.7" and python_version < "4.0" +appnope==0.1.3; python_version >= "3.7" and sys_platform == "darwin" +astroid==2.11.7; python_version >= "3.7" +atomicwrites==1.4.1; sys_platform == "win32" and python_version >= "3.7" +attrs==22.1.0; python_version >= "3.7" +awscli==1.25.40 +awscli==1.25.40; 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" -bcrypt==3.2.0; 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" -bleach==4.1.0; python_version >= "3.7" -boto3==1.21.20; python_version >= "3.7" -botocore==1.24.20; python_version >= "3.7" -cachecontrol==0.12.10; 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" -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") -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" -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" -cffi==1.15.0; python_version >= "3.7" or python_version >= "3.7" -charset-normalizer==2.0.12; python_full_version >= "3.6.0" and python_version >= "3.7" -cleo==1.0.0a4; python_version >= "3.7" and python_version < "4.0" -cloudflare==2.8.15; 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" -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" +bcrypt==3.2.2; python_version >= "3.7" +beautifulsoup4==4.11.1; python_version >= "3.7" +bleach==5.0.1; python_version >= "3.7" +boto3==1.24.40; python_version >= "3.7" +botocore==1.27.40; python_version >= "3.7" +cachecontrol==0.12.11; python_version >= "3.7" and python_version < "4.0" +cached-property==1.5.2; 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_version < "4.0" +certifi==2022.6.15; python_version >= "3.7" and python_version < "4" or python_version >= "3.7" +cffi==1.15.1; python_version >= "3.7" +charset-normalizer==2.1.0; python_version >= "3.7" and python_version < "4" +cleo==1.0.0a5; python_version >= "3.7" and python_version < "4.0" +cloudflare==2.9.11; python_version >= "3.7" +colorama==0.4.4; python_version >= "3.7" +configargparse==1.5.3; 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" -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" -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 +cryptography==37.0.4; python_version >= "3.7" +cython==0.29.31 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" -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" -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" -dns-lexicon==3.9.4; python_version >= "3.7" and python_version < "4.0" +dill==0.3.5.1; python_version >= "3.7" +distlib==0.3.5; python_version >= "3.7" +distro==1.7.0; python_version >= "3.7" +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" -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==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" -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" -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" -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" +docker-compose==1.26.2; python_version >= "3.7" +docker==4.2.2; python_version >= "3.7" +dockerpty==0.4.1; python_version >= "3.7" +docopt==0.6.2; python_version >= "3.7" +docutils==0.16; python_version >= "3.7" 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" -fabric==2.6.0; 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" -google-api-core==2.7.1; python_version >= "3.7" -google-api-python-client==2.41.0; python_version >= "3.7" +execnet==1.9.0; python_version >= "3.7" +fabric==2.7.1; python_version >= "3.7" +filelock==3.7.1; python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0" +google-api-core==2.8.2; 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==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" -googleapis-common-protos==1.55.0; 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" -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" -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" -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" -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" +google-auth==2.9.1; python_version >= "3.7" +googleapis-common-protos==1.56.4; python_version >= "3.7" +html5lib==1.1; python_version >= "3.7" and python_version < "4.0" +httplib2==0.20.4; python_version >= "3.7" +idna==3.3; python_version >= "3.7" and python_version < "4" or python_version >= "3.7" and python_version < "4.0" +imagesize==1.4.1; python_version >= "3.7" +importlib-metadata==1.7.0; python_version >= "3.7" and python_version < "3.8" 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" -ipython==7.32.0; python_version >= "3.7" +ipython==7.34.0; 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" -jeepney==0.7.1; 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" -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" +jeepney==0.8.0; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" +jinja2==3.1.2; python_version >= "3.7" +jmespath==1.0.1; python_version >= "3.7" josepy==1.13.0; python_version >= "3.7" -jsonlines==3.0.0; python_version >= "3.7" -jsonpickle==2.1.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" +jsonlines==3.1.0; python_version >= "3.7" +jsonpickle==2.2.0; 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" -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 markupsafe==2.1.1; 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" -mock==4.0.3; python_version >= "3.6" -msgpack==1.0.3; python_version >= "3.7" and python_version < "4.0" +mccabe==0.7.0; python_version >= "3.7" +mock==4.0.3 +msgpack==1.0.4; python_version >= "3.7" and python_version < "4.0" msrest==0.6.21; 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" -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" -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" -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" +oauthlib==3.2.0; python_version >= "3.7" +packaging==20.9; python_version >= "3.7" +paramiko==2.11.0; python_version >= "3.7" parsedatetime==2.6; python_version >= "3.7" parso==0.8.3; 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" pickleshare==0.7.5; python_version >= "3.7" -pip==22.0.4; python_version >= "3.7" -pkginfo==1.8.2; 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" -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" +pip==22.2.1; 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.2; python_version >= "3.7" +pluggy==1.0.0; 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==1.2.0a2; python_version >= "3.6" and python_version < "4.0" -prompt-toolkit==3.0.28; python_version >= "3.7" and python_full_version >= "3.6.2" -protobuf==3.19.4; python_version >= "3.7" +poetry-core==1.1.0a7 +poetry==1.2.0a2 +prompt-toolkit==3.0.30; 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" -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" -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==0.4.8; python_version >= "3.7" and python_version < "4" or 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" -pygithub==1.55; python_version >= "3.7" -pygments==2.11.2; python_version >= "3.7" -pyjwt==2.3.0; python_version >= "3.7" +py==1.11.0; python_version >= "3.7" +pyasn1-modules==0.2.8; python_version >= "3.7" +pyasn1==0.4.8; python_version >= "3.7" +pycparser==2.21; python_version >= "3.7" +pygments==2.12.0; python_version >= "3.7" pylev==1.4.0; python_version >= "3.7" and python_version < "4.0" -pylint==2.12.2; python_full_version >= "3.6.2" -pynacl==1.5.0; python_version >= "3.7" or python_version >= "3.7" +pylint==2.13.9 +pylint==2.13.9; python_version >= "3.7" +pynacl==1.5.0; python_version >= "3.7" pynsist==2.7; 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" -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") +pyparsing==3.0.9; python_version >= "3.7" +pypiwin32==223; sys_platform == "win32" and 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" -pytest-cov==3.0.0; python_version >= "3.7" or python_version >= "3.7" +pyrsistent==0.18.1; python_version >= "3.7" +pytest-cov==3.0.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==7.1.0; python_version >= "3.7" or python_version >= "3.7" +pytest-xdist==2.5.0; python_version >= "3.7" +pytest==7.1.2; 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-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" -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" +python-dotenv==0.20.0; 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==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") -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" -readme-renderer==34.0; python_version >= "3.7" +pywin32==304; sys_platform == "win32" and python_version >= "3.7" +pyyaml==5.4.1; python_version >= "3.7" +readme-renderer==35.0; 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-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-toolbelt==0.9.1; python_version >= "3.7" and python_version < "4.0" or python_version >= "3.7" or 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-oauthlib==1.3.1; python_version >= "3.7" +requests-toolbelt==0.9.1; python_version >= "3.7" +requests==2.28.1; python_version >= "3.7" and python_version < "4" 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") -s3transfer==0.5.2; python_version >= "3.7" -secretstorage==3.3.1; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" -semantic-version==2.9.0; python_version >= "3.6" -setuptools-rust==1.1.2; python_version >= "3.6" -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" +rsa==4.7.2; python_version >= "3.7" and python_version < "4" +s3transfer==0.6.0; python_version >= "3.7" +secretstorage==3.3.2; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux" +semantic-version==2.10.0; python_version >= "3.7" +setuptools-rust==1.4.1 +setuptools==63.2.0; python_version >= "3.7" 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" -soupsieve==2.3.1; python_full_version > "3.0.0" and 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==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" +soupsieve==2.3.2.post1; python_version >= "3.7" +sphinx-rtd-theme==1.0.0; python_version >= "3.7" +sphinx==4.3.2; python_version >= "3.7" sphinxcontrib-applehelp==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-jsmath==1.0.1; python_version >= "3.7" sphinxcontrib-qthelp==1.0.3; 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" -tldextract==3.2.0; 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" -tomli==2.0.1; python_version >= "3.7" or python_version >= "3.7" -tomlkit==0.10.0; 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" -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" -traitlets==5.1.1; python_version >= "3.7" +texttable==1.6.4; python_version >= "3.7" +tldextract==3.3.1; python_version >= "3.7" and python_version < "4.0" +toml==0.10.2; 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.11.1; python_version >= "3.7" and python_version < "4.0" +tox==3.25.1; python_version >= "3.7" +tqdm==4.64.0; python_version >= "3.7" +traitlets==5.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" -types-cryptography==3.3.18; python_version >= "3.7" -types-mock==4.0.11; python_version >= "3.7" -types-pyopenssl==22.0.0; python_version >= "3.7" +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.21; python_version >= "3.7" +types-mock==4.0.15; python_version >= "3.7" +types-pyopenssl==22.0.9; python_version >= "3.7" types-pyrfc3339==1.1.1; python_version >= "3.7" -types-python-dateutil==2.8.9; python_version >= "3.7" -types-pytz==2021.3.5; python_version >= "3.7" -types-requests==2.27.12; python_version >= "3.7" -types-setuptools==57.4.10; python_version >= "3.7" -types-six==1.16.12; python_version >= "3.7" -types-urllib3==1.26.11; 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" +types-python-dateutil==2.8.19; python_version >= "3.7" +types-pytz==2022.1.2; python_version >= "3.7" +types-requests==2.28.5; python_version >= "3.7" +types-setuptools==63.2.2; python_version >= "3.7" +types-six==1.16.18; python_version >= "3.7" +types-urllib3==1.26.17; 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" -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" -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" -wcwidth==0.2.5; python_version >= "3.7" and python_full_version >= "3.6.2" -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" -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" -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" -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" +urllib3==1.26.11; python_version >= "3.7" and python_version < "4" +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" +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" +wheel==0.37.1; python_version >= "3.7" +wrapt==1.14.1; 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" -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.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.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.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" +zipp==3.8.1; python_version >= "3.7" and python_version < "3.8" +zope.component==5.0.1; python_version >= "3.7" +zope.event==4.5.0; python_version >= "3.7" +zope.hookable==5.1.0; python_version >= "3.7" +zope.interface==5.4.0; python_version >= "3.7" |