Skip to content

Commit 3bd5dc6

Browse files
committed
refactor: extract Reference in its own file
1 parent 8696d1b commit 3bd5dc6

File tree

11 files changed

+71
-67
lines changed

11 files changed

+71
-67
lines changed

scim2_models/__init__.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
from .base import BaseModel
22
from .base import CaseExact
33
from .base import ComplexAttribute
4-
from .base import Context
5-
from .base import ExternalReference
64
from .base import MultiValuedComplexAttribute
75
from .base import Mutability
8-
from .base import Reference
96
from .base import Required
107
from .base import Returned
118
from .base import Uniqueness
12-
from .base import URIReference
9+
from .context import Context
10+
from .reference import ExternalReference
11+
from .reference import Reference
12+
from .reference import URIReference
1313
from .rfc7643.enterprise_user import EnterpriseUser
1414
from .rfc7643.enterprise_user import Manager
1515
from .rfc7643.group import Group

scim2_models/base.py

Lines changed: 1 addition & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
1-
from collections import UserString
21
from enum import Enum
32
from inspect import isclass
43
from typing import Annotated
54
from typing import Any
6-
from typing import Generic
75
from typing import Optional
8-
from typing import TypeVar
96
from typing import get_args
107
from typing import get_origin
118

@@ -14,7 +11,6 @@
1411
from pydantic import ConfigDict
1512
from pydantic import Field
1613
from pydantic import FieldSerializationInfo
17-
from pydantic import GetCoreSchemaHandler
1814
from pydantic import SerializationInfo
1915
from pydantic import SerializerFunctionWrapHandler
2016
from pydantic import ValidationInfo
@@ -24,20 +20,15 @@
2420
from pydantic import model_serializer
2521
from pydantic import model_validator
2622
from pydantic_core import PydanticCustomError
27-
from pydantic_core import core_schema
28-
from typing_extensions import NewType
2923
from typing_extensions import Self
3024

3125
from scim2_models.context import Context
26+
from scim2_models.reference import Reference
3227
from scim2_models.utils import normalize_attribute_name
3328
from scim2_models.utils import to_camel
3429

3530
from .utils import UNION_TYPES
3631

37-
ReferenceTypes = TypeVar("ReferenceTypes")
38-
URIReference = NewType("URIReference", str)
39-
ExternalReference = NewType("ExternalReference", str)
40-
4132

4233
def validate_model_attribute(model: type["BaseModel"], attribute_base: str) -> None:
4334
"""Validate that an attribute name or a sub-attribute path exist for a given model."""
@@ -125,43 +116,6 @@ def contains_attribute_or_subattributes(
125116
)
126117

127118

128-
class Reference(UserString, Generic[ReferenceTypes]):
129-
"""Reference type as defined in :rfc:`RFC7643 §2.3.7 <7643#section-2.3.7>`.
130-
131-
References can take different type parameters:
132-
133-
- Any :class:`~scim2_models.Resource` subtype, or :class:`~typing.ForwardRef` of a Resource subtype, or :data:`~typing.Union` of those,
134-
- :data:`~scim2_models.ExternalReference`
135-
- :data:`~scim2_models.URIReference`
136-
137-
Examples
138-
--------
139-
140-
.. code-block:: python
141-
142-
class Foobar(Resource):
143-
bff: Reference[User]
144-
managers: Reference[Union["User", "Group"]]
145-
photo: Reference[ExternalReference]
146-
website: Reference[URIReference]
147-
148-
"""
149-
150-
@classmethod
151-
def __get_pydantic_core_schema__(
152-
cls,
153-
_source: type[Any],
154-
_handler: GetCoreSchemaHandler,
155-
) -> core_schema.CoreSchema:
156-
return core_schema.no_info_after_validator_function(
157-
cls._validate, core_schema.str_schema()
158-
)
159-
160-
@classmethod
161-
def _validate(cls, input_value: str, /) -> str:
162-
return input_value
163-
164-
165119
class Mutability(str, Enum):
166120
"""A single keyword indicating the circumstances under which the value of the attribute can be (re)defined."""
167121

scim2_models/reference.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from collections import UserString
2+
from typing import Any
3+
from typing import Generic
4+
from typing import TypeVar
5+
6+
from pydantic import GetCoreSchemaHandler
7+
from pydantic_core import core_schema
8+
from typing_extensions import NewType
9+
10+
ReferenceTypes = TypeVar("ReferenceTypes")
11+
12+
URIReference = NewType("URIReference", str)
13+
ExternalReference = NewType("ExternalReference", str)
14+
15+
16+
class Reference(UserString, Generic[ReferenceTypes]):
17+
"""Reference type as defined in :rfc:`RFC7643 §2.3.7 <7643#section-2.3.7>`.
18+
19+
References can take different type parameters:
20+
21+
- Any :class:`~scim2_models.Resource` subtype, or :class:`~typing.ForwardRef` of a Resource subtype, or :data:`~typing.Union` of those,
22+
- :data:`~scim2_models.ExternalReference`
23+
- :data:`~scim2_models.URIReference`
24+
25+
Examples
26+
--------
27+
28+
.. code-block:: python
29+
30+
class Foobar(Resource):
31+
bff: Reference[User]
32+
managers: Reference[Union["User", "Group"]]
33+
photo: Reference[ExternalReference]
34+
website: Reference[URIReference]
35+
36+
"""
37+
38+
@classmethod
39+
def __get_pydantic_core_schema__(
40+
cls,
41+
_source: type[Any],
42+
_handler: GetCoreSchemaHandler,
43+
) -> core_schema.CoreSchema:
44+
return core_schema.no_info_after_validator_function(
45+
cls._validate, core_schema.str_schema()
46+
)
47+
48+
@classmethod
49+
def _validate(cls, input_value: str, /) -> str:
50+
return input_value

scim2_models/rfc7643/enterprise_user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66

77
from ..base import ComplexAttribute
88
from ..base import Mutability
9-
from ..base import Reference
109
from ..base import Required
10+
from ..reference import Reference
1111
from .resource import Extension
1212

1313

scim2_models/rfc7643/group.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
from ..base import ComplexAttribute
1010
from ..base import MultiValuedComplexAttribute
1111
from ..base import Mutability
12-
from ..base import Reference
1312
from ..base import Required
13+
from ..reference import Reference
1414
from .resource import Resource
1515

1616

scim2_models/rfc7643/resource.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@
2323
from ..base import BaseModelType
2424
from ..base import CaseExact
2525
from ..base import ComplexAttribute
26-
from ..base import ExternalReference
2726
from ..base import MultiValuedComplexAttribute
2827
from ..base import Mutability
2928
from ..base import Required
3029
from ..base import Returned
3130
from ..base import Uniqueness
32-
from ..base import URIReference
3331
from ..base import is_complex_attribute
32+
from ..reference import ExternalReference
33+
from ..reference import URIReference
3434
from ..utils import UNION_TYPES
3535
from ..utils import normalize_attribute_name
3636

scim2_models/rfc7643/resource_type.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
from ..base import CaseExact
1010
from ..base import ComplexAttribute
1111
from ..base import Mutability
12-
from ..base import Reference
1312
from ..base import Required
1413
from ..base import Returned
15-
from ..base import URIReference
14+
from ..reference import Reference
15+
from ..reference import URIReference
1616
from ..utils import UNION_TYPES
1717
from .resource import Resource
1818

scim2_models/rfc7643/schema.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@
1919
from ..base import BaseModel
2020
from ..base import CaseExact
2121
from ..base import ComplexAttribute
22-
from ..base import ExternalReference
2322
from ..base import MultiValuedComplexAttribute
2423
from ..base import Mutability
25-
from ..base import Reference
2624
from ..base import Required
2725
from ..base import Returned
2826
from ..base import Uniqueness
29-
from ..base import URIReference
3027
from ..base import is_complex_attribute
3128
from ..constants import RESERVED_WORDS
29+
from ..reference import ExternalReference
30+
from ..reference import Reference
31+
from ..reference import URIReference
3232
from ..utils import Base64Bytes
3333
from ..utils import normalize_attribute_name
3434
from .resource import Extension

scim2_models/rfc7643/service_provider_config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
from pydantic import Field
66

77
from ..base import ComplexAttribute
8-
from ..base import ExternalReference
98
from ..base import Mutability
10-
from ..base import Reference
119
from ..base import Required
1210
from ..base import Returned
1311
from ..base import Uniqueness
12+
from ..reference import ExternalReference
13+
from ..reference import Reference
1414
from .resource import Resource
1515

1616

scim2_models/rfc7643/user.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,13 @@
1010

1111
from ..base import CaseExact
1212
from ..base import ComplexAttribute
13-
from ..base import ExternalReference
1413
from ..base import MultiValuedComplexAttribute
1514
from ..base import Mutability
16-
from ..base import Reference
1715
from ..base import Required
1816
from ..base import Returned
1917
from ..base import Uniqueness
18+
from ..reference import ExternalReference
19+
from ..reference import Reference
2020
from ..utils import Base64Bytes
2121
from .resource import AnyExtension
2222
from .resource import Resource

0 commit comments

Comments
 (0)