printeasy-sdk 0.1.0__py3-none-any.whl
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.
- printeasy/__init__.py +16 -0
- printeasy/_client.py +221 -0
- printeasy/_generated/__init__.py +8 -0
- printeasy/_generated/api/__init__.py +1 -0
- printeasy/_generated/api/account/__init__.py +1 -0
- printeasy/_generated/api/account/get_whoami.py +156 -0
- printeasy/_generated/api/computers/__init__.py +1 -0
- printeasy/_generated/api/computers/delete_computer.py +192 -0
- printeasy/_generated/api/computers/get_computer.py +190 -0
- printeasy/_generated/api/computers/list_computers.py +236 -0
- printeasy/_generated/api/computers/update_computer.py +216 -0
- printeasy/_generated/api/events/__init__.py +1 -0
- printeasy/_generated/api/events/list_events.py +277 -0
- printeasy/_generated/api/print_jobs/__init__.py +1 -0
- printeasy/_generated/api/print_jobs/cancel_print_job.py +199 -0
- printeasy/_generated/api/print_jobs/create_print_job.py +267 -0
- printeasy/_generated/api/print_jobs/get_print_job.py +190 -0
- printeasy/_generated/api/print_jobs/list_print_job_events.py +194 -0
- printeasy/_generated/api/print_jobs/list_print_jobs.py +329 -0
- printeasy/_generated/api/print_jobs/list_printer_print_jobs.py +259 -0
- printeasy/_generated/api/printers/__init__.py +1 -0
- printeasy/_generated/api/printers/get_printer.py +190 -0
- printeasy/_generated/api/printers/list_computer_printers.py +259 -0
- printeasy/_generated/api/printers/list_printers.py +236 -0
- printeasy/_generated/api/printers/update_printer.py +220 -0
- printeasy/_generated/api/usage/__init__.py +1 -0
- printeasy/_generated/api/usage/get_usage.py +156 -0
- printeasy/_generated/api/webhooks/__init__.py +1 -0
- printeasy/_generated/api/webhooks/create_webhook.py +202 -0
- printeasy/_generated/api/webhooks/delete_webhook.py +188 -0
- printeasy/_generated/api/webhooks/get_webhook.py +190 -0
- printeasy/_generated/api/webhooks/list_webhook_deliveries.py +279 -0
- printeasy/_generated/api/webhooks/list_webhooks.py +236 -0
- printeasy/_generated/api/webhooks/replay_webhook_delivery.py +199 -0
- printeasy/_generated/api/webhooks/update_webhook.py +220 -0
- printeasy/_generated/client.py +282 -0
- printeasy/_generated/errors.py +16 -0
- printeasy/_generated/models/__init__.py +199 -0
- printeasy/_generated/models/computer.py +156 -0
- printeasy/_generated/models/computer_mode.py +9 -0
- printeasy/_generated/models/computer_state.py +10 -0
- printeasy/_generated/models/error.py +69 -0
- printeasy/_generated/models/error_error.py +78 -0
- printeasy/_generated/models/event.py +127 -0
- printeasy/_generated/models/event_data.py +48 -0
- printeasy/_generated/models/event_mode.py +9 -0
- printeasy/_generated/models/event_type.py +22 -0
- printeasy/_generated/models/list_computer_printers_dir.py +9 -0
- printeasy/_generated/models/list_computer_printers_response_200.py +98 -0
- printeasy/_generated/models/list_computers_dir.py +9 -0
- printeasy/_generated/models/list_computers_response_200.py +98 -0
- printeasy/_generated/models/list_events_dir.py +9 -0
- printeasy/_generated/models/list_events_response_200.py +98 -0
- printeasy/_generated/models/list_print_job_events_response_200.py +76 -0
- printeasy/_generated/models/list_print_jobs_dir.py +9 -0
- printeasy/_generated/models/list_print_jobs_response_200.py +98 -0
- printeasy/_generated/models/list_print_jobs_state.py +15 -0
- printeasy/_generated/models/list_printer_print_jobs_dir.py +9 -0
- printeasy/_generated/models/list_printer_print_jobs_response_200.py +98 -0
- printeasy/_generated/models/list_printers_dir.py +9 -0
- printeasy/_generated/models/list_printers_response_200.py +98 -0
- printeasy/_generated/models/list_webhook_deliveries_dir.py +9 -0
- printeasy/_generated/models/list_webhook_deliveries_response_200.py +98 -0
- printeasy/_generated/models/list_webhook_deliveries_status.py +11 -0
- printeasy/_generated/models/list_webhooks_dir.py +9 -0
- printeasy/_generated/models/list_webhooks_response_200.py +98 -0
- printeasy/_generated/models/print_job.py +275 -0
- printeasy/_generated/models/print_job_content_type.py +11 -0
- printeasy/_generated/models/print_job_create.py +194 -0
- printeasy/_generated/models/print_job_create_authentication.py +86 -0
- printeasy/_generated/models/print_job_create_authentication_credentials.py +70 -0
- printeasy/_generated/models/print_job_create_authentication_type.py +8 -0
- printeasy/_generated/models/print_job_create_content_type.py +11 -0
- printeasy/_generated/models/print_job_create_options.py +220 -0
- printeasy/_generated/models/print_job_create_options_duplex.py +10 -0
- printeasy/_generated/models/print_job_create_options_rotate_type_0.py +8 -0
- printeasy/_generated/models/print_job_create_options_rotate_type_1.py +8 -0
- printeasy/_generated/models/print_job_create_options_rotate_type_2.py +8 -0
- printeasy/_generated/models/print_job_create_options_rotate_type_3.py +8 -0
- printeasy/_generated/models/print_job_event.py +107 -0
- printeasy/_generated/models/print_job_event_actor.py +11 -0
- printeasy/_generated/models/print_job_event_state.py +15 -0
- printeasy/_generated/models/print_job_mode.py +9 -0
- printeasy/_generated/models/print_job_options.py +212 -0
- printeasy/_generated/models/print_job_options_duplex.py +10 -0
- printeasy/_generated/models/print_job_options_rotate_type_0.py +8 -0
- printeasy/_generated/models/print_job_options_rotate_type_1.py +8 -0
- printeasy/_generated/models/print_job_options_rotate_type_2.py +8 -0
- printeasy/_generated/models/print_job_options_rotate_type_3.py +8 -0
- printeasy/_generated/models/print_job_state.py +15 -0
- printeasy/_generated/models/printer.py +226 -0
- printeasy/_generated/models/printer_capabilities.py +247 -0
- printeasy/_generated/models/printer_capabilities_papers.py +74 -0
- printeasy/_generated/models/printer_capabilities_printrate_type_0.py +70 -0
- printeasy/_generated/models/printer_custom_papers_item.py +78 -0
- printeasy/_generated/models/printer_default_options.py +220 -0
- printeasy/_generated/models/printer_default_options_duplex.py +10 -0
- printeasy/_generated/models/printer_default_options_rotate_type_0.py +8 -0
- printeasy/_generated/models/printer_default_options_rotate_type_1.py +8 -0
- printeasy/_generated/models/printer_default_options_rotate_type_2.py +8 -0
- printeasy/_generated/models/printer_default_options_rotate_type_3.py +8 -0
- printeasy/_generated/models/printer_state.py +10 -0
- printeasy/_generated/models/update_computer_body.py +74 -0
- printeasy/_generated/models/update_printer_body.py +162 -0
- printeasy/_generated/models/update_printer_body_custom_papers_item.py +78 -0
- printeasy/_generated/models/update_printer_body_default_options.py +222 -0
- printeasy/_generated/models/update_printer_body_default_options_duplex.py +10 -0
- printeasy/_generated/models/update_printer_body_default_options_rotate_type_0.py +8 -0
- printeasy/_generated/models/update_printer_body_default_options_rotate_type_1.py +8 -0
- printeasy/_generated/models/update_printer_body_default_options_rotate_type_2.py +8 -0
- printeasy/_generated/models/update_printer_body_default_options_rotate_type_3.py +8 -0
- printeasy/_generated/models/usage.py +98 -0
- printeasy/_generated/models/usage_history_item.py +88 -0
- printeasy/_generated/models/usage_period.py +88 -0
- printeasy/_generated/models/webhook_delivery.py +210 -0
- printeasy/_generated/models/webhook_delivery_event_type.py +22 -0
- printeasy/_generated/models/webhook_delivery_payload.py +48 -0
- printeasy/_generated/models/webhook_delivery_status.py +11 -0
- printeasy/_generated/models/webhook_endpoint.py +169 -0
- printeasy/_generated/models/webhook_endpoint_create.py +90 -0
- printeasy/_generated/models/webhook_endpoint_create_events_item.py +22 -0
- printeasy/_generated/models/webhook_endpoint_events_item.py +22 -0
- printeasy/_generated/models/webhook_endpoint_mode.py +9 -0
- printeasy/_generated/models/webhook_endpoint_update.py +117 -0
- printeasy/_generated/models/webhook_endpoint_update_events_item.py +22 -0
- printeasy/_generated/models/webhook_endpoint_with_secret.py +178 -0
- printeasy/_generated/models/whoami.py +98 -0
- printeasy/_generated/models/whoami_mode.py +9 -0
- printeasy/_generated/models/whoami_organization.py +70 -0
- printeasy/_generated/types.py +54 -0
- printeasy/_http.py +103 -0
- printeasy/_raw.py +15 -0
- printeasy/py.typed +0 -0
- printeasy/webhooks.py +82 -0
- printeasy_sdk-0.1.0.dist-info/METADATA +92 -0
- printeasy_sdk-0.1.0.dist-info/RECORD +138 -0
- printeasy_sdk-0.1.0.dist-info/WHEEL +4 -0
- printeasy_sdk-0.1.0.dist-info/licenses/LICENSE +21 -0
printeasy/__init__.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""PrintEasy Python SDK."""
|
|
2
|
+
|
|
3
|
+
from . import webhooks
|
|
4
|
+
from ._client import PrintEasy
|
|
5
|
+
from ._http import PrintEasyError, PrintEasyTimeoutError
|
|
6
|
+
from .webhooks import WebhookVerificationError
|
|
7
|
+
|
|
8
|
+
__version__ = "0.1.0"
|
|
9
|
+
__all__ = [
|
|
10
|
+
"PrintEasy",
|
|
11
|
+
"PrintEasyError",
|
|
12
|
+
"PrintEasyTimeoutError",
|
|
13
|
+
"WebhookVerificationError",
|
|
14
|
+
"__version__",
|
|
15
|
+
"webhooks",
|
|
16
|
+
]
|
printeasy/_client.py
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
"""The PrintEasy client: retries, idempotency keys, pagination and create_and_wait."""
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
import time
|
|
5
|
+
import uuid
|
|
6
|
+
from collections.abc import Iterator
|
|
7
|
+
from typing import TYPE_CHECKING, Any
|
|
8
|
+
from urllib.parse import quote
|
|
9
|
+
|
|
10
|
+
import httpx
|
|
11
|
+
from httpx._utils import get_environment_proxies
|
|
12
|
+
|
|
13
|
+
from . import webhooks as _webhooks
|
|
14
|
+
from ._http import PrintEasyError, PrintEasyTimeoutError, RetryTransport
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from typing_extensions import Self
|
|
18
|
+
|
|
19
|
+
from ._raw import MaskedAuthenticatedClient
|
|
20
|
+
|
|
21
|
+
DEFAULT_BASE_URL = "https://api.printeasy.adfinite.com"
|
|
22
|
+
TERMINAL = {"done", "error", "cancelled", "expired"}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _q(id: str) -> str:
|
|
26
|
+
"""Quote an id for use as one path segment."""
|
|
27
|
+
return quote(str(id), safe="")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class _ListResource:
|
|
31
|
+
def __init__(self, client: "PrintEasy", path: str):
|
|
32
|
+
self._c, self._path = client, path
|
|
33
|
+
|
|
34
|
+
def list(self, **params: Any) -> dict:
|
|
35
|
+
"""One page: `{"data": [...], "hasMore": bool, "nextCursor": str | None}`."""
|
|
36
|
+
return self._c._request("GET", self._path, params=params)
|
|
37
|
+
|
|
38
|
+
def iterate(self, **params: Any) -> Iterator[dict]:
|
|
39
|
+
"""Every item across pages, following nextCursor."""
|
|
40
|
+
after = params.pop("after", None)
|
|
41
|
+
while True:
|
|
42
|
+
page = self.list(**params, after=after)
|
|
43
|
+
yield from page["data"]
|
|
44
|
+
if not page["hasMore"] or not page["nextCursor"]:
|
|
45
|
+
return
|
|
46
|
+
after = page["nextCursor"]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class _Resource(_ListResource):
|
|
50
|
+
def get(self, id: str) -> dict:
|
|
51
|
+
return self._c._request("GET", f"{self._path}/{_q(id)}")
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class _PrintJobs(_Resource):
|
|
55
|
+
def create(self, body: dict, *, idempotency_key: str | None = None) -> dict:
|
|
56
|
+
"""Create a print job. A random Idempotency-Key is sent when none is given,
|
|
57
|
+
so retries after a network error or 5xx never print twice."""
|
|
58
|
+
key = idempotency_key or str(uuid.uuid4())
|
|
59
|
+
return self._c._request(
|
|
60
|
+
"POST", self._path, json=body, headers={"Idempotency-Key": key}
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
def cancel(self, id: str) -> dict:
|
|
64
|
+
return self._c._request("POST", f"{self._path}/{_q(id)}/cancel")
|
|
65
|
+
|
|
66
|
+
def create_and_wait(
|
|
67
|
+
self,
|
|
68
|
+
body: dict,
|
|
69
|
+
*,
|
|
70
|
+
timeout_s: float = 60.0,
|
|
71
|
+
poll_interval_s: float = 1.0,
|
|
72
|
+
idempotency_key: str | None = None,
|
|
73
|
+
) -> dict:
|
|
74
|
+
"""Create a job and poll it until it is done, error, cancelled or expired.
|
|
75
|
+
|
|
76
|
+
Raises PrintEasyTimeoutError (with the last seen job) after timeout_s.
|
|
77
|
+
"""
|
|
78
|
+
job = self.create(body, idempotency_key=idempotency_key)
|
|
79
|
+
deadline = self._c._clock() + timeout_s
|
|
80
|
+
while job["state"] not in TERMINAL:
|
|
81
|
+
left = deadline - self._c._clock()
|
|
82
|
+
if left <= 0:
|
|
83
|
+
raise PrintEasyTimeoutError(job)
|
|
84
|
+
self._c._sleep(min(poll_interval_s, left))
|
|
85
|
+
job = self.get(job["id"])
|
|
86
|
+
return job
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class _Webhooks(_Resource):
|
|
90
|
+
verify = staticmethod(_webhooks.verify)
|
|
91
|
+
|
|
92
|
+
def create(self, body: dict) -> dict:
|
|
93
|
+
"""Create an endpoint; the response holds the signing secret, shown only once."""
|
|
94
|
+
return self._c._request("POST", self._path, json=body)
|
|
95
|
+
|
|
96
|
+
def update(self, id: str, body: dict) -> dict:
|
|
97
|
+
return self._c._request("PATCH", f"{self._path}/{_q(id)}", json=body)
|
|
98
|
+
|
|
99
|
+
def delete(self, id: str) -> None:
|
|
100
|
+
self._c._request("DELETE", f"{self._path}/{_q(id)}")
|
|
101
|
+
|
|
102
|
+
def deliveries(self, id: str) -> _ListResource:
|
|
103
|
+
"""Deliveries of one endpoint, with list and iterate."""
|
|
104
|
+
return _ListResource(self._c, f"{self._path}/{_q(id)}/deliveries")
|
|
105
|
+
|
|
106
|
+
def replay(self, delivery_id: str) -> dict:
|
|
107
|
+
return self._c._request(
|
|
108
|
+
"POST", f"{self._path}/deliveries/{_q(delivery_id)}/replay"
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _transports(
|
|
113
|
+
transport: httpx.BaseTransport | None, max_retries: int, sleep
|
|
114
|
+
) -> tuple[RetryTransport, dict[str, RetryTransport | None] | None]:
|
|
115
|
+
"""The retrying default transport, plus proxy mounts from the environment.
|
|
116
|
+
|
|
117
|
+
With no transport given this follows httpx's own HTTP_PROXY, HTTPS_PROXY,
|
|
118
|
+
ALL_PROXY and NO_PROXY handling (a None mount means direct, through the
|
|
119
|
+
default transport), with every proxy transport wrapped in RetryTransport.
|
|
120
|
+
"""
|
|
121
|
+
if transport is not None:
|
|
122
|
+
return RetryTransport(transport, max_retries, sleep), None
|
|
123
|
+
mounts: dict[str, RetryTransport | None] = {
|
|
124
|
+
pattern: None
|
|
125
|
+
if proxy is None
|
|
126
|
+
else RetryTransport(httpx.HTTPTransport(proxy=proxy), max_retries, sleep)
|
|
127
|
+
for pattern, proxy in get_environment_proxies().items()
|
|
128
|
+
}
|
|
129
|
+
return RetryTransport(httpx.HTTPTransport(), max_retries, sleep), mounts
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
class PrintEasy:
|
|
133
|
+
"""Client for the PrintEasy API.
|
|
134
|
+
|
|
135
|
+
The API key defaults to the PRINTEASY_API_KEY environment variable. 429 responses
|
|
136
|
+
are retried, and 5xx or network errors too for replay safe requests (GET, PATCH,
|
|
137
|
+
DELETE and print job creation, which always sends an Idempotency-Key).
|
|
138
|
+
"""
|
|
139
|
+
|
|
140
|
+
def __init__(
|
|
141
|
+
self,
|
|
142
|
+
api_key: str | None = None,
|
|
143
|
+
*,
|
|
144
|
+
base_url: str = DEFAULT_BASE_URL,
|
|
145
|
+
max_retries: int = 3,
|
|
146
|
+
timeout: float = 30.0,
|
|
147
|
+
transport: httpx.BaseTransport | None = None,
|
|
148
|
+
sleep=time.sleep,
|
|
149
|
+
clock=time.monotonic,
|
|
150
|
+
):
|
|
151
|
+
key = api_key or os.environ.get("PRINTEASY_API_KEY")
|
|
152
|
+
if not key:
|
|
153
|
+
raise ValueError("pass api_key or set PRINTEASY_API_KEY")
|
|
154
|
+
self._key, self._base_url, self._sleep, self._clock = (
|
|
155
|
+
key,
|
|
156
|
+
base_url,
|
|
157
|
+
sleep,
|
|
158
|
+
clock,
|
|
159
|
+
)
|
|
160
|
+
self._raw: MaskedAuthenticatedClient | None = None
|
|
161
|
+
default, mounts = _transports(transport, max_retries, sleep)
|
|
162
|
+
self._http = httpx.Client(
|
|
163
|
+
base_url=base_url,
|
|
164
|
+
timeout=timeout,
|
|
165
|
+
transport=default,
|
|
166
|
+
mounts=mounts,
|
|
167
|
+
headers={
|
|
168
|
+
"Authorization": f"Bearer {key}",
|
|
169
|
+
"Accept": "application/json",
|
|
170
|
+
"User-Agent": "printeasy-python",
|
|
171
|
+
},
|
|
172
|
+
)
|
|
173
|
+
self.computers = _Resource(self, "/v1/computers")
|
|
174
|
+
self.printers = _Resource(self, "/v1/printers")
|
|
175
|
+
self.events = _ListResource(self, "/v1/events")
|
|
176
|
+
self.print_jobs = _PrintJobs(self, "/v1/printjobs")
|
|
177
|
+
self.webhooks = _Webhooks(self, "/v1/webhooks")
|
|
178
|
+
|
|
179
|
+
def whoami(self) -> dict:
|
|
180
|
+
return self._request("GET", "/v1/whoami")
|
|
181
|
+
|
|
182
|
+
def usage(self) -> dict:
|
|
183
|
+
return self._request("GET", "/v1/usage")
|
|
184
|
+
|
|
185
|
+
@property
|
|
186
|
+
def raw(self) -> "MaskedAuthenticatedClient":
|
|
187
|
+
"""The generated client (printeasy._generated) on the same retrying httpx client.
|
|
188
|
+
|
|
189
|
+
Its repr masks the API key.
|
|
190
|
+
"""
|
|
191
|
+
if self._raw is None:
|
|
192
|
+
from ._raw import MaskedAuthenticatedClient
|
|
193
|
+
|
|
194
|
+
self._raw = MaskedAuthenticatedClient(
|
|
195
|
+
base_url=self._base_url, token=self._key
|
|
196
|
+
).set_httpx_client(self._http)
|
|
197
|
+
return self._raw
|
|
198
|
+
|
|
199
|
+
def close(self) -> None:
|
|
200
|
+
self._http.close()
|
|
201
|
+
|
|
202
|
+
def __enter__(self) -> "Self":
|
|
203
|
+
return self
|
|
204
|
+
|
|
205
|
+
def __exit__(self, *exc: object) -> None:
|
|
206
|
+
self.close()
|
|
207
|
+
|
|
208
|
+
def _request(
|
|
209
|
+
self,
|
|
210
|
+
method: str,
|
|
211
|
+
path: str,
|
|
212
|
+
*,
|
|
213
|
+
params: dict | None = None,
|
|
214
|
+
json: Any = None,
|
|
215
|
+
headers: dict | None = None,
|
|
216
|
+
) -> Any:
|
|
217
|
+
query = {k: v for k, v in (params or {}).items() if v is not None}
|
|
218
|
+
r = self._http.request(method, path, params=query, json=json, headers=headers)
|
|
219
|
+
if r.status_code >= 400:
|
|
220
|
+
raise PrintEasyError.from_response(r)
|
|
221
|
+
return None if r.status_code == 204 else r.json()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Contains methods for accessing the API"""
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Contains endpoint functions for accessing the API"""
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
from http import HTTPStatus
|
|
2
|
+
from typing import Any
|
|
3
|
+
|
|
4
|
+
import httpx
|
|
5
|
+
|
|
6
|
+
from ... import errors
|
|
7
|
+
from ...client import AuthenticatedClient, Client
|
|
8
|
+
from ...models.error import Error
|
|
9
|
+
from ...models.whoami import Whoami
|
|
10
|
+
from ...types import Response
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _get_kwargs() -> dict[str, Any]:
|
|
14
|
+
|
|
15
|
+
_kwargs: dict[str, Any] = {
|
|
16
|
+
"method": "get",
|
|
17
|
+
"url": "/v1/whoami",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
return _kwargs
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _parse_response(
|
|
24
|
+
*, client: AuthenticatedClient | Client, response: httpx.Response
|
|
25
|
+
) -> Error | Whoami | None:
|
|
26
|
+
if response.status_code == 200:
|
|
27
|
+
response_200 = Whoami.from_dict(response.json())
|
|
28
|
+
|
|
29
|
+
return response_200
|
|
30
|
+
|
|
31
|
+
if response.status_code == 401:
|
|
32
|
+
response_401 = Error.from_dict(response.json())
|
|
33
|
+
|
|
34
|
+
return response_401
|
|
35
|
+
|
|
36
|
+
if response.status_code == 403:
|
|
37
|
+
response_403 = Error.from_dict(response.json())
|
|
38
|
+
|
|
39
|
+
return response_403
|
|
40
|
+
|
|
41
|
+
if response.status_code == 429:
|
|
42
|
+
response_429 = Error.from_dict(response.json())
|
|
43
|
+
|
|
44
|
+
return response_429
|
|
45
|
+
|
|
46
|
+
if client.raise_on_unexpected_status:
|
|
47
|
+
raise errors.UnexpectedStatus(response.status_code, response.content)
|
|
48
|
+
else:
|
|
49
|
+
return None
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _build_response(
|
|
53
|
+
*, client: AuthenticatedClient | Client, response: httpx.Response
|
|
54
|
+
) -> Response[Error | Whoami]:
|
|
55
|
+
return Response(
|
|
56
|
+
status_code=HTTPStatus(response.status_code),
|
|
57
|
+
content=response.content,
|
|
58
|
+
headers=response.headers,
|
|
59
|
+
parsed=_parse_response(client=client, response=response),
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def sync_detailed(
|
|
64
|
+
*,
|
|
65
|
+
client: AuthenticatedClient,
|
|
66
|
+
) -> Response[Error | Whoami]:
|
|
67
|
+
"""Identify the organization behind an API key
|
|
68
|
+
|
|
69
|
+
Returns the organization, mode, key id and plan of the API key that signs the request. Use it to
|
|
70
|
+
check that a key works.
|
|
71
|
+
|
|
72
|
+
Raises:
|
|
73
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
74
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
Response[Error | Whoami]
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
kwargs = _get_kwargs()
|
|
81
|
+
|
|
82
|
+
response = client.get_httpx_client().request(
|
|
83
|
+
**kwargs,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
return _build_response(client=client, response=response)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def sync(
|
|
90
|
+
*,
|
|
91
|
+
client: AuthenticatedClient,
|
|
92
|
+
) -> Error | Whoami | None:
|
|
93
|
+
"""Identify the organization behind an API key
|
|
94
|
+
|
|
95
|
+
Returns the organization, mode, key id and plan of the API key that signs the request. Use it to
|
|
96
|
+
check that a key works.
|
|
97
|
+
|
|
98
|
+
Raises:
|
|
99
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
100
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
Error | Whoami
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
return sync_detailed(
|
|
107
|
+
client=client,
|
|
108
|
+
).parsed
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
async def asyncio_detailed(
|
|
112
|
+
*,
|
|
113
|
+
client: AuthenticatedClient,
|
|
114
|
+
) -> Response[Error | Whoami]:
|
|
115
|
+
"""Identify the organization behind an API key
|
|
116
|
+
|
|
117
|
+
Returns the organization, mode, key id and plan of the API key that signs the request. Use it to
|
|
118
|
+
check that a key works.
|
|
119
|
+
|
|
120
|
+
Raises:
|
|
121
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
122
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
Response[Error | Whoami]
|
|
126
|
+
"""
|
|
127
|
+
|
|
128
|
+
kwargs = _get_kwargs()
|
|
129
|
+
|
|
130
|
+
response = await client.get_async_httpx_client().request(**kwargs)
|
|
131
|
+
|
|
132
|
+
return _build_response(client=client, response=response)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
async def asyncio(
|
|
136
|
+
*,
|
|
137
|
+
client: AuthenticatedClient,
|
|
138
|
+
) -> Error | Whoami | None:
|
|
139
|
+
"""Identify the organization behind an API key
|
|
140
|
+
|
|
141
|
+
Returns the organization, mode, key id and plan of the API key that signs the request. Use it to
|
|
142
|
+
check that a key works.
|
|
143
|
+
|
|
144
|
+
Raises:
|
|
145
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
146
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
147
|
+
|
|
148
|
+
Returns:
|
|
149
|
+
Error | Whoami
|
|
150
|
+
"""
|
|
151
|
+
|
|
152
|
+
return (
|
|
153
|
+
await asyncio_detailed(
|
|
154
|
+
client=client,
|
|
155
|
+
)
|
|
156
|
+
).parsed
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""Contains endpoint functions for accessing the API"""
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
from http import HTTPStatus
|
|
2
|
+
from typing import Any, cast
|
|
3
|
+
from urllib.parse import quote
|
|
4
|
+
from uuid import UUID
|
|
5
|
+
|
|
6
|
+
import httpx
|
|
7
|
+
|
|
8
|
+
from ... import errors
|
|
9
|
+
from ...client import AuthenticatedClient, Client
|
|
10
|
+
from ...models.error import Error
|
|
11
|
+
from ...types import Response
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _get_kwargs(
|
|
15
|
+
id: UUID,
|
|
16
|
+
) -> dict[str, Any]:
|
|
17
|
+
|
|
18
|
+
_kwargs: dict[str, Any] = {
|
|
19
|
+
"method": "delete",
|
|
20
|
+
"url": "/v1/computers/{id}".format(
|
|
21
|
+
id=quote(str(id), safe=""),
|
|
22
|
+
),
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return _kwargs
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _parse_response(
|
|
29
|
+
*, client: AuthenticatedClient | Client, response: httpx.Response
|
|
30
|
+
) -> Any | Error | None:
|
|
31
|
+
if response.status_code == 204:
|
|
32
|
+
response_204 = cast(Any, None)
|
|
33
|
+
return response_204
|
|
34
|
+
|
|
35
|
+
if response.status_code == 400:
|
|
36
|
+
response_400 = Error.from_dict(response.json())
|
|
37
|
+
|
|
38
|
+
return response_400
|
|
39
|
+
|
|
40
|
+
if response.status_code == 401:
|
|
41
|
+
response_401 = Error.from_dict(response.json())
|
|
42
|
+
|
|
43
|
+
return response_401
|
|
44
|
+
|
|
45
|
+
if response.status_code == 403:
|
|
46
|
+
response_403 = Error.from_dict(response.json())
|
|
47
|
+
|
|
48
|
+
return response_403
|
|
49
|
+
|
|
50
|
+
if response.status_code == 404:
|
|
51
|
+
response_404 = Error.from_dict(response.json())
|
|
52
|
+
|
|
53
|
+
return response_404
|
|
54
|
+
|
|
55
|
+
if response.status_code == 429:
|
|
56
|
+
response_429 = Error.from_dict(response.json())
|
|
57
|
+
|
|
58
|
+
return response_429
|
|
59
|
+
|
|
60
|
+
if client.raise_on_unexpected_status:
|
|
61
|
+
raise errors.UnexpectedStatus(response.status_code, response.content)
|
|
62
|
+
else:
|
|
63
|
+
return None
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _build_response(
|
|
67
|
+
*, client: AuthenticatedClient | Client, response: httpx.Response
|
|
68
|
+
) -> Response[Any | Error]:
|
|
69
|
+
return Response(
|
|
70
|
+
status_code=HTTPStatus(response.status_code),
|
|
71
|
+
content=response.content,
|
|
72
|
+
headers=response.headers,
|
|
73
|
+
parsed=_parse_response(client=client, response=response),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def sync_detailed(
|
|
78
|
+
id: UUID,
|
|
79
|
+
*,
|
|
80
|
+
client: AuthenticatedClient,
|
|
81
|
+
) -> Response[Any | Error]:
|
|
82
|
+
"""Delete a computer
|
|
83
|
+
|
|
84
|
+
Soft-deletes the computer and its printers, revokes its agent tokens and disconnects the agent. The
|
|
85
|
+
virtual test computer cannot be deleted.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
id (UUID):
|
|
89
|
+
|
|
90
|
+
Raises:
|
|
91
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
92
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
Response[Any | Error]
|
|
96
|
+
"""
|
|
97
|
+
|
|
98
|
+
kwargs = _get_kwargs(
|
|
99
|
+
id=id,
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
response = client.get_httpx_client().request(
|
|
103
|
+
**kwargs,
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
return _build_response(client=client, response=response)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def sync(
|
|
110
|
+
id: UUID,
|
|
111
|
+
*,
|
|
112
|
+
client: AuthenticatedClient,
|
|
113
|
+
) -> Any | Error | None:
|
|
114
|
+
"""Delete a computer
|
|
115
|
+
|
|
116
|
+
Soft-deletes the computer and its printers, revokes its agent tokens and disconnects the agent. The
|
|
117
|
+
virtual test computer cannot be deleted.
|
|
118
|
+
|
|
119
|
+
Args:
|
|
120
|
+
id (UUID):
|
|
121
|
+
|
|
122
|
+
Raises:
|
|
123
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
124
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
Any | Error
|
|
128
|
+
"""
|
|
129
|
+
|
|
130
|
+
return sync_detailed(
|
|
131
|
+
id=id,
|
|
132
|
+
client=client,
|
|
133
|
+
).parsed
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
async def asyncio_detailed(
|
|
137
|
+
id: UUID,
|
|
138
|
+
*,
|
|
139
|
+
client: AuthenticatedClient,
|
|
140
|
+
) -> Response[Any | Error]:
|
|
141
|
+
"""Delete a computer
|
|
142
|
+
|
|
143
|
+
Soft-deletes the computer and its printers, revokes its agent tokens and disconnects the agent. The
|
|
144
|
+
virtual test computer cannot be deleted.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
id (UUID):
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
151
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Response[Any | Error]
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
kwargs = _get_kwargs(
|
|
158
|
+
id=id,
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
response = await client.get_async_httpx_client().request(**kwargs)
|
|
162
|
+
|
|
163
|
+
return _build_response(client=client, response=response)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
async def asyncio(
|
|
167
|
+
id: UUID,
|
|
168
|
+
*,
|
|
169
|
+
client: AuthenticatedClient,
|
|
170
|
+
) -> Any | Error | None:
|
|
171
|
+
"""Delete a computer
|
|
172
|
+
|
|
173
|
+
Soft-deletes the computer and its printers, revokes its agent tokens and disconnects the agent. The
|
|
174
|
+
virtual test computer cannot be deleted.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
id (UUID):
|
|
178
|
+
|
|
179
|
+
Raises:
|
|
180
|
+
errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
|
|
181
|
+
httpx.TimeoutException: If the request takes longer than Client.timeout.
|
|
182
|
+
|
|
183
|
+
Returns:
|
|
184
|
+
Any | Error
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
return (
|
|
188
|
+
await asyncio_detailed(
|
|
189
|
+
id=id,
|
|
190
|
+
client=client,
|
|
191
|
+
)
|
|
192
|
+
).parsed
|