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.
Files changed (138) hide show
  1. printeasy/__init__.py +16 -0
  2. printeasy/_client.py +221 -0
  3. printeasy/_generated/__init__.py +8 -0
  4. printeasy/_generated/api/__init__.py +1 -0
  5. printeasy/_generated/api/account/__init__.py +1 -0
  6. printeasy/_generated/api/account/get_whoami.py +156 -0
  7. printeasy/_generated/api/computers/__init__.py +1 -0
  8. printeasy/_generated/api/computers/delete_computer.py +192 -0
  9. printeasy/_generated/api/computers/get_computer.py +190 -0
  10. printeasy/_generated/api/computers/list_computers.py +236 -0
  11. printeasy/_generated/api/computers/update_computer.py +216 -0
  12. printeasy/_generated/api/events/__init__.py +1 -0
  13. printeasy/_generated/api/events/list_events.py +277 -0
  14. printeasy/_generated/api/print_jobs/__init__.py +1 -0
  15. printeasy/_generated/api/print_jobs/cancel_print_job.py +199 -0
  16. printeasy/_generated/api/print_jobs/create_print_job.py +267 -0
  17. printeasy/_generated/api/print_jobs/get_print_job.py +190 -0
  18. printeasy/_generated/api/print_jobs/list_print_job_events.py +194 -0
  19. printeasy/_generated/api/print_jobs/list_print_jobs.py +329 -0
  20. printeasy/_generated/api/print_jobs/list_printer_print_jobs.py +259 -0
  21. printeasy/_generated/api/printers/__init__.py +1 -0
  22. printeasy/_generated/api/printers/get_printer.py +190 -0
  23. printeasy/_generated/api/printers/list_computer_printers.py +259 -0
  24. printeasy/_generated/api/printers/list_printers.py +236 -0
  25. printeasy/_generated/api/printers/update_printer.py +220 -0
  26. printeasy/_generated/api/usage/__init__.py +1 -0
  27. printeasy/_generated/api/usage/get_usage.py +156 -0
  28. printeasy/_generated/api/webhooks/__init__.py +1 -0
  29. printeasy/_generated/api/webhooks/create_webhook.py +202 -0
  30. printeasy/_generated/api/webhooks/delete_webhook.py +188 -0
  31. printeasy/_generated/api/webhooks/get_webhook.py +190 -0
  32. printeasy/_generated/api/webhooks/list_webhook_deliveries.py +279 -0
  33. printeasy/_generated/api/webhooks/list_webhooks.py +236 -0
  34. printeasy/_generated/api/webhooks/replay_webhook_delivery.py +199 -0
  35. printeasy/_generated/api/webhooks/update_webhook.py +220 -0
  36. printeasy/_generated/client.py +282 -0
  37. printeasy/_generated/errors.py +16 -0
  38. printeasy/_generated/models/__init__.py +199 -0
  39. printeasy/_generated/models/computer.py +156 -0
  40. printeasy/_generated/models/computer_mode.py +9 -0
  41. printeasy/_generated/models/computer_state.py +10 -0
  42. printeasy/_generated/models/error.py +69 -0
  43. printeasy/_generated/models/error_error.py +78 -0
  44. printeasy/_generated/models/event.py +127 -0
  45. printeasy/_generated/models/event_data.py +48 -0
  46. printeasy/_generated/models/event_mode.py +9 -0
  47. printeasy/_generated/models/event_type.py +22 -0
  48. printeasy/_generated/models/list_computer_printers_dir.py +9 -0
  49. printeasy/_generated/models/list_computer_printers_response_200.py +98 -0
  50. printeasy/_generated/models/list_computers_dir.py +9 -0
  51. printeasy/_generated/models/list_computers_response_200.py +98 -0
  52. printeasy/_generated/models/list_events_dir.py +9 -0
  53. printeasy/_generated/models/list_events_response_200.py +98 -0
  54. printeasy/_generated/models/list_print_job_events_response_200.py +76 -0
  55. printeasy/_generated/models/list_print_jobs_dir.py +9 -0
  56. printeasy/_generated/models/list_print_jobs_response_200.py +98 -0
  57. printeasy/_generated/models/list_print_jobs_state.py +15 -0
  58. printeasy/_generated/models/list_printer_print_jobs_dir.py +9 -0
  59. printeasy/_generated/models/list_printer_print_jobs_response_200.py +98 -0
  60. printeasy/_generated/models/list_printers_dir.py +9 -0
  61. printeasy/_generated/models/list_printers_response_200.py +98 -0
  62. printeasy/_generated/models/list_webhook_deliveries_dir.py +9 -0
  63. printeasy/_generated/models/list_webhook_deliveries_response_200.py +98 -0
  64. printeasy/_generated/models/list_webhook_deliveries_status.py +11 -0
  65. printeasy/_generated/models/list_webhooks_dir.py +9 -0
  66. printeasy/_generated/models/list_webhooks_response_200.py +98 -0
  67. printeasy/_generated/models/print_job.py +275 -0
  68. printeasy/_generated/models/print_job_content_type.py +11 -0
  69. printeasy/_generated/models/print_job_create.py +194 -0
  70. printeasy/_generated/models/print_job_create_authentication.py +86 -0
  71. printeasy/_generated/models/print_job_create_authentication_credentials.py +70 -0
  72. printeasy/_generated/models/print_job_create_authentication_type.py +8 -0
  73. printeasy/_generated/models/print_job_create_content_type.py +11 -0
  74. printeasy/_generated/models/print_job_create_options.py +220 -0
  75. printeasy/_generated/models/print_job_create_options_duplex.py +10 -0
  76. printeasy/_generated/models/print_job_create_options_rotate_type_0.py +8 -0
  77. printeasy/_generated/models/print_job_create_options_rotate_type_1.py +8 -0
  78. printeasy/_generated/models/print_job_create_options_rotate_type_2.py +8 -0
  79. printeasy/_generated/models/print_job_create_options_rotate_type_3.py +8 -0
  80. printeasy/_generated/models/print_job_event.py +107 -0
  81. printeasy/_generated/models/print_job_event_actor.py +11 -0
  82. printeasy/_generated/models/print_job_event_state.py +15 -0
  83. printeasy/_generated/models/print_job_mode.py +9 -0
  84. printeasy/_generated/models/print_job_options.py +212 -0
  85. printeasy/_generated/models/print_job_options_duplex.py +10 -0
  86. printeasy/_generated/models/print_job_options_rotate_type_0.py +8 -0
  87. printeasy/_generated/models/print_job_options_rotate_type_1.py +8 -0
  88. printeasy/_generated/models/print_job_options_rotate_type_2.py +8 -0
  89. printeasy/_generated/models/print_job_options_rotate_type_3.py +8 -0
  90. printeasy/_generated/models/print_job_state.py +15 -0
  91. printeasy/_generated/models/printer.py +226 -0
  92. printeasy/_generated/models/printer_capabilities.py +247 -0
  93. printeasy/_generated/models/printer_capabilities_papers.py +74 -0
  94. printeasy/_generated/models/printer_capabilities_printrate_type_0.py +70 -0
  95. printeasy/_generated/models/printer_custom_papers_item.py +78 -0
  96. printeasy/_generated/models/printer_default_options.py +220 -0
  97. printeasy/_generated/models/printer_default_options_duplex.py +10 -0
  98. printeasy/_generated/models/printer_default_options_rotate_type_0.py +8 -0
  99. printeasy/_generated/models/printer_default_options_rotate_type_1.py +8 -0
  100. printeasy/_generated/models/printer_default_options_rotate_type_2.py +8 -0
  101. printeasy/_generated/models/printer_default_options_rotate_type_3.py +8 -0
  102. printeasy/_generated/models/printer_state.py +10 -0
  103. printeasy/_generated/models/update_computer_body.py +74 -0
  104. printeasy/_generated/models/update_printer_body.py +162 -0
  105. printeasy/_generated/models/update_printer_body_custom_papers_item.py +78 -0
  106. printeasy/_generated/models/update_printer_body_default_options.py +222 -0
  107. printeasy/_generated/models/update_printer_body_default_options_duplex.py +10 -0
  108. printeasy/_generated/models/update_printer_body_default_options_rotate_type_0.py +8 -0
  109. printeasy/_generated/models/update_printer_body_default_options_rotate_type_1.py +8 -0
  110. printeasy/_generated/models/update_printer_body_default_options_rotate_type_2.py +8 -0
  111. printeasy/_generated/models/update_printer_body_default_options_rotate_type_3.py +8 -0
  112. printeasy/_generated/models/usage.py +98 -0
  113. printeasy/_generated/models/usage_history_item.py +88 -0
  114. printeasy/_generated/models/usage_period.py +88 -0
  115. printeasy/_generated/models/webhook_delivery.py +210 -0
  116. printeasy/_generated/models/webhook_delivery_event_type.py +22 -0
  117. printeasy/_generated/models/webhook_delivery_payload.py +48 -0
  118. printeasy/_generated/models/webhook_delivery_status.py +11 -0
  119. printeasy/_generated/models/webhook_endpoint.py +169 -0
  120. printeasy/_generated/models/webhook_endpoint_create.py +90 -0
  121. printeasy/_generated/models/webhook_endpoint_create_events_item.py +22 -0
  122. printeasy/_generated/models/webhook_endpoint_events_item.py +22 -0
  123. printeasy/_generated/models/webhook_endpoint_mode.py +9 -0
  124. printeasy/_generated/models/webhook_endpoint_update.py +117 -0
  125. printeasy/_generated/models/webhook_endpoint_update_events_item.py +22 -0
  126. printeasy/_generated/models/webhook_endpoint_with_secret.py +178 -0
  127. printeasy/_generated/models/whoami.py +98 -0
  128. printeasy/_generated/models/whoami_mode.py +9 -0
  129. printeasy/_generated/models/whoami_organization.py +70 -0
  130. printeasy/_generated/types.py +54 -0
  131. printeasy/_http.py +103 -0
  132. printeasy/_raw.py +15 -0
  133. printeasy/py.typed +0 -0
  134. printeasy/webhooks.py +82 -0
  135. printeasy_sdk-0.1.0.dist-info/METADATA +92 -0
  136. printeasy_sdk-0.1.0.dist-info/RECORD +138 -0
  137. printeasy_sdk-0.1.0.dist-info/WHEEL +4 -0
  138. 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,8 @@
1
+ """A client library for accessing PrintEasy API"""
2
+
3
+ from .client import AuthenticatedClient, Client
4
+
5
+ __all__ = (
6
+ "AuthenticatedClient",
7
+ "Client",
8
+ )
@@ -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