cli2 3.4.0__tar.gz → 4.0.1__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.
- cli2-4.0.1/PKG-INFO +66 -0
- cli2-4.0.1/README.rst +29 -0
- cli2-4.0.1/cli2/__init__.py +42 -0
- cli2-4.0.1/cli2/ansible/__init__.py +8 -0
- cli2-3.4.0/cli2/ansible.py → cli2-4.0.1/cli2/ansible/action.py +27 -9
- cli2-3.4.0/cli2/pytest_ansible.py → cli2-4.0.1/cli2/ansible/playbook.py +0 -6
- cli2-4.0.1/cli2/ansible/pytest.py +7 -0
- cli2-4.0.1/cli2/cli.py +1169 -0
- cli2-4.0.1/cli2/cli2.py +97 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2/client.py +6 -8
- {cli2-3.4.0 → cli2-4.0.1}/cli2/configuration.py +3 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2/display.py +23 -2
- cli2-4.0.1/cli2/examples/__init__.py +0 -0
- cli2-3.4.0/cli2/example_client.py → cli2-4.0.1/cli2/examples/client.py +2 -0
- cli2-4.0.1/cli2/examples/conf.py +6 -0
- cli2-4.0.1/cli2/examples/example.py +27 -0
- cli2-4.0.1/cli2/examples/example_obj.py +32 -0
- cli2-4.0.1/cli2/examples/obj2.py +34 -0
- cli2-4.0.1/cli2/examples/test.py +38 -0
- cli2-4.0.1/cli2/lock.py +151 -0
- cli2-3.4.0/cli2/logging.py → cli2-4.0.1/cli2/log.py +68 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2/table.py +42 -1
- cli2-4.0.1/cli2.egg-info/PKG-INFO +66 -0
- cli2-4.0.1/cli2.egg-info/SOURCES.txt +52 -0
- cli2-4.0.1/cli2.egg-info/entry_points.txt +9 -0
- {cli2-3.4.0 → cli2-4.0.1}/setup.py +7 -7
- {cli2-3.4.0/cli2 → cli2-4.0.1/tests}/test_ansible.py +29 -0
- cli2-4.0.1/tests/test_cli.py +83 -0
- {cli2-3.4.0/cli2 → cli2-4.0.1/tests}/test_client.py +1 -1
- {cli2-3.4.0/cli2 → cli2-4.0.1/tests}/test_command.py +75 -79
- {cli2-3.4.0/cli2 → cli2-4.0.1/tests}/test_decorators.py +23 -26
- {cli2-3.4.0/cli2 → cli2-4.0.1/tests}/test_entry_point.py +3 -6
- {cli2-3.4.0/cli2 → cli2-4.0.1/tests}/test_group.py +44 -57
- {cli2-3.4.0/cli2 → cli2-4.0.1/tests}/test_inject.py +5 -7
- cli2-4.0.1/tests/test_lock.py +44 -0
- cli2-4.0.1/tests/test_node.py +67 -0
- {cli2-3.4.0/cli2 → cli2-4.0.1/tests}/test_restful.py +13 -10
- cli2-3.4.0/PKG-INFO +0 -98
- cli2-3.4.0/README.rst +0 -61
- cli2-3.4.0/cli2/__init__.py +0 -56
- cli2-3.4.0/cli2/argument.py +0 -388
- cli2-3.4.0/cli2/cli.py +0 -42
- cli2-3.4.0/cli2/command.py +0 -451
- cli2-3.4.0/cli2/entry_point.py +0 -68
- cli2-3.4.0/cli2/example_client_complex.py +0 -40
- cli2-3.4.0/cli2/group.py +0 -240
- cli2-3.4.0/cli2/locker.py +0 -62
- cli2-3.4.0/cli2/overrides.py +0 -8
- cli2-3.4.0/cli2/test_cli.py +0 -48
- cli2-3.4.0/cli2/test_node.py +0 -109
- cli2-3.4.0/cli2.egg-info/PKG-INFO +0 -98
- cli2-3.4.0/cli2.egg-info/SOURCES.txt +0 -48
- cli2-3.4.0/cli2.egg-info/entry_points.txt +0 -9
- {cli2-3.4.0 → cli2-4.0.1}/MANIFEST.in +0 -0
- {cli2-3.4.0 → cli2-4.0.1}/classifiers.txt +0 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2/asyncio.py +0 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2/colors.py +0 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2/decorators.py +0 -0
- /cli2-3.4.0/cli2/example_nesting.py → /cli2-4.0.1/cli2/examples/nesting.py +0 -0
- /cli2-3.4.0/cli2/example_obj.py → /cli2-4.0.1/cli2/examples/obj.py +0 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2/node.py +0 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2/sphinx.py +0 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2/test.py +0 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2.egg-info/dependency_links.txt +0 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2.egg-info/requires.txt +0 -0
- {cli2-3.4.0 → cli2-4.0.1}/cli2.egg-info/top_level.txt +0 -0
- {cli2-3.4.0 → cli2-4.0.1}/setup.cfg +0 -0
- {cli2-3.4.0/cli2 → cli2-4.0.1/tests}/test_configuration.py +0 -0
- {cli2-3.4.0/cli2 → cli2-4.0.1/tests}/test_display.py +0 -0
- {cli2-3.4.0/cli2 → cli2-4.0.1/tests}/test_table.py +0 -0
cli2-4.0.1/PKG-INFO
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: cli2
|
|
3
|
+
Version: 4.0.1
|
|
4
|
+
Summary: image:: https://yourlabs.io/oss/cli2/badges/master/pipeline.svg
|
|
5
|
+
Home-page: https://yourlabs.io/oss/cli2
|
|
6
|
+
Author: James Pic
|
|
7
|
+
Author-email: jamespic@gmail.com
|
|
8
|
+
License: MIT
|
|
9
|
+
Keywords: cli
|
|
10
|
+
Requires-Python: >=3.6
|
|
11
|
+
Description-Content-Type: text/x-rst
|
|
12
|
+
Requires-Dist: docstring_parser
|
|
13
|
+
Requires-Dist: pyyaml
|
|
14
|
+
Requires-Dist: pygments
|
|
15
|
+
Requires-Dist: structlog
|
|
16
|
+
Provides-Extra: client
|
|
17
|
+
Requires-Dist: httpx; extra == "client"
|
|
18
|
+
Requires-Dist: truststore; extra == "client"
|
|
19
|
+
Provides-Extra: test
|
|
20
|
+
Requires-Dist: freezegun; extra == "test"
|
|
21
|
+
Requires-Dist: pytest; extra == "test"
|
|
22
|
+
Requires-Dist: pytest-cov; extra == "test"
|
|
23
|
+
Requires-Dist: pytest-mock; extra == "test"
|
|
24
|
+
Requires-Dist: pytest-asyncio; extra == "test"
|
|
25
|
+
Requires-Dist: pytest-httpx; extra == "test"
|
|
26
|
+
Dynamic: author
|
|
27
|
+
Dynamic: author-email
|
|
28
|
+
Dynamic: description
|
|
29
|
+
Dynamic: description-content-type
|
|
30
|
+
Dynamic: home-page
|
|
31
|
+
Dynamic: keywords
|
|
32
|
+
Dynamic: license
|
|
33
|
+
Dynamic: provides-extra
|
|
34
|
+
Dynamic: requires-dist
|
|
35
|
+
Dynamic: requires-python
|
|
36
|
+
Dynamic: summary
|
|
37
|
+
|
|
38
|
+
.. image:: https://yourlabs.io/oss/cli2/badges/master/pipeline.svg
|
|
39
|
+
:target: https://yourlabs.io/oss/cli2/pipelines
|
|
40
|
+
.. image:: https://codecov.io/gh/yourlabs/cli2/branch/master/graph/badge.svg
|
|
41
|
+
:target: https://codecov.io/gh/yourlabs/cli2
|
|
42
|
+
.. image:: https://img.shields.io/pypi/v/cli2.svg
|
|
43
|
+
:target: https://pypi.python.org/pypi/cli2
|
|
44
|
+
|
|
45
|
+
cli2: Python Automation Framework
|
|
46
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
47
|
+
|
|
48
|
+
A Python command line and Ansible Action plugin framework that loves meta
|
|
49
|
+
programming: do less and get more out of it, perfect for many kinds of DevOps
|
|
50
|
+
gigs to automate everything.
|
|
51
|
+
|
|
52
|
+
Batteries included, all of which are useful on their own:
|
|
53
|
+
|
|
54
|
+
- beautiful CLI alternative to click, but much less verbose, allowing more
|
|
55
|
+
creative design patterns without any boilerplate thanks to introspection
|
|
56
|
+
- which comes with a Sphinx extension to extensively document your CLIs
|
|
57
|
+
- magic 12-factor configuration library
|
|
58
|
+
- extremely beautiful structlog configuration for colorful and readable logging
|
|
59
|
+
- httpx client wrapper that handles all kind of retries, data masking...
|
|
60
|
+
- magic ORM for HTTP resources based on that client
|
|
61
|
+
- Ansible Action plugin library with all the beautiful logging and a rich
|
|
62
|
+
testing library so that you can go straight to the point in pytest
|
|
63
|
+
- a good old fcntl based locking
|
|
64
|
+
- a command line to run any python function over a beautiful CLI
|
|
65
|
+
|
|
66
|
+
`Documentation available on RTFD <https://cli2.rtfd.io>`_.
|
cli2-4.0.1/README.rst
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
.. image:: https://yourlabs.io/oss/cli2/badges/master/pipeline.svg
|
|
2
|
+
:target: https://yourlabs.io/oss/cli2/pipelines
|
|
3
|
+
.. image:: https://codecov.io/gh/yourlabs/cli2/branch/master/graph/badge.svg
|
|
4
|
+
:target: https://codecov.io/gh/yourlabs/cli2
|
|
5
|
+
.. image:: https://img.shields.io/pypi/v/cli2.svg
|
|
6
|
+
:target: https://pypi.python.org/pypi/cli2
|
|
7
|
+
|
|
8
|
+
cli2: Python Automation Framework
|
|
9
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
10
|
+
|
|
11
|
+
A Python command line and Ansible Action plugin framework that loves meta
|
|
12
|
+
programming: do less and get more out of it, perfect for many kinds of DevOps
|
|
13
|
+
gigs to automate everything.
|
|
14
|
+
|
|
15
|
+
Batteries included, all of which are useful on their own:
|
|
16
|
+
|
|
17
|
+
- beautiful CLI alternative to click, but much less verbose, allowing more
|
|
18
|
+
creative design patterns without any boilerplate thanks to introspection
|
|
19
|
+
- which comes with a Sphinx extension to extensively document your CLIs
|
|
20
|
+
- magic 12-factor configuration library
|
|
21
|
+
- extremely beautiful structlog configuration for colorful and readable logging
|
|
22
|
+
- httpx client wrapper that handles all kind of retries, data masking...
|
|
23
|
+
- magic ORM for HTTP resources based on that client
|
|
24
|
+
- Ansible Action plugin library with all the beautiful logging and a rich
|
|
25
|
+
testing library so that you can go straight to the point in pytest
|
|
26
|
+
- a good old fcntl based locking
|
|
27
|
+
- a command line to run any python function over a beautiful CLI
|
|
28
|
+
|
|
29
|
+
`Documentation available on RTFD <https://cli2.rtfd.io>`_.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# flake8: noqa
|
|
2
|
+
from .cli import (
|
|
3
|
+
cmd,
|
|
4
|
+
arg,
|
|
5
|
+
hide,
|
|
6
|
+
retrieve,
|
|
7
|
+
Argument,
|
|
8
|
+
Command,
|
|
9
|
+
Group,
|
|
10
|
+
EntryPoint,
|
|
11
|
+
)
|
|
12
|
+
from .asyncio import async_resolve
|
|
13
|
+
from .colors import colors as c
|
|
14
|
+
|
|
15
|
+
from .configuration import Configuration, cfg
|
|
16
|
+
try:
|
|
17
|
+
from .client import (
|
|
18
|
+
ClientError,
|
|
19
|
+
ResponseError,
|
|
20
|
+
TokenGetError,
|
|
21
|
+
RefusedResponseError,
|
|
22
|
+
RetriesExceededError,
|
|
23
|
+
FieldError,
|
|
24
|
+
FieldValueError,
|
|
25
|
+
FieldExternalizeError,
|
|
26
|
+
Client,
|
|
27
|
+
DateTimeField,
|
|
28
|
+
Field,
|
|
29
|
+
Handler,
|
|
30
|
+
JSONStringField,
|
|
31
|
+
Model,
|
|
32
|
+
Paginator,
|
|
33
|
+
Related,
|
|
34
|
+
)
|
|
35
|
+
except ImportError:
|
|
36
|
+
raise
|
|
37
|
+
# httpx not installed
|
|
38
|
+
pass
|
|
39
|
+
from .display import diff, diff_data, render, print, highlight
|
|
40
|
+
from .lock import Lock
|
|
41
|
+
from .log import configure, log, get_logger
|
|
42
|
+
from .table import Table
|
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Experimental: my base class for Ansible actions.
|
|
3
|
-
|
|
4
|
-
TODO: Turn this into a cool framework.
|
|
5
3
|
"""
|
|
6
4
|
|
|
7
5
|
import asyncio
|
|
8
6
|
import cli2
|
|
9
7
|
import copy
|
|
10
|
-
import mock
|
|
11
8
|
import os
|
|
12
9
|
import re
|
|
13
10
|
import traceback
|
|
14
11
|
|
|
15
|
-
from cli2 import logging
|
|
16
|
-
|
|
17
12
|
from ansible.plugins.action import ActionBase
|
|
18
13
|
|
|
19
14
|
# colors:
|
|
@@ -154,14 +149,12 @@ class ActionBase(ActionBase):
|
|
|
154
149
|
async def run_wrapped_async(self):
|
|
155
150
|
self.verbosity = self.task_vars.get('ansible_verbosity', 0)
|
|
156
151
|
|
|
157
|
-
if 'LOG_LEVEL' in os.environ
|
|
158
|
-
logging.configure()
|
|
159
|
-
else:
|
|
152
|
+
if 'LOG_LEVEL' not in os.environ and 'DEBUG' not in os.environ:
|
|
160
153
|
if self.verbosity == 1:
|
|
161
154
|
os.environ['LOG_LEVEL'] = 'INFO'
|
|
162
155
|
elif self.verbosity >= 2:
|
|
163
156
|
os.environ['LOG_LEVEL'] = 'DEBUG'
|
|
164
|
-
|
|
157
|
+
cli2.configure()
|
|
165
158
|
|
|
166
159
|
try:
|
|
167
160
|
try:
|
|
@@ -174,6 +167,18 @@ class ActionBase(ActionBase):
|
|
|
174
167
|
|
|
175
168
|
if isinstance(exc, AnsibleError):
|
|
176
169
|
self.result['error'] = exc.message
|
|
170
|
+
elif isinstance(exc, cli2.ResponseError):
|
|
171
|
+
self.result.update(dict(
|
|
172
|
+
method=exc.method,
|
|
173
|
+
url=exc.url,
|
|
174
|
+
status_code=exc.status_code,
|
|
175
|
+
))
|
|
176
|
+
key, value = self.client.response_log_data(exc.response)
|
|
177
|
+
if key:
|
|
178
|
+
self.result[f'response_{key}'] = value
|
|
179
|
+
key, value = self.client.request_log_data(exc.request)
|
|
180
|
+
if key:
|
|
181
|
+
self.result[f'request_{key}'] = value
|
|
177
182
|
elif self.verbosity:
|
|
178
183
|
traceback.print_exc()
|
|
179
184
|
|
|
@@ -232,6 +237,7 @@ class ActionBase(ActionBase):
|
|
|
232
237
|
:param client: Client instance, overrides the factory
|
|
233
238
|
:param fail: Allow this test to fail without exception
|
|
234
239
|
"""
|
|
240
|
+
import mock
|
|
235
241
|
obj = cls(*[mock.Mock()] * 6)
|
|
236
242
|
obj.tmp = None
|
|
237
243
|
obj.task_vars = mock.Mock()
|
|
@@ -265,9 +271,21 @@ class ActionBase(ActionBase):
|
|
|
265
271
|
self._after_data = UNSET_DEFAULT
|
|
266
272
|
|
|
267
273
|
def before_set(self, data, label='before'):
|
|
274
|
+
"""
|
|
275
|
+
Set the data we're going to display the diff for at the end.
|
|
276
|
+
|
|
277
|
+
:param data: Dictionnary of data
|
|
278
|
+
:param label: Label to show in diff
|
|
279
|
+
"""
|
|
268
280
|
self._before_data = copy.deepcopy(data)
|
|
269
281
|
self._before_label = label
|
|
270
282
|
|
|
271
283
|
def after_set(self, data, label='after'):
|
|
284
|
+
"""
|
|
285
|
+
Set the data we're going to display the diff for at the end.
|
|
286
|
+
|
|
287
|
+
:param data: Dictionnary of data
|
|
288
|
+
:param label: Label to show in diff
|
|
289
|
+
"""
|
|
272
290
|
self._after_data = copy.deepcopy(data)
|
|
273
291
|
self._after_label = label
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import copy
|
|
2
2
|
import os
|
|
3
|
-
import pytest
|
|
4
3
|
import re
|
|
5
4
|
import shlex
|
|
6
5
|
import shutil
|
|
@@ -214,8 +213,3 @@ class Playbook:
|
|
|
214
213
|
if not exception:
|
|
215
214
|
check_ansible_output_for_exception(result['exception'])
|
|
216
215
|
return result
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
@pytest.fixture
|
|
220
|
-
def playbook(tmp_path, request):
|
|
221
|
-
return Playbook(tmp_path, name=request.node.originalname)
|