scim2-client 0.2.1__tar.gz → 0.2.2__tar.gz

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.
Files changed (29) hide show
  1. {scim2_client-0.2.1 → scim2_client-0.2.2}/.github/workflows/release.yml +1 -1
  2. {scim2_client-0.2.1 → scim2_client-0.2.2}/.pre-commit-config.yaml +5 -0
  3. {scim2_client-0.2.1 → scim2_client-0.2.2}/PKG-INFO +1 -2
  4. {scim2_client-0.2.1 → scim2_client-0.2.2}/doc/changelog.rst +9 -2
  5. {scim2_client-0.2.1 → scim2_client-0.2.2}/doc/conf.py +0 -1
  6. {scim2_client-0.2.1 → scim2_client-0.2.2}/pyproject.toml +7 -2
  7. {scim2_client-0.2.1 → scim2_client-0.2.2}/scim2_client/client.py +31 -29
  8. scim2_client-0.2.2/tests/__init__.py +0 -0
  9. {scim2_client-0.2.1 → scim2_client-0.2.2}/uv.lock +51 -1
  10. {scim2_client-0.2.1 → scim2_client-0.2.2}/.github/FUNDING.yml +0 -0
  11. {scim2_client-0.2.1 → scim2_client-0.2.2}/.github/workflows/tests.yaml +0 -0
  12. {scim2_client-0.2.1 → scim2_client-0.2.2}/.gitignore +0 -0
  13. {scim2_client-0.2.1 → scim2_client-0.2.2}/.readthedocs.yml +0 -0
  14. {scim2_client-0.2.1 → scim2_client-0.2.2}/LICENSE.md +0 -0
  15. {scim2_client-0.2.1 → scim2_client-0.2.2}/README.md +0 -0
  16. {scim2_client-0.2.1 → scim2_client-0.2.2}/doc/__init__.py +0 -0
  17. {scim2_client-0.2.1 → scim2_client-0.2.2}/doc/contributing.rst +0 -0
  18. {scim2_client-0.2.1 → scim2_client-0.2.2}/doc/index.rst +0 -0
  19. {scim2_client-0.2.1 → scim2_client-0.2.2}/doc/reference.rst +0 -0
  20. {scim2_client-0.2.1 → scim2_client-0.2.2}/doc/tutorial.rst +0 -0
  21. {scim2_client-0.2.1 → scim2_client-0.2.2}/scim2_client/__init__.py +0 -0
  22. {scim2_client-0.2.1 → scim2_client-0.2.2}/scim2_client/errors.py +0 -0
  23. /scim2_client-0.2.1/tests/__init__.py → /scim2_client-0.2.2/scim2_client/py.typed +0 -0
  24. {scim2_client-0.2.1 → scim2_client-0.2.2}/tests/test_create.py +0 -0
  25. {scim2_client-0.2.1 → scim2_client-0.2.2}/tests/test_delete.py +0 -0
  26. {scim2_client-0.2.1 → scim2_client-0.2.2}/tests/test_query.py +0 -0
  27. {scim2_client-0.2.1 → scim2_client-0.2.2}/tests/test_replace.py +0 -0
  28. {scim2_client-0.2.1 → scim2_client-0.2.2}/tests/test_search.py +0 -0
  29. {scim2_client-0.2.1 → scim2_client-0.2.2}/tests/test_utils.py +0 -0
@@ -37,7 +37,7 @@ jobs:
37
37
 
38
38
  environment:
39
39
  name: pypi-release
40
- url: https://pypi.org/project/scim2-models/
40
+ url: https://pypi.org/project/scim2-client/
41
41
  permissions:
42
42
  id-token: write
43
43
 
@@ -15,6 +15,11 @@ repos:
15
15
  - id: end-of-file-fixer
16
16
  exclude: "\\.svg$|\\.map$|\\.min\\.css$|\\.min\\.js$|\\.po$|\\.pot$"
17
17
  - id: check-toml
18
+ - repo: https://github.com/pre-commit/mirrors-mypy
19
+ rev: v1.11.2
20
+ hooks:
21
+ - id: mypy
22
+ additional_dependencies: [pydantic]
18
23
  - repo: https://github.com/codespell-project/codespell
19
24
  rev: v2.3.0
20
25
  hooks:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: scim2-client
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Pythonically build SCIM requests and parse SCIM responses
5
5
  Project-URL: documentation, https://scim2-client.readthedocs.io
6
6
  Project-URL: repository, https://github.com/python-scim/scim2-client
@@ -208,7 +208,6 @@ License: Apache License
208
208
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
209
209
  See the License for the specific language governing permissions and
210
210
  limitations under the License.
211
- License-File: LICENSE.md
212
211
  Keywords: api,httpx,provisioning,rfc7643,rfc7644,scim,scim2
213
212
  Classifier: Development Status :: 3 - Alpha
214
213
  Classifier: Environment :: Web Environment
@@ -1,8 +1,15 @@
1
1
  Changelog
2
2
  =========
3
3
 
4
+ [0.2.2] - 2024-11-12
5
+ --------------------
6
+
7
+ Added
8
+ ^^^^^
9
+ - Mypy type checking and py.typed file :pr:`25`
10
+
4
11
  [0.2.1] - 2024-11-07
5
- ---------------------
12
+ --------------------
6
13
 
7
14
  Added
8
15
  ^^^^^
@@ -14,7 +21,7 @@ Fixed
14
21
  - Don't crash when servers don't return content type headers. :pr:`22,24`
15
22
 
16
23
  [0.2.0] - 2024-09-01
17
- ---------------------
24
+ --------------------
18
25
 
19
26
  Added
20
27
  ^^^^^
@@ -35,7 +35,6 @@ source_suffix = {
35
35
 
36
36
  version = metadata.version("scim2_client")
37
37
  language = "en"
38
- exclude_patterns = []
39
38
  pygments_style = "sphinx"
40
39
  todo_include_todos = True
41
40
  toctree_collapse = False
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "scim2-client"
7
- version = "0.2.1"
7
+ version = "0.2.2"
8
8
  description = "Pythonically build SCIM requests and parse SCIM responses"
9
9
  authors = [{name="Yaal Coop", email="contact@yaal.coop"}]
10
10
  license = {file = "LICENSE.md"}
@@ -44,8 +44,8 @@ dev = [
44
44
  "pytest-coverage>=0.0",
45
45
  "pytest-httpserver>=1.0.10",
46
46
  "tox-uv>=1.16.0",
47
+ "mypy>=1.13.0",
47
48
  ]
48
-
49
49
  doc = [
50
50
  "autodoc-pydantic>=2.2.0",
51
51
  "myst-parser>=3.0.1",
@@ -100,6 +100,11 @@ force-single-line = true
100
100
  [tool.ruff.format]
101
101
  docstring-code-format = true
102
102
 
103
+ [tool.mypy]
104
+ plugins = [
105
+ "pydantic.mypy"
106
+ ]
107
+
103
108
  [tool.tox]
104
109
  requires = ["tox>=4.19"]
105
110
  env_list = [
@@ -128,17 +128,19 @@ class SCIMClient:
128
128
  :rfc:`RFC7644 §3.12 <7644#section-3.12>`.
129
129
  """
130
130
 
131
- def __init__(self, client: Client, resource_types: Optional[tuple[type]] = None):
131
+ def __init__(
132
+ self, client: Client, resource_types: Optional[tuple[type[Resource]]] = None
133
+ ):
132
134
  self.client = client
133
135
  self.resource_types = tuple(
134
136
  set(resource_types or []) | {ResourceType, Schema, ServiceProviderConfig}
135
137
  )
136
138
 
137
- def check_resource_type(self, resource_type):
139
+ def check_resource_type(self, resource_type: type[Resource]) -> None:
138
140
  if resource_type not in self.resource_types:
139
141
  raise SCIMRequestError(f"Unknown resource type: '{resource_type}'")
140
142
 
141
- def resource_endpoint(self, resource_type: type):
143
+ def resource_endpoint(self, resource_type: Optional[type[Resource]]) -> str:
142
144
  if resource_type is None:
143
145
  return "/"
144
146
 
@@ -156,12 +158,12 @@ class SCIMClient:
156
158
  def check_response(
157
159
  self,
158
160
  response: Response,
159
- expected_status_codes: list[int],
160
- expected_types: Optional[type] = None,
161
+ expected_status_codes: Optional[list[int]] = None,
162
+ expected_types: Optional[list[type[Resource]]] = None,
161
163
  check_response_payload: bool = True,
162
164
  raise_scim_errors: bool = True,
163
165
  scim_ctx: Optional[Context] = None,
164
- ):
166
+ ) -> Union[Error, None, dict, type[Resource]]:
165
167
  if expected_status_codes and response.status_code not in expected_status_codes:
166
168
  raise UnexpectedStatusCode(source=response)
167
169
 
@@ -209,8 +211,8 @@ class SCIMClient:
209
211
  expected_types, response_payload, with_extensions=False
210
212
  )
211
213
 
212
- if not actual_type:
213
- expected = ", ".join([type.__name__ for type in expected_types])
214
+ if response_payload and not actual_type:
215
+ expected = ", ".join([type_.__name__ for type_ in expected_types])
214
216
  try:
215
217
  schema = ", ".join(response_payload["schemas"])
216
218
  message = f"Expected type {expected} but got unknown resource with schemas: {schema}"
@@ -293,10 +295,10 @@ class SCIMClient:
293
295
  try:
294
296
  resource = resource_type.model_validate(resource)
295
297
  except ValidationError as exc:
296
- scim_exc = RequestPayloadValidationError(source=resource)
298
+ scim_validation_exc = RequestPayloadValidationError(source=resource)
297
299
  if sys.version_info >= (3, 11): # pragma: no cover
298
- scim_exc.add_note(str(exc))
299
- raise scim_exc from exc
300
+ scim_validation_exc.add_note(str(exc))
301
+ raise scim_validation_exc from exc
300
302
 
301
303
  self.check_resource_type(resource_type)
302
304
  url = kwargs.pop("url", self.resource_endpoint(resource_type))
@@ -305,10 +307,10 @@ class SCIMClient:
305
307
  try:
306
308
  response = self.client.post(url, json=payload, **kwargs)
307
309
  except RequestError as exc:
308
- scim_exc = RequestNetworkError(source=payload)
310
+ scim_network_exc = RequestNetworkError(source=payload)
309
311
  if sys.version_info >= (3, 11): # pragma: no cover
310
- scim_exc.add_note(str(exc))
311
- raise scim_exc from exc
312
+ scim_network_exc.add_note(str(exc))
313
+ raise scim_network_exc from exc
312
314
 
313
315
  return self.check_response(
314
316
  response=response,
@@ -321,7 +323,7 @@ class SCIMClient:
321
323
 
322
324
  def query(
323
325
  self,
324
- resource_type: Optional[type] = None,
326
+ resource_type: Optional[type[Resource]] = None,
325
327
  id: Optional[str] = None,
326
328
  search_request: Optional[Union[SearchRequest, dict]] = None,
327
329
  check_request_payload: bool = True,
@@ -396,19 +398,19 @@ class SCIMClient:
396
398
  if resource_type and check_request_payload:
397
399
  self.check_resource_type(resource_type)
398
400
 
401
+ payload: Optional[SearchRequest]
399
402
  if not check_request_payload:
400
403
  payload = search_request
401
404
 
402
- else:
403
- payload = (
404
- search_request.model_dump(
405
- exclude_unset=True,
406
- scim_ctx=Context.RESOURCE_QUERY_REQUEST,
407
- )
408
- if search_request
409
- else None
405
+ elif isinstance(search_request, SearchRequest):
406
+ payload = search_request.model_dump(
407
+ exclude_unset=True,
408
+ scim_ctx=Context.RESOURCE_QUERY_REQUEST,
410
409
  )
411
410
 
411
+ else:
412
+ payload = None
413
+
412
414
  url = kwargs.pop("url", self.resource_endpoint(resource_type))
413
415
 
414
416
  if resource_type is None:
@@ -647,10 +649,10 @@ class SCIMClient:
647
649
  try:
648
650
  resource = resource_type.model_validate(resource)
649
651
  except ValidationError as exc:
650
- scim_exc = RequestPayloadValidationError(source=resource)
652
+ scim_validation_exc = RequestPayloadValidationError(source=resource)
651
653
  if sys.version_info >= (3, 11): # pragma: no cover
652
- scim_exc.add_note(str(exc))
653
- raise scim_exc from exc
654
+ scim_validation_exc.add_note(str(exc))
655
+ raise scim_validation_exc from exc
654
656
 
655
657
  self.check_resource_type(resource_type)
656
658
 
@@ -665,10 +667,10 @@ class SCIMClient:
665
667
  try:
666
668
  response = self.client.put(url, json=payload, **kwargs)
667
669
  except RequestError as exc:
668
- scim_exc = RequestNetworkError(source=payload)
670
+ scim_network_exc = RequestNetworkError(source=payload)
669
671
  if sys.version_info >= (3, 11): # pragma: no cover
670
- scim_exc.add_note(str(exc))
671
- raise scim_exc from exc
672
+ scim_network_exc.add_note(str(exc))
673
+ raise scim_network_exc from exc
672
674
 
673
675
  return self.check_response(
674
676
  response=response,
File without changes
@@ -520,6 +520,54 @@ wheels = [
520
520
  { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 },
521
521
  ]
522
522
 
523
+ [[package]]
524
+ name = "mypy"
525
+ version = "1.13.0"
526
+ source = { registry = "https://pypi.org/simple" }
527
+ dependencies = [
528
+ { name = "mypy-extensions" },
529
+ { name = "tomli", marker = "python_full_version < '3.11'" },
530
+ { name = "typing-extensions" },
531
+ ]
532
+ sdist = { url = "https://files.pythonhosted.org/packages/e8/21/7e9e523537991d145ab8a0a2fd98548d67646dc2aaaf6091c31ad883e7c1/mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e", size = 3152532 }
533
+ wheels = [
534
+ { url = "https://files.pythonhosted.org/packages/5e/8c/206de95a27722b5b5a8c85ba3100467bd86299d92a4f71c6b9aa448bfa2f/mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a", size = 11020731 },
535
+ { url = "https://files.pythonhosted.org/packages/ab/bb/b31695a29eea76b1569fd28b4ab141a1adc9842edde080d1e8e1776862c7/mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80", size = 10184276 },
536
+ { url = "https://files.pythonhosted.org/packages/a5/2d/4a23849729bb27934a0e079c9c1aad912167d875c7b070382a408d459651/mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7", size = 12587706 },
537
+ { url = "https://files.pythonhosted.org/packages/5c/c3/d318e38ada50255e22e23353a469c791379825240e71b0ad03e76ca07ae6/mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f", size = 13105586 },
538
+ { url = "https://files.pythonhosted.org/packages/4a/25/3918bc64952370c3dbdbd8c82c363804678127815febd2925b7273d9482c/mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372", size = 9632318 },
539
+ { url = "https://files.pythonhosted.org/packages/d0/19/de0822609e5b93d02579075248c7aa6ceaddcea92f00bf4ea8e4c22e3598/mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d", size = 10939027 },
540
+ { url = "https://files.pythonhosted.org/packages/c8/71/6950fcc6ca84179137e4cbf7cf41e6b68b4a339a1f5d3e954f8c34e02d66/mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d", size = 10108699 },
541
+ { url = "https://files.pythonhosted.org/packages/26/50/29d3e7dd166e74dc13d46050b23f7d6d7533acf48f5217663a3719db024e/mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b", size = 12506263 },
542
+ { url = "https://files.pythonhosted.org/packages/3f/1d/676e76f07f7d5ddcd4227af3938a9c9640f293b7d8a44dd4ff41d4db25c1/mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73", size = 12984688 },
543
+ { url = "https://files.pythonhosted.org/packages/9c/03/5a85a30ae5407b1d28fab51bd3e2103e52ad0918d1e68f02a7778669a307/mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca", size = 9626811 },
544
+ { url = "https://files.pythonhosted.org/packages/fb/31/c526a7bd2e5c710ae47717c7a5f53f616db6d9097caf48ad650581e81748/mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5", size = 11077900 },
545
+ { url = "https://files.pythonhosted.org/packages/83/67/b7419c6b503679d10bd26fc67529bc6a1f7a5f220bbb9f292dc10d33352f/mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e", size = 10074818 },
546
+ { url = "https://files.pythonhosted.org/packages/ba/07/37d67048786ae84e6612575e173d713c9a05d0ae495dde1e68d972207d98/mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2", size = 12589275 },
547
+ { url = "https://files.pythonhosted.org/packages/1f/17/b1018c6bb3e9f1ce3956722b3bf91bff86c1cefccca71cec05eae49d6d41/mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0", size = 13037783 },
548
+ { url = "https://files.pythonhosted.org/packages/cb/32/cd540755579e54a88099aee0287086d996f5a24281a673f78a0e14dba150/mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2", size = 9726197 },
549
+ { url = "https://files.pythonhosted.org/packages/11/bb/ab4cfdc562cad80418f077d8be9b4491ee4fb257440da951b85cbb0a639e/mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7", size = 11069721 },
550
+ { url = "https://files.pythonhosted.org/packages/59/3b/a393b1607cb749ea2c621def5ba8c58308ff05e30d9dbdc7c15028bca111/mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62", size = 10063996 },
551
+ { url = "https://files.pythonhosted.org/packages/d1/1f/6b76be289a5a521bb1caedc1f08e76ff17ab59061007f201a8a18cc514d1/mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8", size = 12584043 },
552
+ { url = "https://files.pythonhosted.org/packages/a6/83/5a85c9a5976c6f96e3a5a7591aa28b4a6ca3a07e9e5ba0cec090c8b596d6/mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7", size = 13036996 },
553
+ { url = "https://files.pythonhosted.org/packages/b4/59/c39a6f752f1f893fccbcf1bdd2aca67c79c842402b5283563d006a67cf76/mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc", size = 9737709 },
554
+ { url = "https://files.pythonhosted.org/packages/5f/d4/b33ddd40dad230efb317898a2d1c267c04edba73bc5086bf77edeb410fb2/mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc", size = 11013906 },
555
+ { url = "https://files.pythonhosted.org/packages/f4/e6/f414bca465b44d01cd5f4a82761e15044bedd1bf8025c5af3cc64518fac5/mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732", size = 10180657 },
556
+ { url = "https://files.pythonhosted.org/packages/38/e9/fc3865e417722f98d58409770be01afb961e2c1f99930659ff4ae7ca8b7e/mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc", size = 12586394 },
557
+ { url = "https://files.pythonhosted.org/packages/2e/35/f4d8b6d2cb0b3dad63e96caf159419dda023f45a358c6c9ac582ccaee354/mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d", size = 13103591 },
558
+ { url = "https://files.pythonhosted.org/packages/22/1d/80594aef135f921dd52e142fa0acd19df197690bd0cde42cea7b88cf5aa2/mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24", size = 9634690 },
559
+ { url = "https://files.pythonhosted.org/packages/3b/86/72ce7f57431d87a7ff17d442f521146a6585019eb8f4f31b7c02801f78ad/mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a", size = 2647043 },
560
+ ]
561
+
562
+ [[package]]
563
+ name = "mypy-extensions"
564
+ version = "1.0.0"
565
+ source = { registry = "https://pypi.org/simple" }
566
+ sdist = { url = "https://files.pythonhosted.org/packages/98/a4/1ab47638b92648243faf97a5aeb6ea83059cc3624972ab6b8d2316078d3f/mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782", size = 4433 }
567
+ wheels = [
568
+ { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 },
569
+ ]
570
+
523
571
  [[package]]
524
572
  name = "myst-parser"
525
573
  version = "3.0.1"
@@ -888,7 +936,7 @@ wheels = [
888
936
 
889
937
  [[package]]
890
938
  name = "scim2-client"
891
- version = "0.2.0"
939
+ version = "0.2.1"
892
940
  source = { editable = "." }
893
941
  dependencies = [
894
942
  { name = "httpx" },
@@ -897,6 +945,7 @@ dependencies = [
897
945
 
898
946
  [package.dev-dependencies]
899
947
  dev = [
948
+ { name = "mypy" },
900
949
  { name = "pre-commit-uv" },
901
950
  { name = "pytest" },
902
951
  { name = "pytest-coverage" },
@@ -919,6 +968,7 @@ requires-dist = [
919
968
 
920
969
  [package.metadata.requires-dev]
921
970
  dev = [
971
+ { name = "mypy", specifier = ">=1.13.0" },
922
972
  { name = "pre-commit-uv", specifier = ">=4.1.4" },
923
973
  { name = "pytest", specifier = ">=8.2.1" },
924
974
  { name = "pytest-coverage", specifier = ">=0.0" },
File without changes
File without changes
File without changes
File without changes