Skip to content

Commit 39610bd

Browse files
committed
Fix ResourceType::from_resource for resources with multiple extensions
1 parent b64d53c commit 39610bd

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

scim2_models/rfc7643/resource_type.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
from typing import Annotated
22
from typing import Optional
3+
from typing import Union
4+
from typing import get_args
5+
from typing import get_origin
36

47
from pydantic import Field
58
from typing_extensions import Self
@@ -82,7 +85,16 @@ def from_resource(cls, resource_model: type[Resource]) -> Self:
8285
"""Build a naive ResourceType from a resource model."""
8386
schema = resource_model.model_fields["schemas"].default[0]
8487
name = schema.split(":")[-1]
85-
extensions = resource_model.__pydantic_generic_metadata__["args"]
88+
if resource_model.__pydantic_generic_metadata__["args"]:
89+
extensions = resource_model.__pydantic_generic_metadata__["args"][0]
90+
extensions = (
91+
get_args(extensions)
92+
if get_origin(extensions) == Union
93+
else [extensions]
94+
)
95+
else:
96+
extensions = []
97+
8698
return ResourceType(
8799
id=name,
88100
name=name,

tests/test_resource_type.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
from typing import Annotated
2+
from typing import Union
3+
14
from scim2_models import EnterpriseUser
5+
from scim2_models import Extension
26
from scim2_models import Reference
37
from scim2_models import ResourceType
8+
from scim2_models import Required
49
from scim2_models import User
510

611

@@ -61,3 +66,28 @@ def test_from_resource_with_extensions():
6166
== "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
6267
)
6368
assert not enterprise_user_rt.schema_extensions[0].required
69+
70+
71+
def test_from_resource_with_mulitple_extensions():
72+
class TestExtension(Extension):
73+
schemas: Annotated[list[str], Required.true] = ["urn:ietf:params:scim:schemas:extension:Test:1.0:User"]
74+
75+
test: str | None = None
76+
test2: list[str] | None = None
77+
78+
enterprise_user_rt = ResourceType.from_resource(User[Union[EnterpriseUser, TestExtension]])
79+
assert enterprise_user_rt.id == "User"
80+
assert enterprise_user_rt.name == "User"
81+
assert enterprise_user_rt.description == "User"
82+
assert enterprise_user_rt.endpoint == "/Users"
83+
assert enterprise_user_rt.schema_ == "urn:ietf:params:scim:schemas:core:2.0:User"
84+
assert (
85+
enterprise_user_rt.schema_extensions[0].schema_
86+
== "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
87+
)
88+
assert not enterprise_user_rt.schema_extensions[0].required
89+
assert (
90+
enterprise_user_rt.schema_extensions[1].schema_
91+
== "urn:ietf:params:scim:schemas:extension:Test:1.0:User"
92+
)
93+
assert not enterprise_user_rt.schema_extensions[1].required

0 commit comments

Comments
 (0)