logikal-utils 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,24 @@
1
+ ###################################################################################################
2
+ ##
3
+ ## DO NOT EDIT THIS FILE.
4
+ ## This is an answers file generated by Copier.
5
+ ##
6
+ ###################################################################################################
7
+ _commit: v1.0.2
8
+ _src_path: git@github.com:logikal-io/python-package-template.git
9
+ audience: Developers
10
+ classifiers:
11
+ - 'Topic :: Software Development'
12
+ cloud: false
13
+ description: Common Python utilities used at Logikal
14
+ extras:
15
+ - docker
16
+ jupyter: false
17
+ keywords:
18
+ - python
19
+ - utilities
20
+ license: mit
21
+ name: logikal-utils
22
+ scripts: []
23
+ title: logikal-utils
24
+
@@ -0,0 +1,16 @@
1
+ Copyright 2023 Logikal GmbH
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
4
+ associated documentation files (the "Software"), to deal in the Software without restriction,
5
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
6
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
7
+ furnished to do so, subject to the following conditions:
8
+
9
+ The above copyright notice and this permission notice shall be included in all copies or
10
+ substantial portions of the Software.
11
+
12
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
13
+ NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
14
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
15
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
16
+ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,4 @@
1
+ exclude .gitignore
2
+ prune .github
3
+ prune docs
4
+ prune tests
@@ -0,0 +1,48 @@
1
+ Metadata-Version: 2.1
2
+ Name: logikal-utils
3
+ Version: 1.0.0
4
+ Summary: Common Python utilities used at Logikal
5
+ Author-email: Logikal GmbH <contact@logikal.io>
6
+ License: Copyright 2023 Logikal GmbH
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
9
+ associated documentation files (the "Software"), to deal in the Software without restriction,
10
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
11
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in all copies or
15
+ substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
18
+ NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
21
+ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ Project-URL: Documentation, https://docs.logikal.io/logikal-utils/
24
+ Project-URL: Release notes, https://github.com/logikal-io/logikal-utils/releases
25
+ Project-URL: Issue tracker, https://github.com/logikal-io/logikal-utils/issues
26
+ Project-URL: Source code, https://github.com/logikal-io/logikal-utils
27
+ Keywords: python,utilities
28
+ Classifier: Development Status :: 5 - Production/Stable
29
+ Classifier: Intended Audience :: Developers
30
+ Classifier: License :: OSI Approved :: MIT License
31
+ Classifier: Operating System :: POSIX :: Linux
32
+ Classifier: Programming Language :: Python :: 3
33
+ Classifier: Programming Language :: Python :: 3.8
34
+ Classifier: Topic :: Software Development
35
+ Classifier: Typing :: Typed
36
+ Requires-Python: ~=3.8
37
+ Description-Content-Type: text/x-rst
38
+ Provides-Extra: docker
39
+ License-File: LICENSE.txt
40
+
41
+ logikal-utils
42
+ =============
43
+ Common Python utilities used at Logikal.
44
+
45
+ Getting Started
46
+ ---------------
47
+ You can find the project documentation under `docs.logikal.io/logikal-utils/
48
+ <https://docs.logikal.io/logikal-utils/>`_.
@@ -0,0 +1,8 @@
1
+ logikal-utils
2
+ =============
3
+ Common Python utilities used at Logikal.
4
+
5
+ Getting Started
6
+ ---------------
7
+ You can find the project documentation under `docs.logikal.io/logikal-utils/
8
+ <https://docs.logikal.io/logikal-utils/>`_.
@@ -0,0 +1,6 @@
1
+ name: logikal-utils
2
+
3
+ services:
4
+ validator:
5
+ image: ghcr.io/validator/validator:23.4.11
6
+ ports: [{target: 8888}]
File without changes
@@ -0,0 +1,106 @@
1
+ import os
2
+ import subprocess
3
+ from time import sleep, time
4
+ from typing import Optional
5
+
6
+ from docker import DockerClient, from_env as client_from_env
7
+ from docker.models.containers import Container
8
+ from termcolor import colored
9
+
10
+ from logikal_utils.project import PYPROJECT
11
+
12
+
13
+ class Service:
14
+ def __init__( # pylint: disable=too-many-arguments
15
+ self,
16
+ name: str,
17
+ project: Optional[str] = None,
18
+ start_timeout_seconds: float = 30,
19
+ ready_log_text: Optional[str] = None,
20
+ log_poll_seconds: float = 3,
21
+ ):
22
+ """
23
+ Manage a project's Docker Compose services.
24
+
25
+ .. note:: Automatically starts all services during initialization whenever necessary.
26
+ .. note:: Requires the :ref:`docker extra <index:Docker>`.
27
+
28
+ Args:
29
+ name: The name of the service to manage.
30
+ project: The name of the project to use.
31
+ start_timeout_seconds: The time to wait for services to start.
32
+ ready_log_text: The log text that signals that the service is ready.
33
+ log_poll_seconds: The time to wait between log text polls while waiting for the service
34
+ to be ready.
35
+
36
+ """
37
+ self.name = name
38
+ self.project = project or PYPROJECT['project']['name']
39
+ self.start_timeout_seconds = start_timeout_seconds
40
+ self.ready_log_text = ready_log_text
41
+ self.log_poll_seconds = log_poll_seconds
42
+ try:
43
+ client = client_from_env()
44
+ self.container = self._running_container(client=client, start_services=True)
45
+ finally:
46
+ client.close()
47
+
48
+ def __str__(self) -> str:
49
+ return f'Docker Compose project "{self.project}" service "{self.name}"'
50
+
51
+ def start_services(self) -> None:
52
+ """
53
+ Start all Docker Compose services in the given project.
54
+ """
55
+ print(colored('Starting Docker Compose services', 'yellow', attrs=['bold']))
56
+ command = [
57
+ 'docker', 'compose', 'up', '--detach',
58
+ *(['--quiet-pull'] if 'GITHUB_ACTIONS' in os.environ else []),
59
+ '--wait', '--wait-timeout', str(self.start_timeout_seconds),
60
+ ]
61
+ subprocess.run(command, text=True, check=True) # nosec: secure, not using untrusted input
62
+ print()
63
+
64
+ def _running_container(self, client: DockerClient, start_services: bool) -> Container:
65
+ filters = {
66
+ 'status': 'running',
67
+ 'label': [
68
+ f'com.docker.compose.project={self.project}',
69
+ f'com.docker.compose.service={self.name}',
70
+ ],
71
+ }
72
+ if containers := client.containers.list(limit=1, filters=filters):
73
+ container = containers[0]
74
+ container.reload() # refresh container attributes
75
+
76
+ health = container.attrs['State'].get('Health', {})
77
+ health_status = health.get('Status')
78
+ if health_status and health_status != 'healthy':
79
+ logs = [log['Output'].strip() for log in health.get('Log', {}) if 'Output' in log]
80
+ logs_str = ('\n\nLogs:\n' + '\n'.join(logs)) if logs else ''
81
+ raise RuntimeError(f'{self} is not healthy{logs_str}')
82
+
83
+ if self.ready_log_text and not start_services:
84
+ print(f'Waiting for service "{self.name}" to be ready...')
85
+ wait_start_time = time()
86
+ while ( # pylint: disable=while-used
87
+ self.ready_log_text not in container.logs().decode()
88
+ ):
89
+ if time() - wait_start_time >= self.start_timeout_seconds:
90
+ raise RuntimeError(f'{self} is not ready')
91
+ sleep(self.log_poll_seconds)
92
+ print()
93
+
94
+ return container
95
+
96
+ if start_services:
97
+ self.start_services()
98
+ return self._running_container(client=client, start_services=False)
99
+
100
+ raise RuntimeError(f'{self} not found')
101
+
102
+ def container_port(self, service_port: str) -> str:
103
+ """
104
+ Return the container host port that is linked to the given service port.
105
+ """
106
+ return str(self.container.ports[service_port][0]['HostPort'])
@@ -0,0 +1,15 @@
1
+ from pathlib import Path
2
+ from typing import Any
3
+
4
+ import tomli
5
+
6
+ PATH = Path('pyproject.toml')
7
+ #: The ``pyproject.toml`` configuration of the current project.
8
+ PYPROJECT: Any = tomli.loads(PATH.read_text(encoding='utf-8')) if PATH.exists() else {}
9
+
10
+
11
+ def tool_config(name: str) -> Any:
12
+ """
13
+ Return the ``pyproject.toml`` configuration of a given tool.
14
+ """
15
+ return PYPROJECT.get('tool', {}).get(name, {})
File without changes
@@ -0,0 +1,48 @@
1
+ Metadata-Version: 2.1
2
+ Name: logikal-utils
3
+ Version: 1.0.0
4
+ Summary: Common Python utilities used at Logikal
5
+ Author-email: Logikal GmbH <contact@logikal.io>
6
+ License: Copyright 2023 Logikal GmbH
7
+
8
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
9
+ associated documentation files (the "Software"), to deal in the Software without restriction,
10
+ including without limitation the rights to use, copy, modify, merge, publish, distribute,
11
+ sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
12
+ furnished to do so, subject to the following conditions:
13
+
14
+ The above copyright notice and this permission notice shall be included in all copies or
15
+ substantial portions of the Software.
16
+
17
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
18
+ NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
21
+ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+
23
+ Project-URL: Documentation, https://docs.logikal.io/logikal-utils/
24
+ Project-URL: Release notes, https://github.com/logikal-io/logikal-utils/releases
25
+ Project-URL: Issue tracker, https://github.com/logikal-io/logikal-utils/issues
26
+ Project-URL: Source code, https://github.com/logikal-io/logikal-utils
27
+ Keywords: python,utilities
28
+ Classifier: Development Status :: 5 - Production/Stable
29
+ Classifier: Intended Audience :: Developers
30
+ Classifier: License :: OSI Approved :: MIT License
31
+ Classifier: Operating System :: POSIX :: Linux
32
+ Classifier: Programming Language :: Python :: 3
33
+ Classifier: Programming Language :: Python :: 3.8
34
+ Classifier: Topic :: Software Development
35
+ Classifier: Typing :: Typed
36
+ Requires-Python: ~=3.8
37
+ Description-Content-Type: text/x-rst
38
+ Provides-Extra: docker
39
+ License-File: LICENSE.txt
40
+
41
+ logikal-utils
42
+ =============
43
+ Common Python utilities used at Logikal.
44
+
45
+ Getting Started
46
+ ---------------
47
+ You can find the project documentation under `docs.logikal.io/logikal-utils/
48
+ <https://docs.logikal.io/logikal-utils/>`_.
@@ -0,0 +1,23 @@
1
+ .copier-answers.yml
2
+ LICENSE.txt
3
+ MANIFEST.in
4
+ README.rst
5
+ compose.yml
6
+ pyproject.toml
7
+ logikal_utils/__init__.py
8
+ logikal_utils/docker.py
9
+ logikal_utils/project.py
10
+ logikal_utils/py.typed
11
+ logikal_utils.egg-info/PKG-INFO
12
+ logikal_utils.egg-info/SOURCES.txt
13
+ logikal_utils.egg-info/dependency_links.txt
14
+ logikal_utils.egg-info/requires.txt
15
+ logikal_utils.egg-info/top_level.txt
16
+ requirements/build.txt
17
+ requirements/build.txt.lock
18
+ requirements/core.txt
19
+ requirements/dev.txt
20
+ requirements/dev.txt.lock
21
+ requirements/docs.txt
22
+ requirements/docs.txt.lock
23
+ requirements/extras/docker.txt
@@ -0,0 +1,5 @@
1
+ termcolor~=2.3
2
+ tomli~=2.0
3
+
4
+ [docker]
5
+ docker~=6.1
@@ -0,0 +1 @@
1
+ logikal_utils
@@ -0,0 +1,46 @@
1
+ [build-system]
2
+ requires = ['setuptools>=45', 'setuptools-scm[toml]>=6.2']
3
+ build-backend = 'setuptools.build_meta'
4
+
5
+ [project]
6
+ name = 'logikal-utils'
7
+ description = 'Common Python utilities used at Logikal'
8
+ readme = 'README.rst'
9
+ requires-python = '~= 3.8'
10
+ license = {file = 'LICENSE.txt'}
11
+ authors = [{name = 'Logikal GmbH', email = 'contact@logikal.io'}]
12
+ keywords = ['python', 'utilities']
13
+ classifiers = [
14
+ 'Development Status :: 5 - Production/Stable',
15
+ 'Intended Audience :: Developers',
16
+ 'License :: OSI Approved :: MIT License',
17
+ 'Operating System :: POSIX :: Linux',
18
+ 'Programming Language :: Python :: 3',
19
+ 'Programming Language :: Python :: 3.8',
20
+ 'Topic :: Software Development',
21
+ 'Typing :: Typed',
22
+ ]
23
+ dynamic = ['version', 'dependencies', 'optional-dependencies']
24
+
25
+ [project.urls]
26
+ 'Documentation' = 'https://docs.logikal.io/logikal-utils/'
27
+ 'Release notes' = 'https://github.com/logikal-io/logikal-utils/releases'
28
+ 'Issue tracker' = 'https://github.com/logikal-io/logikal-utils/issues'
29
+ 'Source code' = 'https://github.com/logikal-io/logikal-utils'
30
+
31
+ [tool.setuptools.dynamic]
32
+ dependencies = {file = 'requirements/core.txt'}
33
+
34
+ [tool.setuptools.dynamic.optional-dependencies]
35
+ docker = {file = 'requirements/extras/docker.txt'}
36
+
37
+ [tool.setuptools]
38
+ packages = ['logikal_utils']
39
+
40
+ [tool.setuptools_scm]
41
+
42
+ [[tool.mypy.overrides]]
43
+ ignore_missing_imports = true
44
+ module = [
45
+ 'docker.*',
46
+ ]
@@ -0,0 +1,2 @@
1
+ build==0.10.0
2
+ twine==4.0.2
@@ -0,0 +1,45 @@
1
+ ###################################################################################################
2
+ ##
3
+ ## DO NOT EDIT THIS FILE.
4
+ ## This is a locked requirements file generated by pyorbs.
5
+ ##
6
+ ## Requirements hash: 1d6dda865959484538d6a587e0ca2c0953051494ea1d4a1dbb5a1d3a6044352d
7
+ ##
8
+ ###################################################################################################
9
+ bleach==6.0.0
10
+ build==0.10.0
11
+ certifi==2023.5.7
12
+ cffi==1.15.1
13
+ charset-normalizer==3.1.0
14
+ cryptography==41.0.1
15
+ docutils==0.20.1
16
+ idna==3.4
17
+ importlib-metadata==6.7.0
18
+ importlib-resources==5.12.0
19
+ jaraco.classes==3.2.3
20
+ jeepney==0.8.0
21
+ keyring==24.0.0
22
+ markdown-it-py==3.0.0
23
+ mdurl==0.1.2
24
+ more-itertools==9.1.0
25
+ packaging==23.1
26
+ pip==23.1.2
27
+ pkginfo==1.9.6
28
+ pycparser==2.21
29
+ Pygments==2.15.1
30
+ pyproject_hooks==1.0.0
31
+ readme-renderer==40.0
32
+ requests==2.31.0
33
+ requests-toolbelt==1.0.0
34
+ rfc3986==2.0.0
35
+ rich==13.4.2
36
+ SecretStorage==3.3.3
37
+ setuptools==68.0.0
38
+ six==1.16.0
39
+ tomli==2.0.1
40
+ twine==4.0.2
41
+ typing_extensions==4.6.3
42
+ urllib3==2.0.3
43
+ webencodings==0.5.1
44
+ wheel==0.40.0
45
+ zipp==3.15.0
@@ -0,0 +1,2 @@
1
+ termcolor~=2.3
2
+ tomli~=2.0
@@ -0,0 +1,5 @@
1
+ -r core.txt
2
+ -r build.txt
3
+ -r docs.txt
4
+
5
+ pytest-logikal==1.10.3
@@ -0,0 +1,105 @@
1
+ ###################################################################################################
2
+ ##
3
+ ## DO NOT EDIT THIS FILE.
4
+ ## This is a locked requirements file generated by pyorbs.
5
+ ##
6
+ ## Requirements hash: 61dd452dd340aef4cc158330e72e7b6441e309322e0cbe26ce8894e95a406705
7
+ ##
8
+ ###################################################################################################
9
+ -e .
10
+ alabaster==0.7.13
11
+ astroid==2.15.5
12
+ attrs==23.1.0
13
+ Babel==2.12.1
14
+ bandit==1.7.5
15
+ bleach==6.0.0
16
+ build==0.10.0
17
+ certifi==2023.5.7
18
+ cffi==1.15.1
19
+ charset-normalizer==3.1.0
20
+ colorama==0.4.6
21
+ coverage==7.2.7
22
+ cryptography==41.0.1
23
+ dill==0.3.6
24
+ docker==6.1.3
25
+ docutils==0.17.1
26
+ exceptiongroup==1.1.1
27
+ execnet==1.9.0
28
+ filelock==3.12.2
29
+ gitdb==4.0.10
30
+ GitPython==3.1.31
31
+ idna==3.4
32
+ imagesize==1.4.1
33
+ importlib-metadata==6.7.0
34
+ importlib-resources==5.12.0
35
+ iniconfig==2.0.0
36
+ isort==5.12.0
37
+ jaraco.classes==3.2.3
38
+ jeepney==0.8.0
39
+ Jinja2==3.1.2
40
+ keyring==24.0.0
41
+ lazy-object-proxy==1.9.0
42
+ logikal-docs==1.1.3
43
+ markdown-it-py==3.0.0
44
+ MarkupSafe==2.1.3
45
+ mccabe==0.7.0
46
+ mdurl==0.1.2
47
+ more-itertools==9.1.0
48
+ mypy==1.3.0
49
+ mypy-extensions==1.0.0
50
+ packaging==23.1
51
+ pbr==5.11.1
52
+ Pillow==9.5.0
53
+ pip==23.1.2
54
+ pip-licenses==4.3.2
55
+ pkginfo==1.9.6
56
+ platformdirs==3.7.0
57
+ pluggy==1.2.0
58
+ prettytable==3.8.0
59
+ psutil==5.9.5
60
+ pycodestyle==2.10.0
61
+ pycparser==2.21
62
+ pydocstyle==6.3.0
63
+ Pygments==2.15.1
64
+ pylint==2.17.4
65
+ pyorbs==2.0.0
66
+ pyproject_hooks==1.0.0
67
+ pytest==7.3.1
68
+ pytest-cov==4.1.0
69
+ pytest-logikal==1.10.3
70
+ pytest-mock==3.10.0
71
+ pytest-mypy==0.10.3
72
+ pytest-xdist==3.3.1
73
+ pytz==2023.3
74
+ PyYAML==6.0
75
+ readme-renderer==40.0
76
+ requests==2.31.0
77
+ requests-toolbelt==1.0.0
78
+ rfc3986==2.0.0
79
+ rich==13.4.2
80
+ SecretStorage==3.3.3
81
+ setuptools==68.0.0
82
+ six==1.16.0
83
+ smmap==5.0.0
84
+ snowballstemmer==2.2.0
85
+ Sphinx==5.3.0
86
+ sphinx-rtd-theme==1.1.1
87
+ sphinxcontrib-applehelp==1.0.4
88
+ sphinxcontrib-devhelp==1.0.2
89
+ sphinxcontrib-htmlhelp==2.0.1
90
+ sphinxcontrib-jsmath==1.0.1
91
+ sphinxcontrib-qthelp==1.0.3
92
+ sphinxcontrib-serializinghtml==1.1.5
93
+ stevedore==5.1.0
94
+ termcolor==2.3.0
95
+ tomli==2.0.1
96
+ tomlkit==0.11.8
97
+ twine==4.0.2
98
+ typing_extensions==4.6.3
99
+ urllib3==2.0.3
100
+ wcwidth==0.2.6
101
+ webencodings==0.5.1
102
+ websocket-client==1.6.0
103
+ wheel==0.40.0
104
+ wrapt==1.15.0
105
+ zipp==3.15.0
@@ -0,0 +1,5 @@
1
+ -e .
2
+ -r core.txt
3
+ -r extras/docker.txt
4
+
5
+ logikal-docs==1.1.3
@@ -0,0 +1,42 @@
1
+ ###################################################################################################
2
+ ##
3
+ ## DO NOT EDIT THIS FILE.
4
+ ## This is a locked requirements file generated by pyorbs.
5
+ ##
6
+ ## Requirements hash: 77d551a2ebc640afc10cd1e4f41d7c5bc48119e100bfb0bbffc67821d96ad388
7
+ ##
8
+ ###################################################################################################
9
+ -e .
10
+ alabaster==0.7.13
11
+ Babel==2.12.1
12
+ certifi==2023.5.7
13
+ charset-normalizer==3.1.0
14
+ docker==6.1.3
15
+ docutils==0.17.1
16
+ idna==3.4
17
+ imagesize==1.4.1
18
+ importlib-metadata==6.7.0
19
+ Jinja2==3.1.2
20
+ logikal-docs==1.1.3
21
+ MarkupSafe==2.1.3
22
+ packaging==23.1
23
+ pip==23.1.2
24
+ Pygments==2.15.1
25
+ pytz==2023.3
26
+ requests==2.31.0
27
+ setuptools==68.0.0
28
+ snowballstemmer==2.2.0
29
+ Sphinx==5.3.0
30
+ sphinx-rtd-theme==1.1.1
31
+ sphinxcontrib-applehelp==1.0.4
32
+ sphinxcontrib-devhelp==1.0.2
33
+ sphinxcontrib-htmlhelp==2.0.1
34
+ sphinxcontrib-jsmath==1.0.1
35
+ sphinxcontrib-qthelp==1.0.3
36
+ sphinxcontrib-serializinghtml==1.1.5
37
+ termcolor==2.3.0
38
+ tomli==2.0.1
39
+ urllib3==2.0.3
40
+ websocket-client==1.6.0
41
+ wheel==0.40.0
42
+ zipp==3.15.0
@@ -0,0 +1 @@
1
+ docker~=6.1
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+