authpi-admin 0.3.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 (40) hide show
  1. authpi_admin/__init__.py +55 -0
  2. authpi_admin/_version.py +5 -0
  3. authpi_admin/client.py +155 -0
  4. authpi_admin/errors.py +218 -0
  5. authpi_admin/generated/__init__.py +28 -0
  6. authpi_admin/generated/models.py +380 -0
  7. authpi_admin/generated/resources/__init__.py +0 -0
  8. authpi_admin/generated/resources/accounts.py +157 -0
  9. authpi_admin/generated/resources/agents.py +177 -0
  10. authpi_admin/generated/resources/api_keys.py +213 -0
  11. authpi_admin/generated/resources/approvals.py +109 -0
  12. authpi_admin/generated/resources/auth_methods.py +148 -0
  13. authpi_admin/generated/resources/clients.py +197 -0
  14. authpi_admin/generated/resources/deliveries.py +83 -0
  15. authpi_admin/generated/resources/domains.py +194 -0
  16. authpi_admin/generated/resources/events.py +111 -0
  17. authpi_admin/generated/resources/groups.py +160 -0
  18. authpi_admin/generated/resources/invitations.py +202 -0
  19. authpi_admin/generated/resources/issuers.py +157 -0
  20. authpi_admin/generated/resources/members.py +154 -0
  21. authpi_admin/generated/resources/notes.py +192 -0
  22. authpi_admin/generated/resources/organizations.py +244 -0
  23. authpi_admin/generated/resources/sessions.py +125 -0
  24. authpi_admin/generated/resources/tokens.py +94 -0
  25. authpi_admin/generated/resources/trusted_devices.py +102 -0
  26. authpi_admin/generated/resources/users.py +224 -0
  27. authpi_admin/generated/resources/verifiers.py +102 -0
  28. authpi_admin/generated/resources/webhooks.py +167 -0
  29. authpi_admin/generated/scopes/__init__.py +0 -0
  30. authpi_admin/generated/scopes/agent_scope.py +84 -0
  31. authpi_admin/generated/scopes/issuer_scope.py +160 -0
  32. authpi_admin/generated/scopes/user_scope.py +102 -0
  33. authpi_admin/generated/scopes/webhook_scope.py +84 -0
  34. authpi_admin/http_client.py +305 -0
  35. authpi_admin/pagination.py +41 -0
  36. authpi_admin/py.typed +0 -0
  37. authpi_admin/user_agent.py +21 -0
  38. authpi_admin-0.3.0.dist-info/METADATA +285 -0
  39. authpi_admin-0.3.0.dist-info/RECORD +40 -0
  40. authpi_admin-0.3.0.dist-info/WHEEL +4 -0
@@ -0,0 +1,224 @@
1
+ """Generated resource class for users — DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, AsyncIterator
6
+
7
+ from authpi_admin.http_client import HttpClient, validate_path_segment as _validate_path_segment
8
+ from authpi_admin.pagination import Page, auto_paginate
9
+
10
+
11
+ class UsersResource:
12
+ """Operations on users."""
13
+
14
+ def __init__(self, client: HttpClient, base_path: str) -> None:
15
+ self._client = client
16
+ self._base_path = base_path
17
+
18
+ async def list(
19
+ self,
20
+ limit: int | None = None,
21
+ cursor: str | None = None,
22
+ status: str | None = None,
23
+ *,
24
+ timeout: float | None = None,
25
+ headers: dict[str, str] | None = None,
26
+ ) -> Page[dict[str, Any]]:
27
+ """List Users"""
28
+ query: dict[str, Any] = {}
29
+ if limit is not None:
30
+ query["limit"] = limit
31
+ if cursor is not None:
32
+ query["cursor"] = cursor
33
+ if status is not None:
34
+ query["status"] = status
35
+ resp = await self._client.request(
36
+ "GET",
37
+ self._base_path,
38
+ query=query or None,
39
+ timeout=timeout,
40
+ headers=headers,
41
+ )
42
+ data = resp.data
43
+ items = data.get("data", []) if data else []
44
+ return Page(
45
+ data=items,
46
+ has_more=data.get("has_more", False) if data else False,
47
+ next_cursor=data.get("next_cursor") if data else None,
48
+ )
49
+
50
+ async def list_all(
51
+ self,
52
+ limit: int | None = None,
53
+ status: str | None = None,
54
+ *,
55
+ timeout: float | None = None,
56
+ headers: dict[str, str] | None = None,
57
+ ) -> AsyncIterator[dict[str, Any]]:
58
+ """Auto-paginating iterator over all users."""
59
+ async def _fetch(cursor: str | None = None) -> Page[dict[str, Any]]:
60
+ return await self.list(
61
+ limit=limit,
62
+ status=status,
63
+ cursor=cursor,
64
+ timeout=timeout,
65
+ headers=headers,
66
+ )
67
+ async for item in auto_paginate(_fetch):
68
+ yield item
69
+
70
+ async def create(
71
+ self,
72
+ body: dict[str, Any],
73
+ *,
74
+ idempotency_key: str | None = None,
75
+ timeout: float | None = None,
76
+ headers: dict[str, str] | None = None,
77
+ ) -> dict[str, Any]:
78
+ """Create User"""
79
+ req_headers: dict[str, str] = {}
80
+ if headers:
81
+ req_headers.update(headers)
82
+ if idempotency_key:
83
+ req_headers["idempotency-key"] = idempotency_key
84
+ resp = await self._client.request(
85
+ "POST",
86
+ self._base_path,
87
+ body=body,
88
+ timeout=timeout,
89
+ headers=req_headers or None,
90
+ )
91
+ data = resp.data
92
+ if resp.etag and isinstance(data, dict):
93
+ data["_etag"] = resp.etag
94
+ return data
95
+
96
+ async def get(
97
+ self,
98
+ resource_id: str,
99
+ *,
100
+ timeout: float | None = None,
101
+ headers: dict[str, str] | None = None,
102
+ ) -> dict[str, Any]:
103
+ """Get User"""
104
+ path = f"{self._base_path}/{resource_id}"
105
+ resp = await self._client.request("GET", path, timeout=timeout, headers=headers)
106
+ data = resp.data
107
+ if resp.etag and isinstance(data, dict):
108
+ data["_etag"] = resp.etag
109
+ return data
110
+
111
+ async def update(
112
+ self,
113
+ resource_id: str,
114
+ body: dict[str, Any],
115
+ *,
116
+ if_match: str | None = None,
117
+ idempotency_key: str | None = None,
118
+ timeout: float | None = None,
119
+ headers: dict[str, str] | None = None,
120
+ ) -> dict[str, Any]:
121
+ """Update User"""
122
+ path = f"{self._base_path}/{resource_id}"
123
+ req_headers: dict[str, str] = {}
124
+ if headers:
125
+ req_headers.update(headers)
126
+ if if_match:
127
+ req_headers["if-match"] = if_match
128
+ if idempotency_key:
129
+ req_headers["idempotency-key"] = idempotency_key
130
+ resp = await self._client.request(
131
+ "PATCH",
132
+ path,
133
+ body=body,
134
+ timeout=timeout,
135
+ headers=req_headers or None,
136
+ )
137
+ data = resp.data
138
+ if resp.etag and isinstance(data, dict):
139
+ data["_etag"] = resp.etag
140
+ return data
141
+
142
+ async def delete(
143
+ self,
144
+ resource_id: str,
145
+ *,
146
+ if_match: str | None = None,
147
+ timeout: float | None = None,
148
+ headers: dict[str, str] | None = None,
149
+ ) -> None:
150
+ """Delete User"""
151
+ path = f"{self._base_path}/{resource_id}"
152
+ req_headers: dict[str, str] = {}
153
+ if headers:
154
+ req_headers.update(headers)
155
+ if if_match:
156
+ req_headers["if-match"] = if_match
157
+ await self._client.request(
158
+ "DELETE",
159
+ path,
160
+ timeout=timeout,
161
+ headers=req_headers or None,
162
+ )
163
+
164
+ async def revoke_all_trusted_devices(
165
+ self,
166
+ user_id: str,
167
+ *,
168
+ if_match: str | None = None,
169
+ idempotency_key: str | None = None,
170
+ timeout: float | None = None,
171
+ headers: dict[str, str] | None = None,
172
+ ) -> dict[str, Any]:
173
+ """Revoke All Trusted Devices"""
174
+ _validate_path_segment(user_id, "user_id")
175
+ path = f"{self._base_path}/{user_id}/trusted-devices/revoke-all"
176
+ req_headers: dict[str, str] = {}
177
+ if headers:
178
+ req_headers.update(headers)
179
+ if if_match:
180
+ req_headers["if-match"] = if_match
181
+ if idempotency_key:
182
+ req_headers["idempotency-key"] = idempotency_key
183
+ resp = await self._client.request(
184
+ "POST",
185
+ path,
186
+ timeout=timeout,
187
+ headers=req_headers or None,
188
+ )
189
+ data = resp.data
190
+ if resp.etag and isinstance(data, dict):
191
+ data["_etag"] = resp.etag
192
+ return data
193
+
194
+ async def complete_enrollment_verifiers(
195
+ self,
196
+ user_id: str,
197
+ body: dict[str, Any] | None = None,
198
+ *,
199
+ if_match: str | None = None,
200
+ idempotency_key: str | None = None,
201
+ timeout: float | None = None,
202
+ headers: dict[str, str] | None = None,
203
+ ) -> dict[str, Any]:
204
+ """Complete Verifier Enrollment"""
205
+ _validate_path_segment(user_id, "user_id")
206
+ path = f"{self._base_path}/{user_id}/verifiers/complete-enrollment"
207
+ req_headers: dict[str, str] = {}
208
+ if headers:
209
+ req_headers.update(headers)
210
+ if if_match:
211
+ req_headers["if-match"] = if_match
212
+ if idempotency_key:
213
+ req_headers["idempotency-key"] = idempotency_key
214
+ resp = await self._client.request(
215
+ "POST",
216
+ path,
217
+ body=body,
218
+ timeout=timeout,
219
+ headers=req_headers or None,
220
+ )
221
+ data = resp.data
222
+ if resp.etag and isinstance(data, dict):
223
+ data["_etag"] = resp.etag
224
+ return data
@@ -0,0 +1,102 @@
1
+ """Generated resource class for verifiers — DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, AsyncIterator
6
+
7
+ from authpi_admin.http_client import HttpClient, validate_path_segment as _validate_path_segment
8
+ from authpi_admin.pagination import Page, auto_paginate
9
+
10
+
11
+ class VerifiersResource:
12
+ """Operations on verifiers."""
13
+
14
+ def __init__(self, client: HttpClient, base_path: str) -> None:
15
+ self._client = client
16
+ self._base_path = base_path
17
+
18
+ async def list(
19
+ self,
20
+ *,
21
+ timeout: float | None = None,
22
+ headers: dict[str, str] | None = None,
23
+ ) -> Page[dict[str, Any]]:
24
+ """List Agent Verifiers"""
25
+ query: dict[str, Any] = {}
26
+ resp = await self._client.request(
27
+ "GET",
28
+ self._base_path,
29
+ query=query or None,
30
+ timeout=timeout,
31
+ headers=headers,
32
+ )
33
+ data = resp.data
34
+ items = data.get("data", []) if data else []
35
+ return Page(
36
+ data=items,
37
+ has_more=data.get("has_more", False) if data else False,
38
+ next_cursor=data.get("next_cursor") if data else None,
39
+ )
40
+
41
+ async def list_all(
42
+ self,
43
+ *,
44
+ timeout: float | None = None,
45
+ headers: dict[str, str] | None = None,
46
+ ) -> AsyncIterator[dict[str, Any]]:
47
+ """Auto-paginating iterator over all verifiers."""
48
+ async def _fetch(cursor: str | None = None) -> Page[dict[str, Any]]:
49
+ return await self.list(
50
+ timeout=timeout,
51
+ headers=headers,
52
+ )
53
+ async for item in auto_paginate(_fetch):
54
+ yield item
55
+
56
+ async def create(
57
+ self,
58
+ body: dict[str, Any],
59
+ *,
60
+ idempotency_key: str | None = None,
61
+ timeout: float | None = None,
62
+ headers: dict[str, str] | None = None,
63
+ ) -> dict[str, Any]:
64
+ """Add Agent Verifier"""
65
+ req_headers: dict[str, str] = {}
66
+ if headers:
67
+ req_headers.update(headers)
68
+ if idempotency_key:
69
+ req_headers["idempotency-key"] = idempotency_key
70
+ resp = await self._client.request(
71
+ "POST",
72
+ self._base_path,
73
+ body=body,
74
+ timeout=timeout,
75
+ headers=req_headers or None,
76
+ )
77
+ data = resp.data
78
+ if resp.etag and isinstance(data, dict):
79
+ data["_etag"] = resp.etag
80
+ return data
81
+
82
+ async def delete(
83
+ self,
84
+ verifier_id: str,
85
+ *,
86
+ if_match: str | None = None,
87
+ timeout: float | None = None,
88
+ headers: dict[str, str] | None = None,
89
+ ) -> None:
90
+ """Remove Agent Verifier"""
91
+ path = f"{self._base_path}/{verifier_id}"
92
+ req_headers: dict[str, str] = {}
93
+ if headers:
94
+ req_headers.update(headers)
95
+ if if_match:
96
+ req_headers["if-match"] = if_match
97
+ await self._client.request(
98
+ "DELETE",
99
+ path,
100
+ timeout=timeout,
101
+ headers=req_headers or None,
102
+ )
@@ -0,0 +1,167 @@
1
+ """Generated resource class for webhooks — DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any, AsyncIterator
6
+
7
+ from authpi_admin.http_client import HttpClient, validate_path_segment as _validate_path_segment
8
+ from authpi_admin.pagination import Page, auto_paginate
9
+ from authpi_admin.generated.models import (
10
+ WebhookListItem,
11
+ CreateWebhookInput,
12
+ UpdateWebhook,
13
+ )
14
+
15
+
16
+ class WebhooksResource:
17
+ """Operations on webhooks."""
18
+
19
+ def __init__(self, client: HttpClient, base_path: str) -> None:
20
+ self._client = client
21
+ self._base_path = base_path
22
+
23
+ async def list(
24
+ self,
25
+ limit: int | None = None,
26
+ cursor: str | None = None,
27
+ status: str | None = None,
28
+ *,
29
+ timeout: float | None = None,
30
+ headers: dict[str, str] | None = None,
31
+ ) -> Page[WebhookListItem]:
32
+ """List Webhooks"""
33
+ query: dict[str, Any] = {}
34
+ if limit is not None:
35
+ query["limit"] = limit
36
+ if cursor is not None:
37
+ query["cursor"] = cursor
38
+ if status is not None:
39
+ query["status"] = status
40
+ resp = await self._client.request(
41
+ "GET",
42
+ self._base_path,
43
+ query=query or None,
44
+ timeout=timeout,
45
+ headers=headers,
46
+ )
47
+ data = resp.data
48
+ items = [WebhookListItem(**item) for item in data.get("data", [])] if data else []
49
+ return Page(
50
+ data=items,
51
+ has_more=data.get("has_more", False) if data else False,
52
+ next_cursor=data.get("next_cursor") if data else None,
53
+ )
54
+
55
+ async def list_all(
56
+ self,
57
+ limit: int | None = None,
58
+ status: str | None = None,
59
+ *,
60
+ timeout: float | None = None,
61
+ headers: dict[str, str] | None = None,
62
+ ) -> AsyncIterator[WebhookListItem]:
63
+ """Auto-paginating iterator over all webhooks."""
64
+ async def _fetch(cursor: str | None = None) -> Page[WebhookListItem]:
65
+ return await self.list(
66
+ limit=limit,
67
+ status=status,
68
+ cursor=cursor,
69
+ timeout=timeout,
70
+ headers=headers,
71
+ )
72
+ async for item in auto_paginate(_fetch):
73
+ yield item
74
+
75
+ async def create(
76
+ self,
77
+ body: dict[str, Any],
78
+ *,
79
+ idempotency_key: str | None = None,
80
+ timeout: float | None = None,
81
+ headers: dict[str, str] | None = None,
82
+ ) -> dict[str, Any]:
83
+ """Create Webhook"""
84
+ req_headers: dict[str, str] = {}
85
+ if headers:
86
+ req_headers.update(headers)
87
+ if idempotency_key:
88
+ req_headers["idempotency-key"] = idempotency_key
89
+ resp = await self._client.request(
90
+ "POST",
91
+ self._base_path,
92
+ body=body,
93
+ timeout=timeout,
94
+ headers=req_headers or None,
95
+ )
96
+ data = resp.data
97
+ if resp.etag and isinstance(data, dict):
98
+ data["_etag"] = resp.etag
99
+ return data
100
+
101
+ async def get(
102
+ self,
103
+ resource_id: str,
104
+ *,
105
+ timeout: float | None = None,
106
+ headers: dict[str, str] | None = None,
107
+ ) -> dict[str, Any]:
108
+ """Get Webhook"""
109
+ path = f"{self._base_path}/{resource_id}"
110
+ resp = await self._client.request("GET", path, timeout=timeout, headers=headers)
111
+ data = resp.data
112
+ if resp.etag and isinstance(data, dict):
113
+ data["_etag"] = resp.etag
114
+ return data
115
+
116
+ async def update(
117
+ self,
118
+ resource_id: str,
119
+ body: dict[str, Any],
120
+ *,
121
+ if_match: str | None = None,
122
+ idempotency_key: str | None = None,
123
+ timeout: float | None = None,
124
+ headers: dict[str, str] | None = None,
125
+ ) -> dict[str, Any]:
126
+ """Update Webhook"""
127
+ path = f"{self._base_path}/{resource_id}"
128
+ req_headers: dict[str, str] = {}
129
+ if headers:
130
+ req_headers.update(headers)
131
+ if if_match:
132
+ req_headers["if-match"] = if_match
133
+ if idempotency_key:
134
+ req_headers["idempotency-key"] = idempotency_key
135
+ resp = await self._client.request(
136
+ "PATCH",
137
+ path,
138
+ body=body,
139
+ timeout=timeout,
140
+ headers=req_headers or None,
141
+ )
142
+ data = resp.data
143
+ if resp.etag and isinstance(data, dict):
144
+ data["_etag"] = resp.etag
145
+ return data
146
+
147
+ async def delete(
148
+ self,
149
+ resource_id: str,
150
+ *,
151
+ if_match: str | None = None,
152
+ timeout: float | None = None,
153
+ headers: dict[str, str] | None = None,
154
+ ) -> None:
155
+ """Delete Webhook"""
156
+ path = f"{self._base_path}/{resource_id}"
157
+ req_headers: dict[str, str] = {}
158
+ if headers:
159
+ req_headers.update(headers)
160
+ if if_match:
161
+ req_headers["if-match"] = if_match
162
+ await self._client.request(
163
+ "DELETE",
164
+ path,
165
+ timeout=timeout,
166
+ headers=req_headers or None,
167
+ )
File without changes
@@ -0,0 +1,84 @@
1
+ """Generated scope class for AgentScope — DO NOT EDIT."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from functools import cached_property
6
+ from typing import Any, TYPE_CHECKING
7
+
8
+ from authpi_admin.http_client import validate_path_segment as _validate_path_segment
9
+
10
+ if TYPE_CHECKING:
11
+ from authpi_admin.http_client import HttpClient
12
+ from authpi_admin.generated.resources.verifiers import VerifiersResource
13
+
14
+
15
+ class AgentScope:
16
+ """Scope for operations under a specific agent."""
17
+
18
+ def __init__(self, client: HttpClient, base_path: str, agent_id: str) -> None:
19
+ _validate_path_segment(agent_id, "agent_id")
20
+ self._client = client
21
+ self._base_path = base_path
22
+ self._agent_id = agent_id
23
+ self._path = f"{base_path}/{agent_id}"
24
+
25
+ @cached_property
26
+ def verifiers(self) -> VerifiersResource:
27
+ """Access verifiers under this agent."""
28
+ return VerifiersResource(self._client, f"{self._path}/verifiers")
29
+
30
+ async def get(
31
+ self,
32
+ *,
33
+ timeout: float | None = None,
34
+ headers: dict[str, str] | None = None,
35
+ ) -> Any:
36
+ """Get Agent"""
37
+ resp = await self._client.request("GET", self._path, timeout=timeout, headers=headers)
38
+ return resp.data
39
+
40
+ async def update(
41
+ self,
42
+ body: dict[str, Any],
43
+ *,
44
+ if_match: str | None = None,
45
+ idempotency_key: str | None = None,
46
+ timeout: float | None = None,
47
+ headers: dict[str, str] | None = None,
48
+ ) -> Any:
49
+ """Update Agent"""
50
+ req_headers: dict[str, str] = {}
51
+ if headers:
52
+ req_headers.update(headers)
53
+ if if_match:
54
+ req_headers["if-match"] = if_match
55
+ if idempotency_key:
56
+ req_headers["idempotency-key"] = idempotency_key
57
+ resp = await self._client.request(
58
+ "PATCH",
59
+ self._path,
60
+ body=body,
61
+ timeout=timeout,
62
+ headers=req_headers or None,
63
+ )
64
+ return resp.data
65
+
66
+ async def delete(
67
+ self,
68
+ *,
69
+ if_match: str | None = None,
70
+ timeout: float | None = None,
71
+ headers: dict[str, str] | None = None,
72
+ ) -> None:
73
+ """Delete Agent"""
74
+ req_headers: dict[str, str] = {}
75
+ if headers:
76
+ req_headers.update(headers)
77
+ if if_match:
78
+ req_headers["if-match"] = if_match
79
+ await self._client.request(
80
+ "DELETE",
81
+ self._path,
82
+ timeout=timeout,
83
+ headers=req_headers or None,
84
+ )