scim2-models 0.5.0__py3-none-any.whl → 0.5.1__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.
- scim2_models/attributes.py +6 -7
- scim2_models/base.py +3 -3
- scim2_models/messages/bulk.py +11 -12
- scim2_models/messages/error.py +3 -4
- scim2_models/messages/list_response.py +4 -7
- scim2_models/messages/message.py +4 -5
- scim2_models/messages/patch_op.py +4 -6
- scim2_models/messages/search_request.py +15 -16
- scim2_models/reference.py +1 -1
- scim2_models/resources/enterprise_user.py +9 -10
- scim2_models/resources/group.py +6 -8
- scim2_models/resources/resource.py +25 -26
- scim2_models/resources/resource_type.py +8 -9
- scim2_models/resources/schema.py +22 -20
- scim2_models/resources/service_provider_config.py +26 -29
- scim2_models/resources/user.py +67 -69
- scim2_models/scim_object.py +3 -4
- scim2_models/urn.py +4 -5
- scim2_models/utils.py +10 -7
- {scim2_models-0.5.0.dist-info → scim2_models-0.5.1.dist-info}/METADATA +2 -2
- scim2_models-0.5.1.dist-info/RECORD +29 -0
- {scim2_models-0.5.0.dist-info → scim2_models-0.5.1.dist-info}/WHEEL +1 -1
- scim2_models-0.5.0.dist-info/RECORD +0 -29
|
@@ -3,7 +3,6 @@ from typing import TYPE_CHECKING
|
|
|
3
3
|
from typing import Annotated
|
|
4
4
|
from typing import Any
|
|
5
5
|
from typing import Generic
|
|
6
|
-
from typing import Optional
|
|
7
6
|
from typing import TypeVar
|
|
8
7
|
from typing import Union
|
|
9
8
|
from typing import cast
|
|
@@ -42,20 +41,20 @@ class Meta(ComplexAttribute):
|
|
|
42
41
|
This attribute SHALL be ignored when provided by clients. "meta" contains the following sub-attributes:
|
|
43
42
|
"""
|
|
44
43
|
|
|
45
|
-
resource_type:
|
|
44
|
+
resource_type: str | None = None
|
|
46
45
|
"""The name of the resource type of the resource.
|
|
47
46
|
|
|
48
47
|
This attribute has a mutability of "readOnly" and "caseExact" as
|
|
49
48
|
"true".
|
|
50
49
|
"""
|
|
51
50
|
|
|
52
|
-
created:
|
|
51
|
+
created: datetime | None = None
|
|
53
52
|
"""The "DateTime" that the resource was added to the service provider.
|
|
54
53
|
|
|
55
54
|
This attribute MUST be a DateTime.
|
|
56
55
|
"""
|
|
57
56
|
|
|
58
|
-
last_modified:
|
|
57
|
+
last_modified: datetime | None = None
|
|
59
58
|
"""The most recent DateTime that the details of this resource were updated
|
|
60
59
|
at the service provider.
|
|
61
60
|
|
|
@@ -63,14 +62,14 @@ class Meta(ComplexAttribute):
|
|
|
63
62
|
the value MUST be the same as the value of "created".
|
|
64
63
|
"""
|
|
65
64
|
|
|
66
|
-
location:
|
|
65
|
+
location: str | None = None
|
|
67
66
|
"""The URI of the resource being returned.
|
|
68
67
|
|
|
69
68
|
This value MUST be the same as the "Content-Location" HTTP response
|
|
70
69
|
header (see Section 3.1.4.2 of [RFC7231]).
|
|
71
70
|
"""
|
|
72
71
|
|
|
73
|
-
version:
|
|
72
|
+
version: str | None = None
|
|
74
73
|
"""The version of the resource being returned.
|
|
75
74
|
|
|
76
75
|
This value must be the same as the entity-tag (ETag) HTTP response
|
|
@@ -108,7 +107,7 @@ _PARAMETERIZED_CLASSES: dict[tuple[type, tuple[Any, ...]], type] = {}
|
|
|
108
107
|
|
|
109
108
|
def _extension_serializer(
|
|
110
109
|
value: Any, handler: SerializerFunctionWrapHandler, info: SerializationInfo
|
|
111
|
-
) ->
|
|
110
|
+
) -> dict[str, Any] | None:
|
|
112
111
|
"""Exclude the Resource attributes from the extension dump.
|
|
113
112
|
|
|
114
113
|
For instance, attributes 'meta', 'id' or 'schemas' should not be
|
|
@@ -128,7 +127,7 @@ class Resource(ScimObject, Generic[AnyExtension]):
|
|
|
128
127
|
# https://www.rfc-editor.org/rfc/rfc7643#section-3.1
|
|
129
128
|
|
|
130
129
|
id: Annotated[
|
|
131
|
-
|
|
130
|
+
str | None, Mutability.read_only, Returned.always, Uniqueness.global_
|
|
132
131
|
] = None
|
|
133
132
|
"""A unique identifier for a SCIM resource as defined by the service
|
|
134
133
|
provider.
|
|
@@ -138,12 +137,12 @@ class Resource(ScimObject, Generic[AnyExtension]):
|
|
|
138
137
|
"""
|
|
139
138
|
|
|
140
139
|
external_id: Annotated[
|
|
141
|
-
|
|
140
|
+
str | None, Mutability.read_write, Returned.default, CaseExact.true
|
|
142
141
|
] = None
|
|
143
142
|
"""A String that is an identifier for the resource as defined by the
|
|
144
143
|
provisioning client."""
|
|
145
144
|
|
|
146
|
-
meta: Annotated[
|
|
145
|
+
meta: Annotated[Meta | None, Mutability.read_only, Returned.default] = None
|
|
147
146
|
"""A complex attribute containing resource metadata."""
|
|
148
147
|
|
|
149
148
|
@classmethod
|
|
@@ -188,7 +187,7 @@ class Resource(ScimObject, Generic[AnyExtension]):
|
|
|
188
187
|
|
|
189
188
|
new_annotations = {
|
|
190
189
|
extension.__name__: Annotated[
|
|
191
|
-
|
|
190
|
+
extension | None,
|
|
192
191
|
WrapSerializer(_extension_serializer),
|
|
193
192
|
]
|
|
194
193
|
for extension in valid_extensions
|
|
@@ -207,11 +206,11 @@ class Resource(ScimObject, Generic[AnyExtension]):
|
|
|
207
206
|
|
|
208
207
|
return new_class
|
|
209
208
|
|
|
210
|
-
def __getitem__(self, item: Any) ->
|
|
209
|
+
def __getitem__(self, item: Any) -> Extension | None:
|
|
211
210
|
if not isinstance(item, type) or not issubclass(item, Extension):
|
|
212
211
|
raise KeyError(f"{item} is not a valid extension type")
|
|
213
212
|
|
|
214
|
-
return cast(
|
|
213
|
+
return cast(Extension | None, getattr(self, item.__name__))
|
|
215
214
|
|
|
216
215
|
def __setitem__(self, item: Any, value: "Extension") -> None:
|
|
217
216
|
if not isinstance(item, type) or not issubclass(item, Extension):
|
|
@@ -231,7 +230,7 @@ class Resource(ScimObject, Generic[AnyExtension]):
|
|
|
231
230
|
@classmethod
|
|
232
231
|
def get_extension_model(
|
|
233
232
|
cls, name_or_schema: Union[str, "Schema"]
|
|
234
|
-
) ->
|
|
233
|
+
) -> type[Extension] | None:
|
|
235
234
|
"""Return an extension by its name or schema."""
|
|
236
235
|
for schema, extension in cls.get_extension_models().items():
|
|
237
236
|
if schema == name_or_schema or extension.__name__ == name_or_schema:
|
|
@@ -243,9 +242,9 @@ class Resource(ScimObject, Generic[AnyExtension]):
|
|
|
243
242
|
resource_types: list[type["Resource[Any]"]],
|
|
244
243
|
schema: str,
|
|
245
244
|
with_extensions: bool = True,
|
|
246
|
-
) ->
|
|
245
|
+
) -> type["Resource[Any]"] | type["Extension"] | None:
|
|
247
246
|
"""Given a resource type list and a schema, find the matching resource type."""
|
|
248
|
-
by_schema: dict[str,
|
|
247
|
+
by_schema: dict[str, type[Resource[Any]] | type[Extension]] = {
|
|
249
248
|
resource_type.model_fields["schemas"].default[0].lower(): resource_type
|
|
250
249
|
for resource_type in (resource_types or [])
|
|
251
250
|
}
|
|
@@ -265,7 +264,7 @@ class Resource(ScimObject, Generic[AnyExtension]):
|
|
|
265
264
|
resource_types: list[type["Resource[Any]"]],
|
|
266
265
|
payload: dict[str, Any],
|
|
267
266
|
**kwargs: Any,
|
|
268
|
-
) ->
|
|
267
|
+
) -> type | None:
|
|
269
268
|
"""Given a resource type list and a payload, find the matching resource type."""
|
|
270
269
|
if not payload or not payload.get("schemas"):
|
|
271
270
|
return None
|
|
@@ -298,9 +297,9 @@ class Resource(ScimObject, Generic[AnyExtension]):
|
|
|
298
297
|
|
|
299
298
|
def _prepare_model_dump(
|
|
300
299
|
self,
|
|
301
|
-
scim_ctx:
|
|
302
|
-
attributes:
|
|
303
|
-
excluded_attributes:
|
|
300
|
+
scim_ctx: Context | None = Context.DEFAULT,
|
|
301
|
+
attributes: list[str] | None = None,
|
|
302
|
+
excluded_attributes: list[str] | None = None,
|
|
304
303
|
**kwargs: Any,
|
|
305
304
|
) -> dict[str, Any]:
|
|
306
305
|
kwargs = super()._prepare_model_dump(scim_ctx, **kwargs)
|
|
@@ -323,9 +322,9 @@ class Resource(ScimObject, Generic[AnyExtension]):
|
|
|
323
322
|
def model_dump(
|
|
324
323
|
self,
|
|
325
324
|
*args: Any,
|
|
326
|
-
scim_ctx:
|
|
327
|
-
attributes:
|
|
328
|
-
excluded_attributes:
|
|
325
|
+
scim_ctx: Context | None = Context.DEFAULT,
|
|
326
|
+
attributes: list[str] | None = None,
|
|
327
|
+
excluded_attributes: list[str] | None = None,
|
|
329
328
|
**kwargs: Any,
|
|
330
329
|
) -> dict[str, Any]:
|
|
331
330
|
"""Create a model representation that can be included in SCIM messages by using Pydantic :code:`BaseModel.model_dump`.
|
|
@@ -349,9 +348,9 @@ class Resource(ScimObject, Generic[AnyExtension]):
|
|
|
349
348
|
def model_dump_json(
|
|
350
349
|
self,
|
|
351
350
|
*args: Any,
|
|
352
|
-
scim_ctx:
|
|
353
|
-
attributes:
|
|
354
|
-
excluded_attributes:
|
|
351
|
+
scim_ctx: Context | None = Context.DEFAULT,
|
|
352
|
+
attributes: list[str] | None = None,
|
|
353
|
+
excluded_attributes: list[str] | None = None,
|
|
355
354
|
**kwargs: Any,
|
|
356
355
|
) -> str:
|
|
357
356
|
"""Create a JSON model representation that can be included in SCIM messages by using Pydantic :code:`BaseModel.model_dump_json`.
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from typing import Annotated
|
|
2
2
|
from typing import Any
|
|
3
|
-
from typing import Optional
|
|
4
3
|
|
|
5
4
|
from pydantic import Field
|
|
6
5
|
from typing_extensions import Self
|
|
@@ -17,14 +16,14 @@ from .resource import Resource
|
|
|
17
16
|
|
|
18
17
|
class SchemaExtension(ComplexAttribute):
|
|
19
18
|
schema_: Annotated[
|
|
20
|
-
|
|
19
|
+
Reference[URIReference] | None,
|
|
21
20
|
Mutability.read_only,
|
|
22
21
|
Required.true,
|
|
23
22
|
CaseExact.true,
|
|
24
23
|
] = Field(None, alias="schema")
|
|
25
24
|
"""The URI of a schema extension."""
|
|
26
25
|
|
|
27
|
-
required: Annotated[
|
|
26
|
+
required: Annotated[bool | None, Mutability.read_only, Required.true] = None
|
|
28
27
|
"""A Boolean value that specifies whether or not the schema extension is
|
|
29
28
|
required for the resource type.
|
|
30
29
|
|
|
@@ -40,33 +39,33 @@ class ResourceType(Resource[Any]):
|
|
|
40
39
|
"urn:ietf:params:scim:schemas:core:2.0:ResourceType"
|
|
41
40
|
]
|
|
42
41
|
|
|
43
|
-
name: Annotated[
|
|
42
|
+
name: Annotated[str | None, Mutability.read_only, Required.true] = None
|
|
44
43
|
"""The resource type name.
|
|
45
44
|
|
|
46
45
|
When applicable, service providers MUST specify the name, e.g.,
|
|
47
46
|
'User'.
|
|
48
47
|
"""
|
|
49
48
|
|
|
50
|
-
description: Annotated[
|
|
49
|
+
description: Annotated[str | None, Mutability.read_only] = None
|
|
51
50
|
"""The resource type's human-readable description.
|
|
52
51
|
|
|
53
52
|
When applicable, service providers MUST specify the description.
|
|
54
53
|
"""
|
|
55
54
|
|
|
56
|
-
id: Annotated[
|
|
55
|
+
id: Annotated[str | None, Mutability.read_only, Returned.default] = None
|
|
57
56
|
"""The resource type's server unique id.
|
|
58
57
|
|
|
59
58
|
This is often the same value as the "name" attribute.
|
|
60
59
|
"""
|
|
61
60
|
|
|
62
61
|
endpoint: Annotated[
|
|
63
|
-
|
|
62
|
+
Reference[URIReference] | None, Mutability.read_only, Required.true
|
|
64
63
|
] = None
|
|
65
64
|
"""The resource type's HTTP-addressable endpoint relative to the Base URL,
|
|
66
65
|
e.g., '/Users'."""
|
|
67
66
|
|
|
68
67
|
schema_: Annotated[
|
|
69
|
-
|
|
68
|
+
Reference[URIReference] | None,
|
|
70
69
|
Mutability.read_only,
|
|
71
70
|
Required.true,
|
|
72
71
|
CaseExact.true,
|
|
@@ -74,7 +73,7 @@ class ResourceType(Resource[Any]):
|
|
|
74
73
|
"""The resource type's primary/base schema URI."""
|
|
75
74
|
|
|
76
75
|
schema_extensions: Annotated[
|
|
77
|
-
|
|
76
|
+
list[SchemaExtension] | None, Mutability.read_only, Required.true
|
|
78
77
|
] = None
|
|
79
78
|
"""A list of URIs of the resource type's schema extensions."""
|
|
80
79
|
|
scim2_models/resources/schema.py
CHANGED
|
@@ -35,10 +35,12 @@ from .resource import Resource
|
|
|
35
35
|
|
|
36
36
|
T = TypeVar("T", bound=BaseModel)
|
|
37
37
|
|
|
38
|
+
_NON_WORD_OR_LEADING_DIGIT = re.compile(r"\W|^(?=\d)")
|
|
39
|
+
|
|
38
40
|
|
|
39
41
|
def _make_python_identifier(identifier: str) -> str:
|
|
40
42
|
"""Sanitize string to be a suitable Python/Pydantic class attribute name."""
|
|
41
|
-
sanitized =
|
|
43
|
+
sanitized = _NON_WORD_OR_LEADING_DIGIT.sub("", identifier)
|
|
42
44
|
if sanitized in RESERVED_WORDS:
|
|
43
45
|
sanitized = f"{sanitized}_"
|
|
44
46
|
|
|
@@ -97,7 +99,7 @@ class Attribute(ComplexAttribute):
|
|
|
97
99
|
|
|
98
100
|
def _to_python(
|
|
99
101
|
self,
|
|
100
|
-
reference_types:
|
|
102
|
+
reference_types: list[str] | None = None,
|
|
101
103
|
) -> type:
|
|
102
104
|
if self.value == self.reference and reference_types is not None:
|
|
103
105
|
if reference_types == ["external"]:
|
|
@@ -107,7 +109,7 @@ class Attribute(ComplexAttribute):
|
|
|
107
109
|
return Reference[URIReference]
|
|
108
110
|
|
|
109
111
|
types = tuple(Literal[t] for t in reference_types)
|
|
110
|
-
return Reference[Union[types]] # type: ignore
|
|
112
|
+
return Reference[Union[types]] # type: ignore # noqa: UP007
|
|
111
113
|
|
|
112
114
|
attr_types = {
|
|
113
115
|
self.string: str,
|
|
@@ -118,7 +120,7 @@ class Attribute(ComplexAttribute):
|
|
|
118
120
|
self.binary: Base64Bytes,
|
|
119
121
|
self.complex: ComplexAttribute,
|
|
120
122
|
}
|
|
121
|
-
return attr_types[self
|
|
123
|
+
return attr_types[self]
|
|
122
124
|
|
|
123
125
|
@classmethod
|
|
124
126
|
def from_python(cls, pytype: type) -> "Attribute.Type":
|
|
@@ -141,21 +143,21 @@ class Attribute(ComplexAttribute):
|
|
|
141
143
|
}
|
|
142
144
|
return attr_types.get(pytype, cls.string)
|
|
143
145
|
|
|
144
|
-
name: Annotated[
|
|
145
|
-
|
|
146
|
-
|
|
146
|
+
name: Annotated[str | None, Mutability.read_only, Required.true, CaseExact.true] = (
|
|
147
|
+
None
|
|
148
|
+
)
|
|
147
149
|
"""The attribute's name."""
|
|
148
150
|
|
|
149
|
-
type: Annotated[
|
|
151
|
+
type: Annotated[Type | None, Mutability.read_only, Required.true] = Field(
|
|
150
152
|
None, examples=[item.value for item in Type]
|
|
151
153
|
)
|
|
152
154
|
"""The attribute's data type."""
|
|
153
155
|
|
|
154
|
-
multi_valued: Annotated[
|
|
156
|
+
multi_valued: Annotated[bool | None, Mutability.read_only, Required.true] = None
|
|
155
157
|
"""A Boolean value indicating the attribute's plurality."""
|
|
156
158
|
|
|
157
159
|
description: Annotated[
|
|
158
|
-
|
|
160
|
+
str | None, Mutability.read_only, Required.false, CaseExact.true
|
|
159
161
|
] = None
|
|
160
162
|
"""The attribute's human-readable description."""
|
|
161
163
|
|
|
@@ -164,7 +166,7 @@ class Attribute(ComplexAttribute):
|
|
|
164
166
|
required."""
|
|
165
167
|
|
|
166
168
|
canonical_values: Annotated[
|
|
167
|
-
|
|
169
|
+
list[str] | None, Mutability.read_only, CaseExact.true
|
|
168
170
|
] = None
|
|
169
171
|
"""A collection of suggested canonical values that MAY be used (e.g.,
|
|
170
172
|
"work" and "home")."""
|
|
@@ -195,17 +197,17 @@ class Attribute(ComplexAttribute):
|
|
|
195
197
|
uniqueness of attribute values."""
|
|
196
198
|
|
|
197
199
|
reference_types: Annotated[
|
|
198
|
-
|
|
200
|
+
list[str] | None, Mutability.read_only, Required.false, CaseExact.true
|
|
199
201
|
] = None
|
|
200
202
|
"""A multi-valued array of JSON strings that indicate the SCIM resource
|
|
201
203
|
types that may be referenced."""
|
|
202
204
|
|
|
203
205
|
# for python 3.9 and 3.10 compatibility, this should be 'list' and not 'List'
|
|
204
|
-
sub_attributes: Annotated[
|
|
206
|
+
sub_attributes: Annotated[List["Attribute"] | None, Mutability.read_only] = None # noqa: UP006
|
|
205
207
|
"""When an attribute is of type "complex", "subAttributes" defines a set of
|
|
206
208
|
sub-attributes."""
|
|
207
209
|
|
|
208
|
-
def _to_python(self) ->
|
|
210
|
+
def _to_python(self) -> tuple[Any, Any] | None:
|
|
209
211
|
"""Build tuple suited to be passed to pydantic 'create_model'."""
|
|
210
212
|
if not self.name or not self.type:
|
|
211
213
|
return None
|
|
@@ -219,7 +221,7 @@ class Attribute(ComplexAttribute):
|
|
|
219
221
|
attr_type = list[attr_type] # type: ignore
|
|
220
222
|
|
|
221
223
|
annotation = Annotated[
|
|
222
|
-
|
|
224
|
+
attr_type | None, # type: ignore
|
|
223
225
|
self.required,
|
|
224
226
|
self.case_exact,
|
|
225
227
|
self.mutability,
|
|
@@ -256,19 +258,19 @@ class Schema(Resource[Any]):
|
|
|
256
258
|
"urn:ietf:params:scim:schemas:core:2.0:Schema"
|
|
257
259
|
]
|
|
258
260
|
|
|
259
|
-
id: Annotated[
|
|
261
|
+
id: Annotated[str | None, Mutability.read_only, Required.true] = None
|
|
260
262
|
"""The unique URI of the schema."""
|
|
261
263
|
|
|
262
264
|
name: Annotated[
|
|
263
|
-
|
|
265
|
+
str | None, Mutability.read_only, Returned.default, Required.true
|
|
264
266
|
] = None
|
|
265
267
|
"""The schema's human-readable name."""
|
|
266
268
|
|
|
267
|
-
description: Annotated[
|
|
269
|
+
description: Annotated[str | None, Mutability.read_only, Returned.default] = None
|
|
268
270
|
"""The schema's human-readable description."""
|
|
269
271
|
|
|
270
272
|
attributes: Annotated[
|
|
271
|
-
|
|
273
|
+
list[Attribute] | None, Mutability.read_only, Required.true
|
|
272
274
|
] = None
|
|
273
275
|
"""A complex type that defines service provider attributes and their
|
|
274
276
|
qualities via the following set of sub-attributes."""
|
|
@@ -279,7 +281,7 @@ class Schema(Resource[Any]):
|
|
|
279
281
|
"""Ensure that schema ids are URI, as defined in RFC7643 §7."""
|
|
280
282
|
return str(Url(value))
|
|
281
283
|
|
|
282
|
-
def get_attribute(self, attribute_name: str) ->
|
|
284
|
+
def get_attribute(self, attribute_name: str) -> Attribute | None:
|
|
283
285
|
"""Find an attribute by its name."""
|
|
284
286
|
for attribute in self.attributes or []:
|
|
285
287
|
if attribute.name == attribute_name:
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from enum import Enum
|
|
2
2
|
from typing import Annotated
|
|
3
3
|
from typing import Any
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from pydantic import Field
|
|
7
6
|
|
|
@@ -16,43 +15,41 @@ from .resource import Resource
|
|
|
16
15
|
|
|
17
16
|
|
|
18
17
|
class Patch(ComplexAttribute):
|
|
19
|
-
supported: Annotated[
|
|
18
|
+
supported: Annotated[bool | None, Mutability.read_only, Required.true] = None
|
|
20
19
|
"""A Boolean value specifying whether or not the operation is supported."""
|
|
21
20
|
|
|
22
21
|
|
|
23
22
|
class Bulk(ComplexAttribute):
|
|
24
|
-
supported: Annotated[
|
|
23
|
+
supported: Annotated[bool | None, Mutability.read_only, Required.true] = None
|
|
25
24
|
"""A Boolean value specifying whether or not the operation is supported."""
|
|
26
25
|
|
|
27
|
-
max_operations: Annotated[
|
|
26
|
+
max_operations: Annotated[int | None, Mutability.read_only, Required.true] = None
|
|
28
27
|
"""An integer value specifying the maximum number of operations."""
|
|
29
28
|
|
|
30
|
-
max_payload_size: Annotated[
|
|
31
|
-
None
|
|
32
|
-
)
|
|
29
|
+
max_payload_size: Annotated[int | None, Mutability.read_only, Required.true] = None
|
|
33
30
|
"""An integer value specifying the maximum payload size in bytes."""
|
|
34
31
|
|
|
35
32
|
|
|
36
33
|
class Filter(ComplexAttribute):
|
|
37
|
-
supported: Annotated[
|
|
34
|
+
supported: Annotated[bool | None, Mutability.read_only, Required.true] = None
|
|
38
35
|
"""A Boolean value specifying whether or not the operation is supported."""
|
|
39
36
|
|
|
40
|
-
max_results: Annotated[
|
|
37
|
+
max_results: Annotated[int | None, Mutability.read_only, Required.true] = None
|
|
41
38
|
"""An integer value specifying the maximum number of resources returned in a response."""
|
|
42
39
|
|
|
43
40
|
|
|
44
41
|
class ChangePassword(ComplexAttribute):
|
|
45
|
-
supported: Annotated[
|
|
42
|
+
supported: Annotated[bool | None, Mutability.read_only, Required.true] = None
|
|
46
43
|
"""A Boolean value specifying whether or not the operation is supported."""
|
|
47
44
|
|
|
48
45
|
|
|
49
46
|
class Sort(ComplexAttribute):
|
|
50
|
-
supported: Annotated[
|
|
47
|
+
supported: Annotated[bool | None, Mutability.read_only, Required.true] = None
|
|
51
48
|
"""A Boolean value specifying whether or not the operation is supported."""
|
|
52
49
|
|
|
53
50
|
|
|
54
51
|
class ETag(ComplexAttribute):
|
|
55
|
-
supported: Annotated[
|
|
52
|
+
supported: Annotated[bool | None, Mutability.read_only, Required.true] = None
|
|
56
53
|
"""A Boolean value specifying whether or not the operation is supported."""
|
|
57
54
|
|
|
58
55
|
|
|
@@ -64,31 +61,31 @@ class AuthenticationScheme(ComplexAttribute):
|
|
|
64
61
|
httpbasic = "httpbasic"
|
|
65
62
|
httpdigest = "httpdigest"
|
|
66
63
|
|
|
67
|
-
type: Annotated[
|
|
64
|
+
type: Annotated[Type | None, Mutability.read_only, Required.true] = Field(
|
|
68
65
|
None,
|
|
69
66
|
examples=["oauth", "oauth2", "oauthbearertoken", "httpbasic", "httpdigest"],
|
|
70
67
|
)
|
|
71
68
|
"""The authentication scheme."""
|
|
72
69
|
|
|
73
|
-
name: Annotated[
|
|
70
|
+
name: Annotated[str | None, Mutability.read_only, Required.true] = None
|
|
74
71
|
"""The common authentication scheme name, e.g., HTTP Basic."""
|
|
75
72
|
|
|
76
|
-
description: Annotated[
|
|
73
|
+
description: Annotated[str | None, Mutability.read_only, Required.true] = None
|
|
77
74
|
"""A description of the authentication scheme."""
|
|
78
75
|
|
|
79
|
-
spec_uri: Annotated[
|
|
80
|
-
|
|
81
|
-
|
|
76
|
+
spec_uri: Annotated[Reference[ExternalReference] | None, Mutability.read_only] = (
|
|
77
|
+
None
|
|
78
|
+
)
|
|
82
79
|
"""An HTTP-addressable URL pointing to the authentication scheme's
|
|
83
80
|
specification."""
|
|
84
81
|
|
|
85
82
|
documentation_uri: Annotated[
|
|
86
|
-
|
|
83
|
+
Reference[ExternalReference] | None, Mutability.read_only
|
|
87
84
|
] = None
|
|
88
85
|
"""An HTTP-addressable URL pointing to the authentication scheme's usage
|
|
89
86
|
documentation."""
|
|
90
87
|
|
|
91
|
-
primary: Annotated[
|
|
88
|
+
primary: Annotated[bool | None, Mutability.read_only] = None
|
|
92
89
|
"""A Boolean value indicating the 'primary' or preferred attribute value
|
|
93
90
|
for this attribute, e.g., the preferred mailing address or primary email
|
|
94
91
|
address."""
|
|
@@ -100,7 +97,7 @@ class ServiceProviderConfig(Resource[Any]):
|
|
|
100
97
|
]
|
|
101
98
|
|
|
102
99
|
id: Annotated[
|
|
103
|
-
|
|
100
|
+
str | None, Mutability.read_only, Returned.default, Uniqueness.global_
|
|
104
101
|
] = None
|
|
105
102
|
"""A unique identifier for a SCIM resource as defined by the service
|
|
106
103
|
provider."""
|
|
@@ -110,34 +107,34 @@ class ServiceProviderConfig(Resource[Any]):
|
|
|
110
107
|
# provider configuration resource
|
|
111
108
|
|
|
112
109
|
documentation_uri: Annotated[
|
|
113
|
-
|
|
110
|
+
Reference[ExternalReference] | None, Mutability.read_only
|
|
114
111
|
] = None
|
|
115
112
|
"""An HTTP-addressable URL pointing to the service provider's human-
|
|
116
113
|
consumable help documentation."""
|
|
117
114
|
|
|
118
|
-
patch: Annotated[
|
|
115
|
+
patch: Annotated[Patch | None, Mutability.read_only, Required.true] = None
|
|
119
116
|
"""A complex type that specifies PATCH configuration options."""
|
|
120
117
|
|
|
121
|
-
bulk: Annotated[
|
|
118
|
+
bulk: Annotated[Bulk | None, Mutability.read_only, Required.true] = None
|
|
122
119
|
"""A complex type that specifies bulk configuration options."""
|
|
123
120
|
|
|
124
|
-
filter: Annotated[
|
|
121
|
+
filter: Annotated[Filter | None, Mutability.read_only, Required.true] = None
|
|
125
122
|
"""A complex type that specifies FILTER options."""
|
|
126
123
|
|
|
127
124
|
change_password: Annotated[
|
|
128
|
-
|
|
125
|
+
ChangePassword | None, Mutability.read_only, Required.true
|
|
129
126
|
] = None
|
|
130
127
|
"""A complex type that specifies configuration options related to changing
|
|
131
128
|
a password."""
|
|
132
129
|
|
|
133
|
-
sort: Annotated[
|
|
130
|
+
sort: Annotated[Sort | None, Mutability.read_only, Required.true] = None
|
|
134
131
|
"""A complex type that specifies sort result options."""
|
|
135
132
|
|
|
136
|
-
etag: Annotated[
|
|
133
|
+
etag: Annotated[ETag | None, Mutability.read_only, Required.true] = None
|
|
137
134
|
"""A complex type that specifies ETag configuration options."""
|
|
138
135
|
|
|
139
136
|
authentication_schemes: Annotated[
|
|
140
|
-
|
|
137
|
+
list[AuthenticationScheme] | None, Mutability.read_only, Required.true
|
|
141
138
|
] = None
|
|
142
139
|
"""A complex type that specifies supported authentication scheme
|
|
143
140
|
properties."""
|