scim2-client 0.6.1__py3-none-any.whl → 0.7.0__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,7 +417,7 @@ 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
 
@@ -440,7 +436,7 @@ class SCIMClient:
440
436
  if resource_model is None:
441
437
  req.expected_types = [
442
438
  *self.resource_models,
443
- ListResponse[Union[self.resource_models]],
439
+ ListResponse[Union[self.resource_models]], # noqa: UP007
444
440
  ]
445
441
 
446
442
  elif resource_model == ServiceProviderConfig:
@@ -459,9 +455,9 @@ class SCIMClient:
459
455
 
460
456
  def _prepare_search_request(
461
457
  self,
462
- search_request: Optional[SearchRequest] = None,
463
- check_request_payload: Optional[bool] = None,
464
- expected_status_codes: Optional[list[int]] = None,
458
+ search_request: SearchRequest | None = None,
459
+ check_request_payload: bool | None = None,
460
+ expected_status_codes: list[int] | None = None,
465
461
  **kwargs,
466
462
  ) -> RequestPayload:
467
463
  req = RequestPayload(
@@ -485,14 +481,14 @@ class SCIMClient:
485
481
  )
486
482
 
487
483
  req.url = req.request_kwargs.pop("url", "/.search")
488
- req.expected_types = [ListResponse[Union[self.resource_models]]]
484
+ req.expected_types = [ListResponse[Union[self.resource_models]]] # noqa: UP007
489
485
  return req
490
486
 
491
487
  def _prepare_delete_request(
492
488
  self,
493
489
  resource_model: type,
494
490
  id: str,
495
- expected_status_codes: Optional[list[int]] = None,
491
+ expected_status_codes: list[int] | None = None,
496
492
  **kwargs,
497
493
  ) -> RequestPayload:
498
494
  req = RequestPayload(
@@ -507,9 +503,9 @@ class SCIMClient:
507
503
 
508
504
  def _prepare_replace_request(
509
505
  self,
510
- resource: Union[AnyResource, dict],
511
- check_request_payload: Optional[bool] = None,
512
- expected_status_codes: Optional[list[int]] = None,
506
+ resource: AnyResource | dict,
507
+ check_request_payload: bool | None = None,
508
+ expected_status_codes: list[int] | None = None,
513
509
  **kwargs,
514
510
  ) -> RequestPayload:
515
511
  req = RequestPayload(
@@ -563,9 +559,9 @@ class SCIMClient:
563
559
  self,
564
560
  resource_model: type[ResourceT],
565
561
  id: str,
566
- patch_op: Union[PatchOp[ResourceT], dict],
567
- check_request_payload: Optional[bool] = None,
568
- expected_status_codes: Optional[list[int]] = None,
562
+ patch_op: PatchOp[ResourceT] | dict,
563
+ check_request_payload: bool | None = None,
564
+ expected_status_codes: list[int] | None = None,
569
565
  **kwargs,
570
566
  ) -> RequestPayload:
571
567
  """Prepare a PATCH request payload.
@@ -625,9 +621,9 @@ class SCIMClient:
625
621
  self,
626
622
  resource_model: type[ResourceT],
627
623
  id: str,
628
- patch_op: Union[PatchOp[ResourceT], dict],
624
+ patch_op: PatchOp[ResourceT] | dict,
629
625
  **kwargs,
630
- ) -> Optional[Union[ResourceT, Error, dict]]:
626
+ ) -> ResourceT | Error | dict | None:
631
627
  raise NotImplementedError()
632
628
 
633
629
  def build_resource_models(
@@ -649,7 +645,7 @@ class SCIMClient:
649
645
  extension = Extension.from_schema(schema_obj)
650
646
  extensions = extensions + (extension,)
651
647
  if extensions:
652
- model = model[Union[extensions]]
648
+ model = model[Union[extensions]] # noqa: UP007
653
649
  resource_models.append(model)
654
650
 
655
651
  return tuple(resource_models)
@@ -660,15 +656,14 @@ class BaseSyncSCIMClient(SCIMClient):
660
656
 
661
657
  def create(
662
658
  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,
659
+ resource: AnyResource | dict,
660
+ check_request_payload: bool | None = None,
661
+ check_response_payload: bool | None = None,
662
+ expected_status_codes: list[int]
663
+ | None = SCIMClient.CREATION_RESPONSE_STATUS_CODES,
664
+ raise_scim_errors: bool | None = None,
670
665
  **kwargs,
671
- ) -> Union[AnyResource, Error, dict]:
666
+ ) -> AnyResource | Error | dict:
672
667
  """Perform a POST request to create, as defined in :rfc:`RFC7644 §3.3 <7644#section-3.3>`.
673
668
 
674
669
  :param resource: The resource to create
@@ -706,17 +701,16 @@ class BaseSyncSCIMClient(SCIMClient):
706
701
 
707
702
  def query(
708
703
  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,
704
+ resource_model: type[AnyResource] | None = None,
705
+ id: str | None = None,
706
+ search_request: SearchRequest | dict | None = None,
707
+ check_request_payload: bool | None = None,
708
+ check_response_payload: bool | None = None,
709
+ expected_status_codes: list[int]
710
+ | None = SCIMClient.QUERY_RESPONSE_STATUS_CODES,
711
+ raise_scim_errors: bool | None = None,
718
712
  **kwargs,
719
- ) -> Union[AnyResource, ListResponse[AnyResource], Error, dict]:
713
+ ) -> AnyResource | ListResponse[AnyResource] | Error | dict:
720
714
  """Perform a GET request to read resources, as defined in :rfc:`RFC7644 §3.4.2 <7644#section-3.4.2>`.
721
715
 
722
716
  - If `id` is not :data:`None`, the resource with the exact id will be reached.
@@ -780,15 +774,14 @@ class BaseSyncSCIMClient(SCIMClient):
780
774
 
781
775
  def search(
782
776
  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,
777
+ search_request: SearchRequest | None = None,
778
+ check_request_payload: bool | None = None,
779
+ check_response_payload: bool | None = None,
780
+ expected_status_codes: list[int]
781
+ | None = SCIMClient.SEARCH_RESPONSE_STATUS_CODES,
782
+ raise_scim_errors: bool | None = None,
790
783
  **kwargs,
791
- ) -> Union[AnyResource, ListResponse[AnyResource], Error, dict]:
784
+ ) -> AnyResource | ListResponse[AnyResource] | Error | dict:
792
785
  """Perform a POST search request to read all available resources, as defined in :rfc:`RFC7644 §3.4.3 <7644#section-3.4.3>`.
793
786
 
794
787
  :param resource_models: Resource type or union of types expected
@@ -830,13 +823,12 @@ class BaseSyncSCIMClient(SCIMClient):
830
823
  self,
831
824
  resource_model: type,
832
825
  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,
826
+ check_response_payload: bool | None = None,
827
+ expected_status_codes: list[int]
828
+ | None = SCIMClient.DELETION_RESPONSE_STATUS_CODES,
829
+ raise_scim_errors: bool | None = None,
838
830
  **kwargs,
839
- ) -> Optional[Union[Error, dict]]:
831
+ ) -> Error | dict | None:
840
832
  """Perform a DELETE request to create, as defined in :rfc:`RFC7644 §3.6 <7644#section-3.6>`.
841
833
 
842
834
  :param resource_model: The type of the resource to delete.
@@ -866,15 +858,14 @@ class BaseSyncSCIMClient(SCIMClient):
866
858
 
867
859
  def replace(
868
860
  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,
861
+ resource: AnyResource | dict,
862
+ check_request_payload: bool | None = None,
863
+ check_response_payload: bool | None = None,
864
+ expected_status_codes: list[int]
865
+ | None = SCIMClient.REPLACEMENT_RESPONSE_STATUS_CODES,
866
+ raise_scim_errors: bool | None = None,
876
867
  **kwargs,
877
- ) -> Union[AnyResource, Error, dict]:
868
+ ) -> AnyResource | Error | dict:
878
869
  """Perform a PUT request to replace a resource, as defined in :rfc:`RFC7644 §3.5.1 <7644#section-3.5.1>`.
879
870
 
880
871
  :param resource: The new resource to replace.
@@ -915,15 +906,14 @@ class BaseSyncSCIMClient(SCIMClient):
915
906
  self,
916
907
  resource_model: type[ResourceT],
917
908
  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,
909
+ patch_op: PatchOp[ResourceT] | dict,
910
+ check_request_payload: bool | None = None,
911
+ check_response_payload: bool | None = None,
912
+ expected_status_codes: list[int]
913
+ | None = SCIMClient.PATCH_RESPONSE_STATUS_CODES,
914
+ raise_scim_errors: bool | None = None,
925
915
  **kwargs,
926
- ) -> Optional[Union[ResourceT, Error, dict]]:
916
+ ) -> ResourceT | Error | dict | None:
927
917
  """Perform a PATCH request to modify a resource, as defined in :rfc:`RFC7644 §3.5.2 <7644#section-3.5.2>`.
928
918
 
929
919
  :param resource_model: The type of the resource to modify.
@@ -993,15 +983,14 @@ class BaseAsyncSCIMClient(SCIMClient):
993
983
 
994
984
  async def create(
995
985
  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,
986
+ resource: AnyResource | dict,
987
+ check_request_payload: bool | None = None,
988
+ check_response_payload: bool | None = None,
989
+ expected_status_codes: list[int]
990
+ | None = SCIMClient.CREATION_RESPONSE_STATUS_CODES,
991
+ raise_scim_errors: bool | None = None,
1003
992
  **kwargs,
1004
- ) -> Union[AnyResource, Error, dict]:
993
+ ) -> AnyResource | Error | dict:
1005
994
  """Perform a POST request to create, as defined in :rfc:`RFC7644 §3.3 <7644#section-3.3>`.
1006
995
 
1007
996
  :param resource: The resource to create
@@ -1039,17 +1028,16 @@ class BaseAsyncSCIMClient(SCIMClient):
1039
1028
 
1040
1029
  async def query(
1041
1030
  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,
1031
+ resource_model: type[Resource] | None = None,
1032
+ id: str | None = None,
1033
+ search_request: SearchRequest | dict | None = None,
1034
+ check_request_payload: bool | None = None,
1035
+ check_response_payload: bool | None = None,
1036
+ expected_status_codes: list[int]
1037
+ | None = SCIMClient.QUERY_RESPONSE_STATUS_CODES,
1038
+ raise_scim_errors: bool | None = None,
1051
1039
  **kwargs,
1052
- ) -> Union[AnyResource, ListResponse[AnyResource], Error, dict]:
1040
+ ) -> AnyResource | ListResponse[AnyResource] | Error | dict:
1053
1041
  """Perform a GET request to read resources, as defined in :rfc:`RFC7644 §3.4.2 <7644#section-3.4.2>`.
1054
1042
 
1055
1043
  - If `id` is not :data:`None`, the resource with the exact id will be reached.
@@ -1113,15 +1101,14 @@ class BaseAsyncSCIMClient(SCIMClient):
1113
1101
 
1114
1102
  async def search(
1115
1103
  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,
1104
+ search_request: SearchRequest | None = None,
1105
+ check_request_payload: bool | None = None,
1106
+ check_response_payload: bool | None = None,
1107
+ expected_status_codes: list[int]
1108
+ | None = SCIMClient.SEARCH_RESPONSE_STATUS_CODES,
1109
+ raise_scim_errors: bool | None = None,
1123
1110
  **kwargs,
1124
- ) -> Union[AnyResource, ListResponse[AnyResource], Error, dict]:
1111
+ ) -> AnyResource | ListResponse[AnyResource] | Error | dict:
1125
1112
  """Perform a POST search request to read all available resources, as defined in :rfc:`RFC7644 §3.4.3 <7644#section-3.4.3>`.
1126
1113
 
1127
1114
  :param resource_models: Resource type or union of types expected
@@ -1163,13 +1150,12 @@ class BaseAsyncSCIMClient(SCIMClient):
1163
1150
  self,
1164
1151
  resource_model: type,
1165
1152
  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,
1153
+ check_response_payload: bool | None = None,
1154
+ expected_status_codes: list[int]
1155
+ | None = SCIMClient.DELETION_RESPONSE_STATUS_CODES,
1156
+ raise_scim_errors: bool | None = None,
1171
1157
  **kwargs,
1172
- ) -> Optional[Union[Error, dict]]:
1158
+ ) -> Error | dict | None:
1173
1159
  """Perform a DELETE request to create, as defined in :rfc:`RFC7644 §3.6 <7644#section-3.6>`.
1174
1160
 
1175
1161
  :param resource_model: The type of the resource to delete.
@@ -1199,15 +1185,14 @@ class BaseAsyncSCIMClient(SCIMClient):
1199
1185
 
1200
1186
  async def replace(
1201
1187
  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,
1188
+ resource: AnyResource | dict,
1189
+ check_request_payload: bool | None = None,
1190
+ check_response_payload: bool | None = None,
1191
+ expected_status_codes: list[int]
1192
+ | None = SCIMClient.REPLACEMENT_RESPONSE_STATUS_CODES,
1193
+ raise_scim_errors: bool | None = None,
1209
1194
  **kwargs,
1210
- ) -> Union[AnyResource, Error, dict]:
1195
+ ) -> AnyResource | Error | dict:
1211
1196
  """Perform a PUT request to replace a resource, as defined in :rfc:`RFC7644 §3.5.1 <7644#section-3.5.1>`.
1212
1197
 
1213
1198
  :param resource: The new resource to replace.
@@ -1248,15 +1233,14 @@ class BaseAsyncSCIMClient(SCIMClient):
1248
1233
  self,
1249
1234
  resource_model: type[ResourceT],
1250
1235
  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,
1236
+ patch_op: PatchOp[ResourceT] | dict,
1237
+ check_request_payload: bool | None = None,
1238
+ check_response_payload: bool | None = None,
1239
+ expected_status_codes: list[int]
1240
+ | None = SCIMClient.PATCH_RESPONSE_STATUS_CODES,
1241
+ raise_scim_errors: bool | None = None,
1258
1242
  **kwargs,
1259
- ) -> Optional[Union[ResourceT, Error, dict]]:
1243
+ ) -> ResourceT | Error | dict | None:
1260
1244
  """Perform a PATCH request to modify a resource, as defined in :rfc:`RFC7644 §3.5.2 <7644#section-3.5.2>`.
1261
1245
 
1262
1246
  :param resource_model: The type of the resource to modify.