basaltic-sdk-python 0.3.0__py3-none-any.whl → 0.4.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.
basaltic/_version.py CHANGED
@@ -1,3 +1,3 @@
1
1
  """Basaltic SDK version."""
2
2
 
3
- __version__ = "0.3.0"
3
+ __version__ = "0.4.0"
basaltic/models/audit.py CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from typing import Literal, NotRequired, TypeAlias, TypedDict
5
+ from typing import Literal, NotRequired, Required, TypeAlias, TypedDict
6
6
 
7
7
  AuditLogResponse = TypedDict(
8
8
  "AuditLogResponse", {"audit_log": "NotRequired[AuditLog]"}, total=False
@@ -23,12 +23,33 @@ AuditLog = TypedDict(
23
23
  "ip_address": "NotRequired[str | None]",
24
24
  "user_agent": "NotRequired[str | None]",
25
25
  "request_id": "NotRequired[str | None]",
26
- "details": "NotRequired[dict[str, object]]",
26
+ "details": "NotRequired[AuditLogDetails]",
27
27
  "error_code": "NotRequired[str | None]",
28
28
  "error_message": "NotRequired[str | None]",
29
29
  },
30
30
  total=False,
31
31
  )
32
+ AuditLogDetails = TypedDict(
33
+ "AuditLogDetails", {"auth_chain": "NotRequired[list[AuditAuthenticationStep]]"}, total=False
34
+ )
35
+ AuditAuthenticationStep = TypedDict(
36
+ "AuditAuthenticationStep",
37
+ {
38
+ "principal_id": "Required[str]",
39
+ "principal_type": "Required[str]",
40
+ "principal_crn": "NotRequired[str]",
41
+ "name": "NotRequired[str]",
42
+ "issuer": "NotRequired[str]",
43
+ "subject": "NotRequired[str]",
44
+ "email": "NotRequired[str]",
45
+ "session_id": "NotRequired[str]",
46
+ "session_crn": "NotRequired[str]",
47
+ "session_name": "NotRequired[str]",
48
+ "grant_type": "NotRequired[str]",
49
+ "issued_at": "NotRequired[str]",
50
+ },
51
+ total=False,
52
+ )
32
53
  GetAuditLogResponse: TypeAlias = "AuditLogResponse"
33
54
  GetAuditLogResource: TypeAlias = "AuditLog"
34
55
  GetAuditLogScope = TypedDict(
@@ -7,24 +7,37 @@ from typing import Literal, NotRequired, Required, TypeAlias, TypedDict
7
7
  BillingProfile = TypedDict(
8
8
  "BillingProfile",
9
9
  {
10
- "customer_type": "NotRequired[Literal['', 'individual', 'company']]",
11
- "company_name": "NotRequired[str]",
12
- "country": "NotRequired[str]",
13
- "tax_id": "NotRequired[str]",
14
- "foreign_tax_id": "NotRequired[str]",
15
- "no_tax_id_reason": "NotRequired[str]",
16
- "email": "NotRequired[str]",
17
- "phone": "NotRequired[str]",
10
+ "customer_type": "Required[Literal['', 'individual', 'company']]",
11
+ "company_name": "Required[str]",
12
+ "tax_id": "Required[str]",
13
+ "tax_id_kind": "Required[str]",
14
+ "no_tax_id_reason": "Required[str]",
15
+ "email": "Required[str]",
16
+ "phone": "Required[str]",
17
+ "country": "Required[ResourceRef]",
18
+ "state": "Required[ResourceRef | Literal[None] | None]",
19
+ "city": "Required[ResourceRef | Literal[None] | None]",
20
+ "address": "Required[BillingAddress]",
21
+ "ready": "Required[bool]",
22
+ "missing_fields": "Required[list[str]]",
23
+ },
24
+ total=False,
25
+ )
26
+ ResourceRef = TypedDict(
27
+ "ResourceRef",
28
+ {"id": "Required[str]", "crn": "Required[str]", "name": "NotRequired[str]"},
29
+ total=False,
30
+ )
31
+ BillingAddress = TypedDict(
32
+ "BillingAddress",
33
+ {
18
34
  "street_name": "NotRequired[str]",
19
35
  "street_number": "NotRequired[str]",
20
36
  "complement": "NotRequired[str]",
21
37
  "neighborhood": "NotRequired[str]",
22
38
  "city": "NotRequired[str]",
23
- "municipality_code": "NotRequired[str]",
24
39
  "state": "NotRequired[str]",
25
40
  "postal_code": "NotRequired[str]",
26
- "ready": "NotRequired[bool]",
27
- "missing_fields": "NotRequired[list[str]]",
28
41
  },
29
42
  total=False,
30
43
  )
@@ -258,27 +271,35 @@ Transaction = TypedDict(
258
271
  )
259
272
  ListTransactionsResponse: TypeAlias = "TransactionListResponse"
260
273
  ListTransactionsItem: TypeAlias = "Transaction"
261
- BillingProfileInput = TypedDict(
262
- "BillingProfileInput",
274
+ BillingProfileUpdateInput = TypedDict(
275
+ "BillingProfileUpdateInput",
263
276
  {
264
277
  "customer_type": "NotRequired[Literal['', 'individual', 'company']]",
265
278
  "company_name": "NotRequired[str]",
266
- "country": "NotRequired[str]",
267
279
  "tax_id": "NotRequired[str]",
268
- "foreign_tax_id": "NotRequired[str]",
280
+ "tax_id_kind": "NotRequired[str]",
269
281
  "no_tax_id_reason": "NotRequired[str]",
270
282
  "email": "NotRequired[str]",
271
283
  "phone": "NotRequired[str]",
284
+ "country": "NotRequired[str]",
285
+ "state": "NotRequired[str]",
286
+ "city": "NotRequired[str]",
287
+ "address": "NotRequired[BillingAddressInput]",
288
+ },
289
+ total=False,
290
+ )
291
+ BillingAddressInput = TypedDict(
292
+ "BillingAddressInput",
293
+ {
272
294
  "street_name": "NotRequired[str]",
273
295
  "street_number": "NotRequired[str]",
274
296
  "complement": "NotRequired[str]",
275
297
  "neighborhood": "NotRequired[str]",
276
298
  "city": "NotRequired[str]",
277
- "municipality_code": "NotRequired[str]",
278
299
  "state": "NotRequired[str]",
279
300
  "postal_code": "NotRequired[str]",
280
301
  },
281
302
  total=False,
282
303
  )
283
- UpdateBillingProfileBody: TypeAlias = "BillingProfileInput"
304
+ UpdateBillingProfileBody: TypeAlias = "BillingProfileUpdateInput"
284
305
  UpdateBillingProfileResponse: TypeAlias = "BillingProfile"
@@ -4,6 +4,62 @@ from __future__ import annotations
4
4
 
5
5
  from typing import Literal, NotRequired, Required, TypeAlias, TypedDict
6
6
 
7
+ GetCountryResult = TypedDict(
8
+ "GetCountryResult", {"country": "Required[CountryDetail]"}, total=False
9
+ )
10
+ CountryDetail = TypedDict(
11
+ "CountryDetail",
12
+ {
13
+ "id": "Required[str]",
14
+ "crn": "Required[str]",
15
+ "code": "Required[str]",
16
+ "iso3": "Required[str]",
17
+ "name": "Required[str]",
18
+ "calling_code": "Required[str]",
19
+ "rules": "Required[CountryRules]",
20
+ "postal_lookup": "Required[bool]",
21
+ },
22
+ total=False,
23
+ )
24
+ CountryRules = TypedDict(
25
+ "CountryRules",
26
+ {
27
+ "customer_types": "Required[list[Literal['individual', 'company']]]",
28
+ "name_labels": "Required[dict[str, str]]",
29
+ "tax_ids": "Required[dict[str, list[TaxIDRule]]]",
30
+ "fields": "Required[list[AddressField]]",
31
+ },
32
+ total=False,
33
+ )
34
+ TaxIDRule = TypedDict(
35
+ "TaxIDRule",
36
+ {
37
+ "kind": "Required[str]",
38
+ "label": "Required[str]",
39
+ "mask": "NotRequired[str]",
40
+ "pattern": "NotRequired[str]",
41
+ "validator": "NotRequired[Literal['br_cpf', 'br_cnpj', 'ar_cuit', 'cl_rut']]",
42
+ "example": "NotRequired[str]",
43
+ "required": "Required[bool]",
44
+ },
45
+ total=False,
46
+ )
47
+ AddressField = TypedDict(
48
+ "AddressField",
49
+ {
50
+ "key": "Required[Literal['street_name', 'street_number', 'complement', 'neighborhood', 'city', 'state', 'postal_code']]",
51
+ "label": "Required[str]",
52
+ "required": "Required[bool]",
53
+ "max": "NotRequired[int]",
54
+ "mask": "NotRequired[str]",
55
+ "pattern": "NotRequired[str]",
56
+ "example": "NotRequired[str]",
57
+ "source": "NotRequired[Literal['list', 'free']]",
58
+ "require_metadata": "NotRequired[str]",
59
+ },
60
+ total=False,
61
+ )
62
+ GetCountryResponse: TypeAlias = "GetCountryResult"
7
63
  Region = TypedDict(
8
64
  "Region",
9
65
  {
@@ -22,6 +78,62 @@ Region = TypedDict(
22
78
  GetRegionResponse: TypeAlias = "Region"
23
79
  GetRegionResource: TypeAlias = "GetRegionResponse"
24
80
  GetRegionScope = TypedDict("GetRegionScope", {}, total=False)
81
+ ListCitiesParameters = TypedDict(
82
+ "ListCitiesParameters",
83
+ {
84
+ "state": "NotRequired[str]",
85
+ "country": "NotRequired[str]",
86
+ "q": "NotRequired[str]",
87
+ "limit": "NotRequired[int]",
88
+ },
89
+ total=False,
90
+ )
91
+ ListCitiesQuery: TypeAlias = "ListCitiesParameters"
92
+ ListCitiesResult = TypedDict(
93
+ "ListCitiesResult", {"cities": "Required[list[City]]", "meta": "Required[GeoPage]"}, total=False
94
+ )
95
+ City = TypedDict(
96
+ "City",
97
+ {
98
+ "id": "Required[str]",
99
+ "crn": "Required[str]",
100
+ "name": "Required[str]",
101
+ "country": "Required[ResourceRef]",
102
+ "state": "Required[ResourceRef | Literal[None] | None]",
103
+ },
104
+ total=False,
105
+ )
106
+ ResourceRef = TypedDict(
107
+ "ResourceRef",
108
+ {"id": "Required[str]", "crn": "Required[str]", "name": "NotRequired[str]"},
109
+ total=False,
110
+ )
111
+ GeoPage = TypedDict(
112
+ "GeoPage",
113
+ {"total": "Required[int]", "limit": "Required[int]", "has_more": "Required[bool]"},
114
+ total=False,
115
+ )
116
+ ListCitiesResponse: TypeAlias = "ListCitiesResult"
117
+ ListCitiesItem: TypeAlias = "City"
118
+ ListCountriesResult = TypedDict(
119
+ "ListCountriesResult",
120
+ {"countries": "Required[list[Country]]", "meta": "Required[GeoPage]"},
121
+ total=False,
122
+ )
123
+ Country = TypedDict(
124
+ "Country",
125
+ {
126
+ "id": "Required[str]",
127
+ "crn": "Required[str]",
128
+ "code": "Required[str]",
129
+ "iso3": "Required[str]",
130
+ "name": "Required[str]",
131
+ "calling_code": "Required[str]",
132
+ },
133
+ total=False,
134
+ )
135
+ ListCountriesResponse: TypeAlias = "ListCountriesResult"
136
+ ListCountriesItem: TypeAlias = "Country"
25
137
  ListRegionsParameters = TypedDict(
26
138
  "ListRegionsParameters", {"name": "NotRequired[str]", "crn": "NotRequired[str]"}, total=False
27
139
  )
@@ -33,3 +145,43 @@ ListRegionsResult = TypedDict(
33
145
  )
34
146
  ListRegionsResponse: TypeAlias = "ListRegionsResult"
35
147
  ListRegionsItem: TypeAlias = "Region"
148
+ ListStatesParameters = TypedDict("ListStatesParameters", {"country": "Required[str]"}, total=False)
149
+ ListStatesQuery: TypeAlias = "ListStatesParameters"
150
+ ListStatesResult = TypedDict(
151
+ "ListStatesResult",
152
+ {"states": "Required[list[State]]", "meta": "Required[GeoPage]"},
153
+ total=False,
154
+ )
155
+ State = TypedDict(
156
+ "State",
157
+ {
158
+ "id": "Required[str]",
159
+ "crn": "Required[str]",
160
+ "code": "Required[str]",
161
+ "name": "Required[str]",
162
+ "country": "Required[ResourceRef]",
163
+ },
164
+ total=False,
165
+ )
166
+ ListStatesResponse: TypeAlias = "ListStatesResult"
167
+ ListStatesItem: TypeAlias = "State"
168
+ LookupPostalCodeParameters = TypedDict(
169
+ "LookupPostalCodeParameters", {"country": "Required[str]"}, total=False
170
+ )
171
+ LookupPostalCodeQuery: TypeAlias = "LookupPostalCodeParameters"
172
+ LookupPostalCodeResult = TypedDict(
173
+ "LookupPostalCodeResult", {"postal_code": "Required[PostalCode]"}, total=False
174
+ )
175
+ PostalCode = TypedDict(
176
+ "PostalCode",
177
+ {
178
+ "code": "Required[str]",
179
+ "country": "Required[ResourceRef]",
180
+ "state": "Required[ResourceRef | Literal[None] | None]",
181
+ "city": "Required[ResourceRef | Literal[None] | None]",
182
+ "address": "Required[dict[str, str]]",
183
+ "source": "Required[str]",
184
+ },
185
+ total=False,
186
+ )
187
+ LookupPostalCodeResponse: TypeAlias = "LookupPostalCodeResult"
basaltic/models/kms.py CHANGED
@@ -82,6 +82,79 @@ GetKeyScope = TypedDict(
82
82
  "GetKeyScope", {"limit": "NotRequired[int]", "state": "NotRequired[KeyStateInput]"}, total=False
83
83
  )
84
84
  KeyStateInput: TypeAlias = "Literal['enabled', 'disabled', 'pending_deletion']"
85
+ KeyRotationResponse = TypedDict(
86
+ "KeyRotationResponse", {"rotation": "Required[KeyRotation]"}, total=False
87
+ )
88
+ KeyRotation = TypedDict(
89
+ "KeyRotation",
90
+ {
91
+ "id": "Required[str]",
92
+ "key_id": "Required[str]",
93
+ "trigger": "Required[Literal['on_demand', 'automatic']]",
94
+ "status": "Required[Literal['pending', 'in_progress', 'reconciliation_required', 'succeeded', 'failed']]",
95
+ "previous_version": "Required[int | None]",
96
+ "key_version": "Required[int | None]",
97
+ "requested_at": "Required[str]",
98
+ "started_at": "Required[str | None]",
99
+ "completed_at": "Required[str | None]",
100
+ "error_code": "Required[str | None]",
101
+ },
102
+ total=False,
103
+ )
104
+ GetKeyRotationResponse: TypeAlias = "KeyRotationResponse"
105
+ KeyRotationStatusResponse = TypedDict(
106
+ "KeyRotationStatusResponse", {"rotation": "Required[KeyRotationStatus]"}, total=False
107
+ )
108
+ KeyRotationStatus = TypedDict(
109
+ "KeyRotationStatus",
110
+ {
111
+ "enabled": "Required[bool]",
112
+ "rotation_period_days": "Required[int]",
113
+ "next_rotation_at": "Required[str | None]",
114
+ "current_version": "Required[int]",
115
+ },
116
+ total=False,
117
+ )
118
+ GetKeyRotationStatusResponse: TypeAlias = "KeyRotationStatusResponse"
119
+ GetPublicKeyParameters = TypedDict(
120
+ "GetPublicKeyParameters", {"key_version": "NotRequired[int]"}, total=False
121
+ )
122
+ GetPublicKeyQuery: TypeAlias = "GetPublicKeyParameters"
123
+ PublicKeyResponse = TypedDict(
124
+ "PublicKeyResponse",
125
+ {
126
+ "key_crn": "Required[str]",
127
+ "key_version": "Required[int]",
128
+ "key_spec": "Required[KeySpec]",
129
+ "key_usage": "Required[KeyUsage]",
130
+ "public_key": "Required[str]",
131
+ },
132
+ total=False,
133
+ )
134
+ GetPublicKeyResponse: TypeAlias = "PublicKeyResponse"
135
+ ListKeyRotationsParameters = TypedDict(
136
+ "ListKeyRotationsParameters",
137
+ {"limit": "NotRequired[int]", "marker": "NotRequired[str]"},
138
+ total=False,
139
+ )
140
+ ListKeyRotationsQuery: TypeAlias = "ListKeyRotationsParameters"
141
+ KeyRotationListResponse = TypedDict(
142
+ "KeyRotationListResponse",
143
+ {"rotations": "Required[list[KeyRotation]]", "meta": "Required[PaginationMeta]"},
144
+ total=False,
145
+ )
146
+ PaginationMeta = TypedDict(
147
+ "PaginationMeta",
148
+ {
149
+ "total": "NotRequired[int]",
150
+ "limit": "NotRequired[int]",
151
+ "marker": "NotRequired[str]",
152
+ "has_more": "NotRequired[bool]",
153
+ },
154
+ total=False,
155
+ )
156
+ ListKeyRotationsResponse: TypeAlias = "KeyRotationListResponse"
157
+ ListKeyRotationsItem: TypeAlias = "KeyRotation"
85
158
  ListKeysParameters = TypedDict(
86
159
  "ListKeysParameters",
87
160
  {
@@ -99,23 +172,36 @@ KeyListResponse = TypedDict(
99
172
  {"keys": "NotRequired[list[Key]]", "meta": "NotRequired[PaginationMeta]"},
100
173
  total=False,
101
174
  )
102
- PaginationMeta = TypedDict(
103
- "PaginationMeta",
104
- {
105
- "total": "NotRequired[int]",
106
- "limit": "NotRequired[int]",
107
- "marker": "NotRequired[str]",
108
- "has_more": "NotRequired[bool]",
109
- },
110
- total=False,
111
- )
112
175
  ListKeysResponse: TypeAlias = "KeyListResponse"
113
176
  ListKeysItem: TypeAlias = "Key"
177
+ RewrapRequestInput = TypedDict("RewrapRequestInput", {"ciphertext": "Required[str]"}, total=False)
178
+ RewrapBody: TypeAlias = "RewrapRequestInput"
179
+ RewrapResponse: TypeAlias = "EncryptResponse2"
180
+ RotateKeyOnDemandResponse: TypeAlias = "KeyRotationResponse"
114
181
  ScheduleKeyDeletionRequestInput = TypedDict(
115
182
  "ScheduleKeyDeletionRequestInput", {"recovery_window_days": "NotRequired[int]"}, total=False
116
183
  )
117
184
  ScheduleKeyDeletionBody: TypeAlias = "ScheduleKeyDeletionRequestInput"
118
185
  ScheduleKeyDeletionResponse: TypeAlias = "KeyResponse"
186
+ SetKeyRotationRequestInput = TypedDict(
187
+ "SetKeyRotationRequestInput",
188
+ {"enabled": "Required[bool]", "rotation_period_days": "NotRequired[int]"},
189
+ total=False,
190
+ )
191
+ SetKeyRotationBody: TypeAlias = "SetKeyRotationRequestInput"
192
+ KeyRotationPolicyResponse = TypedDict(
193
+ "KeyRotationPolicyResponse", {"rotation": "Required[KeyRotationPolicy]"}, total=False
194
+ )
195
+ KeyRotationPolicy = TypedDict(
196
+ "KeyRotationPolicy",
197
+ {
198
+ "enabled": "Required[bool]",
199
+ "rotation_period_days": "Required[int]",
200
+ "next_rotation_at": "Required[str | None]",
201
+ },
202
+ total=False,
203
+ )
204
+ SetKeyRotationResponse: TypeAlias = "KeyRotationPolicyResponse"
119
205
  SignRequestInput = TypedDict(
120
206
  "SignRequestInput",
121
207
  {"message": "Required[str]", "signing_algorithm": "NotRequired[SigningAlgorithmInput]"},
@@ -127,7 +213,11 @@ SigningAlgorithmInput: TypeAlias = (
127
213
  SignBody: TypeAlias = "SignRequestInput"
128
214
  SignResponse2 = TypedDict(
129
215
  "SignResponse2",
130
- {"signature": "NotRequired[str]", "signing_algorithm": "NotRequired[SigningAlgorithm]"},
216
+ {
217
+ "key_version": "NotRequired[int]",
218
+ "signature": "NotRequired[str]",
219
+ "signing_algorithm": "NotRequired[SigningAlgorithm]",
220
+ },
131
221
  total=False,
132
222
  )
133
223
  SigningAlgorithm: TypeAlias = (
@@ -144,6 +234,7 @@ UpdateKeyResponse: TypeAlias = "KeyResponse"
144
234
  VerifyRequestInput = TypedDict(
145
235
  "VerifyRequestInput",
146
236
  {
237
+ "key_version": "NotRequired[int]",
147
238
  "message": "Required[str]",
148
239
  "signature": "Required[str]",
149
240
  "signing_algorithm": "NotRequired[SigningAlgorithmInput]",
@@ -17,6 +17,18 @@ from ..response import (
17
17
  )
18
18
 
19
19
  _OPS = {
20
+ "getCountry": Operation(
21
+ id="getCountry",
22
+ method="GET",
23
+ path="/v1/countries/{country}",
24
+ authenticated=False,
25
+ requiredQuery=[],
26
+ requiredHeaders=[],
27
+ queryEncoding={},
28
+ bodyRequired=False,
29
+ contentType="",
30
+ accept="application/json",
31
+ ),
20
32
  "getRegion": Operation(
21
33
  id="getRegion",
22
34
  method="GET",
@@ -29,6 +41,37 @@ _OPS = {
29
41
  contentType="",
30
42
  accept="application/json",
31
43
  ),
44
+ "listCities": Operation(
45
+ id="listCities",
46
+ method="GET",
47
+ path="/v1/cities",
48
+ authenticated=False,
49
+ requiredQuery=[],
50
+ requiredHeaders=[],
51
+ queryEncoding={
52
+ "state": {"style": "form", "explode": True},
53
+ "country": {"style": "form", "explode": True},
54
+ "q": {"style": "form", "explode": True},
55
+ "limit": {"style": "form", "explode": True},
56
+ },
57
+ bodyRequired=False,
58
+ contentType="",
59
+ accept="application/json",
60
+ itemsKey="cities",
61
+ ),
62
+ "listCountries": Operation(
63
+ id="listCountries",
64
+ method="GET",
65
+ path="/v1/countries",
66
+ authenticated=False,
67
+ requiredQuery=[],
68
+ requiredHeaders=[],
69
+ queryEncoding={},
70
+ bodyRequired=False,
71
+ contentType="",
72
+ accept="application/json",
73
+ itemsKey="countries",
74
+ ),
32
75
  "listRegions": Operation(
33
76
  id="listRegions",
34
77
  method="GET",
@@ -45,6 +88,31 @@ _OPS = {
45
88
  accept="application/json",
46
89
  itemsKey="regions",
47
90
  ),
91
+ "listStates": Operation(
92
+ id="listStates",
93
+ method="GET",
94
+ path="/v1/states",
95
+ authenticated=False,
96
+ requiredQuery=["country"],
97
+ requiredHeaders=[],
98
+ queryEncoding={"country": {"style": "form", "explode": True}},
99
+ bodyRequired=False,
100
+ contentType="",
101
+ accept="application/json",
102
+ itemsKey="states",
103
+ ),
104
+ "lookupPostalCode": Operation(
105
+ id="lookupPostalCode",
106
+ method="GET",
107
+ path="/v1/postal-codes/{code}",
108
+ authenticated=False,
109
+ requiredQuery=["country"],
110
+ requiredHeaders=[],
111
+ queryEncoding={"country": {"style": "form", "explode": True}},
112
+ bodyRequired=False,
113
+ contentType="",
114
+ accept="application/json",
115
+ ),
48
116
  }
49
117
 
50
118
 
@@ -52,6 +120,24 @@ class CatalogService:
52
120
  def __init__(self, transport: SyncTransport) -> None:
53
121
  self._transport = transport
54
122
 
123
+ def get_country(
124
+ self, country: str, *, options: RequestOptions | None = None
125
+ ) -> ApiResponse[m.GetCountryResponse]:
126
+ "Get a country and its address rules"
127
+ return cast(
128
+ ApiResponse[m.GetCountryResponse],
129
+ self._transport.request(
130
+ "catalog",
131
+ "https://catalog.basaltic.sh",
132
+ _OPS["getCountry"],
133
+ "json",
134
+ {"country": country},
135
+ UNSET,
136
+ None,
137
+ options,
138
+ ),
139
+ )
140
+
55
141
  def get_region(
56
142
  self, code: str, *, options: RequestOptions | None = None
57
143
  ) -> ApiResponse[m.GetRegionResponse]:
@@ -91,6 +177,42 @@ class CatalogService:
91
177
  ),
92
178
  )
93
179
 
180
+ def list_cities(
181
+ self, *, query: m.ListCitiesQuery | None = None, options: RequestOptions | None = None
182
+ ) -> Page[m.ListCitiesResponse, m.ListCitiesItem]:
183
+ "List cities"
184
+ return cast(
185
+ Page[m.ListCitiesResponse, m.ListCitiesItem],
186
+ self._transport.request(
187
+ "catalog",
188
+ "https://catalog.basaltic.sh",
189
+ _OPS["listCities"],
190
+ "page",
191
+ {},
192
+ UNSET,
193
+ query,
194
+ options,
195
+ ),
196
+ )
197
+
198
+ def list_countries(
199
+ self, *, options: RequestOptions | None = None
200
+ ) -> Page[m.ListCountriesResponse, m.ListCountriesItem]:
201
+ "List countries"
202
+ return cast(
203
+ Page[m.ListCountriesResponse, m.ListCountriesItem],
204
+ self._transport.request(
205
+ "catalog",
206
+ "https://catalog.basaltic.sh",
207
+ _OPS["listCountries"],
208
+ "page",
209
+ {},
210
+ UNSET,
211
+ None,
212
+ options,
213
+ ),
214
+ )
215
+
94
216
  def list_regions(
95
217
  self, *, query: m.ListRegionsQuery | None = None, options: RequestOptions | None = None
96
218
  ) -> Page[m.ListRegionsResponse, m.ListRegionsItem]:
@@ -109,11 +231,65 @@ class CatalogService:
109
231
  ),
110
232
  )
111
233
 
234
+ def list_states(
235
+ self, *, query: m.ListStatesQuery, options: RequestOptions | None = None
236
+ ) -> Page[m.ListStatesResponse, m.ListStatesItem]:
237
+ "List a country's states"
238
+ return cast(
239
+ Page[m.ListStatesResponse, m.ListStatesItem],
240
+ self._transport.request(
241
+ "catalog",
242
+ "https://catalog.basaltic.sh",
243
+ _OPS["listStates"],
244
+ "page",
245
+ {},
246
+ UNSET,
247
+ query,
248
+ options,
249
+ ),
250
+ )
251
+
252
+ def lookup_postal_code(
253
+ self, code: str, *, query: m.LookupPostalCodeQuery, options: RequestOptions | None = None
254
+ ) -> ApiResponse[m.LookupPostalCodeResponse]:
255
+ "Look up a postal code"
256
+ return cast(
257
+ ApiResponse[m.LookupPostalCodeResponse],
258
+ self._transport.request(
259
+ "catalog",
260
+ "https://catalog.basaltic.sh",
261
+ _OPS["lookupPostalCode"],
262
+ "json",
263
+ {"code": code},
264
+ UNSET,
265
+ query,
266
+ options,
267
+ ),
268
+ )
269
+
112
270
 
113
271
  class AsyncCatalogService:
114
272
  def __init__(self, transport: AsyncTransport) -> None:
115
273
  self._transport = transport
116
274
 
275
+ async def get_country(
276
+ self, country: str, *, options: RequestOptions | None = None
277
+ ) -> ApiResponse[m.GetCountryResponse]:
278
+ "Get a country and its address rules"
279
+ return cast(
280
+ ApiResponse[m.GetCountryResponse],
281
+ await self._transport.request(
282
+ "catalog",
283
+ "https://catalog.basaltic.sh",
284
+ _OPS["getCountry"],
285
+ "json",
286
+ {"country": country},
287
+ UNSET,
288
+ None,
289
+ options,
290
+ ),
291
+ )
292
+
117
293
  async def get_region(
118
294
  self, code: str, *, options: RequestOptions | None = None
119
295
  ) -> ApiResponse[m.GetRegionResponse]:
@@ -153,6 +329,42 @@ class AsyncCatalogService:
153
329
  ),
154
330
  )
155
331
 
332
+ async def list_cities(
333
+ self, *, query: m.ListCitiesQuery | None = None, options: RequestOptions | None = None
334
+ ) -> Page[m.ListCitiesResponse, m.ListCitiesItem]:
335
+ "List cities"
336
+ return cast(
337
+ Page[m.ListCitiesResponse, m.ListCitiesItem],
338
+ await self._transport.request(
339
+ "catalog",
340
+ "https://catalog.basaltic.sh",
341
+ _OPS["listCities"],
342
+ "page",
343
+ {},
344
+ UNSET,
345
+ query,
346
+ options,
347
+ ),
348
+ )
349
+
350
+ async def list_countries(
351
+ self, *, options: RequestOptions | None = None
352
+ ) -> Page[m.ListCountriesResponse, m.ListCountriesItem]:
353
+ "List countries"
354
+ return cast(
355
+ Page[m.ListCountriesResponse, m.ListCountriesItem],
356
+ await self._transport.request(
357
+ "catalog",
358
+ "https://catalog.basaltic.sh",
359
+ _OPS["listCountries"],
360
+ "page",
361
+ {},
362
+ UNSET,
363
+ None,
364
+ options,
365
+ ),
366
+ )
367
+
156
368
  async def list_regions(
157
369
  self, *, query: m.ListRegionsQuery | None = None, options: RequestOptions | None = None
158
370
  ) -> Page[m.ListRegionsResponse, m.ListRegionsItem]:
@@ -170,3 +382,39 @@ class AsyncCatalogService:
170
382
  options,
171
383
  ),
172
384
  )
385
+
386
+ async def list_states(
387
+ self, *, query: m.ListStatesQuery, options: RequestOptions | None = None
388
+ ) -> Page[m.ListStatesResponse, m.ListStatesItem]:
389
+ "List a country's states"
390
+ return cast(
391
+ Page[m.ListStatesResponse, m.ListStatesItem],
392
+ await self._transport.request(
393
+ "catalog",
394
+ "https://catalog.basaltic.sh",
395
+ _OPS["listStates"],
396
+ "page",
397
+ {},
398
+ UNSET,
399
+ query,
400
+ options,
401
+ ),
402
+ )
403
+
404
+ async def lookup_postal_code(
405
+ self, code: str, *, query: m.LookupPostalCodeQuery, options: RequestOptions | None = None
406
+ ) -> ApiResponse[m.LookupPostalCodeResponse]:
407
+ "Look up a postal code"
408
+ return cast(
409
+ ApiResponse[m.LookupPostalCodeResponse],
410
+ await self._transport.request(
411
+ "catalog",
412
+ "https://catalog.basaltic.sh",
413
+ _OPS["lookupPostalCode"],
414
+ "json",
415
+ {"code": code},
416
+ UNSET,
417
+ query,
418
+ options,
419
+ ),
420
+ )
basaltic/services/kms.py CHANGED
@@ -116,6 +116,58 @@ _OPS = {
116
116
  contentType="",
117
117
  accept="application/json",
118
118
  ),
119
+ "getKeyRotation": Operation(
120
+ id="getKeyRotation",
121
+ method="GET",
122
+ path="/v1/keys/{key_id}/rotations/{rotation_id}",
123
+ authenticated=True,
124
+ requiredQuery=[],
125
+ requiredHeaders=[],
126
+ queryEncoding={},
127
+ bodyRequired=False,
128
+ contentType="",
129
+ accept="application/json",
130
+ ),
131
+ "getKeyRotationStatus": Operation(
132
+ id="getKeyRotationStatus",
133
+ method="GET",
134
+ path="/v1/keys/{key_id}/rotation",
135
+ authenticated=True,
136
+ requiredQuery=[],
137
+ requiredHeaders=[],
138
+ queryEncoding={},
139
+ bodyRequired=False,
140
+ contentType="",
141
+ accept="application/json",
142
+ ),
143
+ "getPublicKey": Operation(
144
+ id="getPublicKey",
145
+ method="GET",
146
+ path="/v1/keys/{key_id}/public-key",
147
+ authenticated=True,
148
+ requiredQuery=[],
149
+ requiredHeaders=[],
150
+ queryEncoding={"key_version": {"style": "form", "explode": True}},
151
+ bodyRequired=False,
152
+ contentType="",
153
+ accept="application/json",
154
+ ),
155
+ "listKeyRotations": Operation(
156
+ id="listKeyRotations",
157
+ method="GET",
158
+ path="/v1/keys/{key_id}/rotations",
159
+ authenticated=True,
160
+ requiredQuery=[],
161
+ requiredHeaders=[],
162
+ queryEncoding={
163
+ "limit": {"style": "form", "explode": True},
164
+ "marker": {"style": "form", "explode": True},
165
+ },
166
+ bodyRequired=False,
167
+ contentType="",
168
+ accept="application/json",
169
+ itemsKey="rotations",
170
+ ),
119
171
  "listKeys": Operation(
120
172
  id="listKeys",
121
173
  method="GET",
@@ -135,6 +187,30 @@ _OPS = {
135
187
  accept="application/json",
136
188
  itemsKey="keys",
137
189
  ),
190
+ "rewrap": Operation(
191
+ id="rewrap",
192
+ method="POST",
193
+ path="/v1/keys/{key_id}/rewrap",
194
+ authenticated=True,
195
+ requiredQuery=[],
196
+ requiredHeaders=[],
197
+ queryEncoding={},
198
+ bodyRequired=True,
199
+ contentType="application/json",
200
+ accept="application/json",
201
+ ),
202
+ "rotateKeyOnDemand": Operation(
203
+ id="rotateKeyOnDemand",
204
+ method="POST",
205
+ path="/v1/keys/{key_id}/rotate",
206
+ authenticated=True,
207
+ requiredQuery=[],
208
+ requiredHeaders=[],
209
+ queryEncoding={},
210
+ bodyRequired=False,
211
+ contentType="",
212
+ accept="application/json",
213
+ ),
138
214
  "scheduleKeyDeletion": Operation(
139
215
  id="scheduleKeyDeletion",
140
216
  method="POST",
@@ -147,6 +223,18 @@ _OPS = {
147
223
  contentType="application/json",
148
224
  accept="application/json",
149
225
  ),
226
+ "setKeyRotation": Operation(
227
+ id="setKeyRotation",
228
+ method="PUT",
229
+ path="/v1/keys/{key_id}/rotation",
230
+ authenticated=True,
231
+ requiredQuery=[],
232
+ requiredHeaders=[],
233
+ queryEncoding={},
234
+ bodyRequired=True,
235
+ contentType="application/json",
236
+ accept="application/json",
237
+ ),
150
238
  "sign": Operation(
151
239
  id="sign",
152
240
  method="POST",
@@ -359,6 +447,102 @@ class KmsService:
359
447
  ),
360
448
  )
361
449
 
450
+ def get_key_rotation(
451
+ self, key_id: str, rotation_id: str, *, options: RequestOptions | None = None
452
+ ) -> ApiResponse[m.GetKeyRotationResponse]:
453
+ "Get a key rotation"
454
+ return cast(
455
+ ApiResponse[m.GetKeyRotationResponse],
456
+ self._transport.request(
457
+ "kms",
458
+ "https://kms.{region}.basaltic.sh",
459
+ _OPS["getKeyRotation"],
460
+ "json",
461
+ {"key_id": key_id, "rotation_id": rotation_id},
462
+ UNSET,
463
+ None,
464
+ options,
465
+ ),
466
+ )
467
+
468
+ def get_key_rotation_status(
469
+ self, key_id: str, *, options: RequestOptions | None = None
470
+ ) -> ApiResponse[m.GetKeyRotationStatusResponse]:
471
+ "Get key rotation status"
472
+ return cast(
473
+ ApiResponse[m.GetKeyRotationStatusResponse],
474
+ self._transport.request(
475
+ "kms",
476
+ "https://kms.{region}.basaltic.sh",
477
+ _OPS["getKeyRotationStatus"],
478
+ "json",
479
+ {"key_id": key_id},
480
+ UNSET,
481
+ None,
482
+ options,
483
+ ),
484
+ )
485
+
486
+ def get_public_key(
487
+ self,
488
+ key_id: str,
489
+ *,
490
+ query: m.GetPublicKeyQuery | None = None,
491
+ options: RequestOptions | None = None,
492
+ ) -> ApiResponse[m.GetPublicKeyResponse]:
493
+ "Get a versioned public key"
494
+ return cast(
495
+ ApiResponse[m.GetPublicKeyResponse],
496
+ self._transport.request(
497
+ "kms",
498
+ "https://kms.{region}.basaltic.sh",
499
+ _OPS["getPublicKey"],
500
+ "json",
501
+ {"key_id": key_id},
502
+ UNSET,
503
+ query,
504
+ options,
505
+ ),
506
+ )
507
+
508
+ def list_key_rotations(
509
+ self,
510
+ key_id: str,
511
+ *,
512
+ query: m.ListKeyRotationsQuery | None = None,
513
+ options: RequestOptions | None = None,
514
+ ) -> Page[m.ListKeyRotationsResponse, m.ListKeyRotationsItem]:
515
+ "List key rotation history"
516
+ return cast(
517
+ Page[m.ListKeyRotationsResponse, m.ListKeyRotationsItem],
518
+ self._transport.request(
519
+ "kms",
520
+ "https://kms.{region}.basaltic.sh",
521
+ _OPS["listKeyRotations"],
522
+ "page",
523
+ {"key_id": key_id},
524
+ UNSET,
525
+ query,
526
+ options,
527
+ ),
528
+ )
529
+
530
+ def list_key_rotations_all(
531
+ self,
532
+ key_id: str,
533
+ *,
534
+ query: m.ListKeyRotationsQuery | None = None,
535
+ options: RequestOptions | None = None,
536
+ ) -> Iterator[m.ListKeyRotationsItem]:
537
+ return iterate_pages(
538
+ lambda marker: self.list_key_rotations(
539
+ key_id,
540
+ query=cast(m.ListKeyRotationsQuery, {**(query or {}), "marker": marker}),
541
+ options=options,
542
+ ),
543
+ (query or {}).get("marker", ""),
544
+ )
545
+
362
546
  def list_keys(
363
547
  self, *, query: m.ListKeysQuery | None = None, options: RequestOptions | None = None
364
548
  ) -> Page[m.ListKeysResponse, m.ListKeysItem]:
@@ -387,6 +571,42 @@ class KmsService:
387
571
  (query or {}).get("marker", ""),
388
572
  )
389
573
 
574
+ def rewrap(
575
+ self, key_id: str, body: m.RewrapBody, *, options: RequestOptions | None = None
576
+ ) -> ApiResponse[m.RewrapResponse]:
577
+ "Rewrap ciphertext with current key material"
578
+ return cast(
579
+ ApiResponse[m.RewrapResponse],
580
+ self._transport.request(
581
+ "kms",
582
+ "https://kms.{region}.basaltic.sh",
583
+ _OPS["rewrap"],
584
+ "json",
585
+ {"key_id": key_id},
586
+ body,
587
+ None,
588
+ options,
589
+ ),
590
+ )
591
+
592
+ def rotate_key_on_demand(
593
+ self, key_id: str, *, options: RequestOptions | None = None
594
+ ) -> ApiResponse[m.RotateKeyOnDemandResponse]:
595
+ "Rotate key material now"
596
+ return cast(
597
+ ApiResponse[m.RotateKeyOnDemandResponse],
598
+ self._transport.request(
599
+ "kms",
600
+ "https://kms.{region}.basaltic.sh",
601
+ _OPS["rotateKeyOnDemand"],
602
+ "json",
603
+ {"key_id": key_id},
604
+ UNSET,
605
+ None,
606
+ options,
607
+ ),
608
+ )
609
+
390
610
  def schedule_key_deletion(
391
611
  self,
392
612
  key_id: str,
@@ -409,6 +629,24 @@ class KmsService:
409
629
  ),
410
630
  )
411
631
 
632
+ def set_key_rotation(
633
+ self, key_id: str, body: m.SetKeyRotationBody, *, options: RequestOptions | None = None
634
+ ) -> ApiResponse[m.SetKeyRotationResponse]:
635
+ "Configure automatic key rotation"
636
+ return cast(
637
+ ApiResponse[m.SetKeyRotationResponse],
638
+ self._transport.request(
639
+ "kms",
640
+ "https://kms.{region}.basaltic.sh",
641
+ _OPS["setKeyRotation"],
642
+ "json",
643
+ {"key_id": key_id},
644
+ body,
645
+ None,
646
+ options,
647
+ ),
648
+ )
649
+
412
650
  def sign(
413
651
  self, key_id: str, body: m.SignBody, *, options: RequestOptions | None = None
414
652
  ) -> ApiResponse[m.SignResponse]:
@@ -637,6 +875,102 @@ class AsyncKmsService:
637
875
  ),
638
876
  )
639
877
 
878
+ async def get_key_rotation(
879
+ self, key_id: str, rotation_id: str, *, options: RequestOptions | None = None
880
+ ) -> ApiResponse[m.GetKeyRotationResponse]:
881
+ "Get a key rotation"
882
+ return cast(
883
+ ApiResponse[m.GetKeyRotationResponse],
884
+ await self._transport.request(
885
+ "kms",
886
+ "https://kms.{region}.basaltic.sh",
887
+ _OPS["getKeyRotation"],
888
+ "json",
889
+ {"key_id": key_id, "rotation_id": rotation_id},
890
+ UNSET,
891
+ None,
892
+ options,
893
+ ),
894
+ )
895
+
896
+ async def get_key_rotation_status(
897
+ self, key_id: str, *, options: RequestOptions | None = None
898
+ ) -> ApiResponse[m.GetKeyRotationStatusResponse]:
899
+ "Get key rotation status"
900
+ return cast(
901
+ ApiResponse[m.GetKeyRotationStatusResponse],
902
+ await self._transport.request(
903
+ "kms",
904
+ "https://kms.{region}.basaltic.sh",
905
+ _OPS["getKeyRotationStatus"],
906
+ "json",
907
+ {"key_id": key_id},
908
+ UNSET,
909
+ None,
910
+ options,
911
+ ),
912
+ )
913
+
914
+ async def get_public_key(
915
+ self,
916
+ key_id: str,
917
+ *,
918
+ query: m.GetPublicKeyQuery | None = None,
919
+ options: RequestOptions | None = None,
920
+ ) -> ApiResponse[m.GetPublicKeyResponse]:
921
+ "Get a versioned public key"
922
+ return cast(
923
+ ApiResponse[m.GetPublicKeyResponse],
924
+ await self._transport.request(
925
+ "kms",
926
+ "https://kms.{region}.basaltic.sh",
927
+ _OPS["getPublicKey"],
928
+ "json",
929
+ {"key_id": key_id},
930
+ UNSET,
931
+ query,
932
+ options,
933
+ ),
934
+ )
935
+
936
+ async def list_key_rotations(
937
+ self,
938
+ key_id: str,
939
+ *,
940
+ query: m.ListKeyRotationsQuery | None = None,
941
+ options: RequestOptions | None = None,
942
+ ) -> Page[m.ListKeyRotationsResponse, m.ListKeyRotationsItem]:
943
+ "List key rotation history"
944
+ return cast(
945
+ Page[m.ListKeyRotationsResponse, m.ListKeyRotationsItem],
946
+ await self._transport.request(
947
+ "kms",
948
+ "https://kms.{region}.basaltic.sh",
949
+ _OPS["listKeyRotations"],
950
+ "page",
951
+ {"key_id": key_id},
952
+ UNSET,
953
+ query,
954
+ options,
955
+ ),
956
+ )
957
+
958
+ def list_key_rotations_all(
959
+ self,
960
+ key_id: str,
961
+ *,
962
+ query: m.ListKeyRotationsQuery | None = None,
963
+ options: RequestOptions | None = None,
964
+ ) -> AsyncIterator[m.ListKeyRotationsItem]:
965
+ return aiterate_pages(
966
+ lambda marker: self.list_key_rotations(
967
+ key_id,
968
+ query=cast(m.ListKeyRotationsQuery, {**(query or {}), "marker": marker}),
969
+ options=options,
970
+ ),
971
+ (query or {}).get("marker", ""),
972
+ )
973
+
640
974
  async def list_keys(
641
975
  self, *, query: m.ListKeysQuery | None = None, options: RequestOptions | None = None
642
976
  ) -> Page[m.ListKeysResponse, m.ListKeysItem]:
@@ -665,6 +999,42 @@ class AsyncKmsService:
665
999
  (query or {}).get("marker", ""),
666
1000
  )
667
1001
 
1002
+ async def rewrap(
1003
+ self, key_id: str, body: m.RewrapBody, *, options: RequestOptions | None = None
1004
+ ) -> ApiResponse[m.RewrapResponse]:
1005
+ "Rewrap ciphertext with current key material"
1006
+ return cast(
1007
+ ApiResponse[m.RewrapResponse],
1008
+ await self._transport.request(
1009
+ "kms",
1010
+ "https://kms.{region}.basaltic.sh",
1011
+ _OPS["rewrap"],
1012
+ "json",
1013
+ {"key_id": key_id},
1014
+ body,
1015
+ None,
1016
+ options,
1017
+ ),
1018
+ )
1019
+
1020
+ async def rotate_key_on_demand(
1021
+ self, key_id: str, *, options: RequestOptions | None = None
1022
+ ) -> ApiResponse[m.RotateKeyOnDemandResponse]:
1023
+ "Rotate key material now"
1024
+ return cast(
1025
+ ApiResponse[m.RotateKeyOnDemandResponse],
1026
+ await self._transport.request(
1027
+ "kms",
1028
+ "https://kms.{region}.basaltic.sh",
1029
+ _OPS["rotateKeyOnDemand"],
1030
+ "json",
1031
+ {"key_id": key_id},
1032
+ UNSET,
1033
+ None,
1034
+ options,
1035
+ ),
1036
+ )
1037
+
668
1038
  async def schedule_key_deletion(
669
1039
  self,
670
1040
  key_id: str,
@@ -687,6 +1057,24 @@ class AsyncKmsService:
687
1057
  ),
688
1058
  )
689
1059
 
1060
+ async def set_key_rotation(
1061
+ self, key_id: str, body: m.SetKeyRotationBody, *, options: RequestOptions | None = None
1062
+ ) -> ApiResponse[m.SetKeyRotationResponse]:
1063
+ "Configure automatic key rotation"
1064
+ return cast(
1065
+ ApiResponse[m.SetKeyRotationResponse],
1066
+ await self._transport.request(
1067
+ "kms",
1068
+ "https://kms.{region}.basaltic.sh",
1069
+ _OPS["setKeyRotation"],
1070
+ "json",
1071
+ {"key_id": key_id},
1072
+ body,
1073
+ None,
1074
+ options,
1075
+ ),
1076
+ )
1077
+
690
1078
  async def sign(
691
1079
  self, key_id: str, body: m.SignBody, *, options: RequestOptions | None = None
692
1080
  ) -> ApiResponse[m.SignResponse]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: basaltic-sdk-python
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: Official typed synchronous and asynchronous Python SDK for Basaltic
5
5
  Project-URL: Homepage, https://basaltic.sh
6
6
  Project-URL: Documentation, https://docs.basaltic.sh
@@ -209,3 +209,17 @@ python -m pip install -r requirements-dev.txt -e .
209
209
  python scripts/check.py
210
210
  python scripts/check_package.py
211
211
  ```
212
+
213
+ ## KMS key rotation
214
+
215
+ The KMS client supports automatic rotation policies, on-demand rotation, paginated
216
+ rotation history, public keys by material version, and ciphertext rewrapping.
217
+ Reuse an idempotency key when retrying the same on-demand rotation. A `202`
218
+ response represents accepted work; poll its rotation ID until it completes.
219
+ Persist the material version returned by signing and supply it when verifying
220
+ or retrieving a public key. Verification without a version remains compatible
221
+ with older signatures. Rotation retains existing key identities and historical
222
+ material; it does not rewrite stored ciphertext.
223
+
224
+ See [KMS rotation](https://docs.basaltic.sh/kms/rotation) for the lifecycle,
225
+ permissions, and migration workflow.
@@ -2,7 +2,7 @@ basaltic/__init__.py,sha256=_DOarOalYKxGZDb7j-IaOTUOm5qWHhmL90pS8YB32l8,1298
2
2
  basaltic/_client.py,sha256=NS_ke6EWKCn9v1KHV8ffr3hk0vSKT0BPgeh75rhWqcg,4708
3
3
  basaltic/_common.py,sha256=qrI-57XKQc13ZJvafA5gXn9dYp9-jjbVYXhYRUuMK2E,9860
4
4
  basaltic/_transport.py,sha256=cktv1mnEhOkNOOsGT7vvUmvfvZmZdYhvyAyju7NO03Y,8332
5
- basaltic/_version.py,sha256=gB7wyYlVPzpNwiNsFd1XEH74iEFJKXy9MlO6WWp5CQk,51
5
+ basaltic/_version.py,sha256=_KZl-gUhbxxW1DjTCLKKJmvhjEf2WgNTnCZNKLAXCb4,51
6
6
  basaltic/auth.py,sha256=ZD5ut4todK42pMEF-ZF2exT6GuFtjn-lGdylH3Z3ySQ,8315
7
7
  basaltic/client.py,sha256=Y09SmqWpJFSYZcT9l1oo3o1qSKetEXJ68RLOklM19CQ,4622
8
8
  basaltic/config.py,sha256=LNnDMqxRaUz59F1F1u7-kGrrexaLhjRt2taE09FbZT0,5464
@@ -10,14 +10,14 @@ basaltic/errors.py,sha256=hRgdkgXGRTtVIfVQzAdJNIqivwcVOSb_F3hZXiZ9bcE,2070
10
10
  basaltic/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
11
  basaltic/response.py,sha256=7AX0bYDG3k9RyKocvYNwbB0AlFs0urDbFnt_SF0m7uE,4999
12
12
  basaltic/models/__init__.py,sha256=_uuUVyqBGMTS1tIoki7t7u7HOpIHx0kmAkaliv5AyOo,548
13
- basaltic/models/audit.py,sha256=7j-ESdkwu96_R2XbfDCqVmbYS573P4WXloBKn1fHNnQ,2971
14
- basaltic/models/billing.py,sha256=ghmfXQqoeeE6C6NbWQo5U6rQhsJ2WuaE7bDFuBve2e4,9851
15
- basaltic/models/catalog.py,sha256=zNHZACb-S9_MQuLeAWd-p_jKkRP-OqJ_7ckaEexSSVc,1229
13
+ basaltic/models/audit.py,sha256=IM9FZ7MhoqB1F32w7fyybx-wnBTR-v8Gr9viwWHvASA,3698
14
+ basaltic/models/billing.py,sha256=LM63U3pD2oHogO-SRaDAkN2p1VyLhG6AbRO0o-oji78,10365
15
+ basaltic/models/catalog.py,sha256=qgJb_EwhEVZpBSuP0NAYcPDVcZ4ObwlWtZIzZ3h0sfw,5921
16
16
  basaltic/models/certificate.py,sha256=8Xh0r-fxZKZf_KuGIiykBa7ok7ac0CW2a5s8lEQPlCQ,4480
17
17
  basaltic/models/compute.py,sha256=mtfWAVkCly-E1IMmSMKniv8D-vCujQgTN4gsYOTxmVw,36178
18
18
  basaltic/models/dns.py,sha256=cVojfLVbhGE5_hJHf3eLXEJCbMd8REaQ2x-iBt5rOAc,8732
19
19
  basaltic/models/iam.py,sha256=Xq5lF3MbKhr0F8c-liZgxFBqNWFjWl2PljAUs-2Wx9o,27426
20
- basaltic/models/kms.py,sha256=Z7LXqJ110wtxD8OHqotCuqlwzQeGsnb5I4G4gGdB94E,5724
20
+ basaltic/models/kms.py,sha256=In5QSyQlaekyFDq1bnouxHjjzaNpwSwAKu_Kbfoo5pg,9005
21
21
  basaltic/models/loadbalancer.py,sha256=zd0LeaujchvCpBL38jQMMYr75c96I6Xe25HFyUG3T80,24368
22
22
  basaltic/models/network.py,sha256=jSZ0Oi20FkZqyAsp86C4o8OOWOW6w_UNYHGvDWR83OM,35702
23
23
  basaltic/models/quota.py,sha256=-PB3pETNQRGOiDb2sxr6eA7nofIf3S_dh8DbON2-aWg,992
@@ -28,12 +28,12 @@ basaltic/models/workspace.py,sha256=wtMC-WLsEV5am3CkPS7WRTRe_Ay_b3VmOWb64pu8YSQ,
28
28
  basaltic/services/__init__.py,sha256=euiXNIZh01el-j2wG6Hw29NDfg6hK0BlQXUDaOkod_4,62
29
29
  basaltic/services/audit.py,sha256=qK17LjOZP8tFWkOVB8bBJfZSzupGRFNIlyxIHb25lWY,6775
30
30
  basaltic/services/billing.py,sha256=vHTuXtatJgPjPf0gm-_py2uJ6-hruSpdAzHOFXbBXPQ,24758
31
- basaltic/services/catalog.py,sha256=V0wIpG5KqqEu3DZqsAQnWY_eVmwSXIb1Th9UiKylz44,4972
31
+ basaltic/services/catalog.py,sha256=xi_DqOKsTAfT7VKVMcOHFJHf6ExhPjKH0dpAFyGwJtA,12634
32
32
  basaltic/services/certificate.py,sha256=INgW1oVrHomqz94YH8w6-6ae7wrsdKQow8x51LdMfpE,12786
33
33
  basaltic/services/compute.py,sha256=EEy_PPXb8VEVDczSSgZn1qGuOP5k5gnVr14Gd5qtZTY,76401
34
34
  basaltic/services/dns.py,sha256=9JKihOiKzixfZ5EYtfWs626hFkfXO3JWTmc3kwhsiVY,32571
35
35
  basaltic/services/iam.py,sha256=sY2FZYwfcc_PCVWp2Zzs-4rfUd5uhiSskB2YJgcfXhE,109709
36
- basaltic/services/kms.py,sha256=mpYP00PKXPMfeveu0wde2sm-ZutTEx98mt8AkzFAWK8,22021
36
+ basaltic/services/kms.py,sha256=Oxur9qOZfxXwcPTLwjcX8YIYH4Jw1H6aGPWzleJkAeY,34123
37
37
  basaltic/services/loadbalancer.py,sha256=KhQAc2FWTF5PhUnNZFK8C0QjCzaPBAWyh5mdz7D2o8Q,54850
38
38
  basaltic/services/network.py,sha256=gbNbUHIEOMmvQk1G3ls9EXVnl0bQIr-j4O_DvFCDr0g,152645
39
39
  basaltic/services/quota.py,sha256=jStxHg0ZKlTQGJ1Oz4KZhoJzY2dbEKEX8Moaz6L-Yvo,2059
@@ -41,7 +41,7 @@ basaltic/services/secrets.py,sha256=W9QOCBIIgnH9g_i46nBDWRtwp3UyE1TBJ0tUWTFp6Ic,
41
41
  basaltic/services/storage.py,sha256=mj2WAPT6ELD5K34Wp2d4SAFZtOlOOvJ1Sf0cist-ezg,95012
42
42
  basaltic/services/telemetry.py,sha256=vPBVOIr_HIVqekDOZeAoxcvcDDEbX6sZXkzPI38Q_Ow,41777
43
43
  basaltic/services/workspace.py,sha256=86x_ymclTzvEXStJ8gFd0S_VCGeYjD2PQ0QkDg4ijW4,123641
44
- basaltic_sdk_python-0.3.0.dist-info/METADATA,sha256=t1FnJBAezXOFKHzbcQeEoMu6Je3rRhBcGvpbOjXwo00,9261
45
- basaltic_sdk_python-0.3.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
46
- basaltic_sdk_python-0.3.0.dist-info/licenses/LICENSE,sha256=UWjn6PoPejts2Bgdk0SJ6pB3-2l2Bgh7Fr7WENHGSs0,11339
47
- basaltic_sdk_python-0.3.0.dist-info/RECORD,,
44
+ basaltic_sdk_python-0.4.0.dist-info/METADATA,sha256=39U2va-Cv7Ldv7nt2YXu1u0Z2NUoZKngH0Y9H-SwcoA,9995
45
+ basaltic_sdk_python-0.4.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
46
+ basaltic_sdk_python-0.4.0.dist-info/licenses/LICENSE,sha256=UWjn6PoPejts2Bgdk0SJ6pB3-2l2Bgh7Fr7WENHGSs0,11339
47
+ basaltic_sdk_python-0.4.0.dist-info/RECORD,,