scim2-client 0.6.1__py3-none-any.whl → 0.7.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_client/client.py CHANGED
@@ -2,7 +2,6 @@ import asyncio
2
2
  import sys
3
3
  from collections.abc import Collection
4
4
  from dataclasses import dataclass
5
- from typing import Optional
6
5
  from typing import TypeVar
7
6
  from typing import Union
8
7
 
@@ -40,10 +39,10 @@ CONFIG_RESOURCES = (ResourceType, Schema, ServiceProviderConfig)
40
39
  @dataclass
41
40
  class RequestPayload:
42
41
  request_kwargs: dict
43
- url: Optional[str] = None
44
- payload: Optional[dict] = None
45
- expected_types: Optional[list[type[Resource]]] = None
46
- expected_status_codes: Optional[list[int]] = None
42
+ url: str | None = None
43
+ payload: dict | None = None
44
+ expected_types: list[type[Resource]] | None = None
45
+ expected_status_codes: list[int] | None = None
47
46
 
48
47
 
49
48
  class SCIMClient:
@@ -176,9 +175,9 @@ class SCIMClient:
176
175
 
177
176
  def __init__(
178
177
  self,
179
- resource_models: Optional[Collection[type[Resource]]] = None,
180
- resource_types: Optional[Collection[ResourceType]] = None,
181
- service_provider_config: Optional[ServiceProviderConfig] = None,
178
+ resource_models: Collection[type[Resource]] | None = None,
179
+ resource_types: Collection[ResourceType] | None = None,
180
+ service_provider_config: ServiceProviderConfig | None = None,
182
181
  check_request_payload: bool = True,
183
182
  check_response_payload: bool = True,
184
183
  check_response_content_type: bool = True,
@@ -194,10 +193,10 @@ class SCIMClient:
194
193
  self.check_response_status_codes = check_response_status_codes
195
194
  self.raise_scim_errors = raise_scim_errors
196
195
 
197
- def get_resource_model(self, name: str) -> Optional[type[Resource]]:
196
+ def get_resource_model(self, name: str) -> type[Resource] | None:
198
197
  """Get a registered model by its name or its schema."""
199
198
  for resource_model in self.resource_models:
200
- schema = resource_model.model_fields["schemas"].default[0]
199
+ schema = resource_model.__schema__
201
200
  if schema == name or schema.split(":")[-1] == name:
202
201
  return resource_model
203
202
  return None
@@ -205,9 +204,9 @@ class SCIMClient:
205
204
  def _check_resource_model(
206
205
  self, resource_model: type[Resource], payload=None
207
206
  ) -> None:
208
- schema_to_check = resource_model.model_fields["schemas"].default[0]
207
+ schema_to_check = resource_model.__schema__
209
208
  for element in self.resource_models:
210
- schema = element.model_fields["schemas"].default[0]
209
+ schema = element.__schema__
211
210
  if schema_to_check == schema:
212
211
  return
213
212
 
@@ -216,7 +215,7 @@ class SCIMClient:
216
215
  f"Unknown resource type: '{resource_model}'", source=payload
217
216
  )
218
217
 
219
- def resource_endpoint(self, resource_model: Optional[type[Resource]]) -> str:
218
+ def resource_endpoint(self, resource_model: type[Resource] | None) -> str:
220
219
  """Find the :attr:`~scim2_models.ResourceType.endpoint` associated with a given :class:`~scim2_models.Resource`.
221
220
 
222
221
  Internally, it looks if any :paramref:`resource_type <scim2_client.SCIMClient.resource_models>`
@@ -232,7 +231,7 @@ class SCIMClient:
232
231
  if resource_model is ServiceProviderConfig:
233
232
  return "/ServiceProviderConfig"
234
233
 
235
- schema = resource_model.model_fields["schemas"].default[0]
234
+ schema = resource_model.__schema__
236
235
  for resource_type in self.resource_types or []:
237
236
  if schema == resource_type.schema_:
238
237
  return resource_type.endpoint
@@ -253,7 +252,7 @@ class SCIMClient:
253
252
  ]
254
253
 
255
254
  def _check_status_codes(
256
- self, status_code: int, expected_status_codes: Optional[list[int]]
255
+ self, status_code: int, expected_status_codes: list[int] | None
257
256
  ):
258
257
  if (
259
258
  self.check_response_status_codes
@@ -279,15 +278,15 @@ class SCIMClient:
279
278
 
280
279
  def check_response(
281
280
  self,
282
- payload: Optional[dict],
281
+ payload: dict | None,
283
282
  status_code: int,
284
283
  headers: dict,
285
- expected_status_codes: Optional[list[int]] = None,
286
- expected_types: Optional[list[type[Resource]]] = None,
287
- check_response_payload: Optional[bool] = None,
288
- raise_scim_errors: Optional[bool] = None,
289
- scim_ctx: Optional[Context] = None,
290
- ) -> Union[Error, None, dict, type[Resource]]:
284
+ expected_status_codes: list[int] | None = None,
285
+ expected_types: list[type[Resource]] | None = None,
286
+ check_response_payload: bool | None = None,
287
+ raise_scim_errors: bool | None = None,
288
+ scim_ctx: Context | None = None,
289
+ ) -> Error | None | dict | type[Resource]:
291
290
  if raise_scim_errors is None:
292
291
  raise_scim_errors = self.raise_scim_errors
293
292
 
@@ -311,10 +310,7 @@ class SCIMClient:
311
310
  self._check_status_codes(status_code, expected_status_codes)
312
311
  return response_payload
313
312
 
314
- if (
315
- response_payload
316
- and response_payload.get("schemas") == Error.model_fields["schemas"].default
317
- ):
313
+ if response_payload and response_payload.get("schemas") == [Error.__schema__]:
318
314
  error = Error.model_validate(response_payload)
319
315
  if raise_scim_errors:
320
316
  raise SCIMResponseErrorObject(obj=error.detail, source=error)
@@ -355,9 +351,9 @@ class SCIMClient:
355
351
 
356
352
  def _prepare_create_request(
357
353
  self,
358
- resource: Union[AnyResource, dict],
359
- check_request_payload: Optional[bool] = None,
360
- expected_status_codes: Optional[list[int]] = None,
354
+ resource: AnyResource | dict,
355
+ check_request_payload: bool | None = None,
356
+ expected_status_codes: list[int] | None = None,
361
357
  **kwargs,
362
358
  ) -> RequestPayload:
363
359
  req = RequestPayload(
@@ -403,11 +399,11 @@ class SCIMClient:
403
399
 
404
400
  def _prepare_query_request(
405
401
  self,
406
- resource_model: Optional[type[Resource]] = None,
407
- id: Optional[str] = None,
408
- search_request: Optional[Union[SearchRequest, dict]] = None,
409
- check_request_payload: Optional[bool] = None,
410
- expected_status_codes: Optional[list[int]] = None,
402
+ resource_model: type[Resource] | None = None,
403
+ id: str | None = None,
404
+ search_request: SearchRequest | dict | None = None,
405
+ check_request_payload: bool | None = None,
406
+ expected_status_codes: list[int] | None = None,
411
407
  **kwargs,
412
408
  ) -> RequestPayload:
413
409
  req = RequestPayload(
@@ -421,13 +417,14 @@ class SCIMClient:
421
417
  if resource_model and check_request_payload:
422
418
  self._check_resource_model(resource_model)
423
419
 
424
- payload: Optional[SearchRequest]
420
+ payload: SearchRequest | None
425
421
  if not check_request_payload:
426
422
  payload = search_request
427
423
 
428
424
  elif isinstance(search_request, SearchRequest):
429
425
  payload = search_request.model_dump(
430
426
  exclude_unset=True,
427
+ exclude={"schemas"},
431
428
  scim_ctx=Context.RESOURCE_QUERY_REQUEST,
432
429
  )
433
430
 
@@ -440,7 +437,7 @@ class SCIMClient:
440
437
  if resource_model is None:
441
438
  req.expected_types = [
442
439
  *self.resource_models,
443
- ListResponse[Union[self.resource_models]],
440
+ ListResponse[Union[self.resource_models]], # noqa: UP007
444
441
  ]
445
442
 
446
443
  elif resource_model == ServiceProviderConfig:
@@ -459,9 +456,9 @@ class SCIMClient:
459
456
 
460
457
  def _prepare_search_request(
461
458
  self,
462
- search_request: Optional[SearchRequest] = None,
463
- check_request_payload: Optional[bool] = None,
464
- expected_status_codes: Optional[list[int]] = None,
459
+ search_request: SearchRequest | None = None,
460
+ check_request_payload: bool | None = None,
461
+ expected_status_codes: list[int] | None = None,
465
462
  **kwargs,
466
463
  ) -> RequestPayload:
467
464
  req = RequestPayload(
@@ -485,14 +482,14 @@ class SCIMClient:
485
482
  )
486
483
 
487
484
  req.url = req.request_kwargs.pop("url", "/.search")
488
- req.expected_types = [ListResponse[Union[self.resource_models]]]
485
+ req.expected_types = [ListResponse[Union[self.resource_models]]] # noqa: UP007
489
486
  return req
490
487
 
491
488
  def _prepare_delete_request(
492
489
  self,
493
490
  resource_model: type,
494
491
  id: str,
495
- expected_status_codes: Optional[list[int]] = None,
492
+ expected_status_codes: list[int] | None = None,
496
493
  **kwargs,
497
494
  ) -> RequestPayload:
498
495
  req = RequestPayload(
@@ -507,9 +504,9 @@ class SCIMClient:
507
504
 
508
505
  def _prepare_replace_request(
509
506
  self,
510
- resource: Union[AnyResource, dict],
511
- check_request_payload: Optional[bool] = None,
512
- expected_status_codes: Optional[list[int]] = None,
507
+ resource: AnyResource | dict,
508
+ check_request_payload: bool | None = None,
509
+ expected_status_codes: list[int] | None = None,
513
510
  **kwargs,
514
511
  ) -> RequestPayload:
515
512
  req = RequestPayload(
@@ -563,9 +560,9 @@ class SCIMClient:
563
560
  self,
564
561
  resource_model: type[ResourceT],
565
562
  id: str,
566
- patch_op: Union[PatchOp[ResourceT], dict],
567
- check_request_payload: Optional[bool] = None,
568
- expected_status_codes: Optional[list[int]] = None,
563
+ patch_op: PatchOp[ResourceT] | dict,
564
+ check_request_payload: bool | None = None,
565
+ expected_status_codes: list[int] | None = None,
569
566
  **kwargs,
570
567
  ) -> RequestPayload:
571
568
  """Prepare a PATCH request payload.
@@ -625,9 +622,9 @@ class SCIMClient:
625
622
  self,
626
623
  resource_model: type[ResourceT],
627
624
  id: str,
628
- patch_op: Union[PatchOp[ResourceT], dict],
625
+ patch_op: PatchOp[ResourceT] | dict,
629
626
  **kwargs,
630
- ) -> Optional[Union[ResourceT, Error, dict]]:
627
+ ) -> ResourceT | Error | dict | None:
631
628
  raise NotImplementedError()
632
629
 
633
630
  def build_resource_models(
@@ -649,7 +646,7 @@ class SCIMClient:
649
646
  extension = Extension.from_schema(schema_obj)
650
647
  extensions = extensions + (extension,)
651
648
  if extensions:
652
- model = model[Union[extensions]]
649
+ model = model[Union[extensions]] # noqa: UP007
653
650
  resource_models.append(model)
654
651
 
655
652
  return tuple(resource_models)
@@ -660,15 +657,14 @@ class BaseSyncSCIMClient(SCIMClient):
660
657
 
661
658
  def create(
662
659
  self,
663
- resource: Union[AnyResource, dict],
664
- check_request_payload: Optional[bool] = None,
665
- check_response_payload: Optional[bool] = None,
666
- expected_status_codes: Optional[
667
- list[int]
668
- ] = SCIMClient.CREATION_RESPONSE_STATUS_CODES,
669
- raise_scim_errors: Optional[bool] = None,
660
+ resource: AnyResource | dict,
661
+ check_request_payload: bool | None = None,
662
+ check_response_payload: bool | None = None,
663
+ expected_status_codes: list[int]
664
+ | None = SCIMClient.CREATION_RESPONSE_STATUS_CODES,
665
+ raise_scim_errors: bool | None = None,
670
666
  **kwargs,
671
- ) -> Union[AnyResource, Error, dict]:
667
+ ) -> AnyResource | Error | dict:
672
668
  """Perform a POST request to create, as defined in :rfc:`RFC7644 §3.3 <7644#section-3.3>`.
673
669
 
674
670
  :param resource: The resource to create
@@ -706,17 +702,16 @@ class BaseSyncSCIMClient(SCIMClient):
706
702
 
707
703
  def query(
708
704
  self,
709
- resource_model: Optional[type[AnyResource]] = None,
710
- id: Optional[str] = None,
711
- search_request: Optional[Union[SearchRequest, dict]] = None,
712
- check_request_payload: Optional[bool] = None,
713
- check_response_payload: Optional[bool] = None,
714
- expected_status_codes: Optional[
715
- list[int]
716
- ] = SCIMClient.QUERY_RESPONSE_STATUS_CODES,
717
- raise_scim_errors: Optional[bool] = None,
705
+ resource_model: type[AnyResource] | None = None,
706
+ id: str | None = None,
707
+ search_request: SearchRequest | dict | None = None,
708
+ check_request_payload: bool | None = None,
709
+ check_response_payload: bool | None = None,
710
+ expected_status_codes: list[int]
711
+ | None = SCIMClient.QUERY_RESPONSE_STATUS_CODES,
712
+ raise_scim_errors: bool | None = None,
718
713
  **kwargs,
719
- ) -> Union[AnyResource, ListResponse[AnyResource], Error, dict]:
714
+ ) -> AnyResource | ListResponse[AnyResource] | Error | dict:
720
715
  """Perform a GET request to read resources, as defined in :rfc:`RFC7644 §3.4.2 <7644#section-3.4.2>`.
721
716
 
722
717
  - If `id` is not :data:`None`, the resource with the exact id will be reached.
@@ -780,15 +775,14 @@ class BaseSyncSCIMClient(SCIMClient):
780
775
 
781
776
  def search(
782
777
  self,
783
- search_request: Optional[SearchRequest] = None,
784
- check_request_payload: Optional[bool] = None,
785
- check_response_payload: Optional[bool] = None,
786
- expected_status_codes: Optional[
787
- list[int]
788
- ] = SCIMClient.SEARCH_RESPONSE_STATUS_CODES,
789
- raise_scim_errors: Optional[bool] = None,
778
+ search_request: SearchRequest | None = None,
779
+ check_request_payload: bool | None = None,
780
+ check_response_payload: bool | None = None,
781
+ expected_status_codes: list[int]
782
+ | None = SCIMClient.SEARCH_RESPONSE_STATUS_CODES,
783
+ raise_scim_errors: bool | None = None,
790
784
  **kwargs,
791
- ) -> Union[AnyResource, ListResponse[AnyResource], Error, dict]:
785
+ ) -> AnyResource | ListResponse[AnyResource] | Error | dict:
792
786
  """Perform a POST search request to read all available resources, as defined in :rfc:`RFC7644 §3.4.3 <7644#section-3.4.3>`.
793
787
 
794
788
  :param resource_models: Resource type or union of types expected
@@ -830,13 +824,12 @@ class BaseSyncSCIMClient(SCIMClient):
830
824
  self,
831
825
  resource_model: type,
832
826
  id: str,
833
- check_response_payload: Optional[bool] = None,
834
- expected_status_codes: Optional[
835
- list[int]
836
- ] = SCIMClient.DELETION_RESPONSE_STATUS_CODES,
837
- raise_scim_errors: Optional[bool] = None,
827
+ check_response_payload: bool | None = None,
828
+ expected_status_codes: list[int]
829
+ | None = SCIMClient.DELETION_RESPONSE_STATUS_CODES,
830
+ raise_scim_errors: bool | None = None,
838
831
  **kwargs,
839
- ) -> Optional[Union[Error, dict]]:
832
+ ) -> Error | dict | None:
840
833
  """Perform a DELETE request to create, as defined in :rfc:`RFC7644 §3.6 <7644#section-3.6>`.
841
834
 
842
835
  :param resource_model: The type of the resource to delete.
@@ -866,15 +859,14 @@ class BaseSyncSCIMClient(SCIMClient):
866
859
 
867
860
  def replace(
868
861
  self,
869
- resource: Union[AnyResource, dict],
870
- check_request_payload: Optional[bool] = None,
871
- check_response_payload: Optional[bool] = None,
872
- expected_status_codes: Optional[
873
- list[int]
874
- ] = SCIMClient.REPLACEMENT_RESPONSE_STATUS_CODES,
875
- raise_scim_errors: Optional[bool] = None,
862
+ resource: AnyResource | dict,
863
+ check_request_payload: bool | None = None,
864
+ check_response_payload: bool | None = None,
865
+ expected_status_codes: list[int]
866
+ | None = SCIMClient.REPLACEMENT_RESPONSE_STATUS_CODES,
867
+ raise_scim_errors: bool | None = None,
876
868
  **kwargs,
877
- ) -> Union[AnyResource, Error, dict]:
869
+ ) -> AnyResource | Error | dict:
878
870
  """Perform a PUT request to replace a resource, as defined in :rfc:`RFC7644 §3.5.1 <7644#section-3.5.1>`.
879
871
 
880
872
  :param resource: The new resource to replace.
@@ -915,15 +907,14 @@ class BaseSyncSCIMClient(SCIMClient):
915
907
  self,
916
908
  resource_model: type[ResourceT],
917
909
  id: str,
918
- patch_op: Union[PatchOp[ResourceT], dict],
919
- check_request_payload: Optional[bool] = None,
920
- check_response_payload: Optional[bool] = None,
921
- expected_status_codes: Optional[
922
- list[int]
923
- ] = SCIMClient.PATCH_RESPONSE_STATUS_CODES,
924
- raise_scim_errors: Optional[bool] = None,
910
+ patch_op: PatchOp[ResourceT] | dict,
911
+ check_request_payload: bool | None = None,
912
+ check_response_payload: bool | None = None,
913
+ expected_status_codes: list[int]
914
+ | None = SCIMClient.PATCH_RESPONSE_STATUS_CODES,
915
+ raise_scim_errors: bool | None = None,
925
916
  **kwargs,
926
- ) -> Optional[Union[ResourceT, Error, dict]]:
917
+ ) -> ResourceT | Error | dict | None:
927
918
  """Perform a PATCH request to modify a resource, as defined in :rfc:`RFC7644 §3.5.2 <7644#section-3.5.2>`.
928
919
 
929
920
  :param resource_model: The type of the resource to modify.
@@ -993,15 +984,14 @@ class BaseAsyncSCIMClient(SCIMClient):
993
984
 
994
985
  async def create(
995
986
  self,
996
- resource: Union[AnyResource, dict],
997
- check_request_payload: Optional[bool] = None,
998
- check_response_payload: Optional[bool] = None,
999
- expected_status_codes: Optional[
1000
- list[int]
1001
- ] = SCIMClient.CREATION_RESPONSE_STATUS_CODES,
1002
- raise_scim_errors: Optional[bool] = None,
987
+ resource: AnyResource | dict,
988
+ check_request_payload: bool | None = None,
989
+ check_response_payload: bool | None = None,
990
+ expected_status_codes: list[int]
991
+ | None = SCIMClient.CREATION_RESPONSE_STATUS_CODES,
992
+ raise_scim_errors: bool | None = None,
1003
993
  **kwargs,
1004
- ) -> Union[AnyResource, Error, dict]:
994
+ ) -> AnyResource | Error | dict:
1005
995
  """Perform a POST request to create, as defined in :rfc:`RFC7644 §3.3 <7644#section-3.3>`.
1006
996
 
1007
997
  :param resource: The resource to create
@@ -1039,17 +1029,16 @@ class BaseAsyncSCIMClient(SCIMClient):
1039
1029
 
1040
1030
  async def query(
1041
1031
  self,
1042
- resource_model: Optional[type[Resource]] = None,
1043
- id: Optional[str] = None,
1044
- search_request: Optional[Union[SearchRequest, dict]] = None,
1045
- check_request_payload: Optional[bool] = None,
1046
- check_response_payload: Optional[bool] = None,
1047
- expected_status_codes: Optional[
1048
- list[int]
1049
- ] = SCIMClient.QUERY_RESPONSE_STATUS_CODES,
1050
- raise_scim_errors: Optional[bool] = None,
1032
+ resource_model: type[Resource] | None = None,
1033
+ id: str | None = None,
1034
+ search_request: SearchRequest | dict | None = None,
1035
+ check_request_payload: bool | None = None,
1036
+ check_response_payload: bool | None = None,
1037
+ expected_status_codes: list[int]
1038
+ | None = SCIMClient.QUERY_RESPONSE_STATUS_CODES,
1039
+ raise_scim_errors: bool | None = None,
1051
1040
  **kwargs,
1052
- ) -> Union[AnyResource, ListResponse[AnyResource], Error, dict]:
1041
+ ) -> AnyResource | ListResponse[AnyResource] | Error | dict:
1053
1042
  """Perform a GET request to read resources, as defined in :rfc:`RFC7644 §3.4.2 <7644#section-3.4.2>`.
1054
1043
 
1055
1044
  - If `id` is not :data:`None`, the resource with the exact id will be reached.
@@ -1113,15 +1102,14 @@ class BaseAsyncSCIMClient(SCIMClient):
1113
1102
 
1114
1103
  async def search(
1115
1104
  self,
1116
- search_request: Optional[SearchRequest] = None,
1117
- check_request_payload: Optional[bool] = None,
1118
- check_response_payload: Optional[bool] = None,
1119
- expected_status_codes: Optional[
1120
- list[int]
1121
- ] = SCIMClient.SEARCH_RESPONSE_STATUS_CODES,
1122
- raise_scim_errors: Optional[bool] = None,
1105
+ search_request: SearchRequest | None = None,
1106
+ check_request_payload: bool | None = None,
1107
+ check_response_payload: bool | None = None,
1108
+ expected_status_codes: list[int]
1109
+ | None = SCIMClient.SEARCH_RESPONSE_STATUS_CODES,
1110
+ raise_scim_errors: bool | None = None,
1123
1111
  **kwargs,
1124
- ) -> Union[AnyResource, ListResponse[AnyResource], Error, dict]:
1112
+ ) -> AnyResource | ListResponse[AnyResource] | Error | dict:
1125
1113
  """Perform a POST search request to read all available resources, as defined in :rfc:`RFC7644 §3.4.3 <7644#section-3.4.3>`.
1126
1114
 
1127
1115
  :param resource_models: Resource type or union of types expected
@@ -1163,13 +1151,12 @@ class BaseAsyncSCIMClient(SCIMClient):
1163
1151
  self,
1164
1152
  resource_model: type,
1165
1153
  id: str,
1166
- check_response_payload: Optional[bool] = None,
1167
- expected_status_codes: Optional[
1168
- list[int]
1169
- ] = SCIMClient.DELETION_RESPONSE_STATUS_CODES,
1170
- raise_scim_errors: Optional[bool] = None,
1154
+ check_response_payload: bool | None = None,
1155
+ expected_status_codes: list[int]
1156
+ | None = SCIMClient.DELETION_RESPONSE_STATUS_CODES,
1157
+ raise_scim_errors: bool | None = None,
1171
1158
  **kwargs,
1172
- ) -> Optional[Union[Error, dict]]:
1159
+ ) -> Error | dict | None:
1173
1160
  """Perform a DELETE request to create, as defined in :rfc:`RFC7644 §3.6 <7644#section-3.6>`.
1174
1161
 
1175
1162
  :param resource_model: The type of the resource to delete.
@@ -1199,15 +1186,14 @@ class BaseAsyncSCIMClient(SCIMClient):
1199
1186
 
1200
1187
  async def replace(
1201
1188
  self,
1202
- resource: Union[AnyResource, dict],
1203
- check_request_payload: Optional[bool] = None,
1204
- check_response_payload: Optional[bool] = None,
1205
- expected_status_codes: Optional[
1206
- list[int]
1207
- ] = SCIMClient.REPLACEMENT_RESPONSE_STATUS_CODES,
1208
- raise_scim_errors: Optional[bool] = None,
1189
+ resource: AnyResource | dict,
1190
+ check_request_payload: bool | None = None,
1191
+ check_response_payload: bool | None = None,
1192
+ expected_status_codes: list[int]
1193
+ | None = SCIMClient.REPLACEMENT_RESPONSE_STATUS_CODES,
1194
+ raise_scim_errors: bool | None = None,
1209
1195
  **kwargs,
1210
- ) -> Union[AnyResource, Error, dict]:
1196
+ ) -> AnyResource | Error | dict:
1211
1197
  """Perform a PUT request to replace a resource, as defined in :rfc:`RFC7644 §3.5.1 <7644#section-3.5.1>`.
1212
1198
 
1213
1199
  :param resource: The new resource to replace.
@@ -1248,15 +1234,14 @@ class BaseAsyncSCIMClient(SCIMClient):
1248
1234
  self,
1249
1235
  resource_model: type[ResourceT],
1250
1236
  id: str,
1251
- patch_op: Union[PatchOp[ResourceT], dict],
1252
- check_request_payload: Optional[bool] = None,
1253
- check_response_payload: Optional[bool] = None,
1254
- expected_status_codes: Optional[
1255
- list[int]
1256
- ] = SCIMClient.PATCH_RESPONSE_STATUS_CODES,
1257
- raise_scim_errors: Optional[bool] = None,
1237
+ patch_op: PatchOp[ResourceT] | dict,
1238
+ check_request_payload: bool | None = None,
1239
+ check_response_payload: bool | None = None,
1240
+ expected_status_codes: list[int]
1241
+ | None = SCIMClient.PATCH_RESPONSE_STATUS_CODES,
1242
+ raise_scim_errors: bool | None = None,
1258
1243
  **kwargs,
1259
- ) -> Optional[Union[ResourceT, Error, dict]]:
1244
+ ) -> ResourceT | Error | dict | None:
1260
1245
  """Perform a PATCH request to modify a resource, as defined in :rfc:`RFC7644 §3.5.2 <7644#section-3.5.2>`.
1261
1246
 
1262
1247
  :param resource_model: The type of the resource to modify.