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.
@@ -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: Optional[str] = None
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: Optional[datetime] = None
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: Optional[datetime] = None
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: Optional[str] = None
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: Optional[str] = None
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
- ) -> Optional[dict[str, Any]]:
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
- Optional[str], Mutability.read_only, Returned.always, Uniqueness.global_
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
- Optional[str], Mutability.read_write, Returned.default, CaseExact.true
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[Optional[Meta], Mutability.read_only, Returned.default] = None
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
- Optional[extension],
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) -> Optional[Extension]:
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(Optional[Extension], getattr(self, item.__name__))
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
- ) -> Optional[type[Extension]]:
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
- ) -> Optional[Union[type["Resource[Any]"], type["Extension"]]]:
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, Union[type[Resource[Any]], type[Extension]]] = {
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
- ) -> Optional[type]:
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: Optional[Context] = Context.DEFAULT,
302
- attributes: Optional[list[str]] = None,
303
- excluded_attributes: Optional[list[str]] = None,
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: Optional[Context] = Context.DEFAULT,
327
- attributes: Optional[list[str]] = None,
328
- excluded_attributes: Optional[list[str]] = None,
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: Optional[Context] = Context.DEFAULT,
353
- attributes: Optional[list[str]] = None,
354
- excluded_attributes: Optional[list[str]] = None,
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
- Optional[Reference[URIReference]],
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[Optional[bool], Mutability.read_only, Required.true] = None
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[Optional[str], Mutability.read_only, Required.true] = None
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[Optional[str], Mutability.read_only] = None
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[Optional[str], Mutability.read_only, Returned.default] = None
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
- Optional[Reference[URIReference]], Mutability.read_only, Required.true
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
- Optional[Reference[URIReference]],
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
- Optional[list[SchemaExtension]], Mutability.read_only, Required.true
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
 
@@ -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 = re.sub(r"\W|^(?=\d)", "", identifier)
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: Optional[list[str]] = None,
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.value]
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
- Optional[str], Mutability.read_only, Required.true, CaseExact.true
146
- ] = None
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[Optional[Type], Mutability.read_only, Required.true] = Field(
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[Optional[bool], Mutability.read_only, Required.true] = None
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
- Optional[str], Mutability.read_only, Required.false, CaseExact.true
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
- Optional[list[str]], Mutability.read_only, CaseExact.true
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
- Optional[list[str]], Mutability.read_only, Required.false, CaseExact.true
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[Optional[List["Attribute"]], Mutability.read_only] = None # noqa: UP006
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) -> Optional[tuple[Any, Any]]:
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
- Optional[attr_type], # type: ignore
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[Optional[str], Mutability.read_only, Required.true] = None
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
- Optional[str], Mutability.read_only, Returned.default, Required.true
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[Optional[str], Mutability.read_only, Returned.default] = None
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
- Optional[list[Attribute]], Mutability.read_only, Required.true
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) -> Optional[Attribute]:
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[Optional[bool], Mutability.read_only, Required.true] = None
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[Optional[bool], Mutability.read_only, Required.true] = None
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[Optional[int], Mutability.read_only, Required.true] = None
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[Optional[int], Mutability.read_only, Required.true] = (
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[Optional[bool], Mutability.read_only, Required.true] = None
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[Optional[int], Mutability.read_only, Required.true] = None
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[Optional[bool], Mutability.read_only, Required.true] = None
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[Optional[bool], Mutability.read_only, Required.true] = None
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[Optional[bool], Mutability.read_only, Required.true] = None
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[Optional[Type], Mutability.read_only, Required.true] = Field(
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[Optional[str], Mutability.read_only, Required.true] = None
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[Optional[str], Mutability.read_only, Required.true] = None
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
- Optional[Reference[ExternalReference]], Mutability.read_only
81
- ] = None
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
- Optional[Reference[ExternalReference]], Mutability.read_only
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[Optional[bool], Mutability.read_only] = None
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
- Optional[str], Mutability.read_only, Returned.default, Uniqueness.global_
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
- Optional[Reference[ExternalReference]], Mutability.read_only
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[Optional[Patch], Mutability.read_only, Required.true] = None
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[Optional[Bulk], Mutability.read_only, Required.true] = None
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[Optional[Filter], Mutability.read_only, Required.true] = None
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
- Optional[ChangePassword], Mutability.read_only, Required.true
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[Optional[Sort], Mutability.read_only, Required.true] = None
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[Optional[ETag], Mutability.read_only, Required.true] = None
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
- Optional[list[AuthenticationScheme]], Mutability.read_only, Required.true
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."""