spctre-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 (183) hide show
  1. spctre/__init__.py +43 -0
  2. spctre/_generated/__init__.py +8 -0
  3. spctre/_generated/api/__init__.py +1 -0
  4. spctre/_generated/api/approvals/__init__.py +1 -0
  5. spctre/_generated/api/approvals/get_approval.py +174 -0
  6. spctre/_generated/api/auth/__init__.py +1 -0
  7. spctre/_generated/api/auth/refresh_token.py +203 -0
  8. spctre/_generated/api/auth/revoke_token.py +149 -0
  9. spctre/_generated/api/blueprint/__init__.py +1 -0
  10. spctre/_generated/api/blueprint/import_blueprint.py +217 -0
  11. spctre/_generated/api/bundle/__init__.py +1 -0
  12. spctre/_generated/api/bundle/get_bundle_latest.py +312 -0
  13. spctre/_generated/api/bundle/retain_latest_published_bundle.py +162 -0
  14. spctre/_generated/api/compliance/__init__.py +1 -0
  15. spctre/_generated/api/compliance/export_compliance.py +217 -0
  16. spctre/_generated/api/evidence/__init__.py +1 -0
  17. spctre/_generated/api/evidence/forensic_evidence_query.py +261 -0
  18. spctre/_generated/api/evidence/get_policy_content_artifact.py +192 -0
  19. spctre/_generated/api/evidence/ingest_evidence.py +206 -0
  20. spctre/_generated/api/evidence/ingest_git_checkpoint.py +210 -0
  21. spctre/_generated/api/evidence/retain_policy_content_artifact.py +211 -0
  22. spctre/_generated/api/gateway/__init__.py +1 -0
  23. spctre/_generated/api/gateway/gateway_decide.py +192 -0
  24. spctre/_generated/api/gateway/gateway_resolve.py +188 -0
  25. spctre/_generated/api/gateway/get_escalation_status.py +189 -0
  26. spctre/_generated/api/gateway/ingest_helicone_gateway_event.py +197 -0
  27. spctre/_generated/api/gateway/ingest_lite_llm_gateway_event.py +197 -0
  28. spctre/_generated/api/gateway/ingest_notion_gateway_event.py +201 -0
  29. spctre/_generated/api/gateway/ingest_portkey_gateway_event.py +197 -0
  30. spctre/_generated/api/gateway/list_escalations.py +178 -0
  31. spctre/_generated/api/gateway/register_agt_escalation_request.py +175 -0
  32. spctre/_generated/api/meta/__init__.py +1 -0
  33. spctre/_generated/api/meta/get_open_api_spec.py +136 -0
  34. spctre/_generated/api/policy/__init__.py +1 -0
  35. spctre/_generated/api/policy/import_policy.py +209 -0
  36. spctre/_generated/api/scim/__init__.py +1 -0
  37. spctre/_generated/api/scim/scim_create_user.py +180 -0
  38. spctre/_generated/api/scim/scim_list_users.py +210 -0
  39. spctre/_generated/api/simulation/__init__.py +1 -0
  40. spctre/_generated/api/simulation/evaluate_policy.py +193 -0
  41. spctre/_generated/api/trust/__init__.py +1 -0
  42. spctre/_generated/api/trust/evaluate_trust_governance.py +190 -0
  43. spctre/_generated/api/trust/ingest_context_budget_event.py +190 -0
  44. spctre/_generated/api/trust/ingest_trust_score.py +188 -0
  45. spctre/_generated/api/verification/__init__.py +1 -0
  46. spctre/_generated/api/verification/ingest_verification.py +183 -0
  47. spctre/_generated/api/verification/list_verifications.py +204 -0
  48. spctre/_generated/client.py +282 -0
  49. spctre/_generated/errors.py +16 -0
  50. spctre/_generated/models/__init__.py +317 -0
  51. spctre/_generated/models/api_error.py +100 -0
  52. spctre/_generated/models/api_error_issues_item.py +70 -0
  53. spctre/_generated/models/api_meta.py +78 -0
  54. spctre/_generated/models/approval_response.py +77 -0
  55. spctre/_generated/models/approval_response_approval.py +47 -0
  56. spctre/_generated/models/blueprint_import_request.py +74 -0
  57. spctre/_generated/models/blueprint_import_response.py +124 -0
  58. spctre/_generated/models/bundle_export_blocked_response.py +85 -0
  59. spctre/_generated/models/bundle_export_envelope.py +112 -0
  60. spctre/_generated/models/bundle_export_envelope_artifact_type_1.py +47 -0
  61. spctre/_generated/models/bundle_export_format.py +12 -0
  62. spctre/_generated/models/bundle_export_manifest.py +159 -0
  63. spctre/_generated/models/bundle_export_manifest_compatibility_level.py +10 -0
  64. spctre/_generated/models/bundle_export_manifest_provenance.py +148 -0
  65. spctre/_generated/models/bundle_export_manifest_provenance_target_stacks_item.py +47 -0
  66. spctre/_generated/models/bundle_export_preview_response.py +85 -0
  67. spctre/_generated/models/bundle_export_verification.py +91 -0
  68. spctre/_generated/models/bundle_export_verification_failed_response.py +95 -0
  69. spctre/_generated/models/bundle_response.py +50 -0
  70. spctre/_generated/models/compliance_export_response.py +305 -0
  71. spctre/_generated/models/compliance_export_response_approvals_item.py +47 -0
  72. spctre/_generated/models/compliance_export_response_artifact.py +47 -0
  73. spctre/_generated/models/compliance_export_response_escalations_item.py +47 -0
  74. spctre/_generated/models/compliance_export_response_framework_annotation_type_0.py +47 -0
  75. spctre/_generated/models/compliance_export_response_retention_plan_type_0.py +47 -0
  76. spctre/_generated/models/compliance_export_response_summary.py +126 -0
  77. spctre/_generated/models/compliance_export_response_timeline_item.py +47 -0
  78. spctre/_generated/models/compliance_export_response_verification_results_type_0.py +47 -0
  79. spctre/_generated/models/context_budget_ingest_request.py +192 -0
  80. spctre/_generated/models/context_budget_ingest_request_context_source_mix.py +47 -0
  81. spctre/_generated/models/context_budget_ingest_request_event_type.py +11 -0
  82. spctre/_generated/models/context_budget_ingest_request_governance_action.py +11 -0
  83. spctre/_generated/models/credential_grant.py +86 -0
  84. spctre/_generated/models/escalation_queue_item.py +194 -0
  85. spctre/_generated/models/escalation_status_response.py +257 -0
  86. spctre/_generated/models/escalation_status_response_approved_tool_parameters.py +52 -0
  87. spctre/_generated/models/escalation_status_response_resolution_outcome.py +10 -0
  88. spctre/_generated/models/escalation_status_response_status.py +11 -0
  89. spctre/_generated/models/evaluate_request.py +124 -0
  90. spctre/_generated/models/evaluate_request_tool_parameters.py +47 -0
  91. spctre/_generated/models/evaluate_response.py +150 -0
  92. spctre/_generated/models/evaluate_response_result.py +47 -0
  93. spctre/_generated/models/evaluate_trust_governance_response_200.py +47 -0
  94. spctre/_generated/models/evidence_ingest_request.py +567 -0
  95. spctre/_generated/models/evidence_ingest_request_execution_context.py +107 -0
  96. spctre/_generated/models/evidence_ingest_request_ingest_mode.py +9 -0
  97. spctre/_generated/models/evidence_ingest_request_orchestrator_ref.py +91 -0
  98. spctre/_generated/models/evidence_ingest_request_plugin_source.py +11 -0
  99. spctre/_generated/models/evidence_ingest_request_raw_evidence.py +47 -0
  100. spctre/_generated/models/evidence_ingest_request_skill_context.py +96 -0
  101. spctre/_generated/models/evidence_ingest_request_tool_parameters.py +47 -0
  102. spctre/_generated/models/evidence_ingest_response.py +112 -0
  103. spctre/_generated/models/evidence_ingest_response_evidence.py +47 -0
  104. spctre/_generated/models/evidence_ingest_response_gateway.py +109 -0
  105. spctre/_generated/models/evidence_ingest_response_gateway_outcome.py +10 -0
  106. spctre/_generated/models/evidence_ingest_response_gateway_risk_level.py +11 -0
  107. spctre/_generated/models/evidence_layer.py +9 -0
  108. spctre/_generated/models/export_compliance_format.py +9 -0
  109. spctre/_generated/models/export_compliance_framework.py +15 -0
  110. spctre/_generated/models/forensic_evidence_query_response_200.py +47 -0
  111. spctre/_generated/models/forensic_evidence_query_response_402.py +119 -0
  112. spctre/_generated/models/forensic_evidence_query_response_402_plan.py +8 -0
  113. spctre/_generated/models/gateway_decision.py +120 -0
  114. spctre/_generated/models/gateway_decision_outcome.py +10 -0
  115. spctre/_generated/models/gateway_decision_request.py +284 -0
  116. spctre/_generated/models/gateway_decision_request_risk_level.py +11 -0
  117. spctre/_generated/models/gateway_decision_request_tool_parameters.py +47 -0
  118. spctre/_generated/models/gateway_decision_response.py +109 -0
  119. spctre/_generated/models/gateway_decision_risk_level.py +11 -0
  120. spctre/_generated/models/gateway_ingest_response.py +92 -0
  121. spctre/_generated/models/gateway_resolve_request.py +94 -0
  122. spctre/_generated/models/gateway_resolve_request_resolution_outcome.py +10 -0
  123. spctre/_generated/models/gateway_resolve_response_200.py +83 -0
  124. spctre/_generated/models/gateway_webhook_request.py +50 -0
  125. spctre/_generated/models/get_open_api_spec_response_200.py +47 -0
  126. spctre/_generated/models/git_checkpoint_ingest_request.py +182 -0
  127. spctre/_generated/models/git_checkpoint_ingest_request_agent.py +70 -0
  128. spctre/_generated/models/git_checkpoint_ingest_request_checkpoint.py +132 -0
  129. spctre/_generated/models/git_checkpoint_ingest_request_checkpoint_diff.py +119 -0
  130. spctre/_generated/models/git_checkpoint_ingest_request_checkpoint_diff_files_item.py +91 -0
  131. spctre/_generated/models/git_checkpoint_ingest_request_checkpoint_diff_files_item_status.py +13 -0
  132. spctre/_generated/models/git_checkpoint_ingest_request_checkpoint_diff_format.py +10 -0
  133. spctre/_generated/models/git_checkpoint_ingest_request_checkpoint_repository.py +72 -0
  134. spctre/_generated/models/git_checkpoint_ingest_request_metadata.py +47 -0
  135. spctre/_generated/models/ingest_context_budget_event_response_201.py +47 -0
  136. spctre/_generated/models/ingest_trust_score_response_201.py +47 -0
  137. spctre/_generated/models/list_escalations_response_200.py +141 -0
  138. spctre/_generated/models/list_verifications_response_200.py +147 -0
  139. spctre/_generated/models/list_verifications_response_200_results_item.py +47 -0
  140. spctre/_generated/models/pagination.py +77 -0
  141. spctre/_generated/models/policy_content_artifact_retain_response.py +83 -0
  142. spctre/_generated/models/policy_import_request.py +127 -0
  143. spctre/_generated/models/policy_import_request_scope.py +11 -0
  144. spctre/_generated/models/policy_import_response.py +115 -0
  145. spctre/_generated/models/register_agt_escalation_request_body.py +69 -0
  146. spctre/_generated/models/retain_latest_published_bundle_response_201.py +91 -0
  147. spctre/_generated/models/runtime_decision_status.py +11 -0
  148. spctre/_generated/models/runtime_policy_context.py +115 -0
  149. spctre/_generated/models/runtime_policy_context_scope.py +12 -0
  150. spctre/_generated/models/runtime_stack.py +26 -0
  151. spctre/_generated/models/runtime_target.py +101 -0
  152. spctre/_generated/models/scim_create_user_body.py +47 -0
  153. spctre/_generated/models/scim_create_user_response_201.py +47 -0
  154. spctre/_generated/models/scim_create_user_response_402.py +117 -0
  155. spctre/_generated/models/scim_create_user_response_402_plan.py +8 -0
  156. spctre/_generated/models/scim_list_users_response_200.py +47 -0
  157. spctre/_generated/models/scim_list_users_response_402.py +117 -0
  158. spctre/_generated/models/scim_list_users_response_402_plan.py +8 -0
  159. spctre/_generated/models/token_refresh_request.py +61 -0
  160. spctre/_generated/models/token_refresh_response.py +104 -0
  161. spctre/_generated/models/trigger_kind.py +13 -0
  162. spctre/_generated/models/trust_evaluate_request.py +160 -0
  163. spctre/_generated/models/trust_evaluate_request_consequence_tier.py +11 -0
  164. spctre/_generated/models/trust_score_ingest_request.py +115 -0
  165. spctre/_generated/models/trust_score_ingest_request_source.py +12 -0
  166. spctre/_generated/models/verification_ingest_request.py +369 -0
  167. spctre/_generated/models/verification_ingest_request_compatibility_check_outcome.py +10 -0
  168. spctre/_generated/models/verification_ingest_request_escrow_verification_outcome.py +10 -0
  169. spctre/_generated/models/verification_ingest_request_outcome.py +10 -0
  170. spctre/_generated/models/verification_ingest_request_summary.py +47 -0
  171. spctre/_generated/models/verification_ingest_request_verification_type.py +13 -0
  172. spctre/_generated/models/verification_ingest_response.py +97 -0
  173. spctre/_generated/models/verification_ingest_response_outcome.py +10 -0
  174. spctre/_generated/types.py +54 -0
  175. spctre/_url.py +52 -0
  176. spctre/_version.py +1 -0
  177. spctre/client.py +313 -0
  178. spctre/errors.py +160 -0
  179. spctre/models.py +15 -0
  180. spctre/py.typed +0 -0
  181. spctre_sdk-0.1.0.dist-info/METADATA +145 -0
  182. spctre_sdk-0.1.0.dist-info/RECORD +183 -0
  183. spctre_sdk-0.1.0.dist-info/WHEEL +4 -0
spctre/__init__.py ADDED
@@ -0,0 +1,43 @@
1
+ """Supported Python client for the Spctre control plane.
2
+
3
+ from spctre import SpctreClient
4
+
5
+ client = SpctreClient(base_url="https://app-staging.spctre.dev", token=token)
6
+ decision = client.gateway.decide(request)
7
+
8
+ Request and response models live in `spctre.models`. The full generated
9
+ surface, including operations the facade does not wrap, is under
10
+ `spctre._generated` — regenerated wholesale from the OpenAPI spec and not
11
+ covered by this package's stability promise.
12
+ """
13
+
14
+ from . import models
15
+ from ._url import API_PREFIX, normalize_base_url
16
+ from ._version import __version__
17
+ from .client import UNSET, SpctreClient, Unset
18
+ from .errors import (
19
+ SpctreAuthError,
20
+ SpctreError,
21
+ SpctrePermissionError,
22
+ SpctreRequestError,
23
+ SpctreResponseError,
24
+ SpctreServerError,
25
+ SpctreTransportError,
26
+ )
27
+
28
+ __all__ = [
29
+ "API_PREFIX",
30
+ "SpctreAuthError",
31
+ "SpctreClient",
32
+ "SpctreError",
33
+ "SpctrePermissionError",
34
+ "SpctreRequestError",
35
+ "SpctreResponseError",
36
+ "SpctreServerError",
37
+ "SpctreTransportError",
38
+ "UNSET",
39
+ "Unset",
40
+ "__version__",
41
+ "models",
42
+ "normalize_base_url",
43
+ ]
@@ -0,0 +1,8 @@
1
+ """A client library for accessing Spctre 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,174 @@
1
+ from http import HTTPStatus
2
+ from typing import Any
3
+ from urllib.parse import quote
4
+
5
+ import httpx
6
+
7
+ from ... import errors
8
+ from ...client import AuthenticatedClient, Client
9
+ from ...models.api_error import ApiError
10
+ from ...models.approval_response import ApprovalResponse
11
+ from ...types import Response
12
+
13
+
14
+ def _get_kwargs(
15
+ id: str,
16
+ ) -> dict[str, Any]:
17
+
18
+ _kwargs: dict[str, Any] = {
19
+ "method": "get",
20
+ "url": "/approvals/{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
+ ) -> ApiError | ApprovalResponse | None:
31
+ if response.status_code == 200:
32
+ response_200 = ApprovalResponse.from_dict(response.json())
33
+
34
+ return response_200
35
+
36
+ if response.status_code == 401:
37
+ response_401 = ApiError.from_dict(response.json())
38
+
39
+ return response_401
40
+
41
+ if response.status_code == 404:
42
+ response_404 = ApiError.from_dict(response.json())
43
+
44
+ return response_404
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[ApiError | ApprovalResponse]:
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
+ id: str,
65
+ *,
66
+ client: AuthenticatedClient | Client,
67
+ ) -> Response[ApiError | ApprovalResponse]:
68
+ """Get an approval by ID
69
+
70
+ Returns the approval record for a specific revision approval ID.
71
+
72
+ Args:
73
+ id (str):
74
+
75
+ Raises:
76
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
77
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
78
+
79
+ Returns:
80
+ Response[ApiError | ApprovalResponse]
81
+ """
82
+
83
+ kwargs = _get_kwargs(
84
+ id=id,
85
+ )
86
+
87
+ response = client.get_httpx_client().request(
88
+ **kwargs,
89
+ )
90
+
91
+ return _build_response(client=client, response=response)
92
+
93
+
94
+ def sync(
95
+ id: str,
96
+ *,
97
+ client: AuthenticatedClient | Client,
98
+ ) -> ApiError | ApprovalResponse | None:
99
+ """Get an approval by ID
100
+
101
+ Returns the approval record for a specific revision approval ID.
102
+
103
+ Args:
104
+ id (str):
105
+
106
+ Raises:
107
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
108
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
109
+
110
+ Returns:
111
+ ApiError | ApprovalResponse
112
+ """
113
+
114
+ return sync_detailed(
115
+ id=id,
116
+ client=client,
117
+ ).parsed
118
+
119
+
120
+ async def asyncio_detailed(
121
+ id: str,
122
+ *,
123
+ client: AuthenticatedClient | Client,
124
+ ) -> Response[ApiError | ApprovalResponse]:
125
+ """Get an approval by ID
126
+
127
+ Returns the approval record for a specific revision approval ID.
128
+
129
+ Args:
130
+ id (str):
131
+
132
+ Raises:
133
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
134
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
135
+
136
+ Returns:
137
+ Response[ApiError | ApprovalResponse]
138
+ """
139
+
140
+ kwargs = _get_kwargs(
141
+ id=id,
142
+ )
143
+
144
+ response = await client.get_async_httpx_client().request(**kwargs)
145
+
146
+ return _build_response(client=client, response=response)
147
+
148
+
149
+ async def asyncio(
150
+ id: str,
151
+ *,
152
+ client: AuthenticatedClient | Client,
153
+ ) -> ApiError | ApprovalResponse | None:
154
+ """Get an approval by ID
155
+
156
+ Returns the approval record for a specific revision approval ID.
157
+
158
+ Args:
159
+ id (str):
160
+
161
+ Raises:
162
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
163
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
164
+
165
+ Returns:
166
+ ApiError | ApprovalResponse
167
+ """
168
+
169
+ return (
170
+ await asyncio_detailed(
171
+ id=id,
172
+ client=client,
173
+ )
174
+ ).parsed
@@ -0,0 +1 @@
1
+ """Contains endpoint functions for accessing the API"""
@@ -0,0 +1,203 @@
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.api_error import ApiError
9
+ from ...models.token_refresh_request import TokenRefreshRequest
10
+ from ...models.token_refresh_response import TokenRefreshResponse
11
+ from ...types import UNSET, Response, Unset
12
+
13
+
14
+ def _get_kwargs(
15
+ *,
16
+ body: TokenRefreshRequest,
17
+ idempotency_key: str | Unset = UNSET,
18
+ ) -> dict[str, Any]:
19
+ headers: dict[str, Any] = {}
20
+ if not isinstance(idempotency_key, Unset):
21
+ headers["Idempotency-Key"] = idempotency_key
22
+
23
+ _kwargs: dict[str, Any] = {
24
+ "method": "post",
25
+ "url": "/token/refresh",
26
+ }
27
+
28
+ _kwargs["json"] = body.to_dict()
29
+
30
+ headers["Content-Type"] = "application/json"
31
+
32
+ _kwargs["headers"] = headers
33
+ return _kwargs
34
+
35
+
36
+ def _parse_response(
37
+ *, client: AuthenticatedClient | Client, response: httpx.Response
38
+ ) -> ApiError | TokenRefreshResponse | None:
39
+ if response.status_code == 200:
40
+ response_200 = TokenRefreshResponse.from_dict(response.json())
41
+
42
+ return response_200
43
+
44
+ if response.status_code == 400:
45
+ response_400 = ApiError.from_dict(response.json())
46
+
47
+ return response_400
48
+
49
+ if response.status_code == 401:
50
+ response_401 = ApiError.from_dict(response.json())
51
+
52
+ return response_401
53
+
54
+ if response.status_code == 503:
55
+ response_503 = ApiError.from_dict(response.json())
56
+
57
+ return response_503
58
+
59
+ if client.raise_on_unexpected_status:
60
+ raise errors.UnexpectedStatus(response.status_code, response.content)
61
+ else:
62
+ return None
63
+
64
+
65
+ def _build_response(
66
+ *, client: AuthenticatedClient | Client, response: httpx.Response
67
+ ) -> Response[ApiError | TokenRefreshResponse]:
68
+ return Response(
69
+ status_code=HTTPStatus(response.status_code),
70
+ content=response.content,
71
+ headers=response.headers,
72
+ parsed=_parse_response(client=client, response=response),
73
+ )
74
+
75
+
76
+ def sync_detailed(
77
+ *,
78
+ client: AuthenticatedClient | Client,
79
+ body: TokenRefreshRequest,
80
+ idempotency_key: str | Unset = UNSET,
81
+ ) -> Response[ApiError | TokenRefreshResponse]:
82
+ """Rotate an access/refresh token pair
83
+
84
+ Exchanges a valid refresh token for a fresh short-lived access token and rolling refresh token. The
85
+ previous access token is revoked and the previous refresh token is marked rotated.
86
+
87
+ Args:
88
+ idempotency_key (str | Unset):
89
+ body (TokenRefreshRequest):
90
+
91
+ Raises:
92
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
93
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
94
+
95
+ Returns:
96
+ Response[ApiError | TokenRefreshResponse]
97
+ """
98
+
99
+ kwargs = _get_kwargs(
100
+ body=body,
101
+ idempotency_key=idempotency_key,
102
+ )
103
+
104
+ response = client.get_httpx_client().request(
105
+ **kwargs,
106
+ )
107
+
108
+ return _build_response(client=client, response=response)
109
+
110
+
111
+ def sync(
112
+ *,
113
+ client: AuthenticatedClient | Client,
114
+ body: TokenRefreshRequest,
115
+ idempotency_key: str | Unset = UNSET,
116
+ ) -> ApiError | TokenRefreshResponse | None:
117
+ """Rotate an access/refresh token pair
118
+
119
+ Exchanges a valid refresh token for a fresh short-lived access token and rolling refresh token. The
120
+ previous access token is revoked and the previous refresh token is marked rotated.
121
+
122
+ Args:
123
+ idempotency_key (str | Unset):
124
+ body (TokenRefreshRequest):
125
+
126
+ Raises:
127
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
128
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
129
+
130
+ Returns:
131
+ ApiError | TokenRefreshResponse
132
+ """
133
+
134
+ return sync_detailed(
135
+ client=client,
136
+ body=body,
137
+ idempotency_key=idempotency_key,
138
+ ).parsed
139
+
140
+
141
+ async def asyncio_detailed(
142
+ *,
143
+ client: AuthenticatedClient | Client,
144
+ body: TokenRefreshRequest,
145
+ idempotency_key: str | Unset = UNSET,
146
+ ) -> Response[ApiError | TokenRefreshResponse]:
147
+ """Rotate an access/refresh token pair
148
+
149
+ Exchanges a valid refresh token for a fresh short-lived access token and rolling refresh token. The
150
+ previous access token is revoked and the previous refresh token is marked rotated.
151
+
152
+ Args:
153
+ idempotency_key (str | Unset):
154
+ body (TokenRefreshRequest):
155
+
156
+ Raises:
157
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
158
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
159
+
160
+ Returns:
161
+ Response[ApiError | TokenRefreshResponse]
162
+ """
163
+
164
+ kwargs = _get_kwargs(
165
+ body=body,
166
+ idempotency_key=idempotency_key,
167
+ )
168
+
169
+ response = await client.get_async_httpx_client().request(**kwargs)
170
+
171
+ return _build_response(client=client, response=response)
172
+
173
+
174
+ async def asyncio(
175
+ *,
176
+ client: AuthenticatedClient | Client,
177
+ body: TokenRefreshRequest,
178
+ idempotency_key: str | Unset = UNSET,
179
+ ) -> ApiError | TokenRefreshResponse | None:
180
+ """Rotate an access/refresh token pair
181
+
182
+ Exchanges a valid refresh token for a fresh short-lived access token and rolling refresh token. The
183
+ previous access token is revoked and the previous refresh token is marked rotated.
184
+
185
+ Args:
186
+ idempotency_key (str | Unset):
187
+ body (TokenRefreshRequest):
188
+
189
+ Raises:
190
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
191
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
192
+
193
+ Returns:
194
+ ApiError | TokenRefreshResponse
195
+ """
196
+
197
+ return (
198
+ await asyncio_detailed(
199
+ client=client,
200
+ body=body,
201
+ idempotency_key=idempotency_key,
202
+ )
203
+ ).parsed
@@ -0,0 +1,149 @@
1
+ from http import HTTPStatus
2
+ from typing import Any, cast
3
+
4
+ import httpx
5
+
6
+ from ... import errors
7
+ from ...client import AuthenticatedClient, Client
8
+ from ...models.api_error import ApiError
9
+ from ...types import Response
10
+
11
+
12
+ def _get_kwargs() -> dict[str, Any]:
13
+
14
+ _kwargs: dict[str, Any] = {
15
+ "method": "post",
16
+ "url": "/token/revoke",
17
+ }
18
+
19
+ return _kwargs
20
+
21
+
22
+ def _parse_response(
23
+ *, client: AuthenticatedClient | Client, response: httpx.Response
24
+ ) -> Any | ApiError | None:
25
+ if response.status_code == 204:
26
+ response_204 = cast(Any, None)
27
+ return response_204
28
+
29
+ if response.status_code == 401:
30
+ response_401 = ApiError.from_dict(response.json())
31
+
32
+ return response_401
33
+
34
+ if response.status_code == 503:
35
+ response_503 = ApiError.from_dict(response.json())
36
+
37
+ return response_503
38
+
39
+ if client.raise_on_unexpected_status:
40
+ raise errors.UnexpectedStatus(response.status_code, response.content)
41
+ else:
42
+ return None
43
+
44
+
45
+ def _build_response(
46
+ *, client: AuthenticatedClient | Client, response: httpx.Response
47
+ ) -> Response[Any | ApiError]:
48
+ return Response(
49
+ status_code=HTTPStatus(response.status_code),
50
+ content=response.content,
51
+ headers=response.headers,
52
+ parsed=_parse_response(client=client, response=response),
53
+ )
54
+
55
+
56
+ def sync_detailed(
57
+ *,
58
+ client: AuthenticatedClient,
59
+ ) -> Response[Any | ApiError]:
60
+ """Revoke the current service token
61
+
62
+ Revokes the bearer access token used for the request and any active refresh token linked to it.
63
+ Successful revocation returns 204 with no body.
64
+
65
+ Raises:
66
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
67
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
68
+
69
+ Returns:
70
+ Response[Any | ApiError]
71
+ """
72
+
73
+ kwargs = _get_kwargs()
74
+
75
+ response = client.get_httpx_client().request(
76
+ **kwargs,
77
+ )
78
+
79
+ return _build_response(client=client, response=response)
80
+
81
+
82
+ def sync(
83
+ *,
84
+ client: AuthenticatedClient,
85
+ ) -> Any | ApiError | None:
86
+ """Revoke the current service token
87
+
88
+ Revokes the bearer access token used for the request and any active refresh token linked to it.
89
+ Successful revocation returns 204 with no body.
90
+
91
+ Raises:
92
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
93
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
94
+
95
+ Returns:
96
+ Any | ApiError
97
+ """
98
+
99
+ return sync_detailed(
100
+ client=client,
101
+ ).parsed
102
+
103
+
104
+ async def asyncio_detailed(
105
+ *,
106
+ client: AuthenticatedClient,
107
+ ) -> Response[Any | ApiError]:
108
+ """Revoke the current service token
109
+
110
+ Revokes the bearer access token used for the request and any active refresh token linked to it.
111
+ Successful revocation returns 204 with no body.
112
+
113
+ Raises:
114
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
115
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
116
+
117
+ Returns:
118
+ Response[Any | ApiError]
119
+ """
120
+
121
+ kwargs = _get_kwargs()
122
+
123
+ response = await client.get_async_httpx_client().request(**kwargs)
124
+
125
+ return _build_response(client=client, response=response)
126
+
127
+
128
+ async def asyncio(
129
+ *,
130
+ client: AuthenticatedClient,
131
+ ) -> Any | ApiError | None:
132
+ """Revoke the current service token
133
+
134
+ Revokes the bearer access token used for the request and any active refresh token linked to it.
135
+ Successful revocation returns 204 with no body.
136
+
137
+ Raises:
138
+ errors.UnexpectedStatus: If the server returns an undocumented status code and Client.raise_on_unexpected_status is True.
139
+ httpx.TimeoutException: If the request takes longer than Client.timeout.
140
+
141
+ Returns:
142
+ Any | ApiError
143
+ """
144
+
145
+ return (
146
+ await asyncio_detailed(
147
+ client=client,
148
+ )
149
+ ).parsed
@@ -0,0 +1 @@
1
+ """Contains endpoint functions for accessing the API"""