|
1 | 1 | import json |
2 | 2 |
|
3 | 3 | import click |
4 | | -import requests |
| 4 | +from httpx import Client |
| 5 | +from scim2_client import SCIMClient |
| 6 | +from scim2_models import EnterpriseUser |
| 7 | +from scim2_models import Group |
| 8 | +from scim2_models import User |
5 | 9 | from sphinx_click.rst_to_ansi_formatter import make_rst_to_ansi_formatter |
6 | 10 |
|
7 | | -DOC_URL = "https://scim2-cli.readthedocs.io/" |
8 | | -BASE_HEADERS = { |
9 | | - "Accept": "application/scim+json", |
10 | | - "Content-Type": "application/scim+json", |
11 | | -} |
| 11 | +from .create import create_cli |
| 12 | +from .delete import delete_cli |
| 13 | +from .query import query_cli |
| 14 | +from .replace import replace_cli |
| 15 | +from .search import search_cli |
| 16 | +from .utils import DOC_URL |
12 | 17 |
|
13 | 18 |
|
14 | 19 | @click.group(cls=make_rst_to_ansi_formatter(DOC_URL, group=True)) |
15 | 20 | @click.argument("url") |
16 | 21 | @click.pass_context |
17 | 22 | def cli(ctx, url): |
18 | 23 | """SCIM application development CLI.""" |
| 24 | + |
19 | 25 | ctx.ensure_object(dict) |
20 | 26 | ctx.obj["URL"] = url |
21 | | - |
22 | | - if not click.get_text_stream("stdin").isatty(): # pragma: no cover |
23 | | - stdin = click.get_text_stream("stdin").read().strip() |
24 | | - ctx.obj["STDIN"] = json.loads(stdin) |
25 | | - |
26 | | - |
27 | | -@cli.command(cls=make_rst_to_ansi_formatter(DOC_URL)) |
28 | | -@click.pass_context |
29 | | -def get(ctx): |
30 | | - """Perform a `SCIM GET <https://www.rfc-editor.org/rfc/rfc7644#section-3.4.1>`_ request. |
31 | | -
|
32 | | - Data passed in JSON format to stdin is sent as request arguments: |
33 | | -
|
34 | | - .. code-block:: bash |
35 | | -
|
36 | | - echo '{"foo": "bar"}' | scim https://scim.example get |
37 | | - """ |
38 | | - |
39 | | - response = requests.get( |
40 | | - ctx.obj["URL"], |
41 | | - params=ctx.obj.get("STDIN"), |
42 | | - headers=BASE_HEADERS, |
43 | | - allow_redirects=True, |
44 | | - ) |
45 | | - click.echo(response.text) |
46 | | - |
47 | | - |
48 | | -@cli.command(cls=make_rst_to_ansi_formatter(DOC_URL)) |
49 | | -@click.pass_context |
50 | | -def post(ctx): |
51 | | - """Perform a `SCIM POST <https://www.rfc-editor.org/rfc/rfc7644#section-3.3>`_ request. |
52 | | -
|
53 | | - Data passed in JSON format to stdin is sent as request payload: |
54 | | -
|
55 | | - .. code-block:: bash |
56 | | -
|
57 | | - echo '{"foo": "bar"}' | scim https://scim.example post |
58 | | - """ |
59 | | - |
60 | | - response = requests.post( |
61 | | - ctx.obj["URL"], |
62 | | - json=ctx.obj.get("STDIN"), |
63 | | - headers=BASE_HEADERS, |
64 | | - allow_redirects=True, |
65 | | - ) |
66 | | - click.echo(response.text) |
67 | | - |
68 | | - |
69 | | -@cli.command(cls=make_rst_to_ansi_formatter(DOC_URL)) |
70 | | -@click.pass_context |
71 | | -def put(ctx): |
72 | | - """Perform a `SCIM PUT <https://www.rfc-editor.org/rfc/rfc7644#section-3.5.1>`_ request. |
73 | | -
|
74 | | - Data passed in JSON format to stdin is sent as request payload: |
75 | | -
|
76 | | - .. code-block:: bash |
77 | | -
|
78 | | - echo '{"foo": "bar"}' | scim https://scim.example put |
79 | | - """ |
80 | | - |
81 | | - response = requests.put( |
82 | | - ctx.obj["URL"], |
83 | | - json=ctx.obj.get("STDIN"), |
84 | | - headers=BASE_HEADERS, |
85 | | - allow_redirects=True, |
| 27 | + client = Client(base_url=ctx.obj["URL"]) |
| 28 | + ctx.obj["client"] = SCIMClient( |
| 29 | + client, resource_types=(User, User[EnterpriseUser], Group) |
86 | 30 | ) |
87 | | - click.echo(response.text) |
88 | | - |
89 | | - |
90 | | -@cli.command(cls=make_rst_to_ansi_formatter(DOC_URL)) |
91 | | -@click.pass_context |
92 | | -def patch(ctx): |
93 | | - """Perform a `SCIM PATCH <https://www.rfc-editor.org/rfc/rfc7644#section-3.5.2>`_ request. |
94 | | -
|
95 | | - Data passed in JSON format to stdin is sent as request payload: |
96 | | -
|
97 | | - .. code-block:: bash |
98 | | -
|
99 | | - echo '{"foo": "bar"}' | scim https://scim.example patch |
100 | | - """ |
| 31 | + ctx.obj["resource_types"] = { |
| 32 | + resource_type.__name__.lower(): resource_type |
| 33 | + for resource_type in ctx.obj["client"].resource_types |
| 34 | + } |
101 | 35 |
|
102 | | - response = requests.patch( |
103 | | - ctx.obj["URL"], |
104 | | - json=ctx.obj.get("STDIN"), |
105 | | - headers=BASE_HEADERS, |
106 | | - allow_redirects=True, |
107 | | - ) |
108 | | - click.echo(response.text) |
109 | | - |
110 | | - |
111 | | -@cli.command(cls=make_rst_to_ansi_formatter(DOC_URL)) |
112 | | -@click.pass_context |
113 | | -def delete(ctx): |
114 | | - """Perform a `SCIM DELETE <https://www.rfc-editor.org/rfc/rfc7644#section-3.6>`_ request. |
115 | | -
|
116 | | - Data passed in JSON format to stdin is sent as request payload: |
117 | | -
|
118 | | - .. code-block:: bash |
119 | | -
|
120 | | - echo '{"foo": "bar"}' | scim https://scim.example delete |
121 | | - """ |
122 | | - |
123 | | - response = requests.delete( |
124 | | - ctx.obj["URL"], |
125 | | - json=ctx.obj.get("STDIN"), |
126 | | - headers=BASE_HEADERS, |
127 | | - allow_redirects=True, |
128 | | - ) |
129 | | - click.echo(response.text) |
| 36 | + if not click.get_text_stream("stdin").isatty(): # pragma: no cover |
| 37 | + if stdin := click.get_text_stream("stdin").read().strip(): |
| 38 | + try: |
| 39 | + ctx.obj["stdin"] = json.loads(stdin) |
| 40 | + except json.JSONDecodeError as exc: |
| 41 | + message = f"Invalid JSON input.\n{exc}" |
| 42 | + raise click.ClickException(message) from exc |
| 43 | + |
| 44 | + |
| 45 | +cli.add_command(create_cli) |
| 46 | +cli.add_command(query_cli) |
| 47 | +cli.add_command(replace_cli) |
| 48 | +cli.add_command(delete_cli) |
| 49 | +cli.add_command(search_cli) |
0 commit comments