diff --git a/acme/acme/fields.py b/acme/acme/fields.py index b15489020..15a5b0add 100644 --- a/acme/acme/fields.py +++ b/acme/acme/fields.py @@ -57,7 +57,7 @@ class Resource(jose.Field): def __init__(self, resource_type: str, *args: Any, **kwargs: Any) -> None: self.resource_type = resource_type super().__init__( - 'resource', default=resource_type, *args, **kwargs) + 'resource', default=resource_type, *args, **kwargs) # type: ignore[misc] def decode(self, value: Any) -> Any: if value != self.resource_type: diff --git a/acme/acme/jws.py b/acme/acme/jws.py index bde1bb590..ea48ab380 100644 --- a/acme/acme/jws.py +++ b/acme/acme/jws.py @@ -12,14 +12,14 @@ import josepy as jose class Header(jose.Header): """ACME-specific JOSE Header. Implements nonce, kid, and url. """ - nonce = jose.Field('nonce', omitempty=True, encoder=jose.encode_b64jose) - kid = jose.Field('kid', omitempty=True) - url = jose.Field('url', omitempty=True) + nonce: bytes = jose.field('nonce', omitempty=True, encoder=jose.encode_b64jose) + kid: bytes = jose.field('kid', omitempty=True) + url: str = jose.field('url', omitempty=True) # Mypy does not understand the josepy magic happening here, and falsely claims # that nonce is redefined. Let's ignore the type check here. - @nonce.decoder # type: ignore - def nonce(value: str) -> bytes: # pylint: disable=no-self-argument,missing-function-docstring + @nonce.decoder # type: ignore[no-redef,attr-defined] + def nonce(value: str) -> bytes: # type: ignore[misc] # pylint: disable=no-self-argument,missing-function-docstring try: return jose.decode_b64jose(value) except jose.DeserializationError as error: @@ -29,12 +29,12 @@ class Header(jose.Header): class Signature(jose.Signature): """ACME-specific Signature. Uses ACME-specific Header for customer fields.""" - __slots__ = jose.Signature._orig_slots # pylint: disable=no-member + __slots__ = jose.Signature._orig_slots # type: ignore[attr-defined] # pylint: disable=no-member # TODO: decoder/encoder should accept cls? Otherwise, subclassing # JSONObjectWithFields is tricky... header_cls = Header - header = jose.Field( + header: Header = jose.field( 'header', omitempty=True, default=header_cls(), decoder=header_cls.from_json) @@ -44,10 +44,10 @@ class Signature(jose.Signature): class JWS(jose.JWS): """ACME-specific JWS. Includes none, url, and kid in protected header.""" signature_cls = Signature - __slots__ = jose.JWS._orig_slots + __slots__ = jose.JWS._orig_slots # type: ignore[attr-defined] @classmethod - # pylint: disable=arguments-differ + # type: ignore[override] # pylint: disable=arguments-differ def sign(cls, payload: bytes, key: jose.JWK, alg: jose.JWASignature, nonce: Optional[bytes], url: Optional[str] = None, kid: Optional[str] = None) -> jose.JWS: # Per ACME spec, jwk and kid are mutually exclusive, so only include a diff --git a/acme/acme/messages.py b/acme/acme/messages.py index 0dd579a98..0043a68e9 100644 --- a/acme/acme/messages.py +++ b/acme/acme/messages.py @@ -75,20 +75,20 @@ class Error(jose.JSONObjectWithFields, errors.Error): https://tools.ietf.org/html/draft-ietf-appsawg-http-problem-00 - :ivar unicode typ: - :ivar unicode title: - :ivar unicode detail: + :ivar str typ: + :ivar str title: + :ivar str detail: """ - typ = jose.Field('type', omitempty=True, default='about:blank') - title = jose.Field('title', omitempty=True) - detail = jose.Field('detail', omitempty=True) + typ: str = jose.field('type', omitempty=True, default='about:blank') + title: str = jose.field('title', omitempty=True) + detail: str = jose.field('detail', omitempty=True) @classmethod def with_code(cls, code: str, **kwargs: Any) -> 'Error': """Create an Error instance with an ACME Error code. - :unicode code: An ACME error code, like 'dnssec'. + :str code: An ACME error code, like 'dnssec'. :kwargs: kwargs to pass to Error. """ @@ -105,7 +105,7 @@ class Error(jose.JSONObjectWithFields, errors.Error): """Hardcoded error description based on its type. :returns: Description if standard ACME error or ``None``. - :rtype: unicode + :rtype: str """ return ERROR_TYPE_DESCRIPTIONS.get(self.typ) @@ -117,7 +117,7 @@ class Error(jose.JSONObjectWithFields, errors.Error): Basically self.typ without the ERROR_PREFIX. :returns: error code if standard ACME code or ``None``. - :rtype: unicode + :rtype: str """ code = str(self.typ).rsplit(':', maxsplit=1)[-1] @@ -190,11 +190,11 @@ class Identifier(jose.JSONObjectWithFields): """ACME identifier. :ivar IdentifierType typ: - :ivar unicode value: + :ivar str value: """ - typ = jose.Field('type', decoder=IdentifierType.from_json) - value = jose.Field('value') + typ: IdentifierType = jose.field('type', decoder=IdentifierType.from_json) + value: str = jose.field('value') class Directory(jose.JSONDeSerializable): @@ -273,16 +273,16 @@ class Resource(jose.JSONObjectWithFields): :ivar acme.messages.ResourceBody body: Resource body. """ - body = jose.Field('body') + body: "ResourceBody" = jose.field('body') class ResourceWithURI(Resource): """ACME Resource with URI. - :ivar unicode ~.uri: Location of the resource. + :ivar str uri: Location of the resource. """ - uri = jose.Field('uri') # no ChallengeResource.uri + uri: str = jose.field('uri') # no ChallengeResource.uri class ResourceBody(jose.JSONObjectWithFields): @@ -311,24 +311,24 @@ class ExternalAccountBinding: class Registration(ResourceBody): """Registration Resource Body. - :ivar josepy.jwk.JWK key: Public key. + :ivar jose.JWK key: Public key. :ivar tuple contact: Contact information following ACME spec, `tuple` of `unicode`. - :ivar unicode agreement: + :ivar str agreement: """ # on new-reg key server ignores 'key' and populates it based on # JWS.signature.combined.jwk - key = jose.Field('key', omitempty=True, decoder=jose.JWK.from_json) + key: jose.JWK = jose.field('key', omitempty=True, decoder=jose.JWK.from_json) # Contact field implements special behavior to allow messages that clear existing # contacts while not expecting the `contact` field when loading from json. # This is implemented in the constructor and *_json methods. - contact = jose.Field('contact', omitempty=True, default=()) - agreement = jose.Field('agreement', omitempty=True) - status = jose.Field('status', omitempty=True) - terms_of_service_agreed = jose.Field('termsOfServiceAgreed', omitempty=True) - only_return_existing = jose.Field('onlyReturnExisting', omitempty=True) - external_account_binding = jose.Field('externalAccountBinding', omitempty=True) + contact: Tuple[str, ...] = jose.field('contact', omitempty=True, default=()) + agreement: str = jose.field('agreement', omitempty=True) + status: Status = jose.field('status', omitempty=True) + terms_of_service_agreed: bool = jose.field('termsOfServiceAgreed', omitempty=True) + only_return_existing: bool = jose.field('onlyReturnExisting', omitempty=True) + external_account_binding: ExternalAccountBinding = jose.field('externalAccountBinding', omitempty=True) phone_prefix = 'tel:' email_prefix = 'mailto:' @@ -436,9 +436,9 @@ class RegistrationResource(ResourceWithURI): :ivar unicode terms_of_service: URL for the CA TOS. """ - body = jose.Field('body', decoder=Registration.from_json) - new_authzr_uri = jose.Field('new_authzr_uri', omitempty=True) - terms_of_service = jose.Field('terms_of_service', omitempty=True) + body: Registration = jose.field('body', decoder=Registration.from_json) + new_authzr_uri: str = jose.field('new_authzr_uri', omitempty=True) + terms_of_service: str = jose.field('terms_of_service', omitempty=True) class ChallengeBody(ResourceBody): @@ -463,12 +463,12 @@ class ChallengeBody(ResourceBody): # challenge object supports either one, but should be accessed through the # name "uri". In Client.answer_challenge, whichever one is set will be # used. - _uri = jose.Field('uri', omitempty=True, default=None) - _url = jose.Field('url', omitempty=True, default=None) - status = jose.Field('status', decoder=Status.from_json, + _uri: str = jose.field('uri', omitempty=True, default=None) + _url: str = jose.field('url', omitempty=True, default=None) + status: Status = jose.field('status', decoder=Status.from_json, omitempty=True, default=STATUS_PENDING) validated = fields.RFC3339Field('validated', omitempty=True) - error = jose.Field('error', decoder=Error.from_json, + error: Error = jose.field('error', decoder=Error.from_json, omitempty=True, default=None) def __init__(self, **kwargs: Any) -> None: @@ -511,11 +511,11 @@ class ChallengeResource(Resource): """Challenge Resource. :ivar acme.messages.ChallengeBody body: - :ivar unicode authzr_uri: URI found in the 'up' ``Link`` header. + :ivar str authzr_uri: URI found in the 'up' ``Link`` header. """ - body = jose.Field('body', decoder=ChallengeBody.from_json) - authzr_uri = jose.Field('authzr_uri') + body: ChallengeBody = jose.field('body', decoder=ChallengeBody.from_json) + authzr_uri: str = jose.field('authzr_uri') @property def uri(self) -> str: @@ -534,17 +534,17 @@ class Authorization(ResourceBody): :ivar datetime.datetime expires: """ - identifier = jose.Field('identifier', decoder=Identifier.from_json, omitempty=True) - challenges = jose.Field('challenges', omitempty=True) - combinations = jose.Field('combinations', omitempty=True) + identifier: Identifier = jose.field('identifier', decoder=Identifier.from_json, omitempty=True) + challenges: List[ChallengeBody] = jose.field('challenges', omitempty=True) + combinations: Tuple[Tuple[int, ...], ...] = jose.field('combinations', omitempty=True) - status = jose.Field('status', omitempty=True, decoder=Status.from_json) + status: Status = jose.field('status', omitempty=True, decoder=Status.from_json) # TODO: 'expires' is allowed for Authorization Resources in # general, but for Key Authorization '[t]he "expires" field MUST # be absent'... then acme-spec gives example with 'expires' # present... That's confusing! expires = fields.RFC3339Field('expires', omitempty=True) - wildcard = jose.Field('wildcard', omitempty=True) + wildcard: bool = jose.field('wildcard', omitempty=True) # Mypy does not understand the josepy magic happening here, and falsely claims # that challenge is redefined. Let's ignore the type check here. @@ -576,24 +576,24 @@ class AuthorizationResource(ResourceWithURI): """Authorization Resource. :ivar acme.messages.Authorization body: - :ivar unicode new_cert_uri: Deprecated. Do not use. + :ivar str new_cert_uri: Deprecated. Do not use. """ - body = jose.Field('body', decoder=Authorization.from_json) - new_cert_uri = jose.Field('new_cert_uri', omitempty=True) + body: Authorization = jose.field('body', decoder=Authorization.from_json) + new_cert_uri: str = jose.field('new_cert_uri', omitempty=True) @Directory.register class CertificateRequest(ResourceMixin, jose.JSONObjectWithFields): """ACME new-cert request. - :ivar josepy.util.ComparableX509 csr: + :ivar jose.ComparableX509 csr: `OpenSSL.crypto.X509Req` wrapped in `.ComparableX509` """ resource_type = 'new-cert' resource = fields.Resource(resource_type) - csr = jose.Field('csr', decoder=jose.decode_csr, encoder=jose.encode_csr) + csr: jose.ComparableX509 = jose.field('csr', decoder=jose.decode_csr, encoder=jose.encode_csr) class CertificateResource(ResourceWithURI): @@ -601,25 +601,25 @@ class CertificateResource(ResourceWithURI): :ivar josepy.util.ComparableX509 body: `OpenSSL.crypto.X509` wrapped in `.ComparableX509` - :ivar unicode cert_chain_uri: URI found in the 'up' ``Link`` header + :ivar str cert_chain_uri: URI found in the 'up' ``Link`` header :ivar tuple authzrs: `tuple` of `AuthorizationResource`. """ - cert_chain_uri = jose.Field('cert_chain_uri') - authzrs = jose.Field('authzrs') + cert_chain_uri: str = jose.field('cert_chain_uri') + authzrs: Tuple[AuthorizationResource, ...] = jose.field('authzrs') @Directory.register class Revocation(ResourceMixin, jose.JSONObjectWithFields): """Revocation message. - :ivar .ComparableX509 certificate: `OpenSSL.crypto.X509` wrapped in - `.ComparableX509` + :ivar jose.ComparableX509 certificate: `OpenSSL.crypto.X509` wrapped in + `jose.ComparableX509` """ resource_type = 'revoke-cert' resource = fields.Resource(resource_type) - certificate = jose.Field( + certificate: jose.ComparableX509 = jose.field( 'certificate', decoder=jose.decode_cert, encoder=jose.encode_cert) reason = jose.Field('reason') @@ -638,14 +638,13 @@ class Order(ResourceBody): :ivar datetime.datetime expires: When the order expires. :ivar ~.Error error: Any error that occurred during finalization, if applicable. """ - identifiers = jose.Field('identifiers', omitempty=True) - status = jose.Field('status', decoder=Status.from_json, - omitempty=True) - authorizations = jose.Field('authorizations', omitempty=True) - certificate = jose.Field('certificate', omitempty=True) - finalize = jose.Field('finalize', omitempty=True) + identifiers: List[Identifier] = jose.field('identifiers', omitempty=True) + status: Status = jose.field('status', decoder=Status.from_json, omitempty=True) + authorizations: List[str] = jose.field('authorizations', omitempty=True) + certificate: str = jose.field('certificate', omitempty=True) + finalize: str = jose.field('finalize', omitempty=True) expires = fields.RFC3339Field('expires', omitempty=True) - error = jose.Field('error', omitempty=True, decoder=Error.from_json) + error: Error = jose.field('error', omitempty=True, decoder=Error.from_json) # Mypy does not understand the josepy magic happening here, and falsely claims # that identifiers is redefined. Let's ignore the type check here. @@ -668,11 +667,11 @@ class OrderResource(ResourceWithURI): finalization. :vartype alternative_fullchains_pem: `list` of `str` """ - body = jose.Field('body', decoder=Order.from_json) - csr_pem = jose.Field('csr_pem', omitempty=True) - authorizations = jose.Field('authorizations') - fullchain_pem = jose.Field('fullchain_pem', omitempty=True) - alternative_fullchains_pem = jose.Field('alternative_fullchains_pem', omitempty=True) + body: Order = jose.field('body', decoder=Order.from_json) + csr_pem: str = jose.field('csr_pem', omitempty=True) + authorizations: List[AuthorizationResource] = jose.field('authorizations') + fullchain_pem: str = jose.field('fullchain_pem', omitempty=True) + alternative_fullchains_pem: List[str] = jose.field('alternative_fullchains_pem', omitempty=True) @Directory.register class NewOrder(Order): diff --git a/acme/setup.py b/acme/setup.py index 839c3f284..5c1bbaa27 100644 --- a/acme/setup.py +++ b/acme/setup.py @@ -7,7 +7,7 @@ version = '1.21.0.dev0' install_requires = [ 'cryptography>=2.1.4', - 'josepy>=1.9.0', + 'josepy>=1.10.0', 'PyOpenSSL>=17.3.0', 'pyrfc3339', 'pytz', diff --git a/tools/requirements.txt b/tools/requirements.txt index 3decb8996..90651e59d 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -9,74 +9,74 @@ alabaster==0.7.12; python_version >= "3.6" apacheconfig==0.3.2; python_version >= "3.6" appdirs==1.4.4; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" appnope==0.1.2; python_version == "3.6" and sys_platform == "darwin" or python_version >= "3.7" and sys_platform == "darwin" -astroid==2.7.3; python_version >= "3.6" and python_version < "4.0" +astroid==2.8.4; python_version >= "3.6" and python_version < "4.0" atomicwrites==1.4.0; python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" or sys_platform == "win32" and python_version >= "3.6" and python_full_version >= "3.4.0" attrs==21.2.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" -awscli==1.20.39; python_version >= "3.6" +awscli==1.21.3; python_version >= "3.6" azure-devops==6.0.0b4; python_version >= "3.6" babel==2.9.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" backcall==0.2.0; python_version == "3.6" or python_version >= "3.7" bcrypt==3.2.0; python_version >= "3.6" beautifulsoup4==4.10.0; python_full_version > "3.0.0" and python_version >= "3.6" or python_version >= "3.6" and python_version < "4.0" and python_full_version > "3.0.0" bleach==4.1.0; python_version >= "3.6" -boto3==1.18.39; python_version >= "3.6" -botocore==1.21.39; python_version >= "3.6" +boto3==1.19.3; python_version >= "3.6" +botocore==1.22.3; python_version >= "3.6" cachecontrol==0.12.6; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" cached-property==1.5.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" -cachetools==4.2.2; python_version >= "3.6" and python_version < "4.0" +cachetools==4.2.4; python_version >= "3.5" and python_version < "4.0" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6") cachy==0.3.0; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" -certifi==2021.5.30; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" or python_version >= "3.6" -cffi==1.14.6; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" or python_version >= "3.6" -charset-normalizer==2.0.4; python_full_version >= "3.6.0" and python_version >= "3.6" +certifi==2021.10.8; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" or python_version >= "3.6" +cffi==1.15.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" or python_version >= "3.6" +charset-normalizer==2.0.7; python_full_version >= "3.6.0" and python_version >= "3.6" cleo==1.0.0a4; python_version >= "3.6" and python_version < "4.0" cloudflare==2.8.15; python_version >= "3.6" colorama==0.4.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" or python_version >= "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" or python_full_version >= "3.5.0" and python_version >= "3.6" and sys_platform == "win32" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" and sys_platform == "win32" or python_version >= "3.6" and python_version < "4.0" and sys_platform == "win32" and python_full_version >= "3.5.0" or python_version >= "3.6" and python_full_version < "3.0.0" and platform_system == "Windows" or python_version >= "3.6" and python_full_version >= "3.5.0" and platform_system == "Windows" or python_version == "3.6" and python_full_version < "3.0.0" and sys_platform == "win32" or python_version == "3.6" and sys_platform == "win32" and python_full_version >= "3.5.0" or python_version >= "3.7" and python_full_version < "3.0.0" and sys_platform == "win32" or python_version >= "3.7" and sys_platform == "win32" and python_full_version >= "3.5.0" -configargparse==1.5.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +configargparse==1.5.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" configobj==5.0.6; python_version >= "3.6" -coverage==5.5; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.6" +coverage==6.0.2; python_version >= "3.6" or python_version >= "3.6" crashtest==0.3.1; python_version >= "3.6" and python_version < "4.0" -cryptography==3.4.8; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" or python_version >= "3.6" or python_version >= "3.6" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and sys_platform == "linux" +cryptography==35.0.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" or python_version >= "3.6" or python_version >= "3.6" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and sys_platform == "linux" cython==0.29.24; (python_version >= "2.6" and python_full_version < "3.0.0") or (python_full_version >= "3.3.0") dataclasses==0.8; python_version >= "3.6" and python_version < "3.7" -decorator==5.0.9; python_version == "3.6" or python_version > "3.6" or python_version >= "3.5" or python_version >= "3.7" +decorator==5.1.0; python_version == "3.6" or python_version > "3.6" or python_version >= "3.5" or python_version >= "3.7" deprecated==1.2.13; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" -distlib==0.3.2; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.6" +distlib==0.3.3; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.6" distro==1.6.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" or python_version >= "3.6" -dns-lexicon==3.7.0; python_version >= "3.6" and python_version < "4.0" +dns-lexicon==3.8.1; python_version >= "3.6" and python_version < "4.0" dnspython==2.1.0; python_version >= "3.6" docker-compose==1.26.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" docker==4.2.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" dockerpty==0.4.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" docopt==0.6.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" -docutils==0.15.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" +docutils==0.15.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" or python_version >= "3.6" and python_full_version >= "3.4.0" entrypoints==0.3; python_version >= "3.6" and python_version < "4.0" execnet==1.9.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" fabric==2.6.0; python_version >= "3.6" -filelock==3.0.12; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.5.0" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.6" and python_version < "4.0" -google-api-core==2.0.1; python_version >= "3.6" -google-api-python-client==2.20.0; python_version >= "3.6" +filelock==3.3.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.5.0" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.6" and python_version < "4.0" +google-api-core==2.1.1; python_version >= "3.6" +google-api-python-client==2.27.0; python_version >= "3.6" google-auth-httplib2==0.1.0; python_version >= "3.6" -google-auth==2.0.2; python_version >= "3.6" +google-auth==2.3.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" googleapis-common-protos==1.53.0; python_version >= "3.6" html5lib==1.1; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0" -httplib2==0.19.1; python_version >= "3.6" -idna==3.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" or python_version >= "3.6" and python_version < "4.0" +httplib2==0.18.1; python_version >= "3.6" +idna==3.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" or python_version >= "3.6" and python_version < "4.0" imagesize==1.2.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" importlib-metadata==1.7.0; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_version >= "3.6" and python_version < "3.8" and python_full_version >= "3.5.0" -importlib-resources==5.2.2; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.7" or python_version >= "3.6" and python_version < "3.7" and python_full_version >= "3.4.0" +importlib-resources==5.3.0; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.7" or python_version >= "3.6" and python_version < "3.7" and python_full_version >= "3.4.0" iniconfig==1.1.1; python_version >= "3.6" invoke==1.6.0; python_version >= "3.6" ipdb==0.13.9; python_version >= "3.6" ipython-genutils==0.2.0 ipython==7.16.1; python_version == "3.6" -ipython==7.27.0; python_version >= "3.7" +ipython==7.28.0; python_version >= "3.7" isodate==0.6.0; python_version >= "3.6" isort==5.8.0; python_version >= "3.6" and python_version < "4.0" jedi==0.18.0; python_version == "3.6" or python_version >= "3.7" jeepney==0.7.1; python_version >= "3.6" and python_version < "4.0" and sys_platform == "linux" -jinja2==3.0.1; python_version >= "3.6" or python_version >= "3.6" +jinja2==3.0.2; python_version >= "3.6" or python_version >= "3.6" jmespath==0.10.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" -josepy==1.9.0; python_version >= "3.6" +josepy==1.10.0; python_version >= "3.6" jsonlines==2.0.0; python_version >= "3.6" jsonpickle==2.0.0; python_version >= "3.6" jsonschema==3.2.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" @@ -94,67 +94,67 @@ mypy==0.910; python_version >= "3.6" oauth2client==4.1.3; python_version >= "3.6" oauthlib==3.1.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" packaging==20.9; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" or python_version >= "3.6" and python_full_version >= "3.5.0" -paramiko==2.7.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" or python_version >= "3.6" +paramiko==2.8.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" or python_version >= "3.6" parsedatetime==2.6; python_version >= "3.6" parso==0.8.2; python_version == "3.6" pathlib2==2.3.6; python_version >= "3.6" pexpect==4.8.0; python_version >= "3.6" and python_version < "4.0" or python_version == "3.6" and sys_platform != "win32" or python_version >= "3.7" and sys_platform != "win32" pickleshare==0.7.5; python_version == "3.6" or python_version >= "3.7" -pip==21.2.4; python_version >= "3.6" +pip==21.3.1; python_version >= "3.6" pkginfo==1.7.1; python_version >= "3.6" and python_version < "4.0" or python_version >= "3.6" -platformdirs==2.3.0; python_version >= "3.6" and python_version < "4.0" +platformdirs==2.4.0; python_version >= "3.6" and python_version < "4.0" pluggy==1.0.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.5.0" or python_version >= "3.6" ply==3.11; python_version >= "3.6" poetry-core==1.1.0a6; python_version >= "3.6" and python_version < "4.0" poetry==1.2.0a2; python_version >= "3.6" and python_version < "4.0" -prompt-toolkit==3.0.20; python_version == "3.6" and python_full_version >= "3.6.2" or python_version >= "3.7" and python_full_version >= "3.6.2" -protobuf==3.17.3; python_version >= "3.6" +prompt-toolkit==3.0.3; python_version == "3.6" or python_version >= "3.7" +protobuf==3.19.0; python_version >= "3.6" ptyprocess==0.7.0; python_version >= "3.6" and python_version < "4.0" py==1.10.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" or python_version >= "3.6" and python_full_version >= "3.5.0" -pyasn1-modules==0.2.8; python_version >= "3.6" +pyasn1-modules==0.2.8; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" or python_version >= "3.6" pyasn1==0.4.8; python_version >= "3.6" and python_version < "4" or python_version >= "3.6" pycparser==2.20; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" pygithub==1.55; python_version >= "3.6" pygments==2.10.0; python_version >= "3.6" or python_version == "3.6" or python_version >= "3.7" -pyjwt==2.1.0; python_version >= "3.6" +pyjwt==2.3.0; python_version >= "3.6" pylev==1.4.0; python_version >= "3.6" and python_version < "4.0" -pylint==2.10.2; python_version >= "3.6" and python_version < "4.0" +pylint==2.11.1; python_version >= "3.6" and python_version < "4.0" pynacl==1.4.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" pynsist==2.7; python_version >= "3.6" -pyopenssl==20.0.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" -pyparsing==2.4.7; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" +pyopenssl==21.0.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" +pyparsing==3.0.1; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.6" pypiwin32==223; sys_platform == "win32" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6") pyrfc3339==1.1; python_version >= "3.6" pyrsistent==0.18.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" -pytest-cov==2.12.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" +pytest-cov==3.0.0; python_version >= "3.6" or python_version >= "3.6" pytest-forked==1.3.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" -pytest-xdist==2.3.0; python_version >= "3.6" or python_version >= "3.6" +pytest-xdist==2.4.0; python_version >= "3.6" or python_version >= "3.6" pytest==6.2.5; python_version >= "3.6" or python_version >= "3.6" or python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" python-augeas==1.1.0; python_version >= "3.6" python-dateutil==2.8.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" -python-digitalocean==1.16.0; python_version >= "3.6" -python-dotenv==0.19.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" -pytz==2021.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" or python_version >= "3.6" +python-digitalocean==1.17.0; python_version >= "3.6" +python-dotenv==0.19.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" +pytz==2021.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" or python_version >= "3.6" pywin32-ctypes==0.2.0; python_version >= "3.6" and python_version < "4.0" and sys_platform == "win32" -pywin32==301; sys_platform == "win32" and python_version >= "3.6" or sys_platform == "win32" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6") +pywin32==302; sys_platform == "win32" and python_version >= "3.6" or sys_platform == "win32" and python_version >= "3.6" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6") pyyaml==5.4.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.0" -readme-renderer==29.0; python_version >= "3.6" +readme-renderer==30.0; python_version >= "3.6" requests-download==0.1.2; python_version >= "3.6" requests-file==1.5.1; python_version >= "3.6" and python_version < "4.0" requests-oauthlib==1.3.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" requests-toolbelt==0.9.1; python_version >= "3.6" and python_version < "4.0" or python_version >= "3.6" or python_version >= "3.6" requests==2.26.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.6.0" rfc3986==1.5.0; python_version >= "3.6" -rsa==4.7.2; python_version >= "3.6" and python_version < "4" +rsa==4.7.2; python_version >= "3.6" and python_version < "4" or python_version >= "3.5" and python_version < "4" and (python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version >= "3.6") s3transfer==0.5.0; python_version >= "3.6" secretstorage==3.3.1; python_version >= "3.6" and python_version < "4.0" and sys_platform == "linux" -setuptools==58.0.4; python_version >= "3.6" or python_version >= "3.6" or python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" or python_full_version >= "3.4.0" and python_version >= "3.6" or python_version == "3.6" or python_version >= "3.7" or python_version >= "3.6" and python_version < "4.0" +setuptools==58.3.0; python_version >= "3.6" or python_version >= "3.6" or python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" or python_full_version >= "3.4.0" and python_version >= "3.6" or python_full_version >= "3.6.0" and python_version >= "3.6" or python_version == "3.6" or python_version >= "3.7" or python_version >= "3.6" and python_version < "4.0" shellingham==1.4.0; python_version >= "3.6" and python_version < "4.0" -six==1.16.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" or python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" or python_full_version >= "3.5.0" and python_version >= "3.6" or python_full_version >= "3.3.0" and python_version >= "3.6" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.3.0" or python_version == "3.6" and python_full_version < "3.0.0" or python_version == "3.6" and python_full_version >= "3.3.0" +six==1.16.0; python_version >= "2.7" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" or python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" or python_full_version >= "3.6.0" and python_version >= "3.6" or python_full_version >= "3.3.0" and python_version >= "3.6" or python_version >= "3.6" and python_full_version >= "3.5.0" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.3.0" or python_version == "3.6" and python_full_version < "3.0.0" or python_version == "3.6" and python_full_version >= "3.3.0" snowballstemmer==2.1.0; python_version >= "3.6" soupsieve==2.2.1; python_full_version > "3.0.0" and python_version >= "3.6" -sphinx-rtd-theme==0.5.2; python_version >= "3.6" -sphinx==4.1.2; python_version >= "3.6" +sphinx-rtd-theme==1.0.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" +sphinx==4.2.0; python_version >= "3.6" or python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" sphinxcontrib-applehelp==1.0.2; python_version >= "3.6" sphinxcontrib-devhelp==1.0.2; python_version >= "3.6" sphinxcontrib-htmlhelp==2.0.0; python_version >= "3.6" @@ -163,35 +163,36 @@ sphinxcontrib-qthelp==1.0.3; python_version >= "3.6" sphinxcontrib-serializinghtml==1.1.5; python_version >= "3.6" texttable==1.6.4; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" tldextract==3.1.2; python_version >= "3.6" and python_version < "4.0" -toml==0.10.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" or python_full_version >= "3.5.0" and python_version >= "3.6" or python_version == "3.6" and python_full_version < "3.0.0" or python_version > "3.6" and python_full_version < "3.0.0" or python_version == "3.6" and python_full_version >= "3.3.0" or python_version > "3.6" and python_full_version >= "3.3.0" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.3.0" +toml==0.10.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" or python_version == "3.6" and python_full_version < "3.0.0" or python_version > "3.6" and python_full_version < "3.0.0" or python_version == "3.6" and python_full_version >= "3.3.0" or python_version > "3.6" and python_full_version >= "3.3.0" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.3.0" or python_version >= "3.6" and python_full_version >= "3.5.0" +tomli==1.2.2; python_version >= "3.6" tomlkit==0.7.2; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0" -tox==3.24.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.5.0" -tqdm==4.62.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" +tox==3.24.4; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.5.0" +tqdm==4.62.3; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" traitlets==4.3.3 twine==3.3.0; python_version >= "3.6" typed-ast==1.4.3; python_version >= "3.6" and python_version < "3.8" or implementation_name == "cpython" and python_version < "3.8" and python_version >= "3.6" -types-cryptography==3.3.5; python_version >= "3.6" -types-enum34==1.1.0; python_version >= "3.6" -types-ipaddress==1.0.0; python_version >= "3.6" -types-mock==4.0.1; python_version >= "3.6" -types-pyopenssl==20.0.6; python_version >= "3.6" -types-pyrfc3339==0.1.2; python_version >= "3.6" -types-python-dateutil==2.8.0; python_version >= "3.6" -types-pytz==2021.1.2; python_version >= "3.6" -types-requests==2.25.6; python_version >= "3.6" -types-setuptools==57.0.2; python_version >= "3.6" -types-six==1.16.1; python_version >= "3.6" -typing-extensions==3.10.0.2; python_version >= "3.6" or python_version >= "3.6" and python_version < "3.8" -uritemplate==3.0.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" -urllib3==1.26.6; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.6" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.6" +types-cryptography==3.3.7; python_version >= "3.6" +types-enum34==1.1.1; python_version >= "3.6" +types-ipaddress==1.0.1; python_version >= "3.6" +types-mock==4.0.3; python_version >= "3.6" +types-pyopenssl==20.0.9; python_version >= "3.6" +types-pyrfc3339==1.1.0; python_version >= "3.6" +types-python-dateutil==2.8.2; python_version >= "3.6" +types-pytz==2021.3.0; python_version >= "3.6" +types-requests==2.25.11; python_version >= "3.6" +types-setuptools==57.4.2; python_version >= "3.6" +types-six==1.16.2; python_version >= "3.6" +typing-extensions==3.10.0.2; python_version >= "3.6" or python_version >= "3.6" and python_version < "3.10" +uritemplate==4.1.1; python_version >= "3.6" +urllib3==1.26.7; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.6.0" and python_version < "4" and python_version >= "3.6" or python_full_version >= "3.5.0" and python_version < "4" and python_version >= "3.6" virtualenv==20.4.4; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.4.0" or python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.5.0" -wcwidth==0.2.5; python_version == "3.6" and python_full_version >= "3.6.2" +wcwidth==0.2.5; python_version == "3.6" webencodings==0.5.1; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0" or python_version >= "3.6" websocket-client==0.59.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.4.0" and python_version >= "3.6" or python_full_version >= "3.5.0" and python_version >= "3.6" wheel==0.37.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.5.0" -wrapt==1.12.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.4.0" or python_version >= "3.6" and python_version < "4.0" +wrapt==1.13.2; python_version >= "3.6" and python_full_version < "3.0.0" or python_version >= "3.6" and python_full_version >= "3.5.0" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "4.0" or python_version >= "3.6" and python_version < "4.0" and python_full_version >= "3.5.0" yarg==0.1.9; python_version >= "3.6" -zipp==3.5.0; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_version >= "3.6" and python_version < "3.8" and python_full_version >= "3.5.0" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.7" or python_version >= "3.6" and python_version < "3.7" and python_full_version >= "3.4.0" +zipp==3.6.0; python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.8" or python_version >= "3.6" and python_version < "3.8" and python_full_version >= "3.5.0" or python_version >= "3.6" and python_full_version < "3.0.0" and python_version < "3.7" or python_version >= "3.6" and python_version < "3.7" and python_full_version >= "3.4.0" zope.component==5.0.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" zope.event==4.5.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6" zope.hookable==5.1.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.5.0" and python_version >= "3.6"