Skip to content

Commit 7bbe42e

Browse files
Sync monorepo state at "update python userstore sample for data types" (#99)
Syncing from userclouds/userclouds@6ee49350b266e518c9423db9bfa88f150499114b
1 parent 499972d commit 7bbe42e

File tree

7 files changed

+389
-49
lines changed

7 files changed

+389
-49
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Changelog
22

3+
## UNPUBLISHED
4+
5+
- Add methods for creating, retrieving, updating, and deleting ColumnDataTypes
6+
- Add data_type field to Column that refers to a ColumnDataType
7+
- Add input_data_type and output_data_type fields to Transformer that refer to ColumnDataTypes
8+
- Add ColumnDataType resource IDs for native ColumnDataTypes
9+
- Update userstore_sample.py to interact with ColumnDataTypes
10+
311
## 1.6.1
412

513
- Add SDK method for data import via ExecuteMutator

src/usercloudssdk/asyncclient.py

Lines changed: 65 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
AccessPolicyTemplate,
2121
Column,
2222
ColumnConsentedPurposes,
23+
ColumnDataType,
2324
ColumnRetentionDurationResponse,
2425
ColumnRetentionDurationsResponse,
2526
Edge,
@@ -185,9 +186,59 @@ async def CreateUserWithMutatorAsync(
185186
}
186187
return await self._post_async("/userstore/api/users", json_data=body)
187188

189+
# ColumnDataType Operations
190+
191+
async def CreateColumnDataTypeAsync(
192+
self, dataType: ColumnDataType, if_not_exists: bool = False
193+
) -> ColumnDataType:
194+
try:
195+
resp_json = await self._post_async(
196+
"/userstore/config/datatypes",
197+
json_data={"data_type": dataType.__dict__},
198+
)
199+
return ColumnDataType.from_json(resp_json)
200+
except UserCloudsSDKError as err:
201+
if if_not_exists:
202+
dataType.id = _id_from_identical_conflict(err)
203+
return dataType
204+
raise err
205+
206+
async def DeleteColumnDataTypeAsync(self, id: uuid.UUID) -> bool:
207+
return await self._delete_async(f"/userstore/config/datatypes/{id}")
208+
209+
async def GetColumnDataTypeAsync(self, id: uuid.UUID) -> ColumnDataType:
210+
resp_json = await self._get_async(f"/userstore/config/datatypes/{id}")
211+
return ColumnDataType.from_json(resp_json)
212+
213+
async def ListColumnDataTypesAsync(
214+
self, limit: int = 0, starting_after: uuid.UUID | None = None
215+
) -> list[ColumnDataType]:
216+
params: dict[str, int | str] = {}
217+
if limit > 0:
218+
params["limit"] = limit
219+
if starting_after is not None:
220+
params["starting_after"] = f"id:{starting_after}"
221+
params["version"] = "3"
222+
resp_json = await self._get_async("/userstore/config/datatypes", params=params)
223+
dataTypes = [
224+
ColumnDataType.from_json(dataType) for dataType in resp_json["data"]
225+
]
226+
return dataTypes
227+
228+
async def UpdateColumnDataTypeAsync(
229+
self, dataType: ColumnDataType
230+
) -> ColumnDataType:
231+
resp_json = await self._put_async(
232+
f"/userstore/config/datatypes/{dataType.id}",
233+
json_data={"data_type": dataType.__dict__},
234+
)
235+
return ColumnDataType.from_json(resp_json)
236+
188237
# Column Operations
189238

190-
async def CreateColumnAsync(self, column: Column, if_not_exists=False) -> Column:
239+
async def CreateColumnAsync(
240+
self, column: Column, if_not_exists: bool = False
241+
) -> Column:
191242
try:
192243
resp_json = await self._post_async(
193244
"/userstore/config/columns", json_data={"column": column.__dict__}
@@ -229,7 +280,7 @@ async def UpdateColumnAsync(self, column: Column) -> Column:
229280
# Purpose Operations
230281

231282
async def CreatePurposeAsync(
232-
self, purpose: Purpose, if_not_exists=False
283+
self, purpose: Purpose, if_not_exists: bool = False
233284
) -> Purpose:
234285
try:
235286
resp_json = await self._post_async(
@@ -438,7 +489,7 @@ async def UpdateSoftDeletedRetentionDurationsOnColumnAsync(
438489
# Access Policy Templates
439490

440491
async def CreateAccessPolicyTemplateAsync(
441-
self, access_policy_template: AccessPolicyTemplate, if_not_exists=False
492+
self, access_policy_template: AccessPolicyTemplate, if_not_exists: bool = False
442493
) -> AccessPolicyTemplate | UserCloudsSDKError:
443494
try:
444495
resp_json = await self._post_async(
@@ -498,7 +549,7 @@ async def DeleteAccessPolicyTemplateAsync(self, id: uuid.UUID, version: int):
498549
# Access Policies
499550

500551
async def CreateAccessPolicyAsync(
501-
self, access_policy: AccessPolicy, if_not_exists=False
552+
self, access_policy: AccessPolicy, if_not_exists: bool = False
502553
) -> AccessPolicy | UserCloudsSDKError:
503554
try:
504555
resp_json = await self._post_async(
@@ -552,7 +603,7 @@ async def DeleteAccessPolicyAsync(self, id: uuid.UUID, version: int):
552603
# Transformers
553604

554605
async def CreateTransformerAsync(
555-
self, transformer: Transformer, if_not_exists=False
606+
self, transformer: Transformer, if_not_exists: bool = False
556607
):
557608
try:
558609
resp_json = await self._post_async(
@@ -589,7 +640,7 @@ async def DeleteTransformerAsync(self, id: uuid.UUID):
589640
# Accessor Operations
590641

591642
async def CreateAccessorAsync(
592-
self, accessor: Accessor, if_not_exists=False
643+
self, accessor: Accessor, if_not_exists: bool = False
593644
) -> Accessor:
594645
try:
595646
resp_json = await self._post_async(
@@ -643,7 +694,7 @@ async def ExecuteAccessorAsync(
643694
# Mutator Operations
644695

645696
async def CreateMutatorAsync(
646-
self, mutator: Mutator, if_not_exists=False
697+
self, mutator: Mutator, if_not_exists: bool = False
647698
) -> Mutator:
648699
try:
649700
resp_json = await self._post_async(
@@ -783,7 +834,9 @@ async def ListObjectsAsync(
783834
objects = [Object.from_json(o) for o in j["data"]]
784835
return objects
785836

786-
async def CreateObjectAsync(self, object: Object, if_not_exists=False) -> Object:
837+
async def CreateObjectAsync(
838+
self, object: Object, if_not_exists: bool = False
839+
) -> Object:
787840
try:
788841
j = await self._post_async(
789842
"/authz/objects", json_data={"object": object.__dict__}
@@ -816,7 +869,7 @@ async def ListEdgesAsync(
816869
edges = [Edge.from_json(e) for e in j["data"]]
817870
return edges
818871

819-
async def CreateEdgeAsync(self, edge: Edge, if_not_exists=False) -> Edge:
872+
async def CreateEdgeAsync(self, edge: Edge, if_not_exists: bool = False) -> Edge:
820873
try:
821874
j = await self._post_async(
822875
"/authz/edges", json_data={"edge": edge.__dict__}
@@ -850,7 +903,7 @@ async def ListObjectTypesAsync(
850903
return object_types
851904

852905
async def CreateObjectTypeAsync(
853-
self, object_type: ObjectType, if_not_exists=False
906+
self, object_type: ObjectType, if_not_exists: bool = False
854907
) -> ObjectType:
855908
try:
856909
j = await self._post_async(
@@ -885,7 +938,7 @@ async def ListEdgeTypesAsync(
885938
return edge_types
886939

887940
async def CreateEdgeTypeAsync(
888-
self, edge_type: EdgeType, if_not_exists=False
941+
self, edge_type: EdgeType, if_not_exists: bool = False
889942
) -> EdgeType:
890943
try:
891944
j = await self._post_async(
@@ -920,7 +973,7 @@ async def ListOrganizationsAsync(
920973
return organizations
921974

922975
async def CreateOrganizationAsync(
923-
self, organization: Organization, if_not_exists=False
976+
self, organization: Organization, if_not_exists: bool = False
924977
) -> Organization:
925978
try:
926979
json_data = await self._post_async(

src/usercloudssdk/client.py

Lines changed: 63 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
AccessPolicyTemplate,
2020
Column,
2121
ColumnConsentedPurposes,
22+
ColumnDataType,
2223
ColumnRetentionDurationResponse,
2324
ColumnRetentionDurationsResponse,
2425
Edge,
@@ -179,9 +180,55 @@ def CreateUserWithMutator(
179180
}
180181
return self._post("/userstore/api/users", json_data=body)
181182

183+
# ColumnDataType Operations
184+
185+
def CreateColumnDataType(
186+
self, dataType: ColumnDataType, if_not_exists: bool = False
187+
) -> ColumnDataType:
188+
try:
189+
resp_json = self._post(
190+
"/userstore/config/datatypes",
191+
json_data={"data_type": dataType.__dict__},
192+
)
193+
return ColumnDataType.from_json(resp_json)
194+
except UserCloudsSDKError as err:
195+
if if_not_exists:
196+
dataType.id = _id_from_identical_conflict(err)
197+
return dataType
198+
raise err
199+
200+
def DeleteColumnDataType(self, id: uuid.UUID) -> bool:
201+
return self._delete(f"/userstore/config/datatypes/{id}")
202+
203+
def GetColumnDataType(self, id: uuid.UUID) -> ColumnDataType:
204+
resp_json = self._get(f"/userstore/config/datatypes/{id}")
205+
return ColumnDataType.from_json(resp_json)
206+
207+
def ListColumnDataTypes(
208+
self, limit: int = 0, starting_after: uuid.UUID | None = None
209+
) -> list[ColumnDataType]:
210+
params: dict[str, int | str] = {}
211+
if limit > 0:
212+
params["limit"] = limit
213+
if starting_after is not None:
214+
params["starting_after"] = f"id:{starting_after}"
215+
params["version"] = "3"
216+
resp_json = self._get("/userstore/config/datatypes", params=params)
217+
dataTypes = [
218+
ColumnDataType.from_json(dataType) for dataType in resp_json["data"]
219+
]
220+
return dataTypes
221+
222+
def UpdateColumnDataType(self, dataType: ColumnDataType) -> ColumnDataType:
223+
resp_json = self._put(
224+
f"/userstore/config/datatypes/{dataType.id}",
225+
json_data={"data_type": dataType.__dict__},
226+
)
227+
return ColumnDataType.from_json(resp_json)
228+
182229
# Column Operations
183230

184-
def CreateColumn(self, column: Column, if_not_exists=False) -> Column:
231+
def CreateColumn(self, column: Column, if_not_exists: bool = False) -> Column:
185232
try:
186233
resp_json = self._post(
187234
"/userstore/config/columns", json_data={"column": column.__dict__}
@@ -222,7 +269,7 @@ def UpdateColumn(self, column: Column) -> Column:
222269

223270
# Purpose Operations
224271

225-
def CreatePurpose(self, purpose: Purpose, if_not_exists=False) -> Purpose:
272+
def CreatePurpose(self, purpose: Purpose, if_not_exists: bool = False) -> Purpose:
226273
try:
227274
resp_json = self._post(
228275
"/userstore/config/purposes", json_data={"purpose": purpose.__dict__}
@@ -428,7 +475,7 @@ def UpdateSoftDeletedRetentionDurationsOnColumn(
428475
# Access Policy Templates
429476

430477
def CreateAccessPolicyTemplate(
431-
self, access_policy_template: AccessPolicyTemplate, if_not_exists=False
478+
self, access_policy_template: AccessPolicyTemplate, if_not_exists: bool = False
432479
) -> AccessPolicyTemplate | UserCloudsSDKError:
433480
try:
434481
resp_json = self._post(
@@ -480,7 +527,7 @@ def DeleteAccessPolicyTemplate(self, id: uuid.UUID, version: int):
480527
# Access Policies
481528

482529
def CreateAccessPolicy(
483-
self, access_policy: AccessPolicy, if_not_exists=False
530+
self, access_policy: AccessPolicy, if_not_exists: bool = False
484531
) -> AccessPolicy | UserCloudsSDKError:
485532
try:
486533
resp_json = self._post(
@@ -531,7 +578,7 @@ def DeleteAccessPolicy(self, id: uuid.UUID, version: int):
531578

532579
# Transformers
533580

534-
def CreateTransformer(self, transformer: Transformer, if_not_exists=False):
581+
def CreateTransformer(self, transformer: Transformer, if_not_exists: bool = False):
535582
try:
536583
resp_json = self._post(
537584
"/tokenizer/policies/transformation",
@@ -562,7 +609,9 @@ def DeleteTransformer(self, id: uuid.UUID):
562609

563610
# Accessor Operations
564611

565-
def CreateAccessor(self, accessor: Accessor, if_not_exists=False) -> Accessor:
612+
def CreateAccessor(
613+
self, accessor: Accessor, if_not_exists: bool = False
614+
) -> Accessor:
566615
try:
567616
resp_json = self._post(
568617
"/userstore/config/accessors", json_data={"accessor": accessor.__dict__}
@@ -614,7 +663,7 @@ def ExecuteAccessor(
614663

615664
# Mutator Operations
616665

617-
def CreateMutator(self, mutator: Mutator, if_not_exists=False) -> Mutator:
666+
def CreateMutator(self, mutator: Mutator, if_not_exists: bool = False) -> Mutator:
618667
try:
619668
resp_json = self._post(
620669
"/userstore/config/mutators", json_data={"mutator": mutator.__dict__}
@@ -751,7 +800,7 @@ def ListObjects(
751800
objects = [Object.from_json(o) for o in j["data"]]
752801
return objects
753802

754-
def CreateObject(self, object: Object, if_not_exists=False) -> Object:
803+
def CreateObject(self, object: Object, if_not_exists: bool = False) -> Object:
755804
try:
756805
j = self._post("/authz/objects", json_data={"object": object.__dict__})
757806
return Object.from_json(j)
@@ -782,7 +831,7 @@ def ListEdges(
782831
edges = [Edge.from_json(e) for e in j["data"]]
783832
return edges
784833

785-
def CreateEdge(self, edge: Edge, if_not_exists=False) -> Edge:
834+
def CreateEdge(self, edge: Edge, if_not_exists: bool = False) -> Edge:
786835
try:
787836
j = self._post("/authz/edges", json_data={"edge": edge.__dict__})
788837
return Edge.from_json(j)
@@ -814,7 +863,7 @@ def ListObjectTypes(
814863
return object_types
815864

816865
def CreateObjectType(
817-
self, object_type: ObjectType, if_not_exists=False
866+
self, object_type: ObjectType, if_not_exists: bool = False
818867
) -> ObjectType:
819868
try:
820869
j = self._post(
@@ -848,7 +897,9 @@ def ListEdgeTypes(
848897
edge_types = [EdgeType.from_json(et) for et in j["data"]]
849898
return edge_types
850899

851-
def CreateEdgeType(self, edge_type: EdgeType, if_not_exists=False) -> EdgeType:
900+
def CreateEdgeType(
901+
self, edge_type: EdgeType, if_not_exists: bool = False
902+
) -> EdgeType:
852903
try:
853904
j = self._post(
854905
"/authz/edgetypes", json_data={"edge_type": edge_type.__dict__}
@@ -882,7 +933,7 @@ def ListOrganizations(
882933
return organizations
883934

884935
def CreateOrganization(
885-
self, organization: Organization, if_not_exists=False
936+
self, organization: Organization, if_not_exists: bool = False
886937
) -> Organization:
887938
try:
888939
json_data = self._post(

src/usercloudssdk/data_types.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
from .models import ResourceID
2+
3+
# Note: these need to stay in sync with idp/userstore/datatype/constants.go
4+
ColumnDataTypeAddress = ResourceID(name="address")
5+
ColumnDataTypeBirthdate = ResourceID(name="birthdate")
6+
ColumnDataTypeBoolean = ResourceID(name="boolean")
7+
ColumnDataTypeDate = ResourceID(name="date")
8+
ColumnDataTypeE164PhoneNumber = ResourceID(name="e164_phonenumber")
9+
ColumnDataTypeEmail = ResourceID(name="email")
10+
ColumnDataTypeInteger = ResourceID(name="integer")
11+
ColumnDataTypePhoneNumber = ResourceID(name="phonenumber")
12+
ColumnDataTypeSSN = ResourceID(name="ssn")
13+
ColumnDataTypeString = ResourceID(name="string")
14+
ColumnDataTypeTimestamp = ResourceID(name="timestamp")
15+
ColumnDataTypeUUID = ResourceID(name="uuid")

0 commit comments

Comments
 (0)