mirror of
https://github.com/certbot/certbot.git
synced 2026-06-06 23:32:06 -04:00
Remove docker-compose dependency (#9436)
This is progress towards https://github.com/certbot/certbot/issues/9370 as discussed at https://github.com/certbot/certbot/pull/9435. I kept the command using `docker-compose` because `docker compose` doesn't seem that widely recognized yet and https://www.docker.com/blog/announcing-compose-v2-general-availability/ describes aliasing `docker-compose` to `docker compose` on newer systems by default. * refactor boulder shutdown * remove docker-compose dep * Reorder shutdown process
This commit is contained in:
parent
5270c34dd7
commit
3a738cadc3
8 changed files with 102 additions and 108 deletions
|
|
@ -157,7 +157,7 @@ class Error(jose.JSONObjectWithFields, errors.Error):
|
|||
# Mypy does not understand the josepy magic happening here, and falsely claims
|
||||
# that subproblems is redefined. Let's ignore the type check here.
|
||||
@subproblems.decoder # type: ignore
|
||||
def subproblems(value: List[Dict[str, Any]]) -> Tuple['Error', ...]: # type: ignore[misc] # pylint: disable=no-self-argument,missing-function-docstring
|
||||
def subproblems(value: List[Dict[str, Any]]) -> Tuple['Error', ...]: # pylint: disable=no-self-argument,missing-function-docstring
|
||||
return tuple(Error.from_json(subproblem) for subproblem in value)
|
||||
|
||||
@classmethod
|
||||
|
|
@ -603,7 +603,7 @@ class Authorization(ResourceBody):
|
|||
# Mypy does not understand the josepy magic happening here, and falsely claims
|
||||
# that challenge is redefined. Let's ignore the type check here.
|
||||
@challenges.decoder # type: ignore
|
||||
def challenges(value: List[Dict[str, Any]]) -> Tuple[ChallengeBody, ...]: # type: ignore[misc] # pylint: disable=no-self-argument,missing-function-docstring
|
||||
def challenges(value: List[Dict[str, Any]]) -> Tuple[ChallengeBody, ...]: # pylint: disable=no-self-argument,missing-function-docstring
|
||||
return tuple(ChallengeBody.from_json(chall) for chall in value)
|
||||
|
||||
@property
|
||||
|
|
@ -691,7 +691,7 @@ class Order(ResourceBody):
|
|||
# Mypy does not understand the josepy magic happening here, and falsely claims
|
||||
# that identifiers is redefined. Let's ignore the type check here.
|
||||
@identifiers.decoder # type: ignore
|
||||
def identifiers(value: List[Dict[str, Any]]) -> Tuple[Identifier, ...]: # type: ignore[misc] # pylint: disable=no-self-argument,missing-function-docstring
|
||||
def identifiers(value: List[Dict[str, Any]]) -> Tuple[Identifier, ...]: # pylint: disable=no-self-argument,missing-function-docstring
|
||||
return tuple(Identifier.from_json(identifier) for identifier in value)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ import pytest
|
|||
from certbot_integration_tests.certbot_tests import context as certbot_context
|
||||
from certbot_integration_tests.nginx_tests import nginx_config as config
|
||||
from certbot_integration_tests.utils import certbot_call
|
||||
from certbot_integration_tests.utils import constants
|
||||
from certbot_integration_tests.utils import misc
|
||||
|
||||
|
||||
|
|
@ -65,4 +66,4 @@ class IntegrationTestsContext(certbot_context.IntegrationTestsContext):
|
|||
def _stop_nginx(self) -> None:
|
||||
assert self.process.poll() is None
|
||||
self.process.terminate()
|
||||
self.process.wait()
|
||||
self.process.wait(constants.MAX_SUBPROCESS_WAIT)
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ from typing import Dict
|
|||
from typing import List
|
||||
from typing import Mapping
|
||||
from typing import Optional
|
||||
from typing import Tuple
|
||||
from typing import Type
|
||||
|
||||
import requests
|
||||
|
|
@ -63,6 +64,7 @@ class ACMEServer:
|
|||
self._stdout = sys.stdout if stdout else open(os.devnull, 'w') # pylint: disable=consider-using-with
|
||||
self._dns_server = dns_server
|
||||
self._http_01_port = http_01_port
|
||||
self._preterminate_cmds_args: List[Tuple[Tuple[Any, ...], Dict[str, Any]]] = []
|
||||
if http_01_port != DEFAULT_HTTP_01_PORT:
|
||||
if self._acme_type != 'pebble' or self._proxy:
|
||||
raise ValueError('setting http_01_port is not currently supported '
|
||||
|
|
@ -85,6 +87,7 @@ class ACMEServer:
|
|||
"""Stop the test stack, and clean its resources"""
|
||||
print('=> Tear down the test infrastructure...')
|
||||
try:
|
||||
self._run_preterminate_cmds()
|
||||
for process in self._processes:
|
||||
try:
|
||||
process.terminate()
|
||||
|
|
@ -94,17 +97,7 @@ class ACMEServer:
|
|||
if e.errno != errno.ESRCH:
|
||||
raise
|
||||
for process in self._processes:
|
||||
process.wait()
|
||||
|
||||
if os.path.exists(os.path.join(self._workspace, 'boulder')):
|
||||
# Boulder docker generates build artifacts owned by root with 0o744 permissions.
|
||||
# If we started the acme server from a normal user that has access to the Docker
|
||||
# daemon, this user will not be able to delete these artifacts from the host.
|
||||
# We need to do it through a docker.
|
||||
process = self._launch_process(['docker', 'run', '--rm', '-v',
|
||||
'{0}:/workspace'.format(self._workspace),
|
||||
'alpine', 'rm', '-rf', '/workspace/boulder'])
|
||||
process.wait()
|
||||
process.wait(MAX_SUBPROCESS_WAIT)
|
||||
finally:
|
||||
if os.path.exists(self._workspace):
|
||||
shutil.rmtree(self._workspace)
|
||||
|
|
@ -187,7 +180,7 @@ class ACMEServer:
|
|||
# Load Boulder from git, that includes a docker-compose.yml ready for production.
|
||||
process = self._launch_process(['git', 'clone', 'https://github.com/letsencrypt/boulder',
|
||||
'--single-branch', '--depth=1', instance_path])
|
||||
process.wait()
|
||||
process.wait(MAX_SUBPROCESS_WAIT)
|
||||
|
||||
# Allow Boulder to ignore usual limit rate policies, useful for tests.
|
||||
os.rename(join(instance_path, 'test/rate-limit-policies-b.yml'),
|
||||
|
|
@ -202,6 +195,17 @@ class ACMEServer:
|
|||
with open(join(instance_path, 'test/config/va{}.json'.format(suffix)), 'w') as f:
|
||||
f.write(json.dumps(config, indent=2, separators=(',', ': ')))
|
||||
|
||||
# This command needs to be run before we try and terminate running processes because
|
||||
# docker-compose up doesn't always respond to SIGTERM. See
|
||||
# https://github.com/certbot/certbot/pull/9435.
|
||||
self._register_preterminate_cmd(['docker-compose', 'down'], cwd=instance_path)
|
||||
# Boulder docker generates build artifacts owned by root with 0o744 permissions.
|
||||
# If we started the acme server from a normal user that has access to the Docker
|
||||
# daemon, this user will not be able to delete these artifacts from the host.
|
||||
# We need to do it through a docker.
|
||||
self._register_preterminate_cmd(['docker', 'run', '--rm', '-v',
|
||||
'{0}:/workspace'.format(self._workspace), 'alpine', 'rm',
|
||||
'-rf', '/workspace/boulder'])
|
||||
try:
|
||||
# Launch the Boulder server
|
||||
self._launch_process(['docker-compose', 'up', '--force-recreate'], cwd=instance_path)
|
||||
|
|
@ -224,7 +228,7 @@ class ACMEServer:
|
|||
process = self._launch_process([
|
||||
'docker-compose', 'logs'], cwd=instance_path, force_stderr=True
|
||||
)
|
||||
process.wait()
|
||||
process.wait(MAX_SUBPROCESS_WAIT)
|
||||
raise
|
||||
|
||||
print('=> Finished boulder instance deployment.')
|
||||
|
|
@ -253,6 +257,17 @@ class ACMEServer:
|
|||
self._processes.append(process)
|
||||
return process
|
||||
|
||||
def _register_preterminate_cmd(self, *args: Any, **kwargs: Any) -> None:
|
||||
self._preterminate_cmds_args.append((args, kwargs))
|
||||
|
||||
def _run_preterminate_cmds(self) -> None:
|
||||
for args, kwargs in self._preterminate_cmds_args:
|
||||
process = self._launch_process(*args, **kwargs)
|
||||
process.wait(MAX_SUBPROCESS_WAIT)
|
||||
# It's unlikely to matter, but let's clear the list of cleanup commands
|
||||
# once they've been run.
|
||||
self._preterminate_cmds_args.clear()
|
||||
|
||||
|
||||
def main() -> None:
|
||||
# pylint: disable=missing-function-docstring
|
||||
|
|
|
|||
|
|
@ -9,3 +9,4 @@ PEBBLE_MANAGEMENT_URL = 'https://localhost:15000'
|
|||
PEBBLE_CHALLTESTSRV_URL = f'http://localhost:{CHALLTESTSRV_PORT}'
|
||||
MOCK_OCSP_SERVER_PORT = 4002
|
||||
PEBBLE_ALTERNATE_ROOTS = 2
|
||||
MAX_SUBPROCESS_WAIT = 120
|
||||
|
|
|
|||
|
|
@ -17,6 +17,8 @@ from typing import Type
|
|||
|
||||
from pkg_resources import resource_filename
|
||||
|
||||
from certbot_integration_tests.utils import constants
|
||||
|
||||
BIND_DOCKER_IMAGE = "internetsystemsconsortium/bind9:9.16"
|
||||
BIND_BIND_ADDRESS = ("127.0.0.1", 45953)
|
||||
|
||||
|
|
@ -67,7 +69,7 @@ class DNSServer:
|
|||
if self.process:
|
||||
try:
|
||||
self.process.terminate()
|
||||
self.process.wait()
|
||||
self.process.wait(constants.MAX_SUBPROCESS_WAIT)
|
||||
except BaseException as e:
|
||||
print("BIND9 did not stop cleanly: {}".format(e), file=sys.stderr)
|
||||
|
||||
|
|
|
|||
|
|
@ -15,7 +15,6 @@ if parse_version(setuptools_version) < parse_version(min_setuptools_version):
|
|||
install_requires = [
|
||||
'coverage',
|
||||
'cryptography',
|
||||
'docker-compose',
|
||||
'pyopenssl',
|
||||
'pytest',
|
||||
'pytest-cov',
|
||||
|
|
|
|||
|
|
@ -3,58 +3,49 @@
|
|||
apacheconfig==0.3.2
|
||||
asn1crypto==0.24.0
|
||||
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"
|
||||
bcrypt==3.2.2; python_version >= "3.7"
|
||||
boto3==1.15.15
|
||||
botocore==1.18.15
|
||||
cached-property==1.5.2; python_version >= "3.7"
|
||||
certifi==2022.6.15; python_version >= "3.7"
|
||||
certifi==2022.9.24; python_version >= "3.7"
|
||||
cffi==1.9.1
|
||||
chardet==3.0.4
|
||||
cloudflare==1.5.1
|
||||
colorama==0.4.5; sys_platform == "win32" and python_version >= "3.7"
|
||||
configargparse==0.10.0
|
||||
configobj==5.0.6
|
||||
coverage==6.4.2; python_version >= "3.7"
|
||||
coverage==6.5.0; python_version >= "3.7"
|
||||
cryptography==3.2.1
|
||||
cython==0.29.31
|
||||
cython==0.29.32
|
||||
dill==0.3.5.1; python_version >= "3.7"
|
||||
distlib==0.3.5; python_version >= "3.7"
|
||||
distlib==0.3.6; python_version >= "3.7"
|
||||
distro==1.0.1
|
||||
dns-lexicon==3.2.1
|
||||
dnspython==1.15.0
|
||||
docker-compose==1.25.5; 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"
|
||||
execnet==1.9.0; python_version >= "3.7"
|
||||
filelock==3.7.1; python_version >= "3.7"
|
||||
filelock==3.8.0; python_version >= "3.7"
|
||||
funcsigs==0.4
|
||||
future==0.18.2; python_version >= "3.7"
|
||||
google-api-python-client==1.5.5
|
||||
httplib2==0.9.2
|
||||
idna==2.6
|
||||
importlib-metadata==4.12.0; python_version < "3.8" and python_version >= "3.7"
|
||||
importlib-metadata==5.0.0; python_version < "3.8" and python_version >= "3.7"
|
||||
iniconfig==1.1.1; python_version >= "3.7"
|
||||
ipaddress==1.0.16
|
||||
isort==5.10.1; python_version >= "3.7" and python_version < "4.0"
|
||||
jmespath==0.10.0; python_version >= "3.7"
|
||||
josepy==1.13.0; python_version >= "3.7"
|
||||
jsonschema==3.2.0; python_version >= "3.7"
|
||||
lazy-object-proxy==1.7.1; python_version >= "3.7"
|
||||
logger==1.4; python_version >= "3.7"
|
||||
mccabe==0.7.0; python_version >= "3.7"
|
||||
mock==1.0.1
|
||||
mypy-extensions==0.4.3; python_version >= "3.7"
|
||||
mypy==0.971; python_version >= "3.7"
|
||||
mypy==0.982; python_version >= "3.7"
|
||||
ndg-httpsclient==0.3.2
|
||||
oauth2client==4.0.0
|
||||
packaging==21.3; python_version >= "3.7"
|
||||
paramiko==2.11.0; python_version >= "3.7"
|
||||
parsedatetime==2.4
|
||||
pbr==1.8.0
|
||||
pip==22.2.1; python_version >= "3.7"
|
||||
pip==22.3; python_version >= "3.7"
|
||||
platformdirs==2.5.2; python_version >= "3.7"
|
||||
pluggy==1.0.0; python_version >= "3.7"
|
||||
ply==3.4
|
||||
|
|
@ -63,53 +54,48 @@ pyasn1-modules==0.0.10; python_version >= "3.7"
|
|||
pyasn1==0.1.9
|
||||
pycparser==2.14
|
||||
pylint==2.13.9
|
||||
pynacl==1.5.0; python_version >= "3.7"
|
||||
pyopenssl==17.5.0
|
||||
pyparsing==2.2.1
|
||||
pypiwin32==223; sys_platform == "win32" and python_version >= "3.7"
|
||||
pyrfc3339==1.0
|
||||
pyrsistent==0.18.1; python_version >= "3.7"
|
||||
pytest-cov==3.0.0; python_version >= "3.7"
|
||||
pytest-cov==4.0.0; python_version >= "3.7"
|
||||
pytest-forked==1.4.0; python_version >= "3.7"
|
||||
pytest-xdist==2.5.0; python_version >= "3.7"
|
||||
pytest==7.1.2; python_version >= "3.7"
|
||||
pytest==7.1.3; python_version >= "3.7"
|
||||
python-augeas==0.5.0
|
||||
python-dateutil==2.8.2; python_version >= "3.7"
|
||||
python-digitalocean==1.11
|
||||
pytz==2019.3
|
||||
pywin32==304; sys_platform == "win32" and python_version >= "3.7"
|
||||
pyyaml==5.4.1; python_version >= "3.7"
|
||||
pyyaml==6.0; python_version >= "3.7"
|
||||
requests-file==1.5.1; python_version >= "3.7"
|
||||
requests-toolbelt==0.9.1; python_version >= "3.7"
|
||||
requests-toolbelt==0.10.0; python_version >= "3.7"
|
||||
requests==2.20.0
|
||||
rsa==4.9; python_version >= "3.7" and python_version < "4"
|
||||
s3transfer==0.3.7; python_version >= "3.7"
|
||||
setuptools==41.6.0
|
||||
six==1.11.0
|
||||
texttable==1.6.4; python_version >= "3.7"
|
||||
tldextract==3.3.1; python_version >= "3.7"
|
||||
tldextract==3.4.0; 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"
|
||||
tox==1.9.2; 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-cryptography==3.3.23.1; python_version >= "3.7"
|
||||
types-mock==4.0.15.1; python_version >= "3.7"
|
||||
types-pyopenssl==22.1.0.1; python_version >= "3.7"
|
||||
types-pyrfc3339==1.1.1; 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"
|
||||
types-python-dateutil==2.8.19.2; python_version >= "3.7"
|
||||
types-pytz==2022.5.0.0; python_version >= "3.7"
|
||||
types-requests==2.28.11.2; python_version >= "3.7"
|
||||
types-setuptools==65.5.0.1; python_version >= "3.7"
|
||||
types-six==1.16.21; python_version >= "3.7"
|
||||
types-urllib3==1.26.25.1; python_version >= "3.7"
|
||||
typing-extensions==4.4.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==3.0.1; python_version >= "3.7"
|
||||
urllib3==1.24.2
|
||||
virtualenv==20.16.2; python_version >= "3.7"
|
||||
websocket-client==0.59.0; python_version >= "3.7"
|
||||
virtualenv==20.16.5; python_version >= "3.7"
|
||||
wheel==0.33.6
|
||||
wheel==0.33.6; python_version >= "3.7"
|
||||
wrapt==1.14.1; python_version >= "3.7"
|
||||
zipp==3.8.1; python_version < "3.8" and python_version >= "3.7"
|
||||
zipp==3.9.0; python_version < "3.8" and python_version >= "3.7"
|
||||
zope.component==4.1.0
|
||||
zope.event==4.0.3
|
||||
zope.hookable==4.0.4
|
||||
|
|
|
|||
|
|
@ -11,52 +11,47 @@ 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"
|
||||
attrs==22.1.0; python_version >= "3.7"
|
||||
awscli==1.25.76
|
||||
awscli==1.25.76; python_version >= "3.7"
|
||||
awscli==1.25.95
|
||||
awscli==1.25.95; python_version >= "3.7"
|
||||
azure-devops==6.0.0b4; python_version >= "3.7"
|
||||
babel==2.10.3; python_version >= "3.7"
|
||||
backcall==0.2.0; python_version >= "3.7"
|
||||
bcrypt==4.0.0; python_version >= "3.7"
|
||||
bcrypt==4.0.1; python_version >= "3.7"
|
||||
beautifulsoup4==4.11.1; python_version >= "3.7"
|
||||
bleach==5.0.1; python_version >= "3.7"
|
||||
boto3==1.24.75; python_version >= "3.7"
|
||||
botocore==1.27.75; python_version >= "3.7"
|
||||
boto3==1.24.94; python_version >= "3.7"
|
||||
botocore==1.27.94; python_version >= "3.7"
|
||||
cachecontrol==0.12.12; python_version >= "3.7" and python_version < "4.0"
|
||||
cached-property==1.5.2; python_version < "3.8" 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_version < "4.0"
|
||||
certifi==2022.9.14; python_version >= "3.7" and python_version < "4" or python_version >= "3.7"
|
||||
certifi==2022.9.24; 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.1; python_version >= "3.7" and python_version < "4"
|
||||
cleo==1.0.0a5; python_version >= "3.7" and python_version < "4.0"
|
||||
cloudflare==2.10.1; python_version >= "3.7"
|
||||
cloudflare==2.10.2; 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.4.4; python_version >= "3.7"
|
||||
coverage==6.5.0; python_version >= "3.7"
|
||||
crashtest==0.3.1; python_version >= "3.7" and python_version < "4.0"
|
||||
cryptography==38.0.1
|
||||
cryptography==38.0.1; python_version >= "3.7"
|
||||
cryptography==38.0.2
|
||||
cryptography==38.0.2; python_version >= "3.7"
|
||||
cython==0.29.32
|
||||
decorator==5.1.1; python_version >= "3.7"
|
||||
dill==0.3.5.1; python_version >= "3.7"
|
||||
distlib==0.3.6; python_version >= "3.7"
|
||||
distro==1.7.0; python_version >= "3.7"
|
||||
distro==1.8.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.29.2; python_version >= "3.7"
|
||||
docker==6.0.0; 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"
|
||||
fabric==2.7.1; python_version >= "3.7"
|
||||
filelock==3.8.0; python_version >= "3.7" or python_version >= "3.7" and python_version < "4.0"
|
||||
google-api-core==2.10.1; python_version >= "3.7"
|
||||
google-api-python-client==2.61.0; python_version >= "3.7"
|
||||
google-api-core==2.10.2; python_version >= "3.7"
|
||||
google-api-python-client==2.65.0; python_version >= "3.7"
|
||||
google-auth-httplib2==0.1.0; python_version >= "3.7"
|
||||
google-auth==2.11.0; python_version >= "3.7"
|
||||
google-auth==2.13.0; 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"
|
||||
|
|
@ -64,7 +59,7 @@ idna==3.4; python_version >= "3.7" and python_version < "4" or python_version >=
|
|||
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.7.1; python_version >= "3.7"
|
||||
invoke==1.7.3; python_version >= "3.7"
|
||||
ipdb==0.13.9; python_version >= "3.7"
|
||||
ipython==7.34.0; python_version >= "3.7"
|
||||
isodate==0.6.1; python_version >= "3.7"
|
||||
|
|
@ -76,7 +71,6 @@ jmespath==1.0.1; python_version >= "3.7"
|
|||
josepy==1.13.0; 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"
|
||||
markupsafe==2.1.1; python_version >= "3.7"
|
||||
|
|
@ -86,9 +80,9 @@ 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.971; python_version >= "3.7"
|
||||
mypy==0.982; python_version >= "3.7"
|
||||
oauth2client==4.1.3; python_version >= "3.7"
|
||||
oauthlib==3.2.1; python_version >= "3.7"
|
||||
oauthlib==3.2.2; 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"
|
||||
|
|
@ -96,7 +90,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.2.2; python_version >= "3.7"
|
||||
pip==22.3; 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"
|
||||
|
|
@ -104,7 +98,7 @@ ply==3.11; python_version >= "3.7"
|
|||
poetry-core==1.1.0a7
|
||||
poetry==1.2.0a2
|
||||
prompt-toolkit==3.0.31; python_version >= "3.7"
|
||||
protobuf==4.21.6; python_version >= "3.7"
|
||||
protobuf==4.21.8; 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"
|
||||
pyasn1-modules==0.2.8; python_version >= "3.7"
|
||||
|
|
@ -115,23 +109,21 @@ pylev==1.4.0; python_version >= "3.7" and python_version < "4.0"
|
|||
pylint==2.13.9
|
||||
pynacl==1.5.0; python_version >= "3.7"
|
||||
pynsist==2.7; python_version >= "3.7"
|
||||
pyopenssl==22.0.0; python_version >= "3.7"
|
||||
pyopenssl==22.1.0; python_version >= "3.7"
|
||||
pyparsing==3.0.9; python_version >= "3.7"
|
||||
pyrfc3339==1.1; python_version >= "3.7"
|
||||
pyrsistent==0.18.1; python_version >= "3.7"
|
||||
pytest-cov==3.0.0; python_version >= "3.7"
|
||||
pytest-cov==4.0.0; python_version >= "3.7"
|
||||
pytest-forked==1.4.0; python_version >= "3.7"
|
||||
pytest-xdist==2.5.0; python_version >= "3.7"
|
||||
pytest==7.1.3; python_version >= "3.7"
|
||||
python-augeas==1.1.0; 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.21.0; python_version >= "3.7"
|
||||
pytz==2022.2.1; python_version >= "3.7"
|
||||
pytz==2022.5; python_version >= "3.7"
|
||||
pywin32-ctypes==0.2.0; python_version >= "3.7" and python_version < "4.0" and sys_platform == "win32"
|
||||
pywin32==304; sys_platform == "win32" and python_version >= "3.7"
|
||||
pyyaml==5.4.1; python_version >= "3.7"
|
||||
readme-renderer==37.1; python_version >= "3.7"
|
||||
readme-renderer==37.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-oauthlib==1.3.1; python_version >= "3.7"
|
||||
|
|
@ -142,8 +134,8 @@ rsa==4.7.2; python_version >= "3.7" and python_version < "4"
|
|||
s3transfer==0.6.0; python_version >= "3.7"
|
||||
secretstorage==3.3.3; python_version >= "3.7" and python_version < "4.0" and sys_platform == "linux"
|
||||
semantic-version==2.10.0; python_version >= "3.7"
|
||||
setuptools-rust==1.5.1
|
||||
setuptools==65.3.0; python_version >= "3.7"
|
||||
setuptools-rust==1.5.2
|
||||
setuptools==65.5.0; python_version >= "3.7"
|
||||
shellingham==1.5.0; python_version >= "3.7" and python_version < "4.0"
|
||||
six==1.16.0; python_version >= "3.7"
|
||||
snowballstemmer==2.2.0; python_version >= "3.7"
|
||||
|
|
@ -156,38 +148,36 @@ 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"
|
||||
tldextract==3.3.1; python_version >= "3.7" and python_version < "4.0"
|
||||
tldextract==3.4.0; 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.4; python_version >= "3.7" and python_version < "4.0"
|
||||
tomlkit==0.11.5; python_version >= "3.7" and python_version < "4.0"
|
||||
tox==3.26.0; python_version >= "3.7"
|
||||
tqdm==4.64.1; python_version >= "3.7"
|
||||
traitlets==5.4.0; python_version >= "3.7"
|
||||
traitlets==5.5.0; python_version >= "3.7"
|
||||
twine==3.3.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.23; python_version >= "3.7"
|
||||
types-mock==4.0.15; python_version >= "3.7"
|
||||
types-pyopenssl==22.0.10; python_version >= "3.7"
|
||||
types-cryptography==3.3.23.1; python_version >= "3.7"
|
||||
types-mock==4.0.15.1; python_version >= "3.7"
|
||||
types-pyopenssl==22.1.0.1; python_version >= "3.7"
|
||||
types-pyrfc3339==1.1.1; python_version >= "3.7"
|
||||
types-python-dateutil==2.8.19; python_version >= "3.7"
|
||||
types-pytz==2022.2.1.0; python_version >= "3.7"
|
||||
types-requests==2.28.10; python_version >= "3.7"
|
||||
types-setuptools==65.3.0; python_version >= "3.7"
|
||||
types-six==1.16.19; python_version >= "3.7"
|
||||
types-urllib3==1.26.24; 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"
|
||||
types-python-dateutil==2.8.19.2; python_version >= "3.7"
|
||||
types-pytz==2022.5.0.0; python_version >= "3.7"
|
||||
types-requests==2.28.11.2; python_version >= "3.7"
|
||||
types-setuptools==65.5.0.1; python_version >= "3.7"
|
||||
types-six==1.16.21; python_version >= "3.7"
|
||||
types-urllib3==1.26.25.1; python_version >= "3.7"
|
||||
typing-extensions==4.4.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.12; 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.8.1; python_version >= "3.7" and python_version < "3.8"
|
||||
zipp==3.9.0; 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.2; python_version >= "3.7"
|
||||
zope.interface==5.4.0; python_version >= "3.7"
|
||||
zope.interface==5.5.0; python_version >= "3.7"
|
||||
|
|
|
|||
Loading…
Reference in a new issue