Skip to content

Commit 041a038

Browse files
committed
feat: implement ResourceType.from_resource
1 parent 3ab3833 commit 041a038

File tree

3 files changed

+54
-0
lines changed

3 files changed

+54
-0
lines changed

doc/changelog.rst

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
Changelog
22
=========
33

4+
[0.2.7] - Unreleased
5+
--------------------
6+
7+
Added
8+
^^^^^
9+
- Implement :meth:`ResourceType.from_resource`.
10+
411
[0.2.6] - 2024-11-29
512
--------------------
613

scim2_models/rfc7643/resource_type.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from typing import Optional
33

44
from pydantic import Field
5+
from typing_extensions import Self
56

67
from ..base import CaseExact
78
from ..base import ComplexAttribute
@@ -73,3 +74,23 @@ class ResourceType(Resource):
7374
Optional[list[SchemaExtension]], Mutability.read_only, Required.true
7475
] = None
7576
"""A list of URIs of the resource type's schema extensions."""
77+
78+
@classmethod
79+
def from_resource(cls, resource_model: type[Resource]) -> Self:
80+
"""Build a naive ResourceType from a resource model."""
81+
schema = resource_model.model_fields["schemas"].default[0]
82+
name = schema.split(":")[-1]
83+
extensions = resource_model.__pydantic_generic_metadata__["args"]
84+
return ResourceType(
85+
id=name,
86+
name=name,
87+
description=name,
88+
endpoint=f"/{name}s",
89+
schema_=schema,
90+
schema_extensions=[
91+
SchemaExtension(
92+
schema_=extension.model_fields["schemas"].default[0], required=False
93+
)
94+
for extension in extensions
95+
],
96+
)

tests/test_resource_type.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
from scim2_models import EnterpriseUser
12
from scim2_models import Reference
23
from scim2_models import ResourceType
4+
from scim2_models import User
35

46

57
def test_user_resource_type(load_sample):
@@ -35,3 +37,27 @@ def test_group_resource_type(load_sample):
3537
assert obj.meta.resource_type == "ResourceType"
3638

3739
assert obj.model_dump(exclude_unset=True) == payload
40+
41+
42+
def test_from_simple_resource():
43+
user_rt = ResourceType.from_resource(User)
44+
assert user_rt.id == "User"
45+
assert user_rt.name == "User"
46+
assert user_rt.description == "User"
47+
assert user_rt.endpoint == "/Users"
48+
assert user_rt.schema_ == "urn:ietf:params:scim:schemas:core:2.0:User"
49+
assert not user_rt.schema_extensions
50+
51+
52+
def test_from_resource_with_extensions():
53+
enterprise_user_rt = ResourceType.from_resource(User[EnterpriseUser])
54+
assert enterprise_user_rt.id == "User"
55+
assert enterprise_user_rt.name == "User"
56+
assert enterprise_user_rt.description == "User"
57+
assert enterprise_user_rt.endpoint == "/Users"
58+
assert enterprise_user_rt.schema_ == "urn:ietf:params:scim:schemas:core:2.0:User"
59+
assert (
60+
enterprise_user_rt.schema_extensions[0].schema_
61+
== "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
62+
)
63+
assert not enterprise_user_rt.schema_extensions[0].required

0 commit comments

Comments
 (0)