fastapi-error-map 0.9.9__tar.gz → 0.9.10__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 (39) hide show
  1. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/Makefile +3 -1
  2. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/PKG-INFO +2 -2
  3. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/error_handling.py +3 -3
  4. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/routing.py +87 -1
  5. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/noxfile.py +3 -3
  6. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/pyproject.toml +2 -2
  7. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/test_routing.py +42 -0
  8. fastapi_error_map-0.9.10/tests/unit/test_routing.py +44 -0
  9. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/uv.lock +3 -97
  10. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/.github/workflows/ci.yaml +0 -0
  11. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/.github/workflows/publish.yaml +0 -0
  12. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/.github/workflows/test-compatibility.yaml +0 -0
  13. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/.gitignore +0 -0
  14. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/.pre-commit-config.yaml +0 -0
  15. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/LICENSE +0 -0
  16. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/README.md +0 -0
  17. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/docs/example-openapi.png +0 -0
  18. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/examples/__init__.py +0 -0
  19. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/examples/errors.py +0 -0
  20. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/examples/main.py +0 -0
  21. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/__init__.py +0 -0
  22. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/openapi.py +0 -0
  23. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/py.typed +0 -0
  24. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/rules.py +0 -0
  25. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/translator_policy.py +0 -0
  26. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/translators.py +0 -0
  27. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/__init__.py +0 -0
  28. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/__init__.py +0 -0
  29. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/conftest.py +0 -0
  30. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/test_example.py +0 -0
  31. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/test_exclude_none.py +0 -0
  32. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/test_threadpool.py +0 -0
  33. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/__init__.py +0 -0
  34. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/error_stubs.py +0 -0
  35. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/test_error_handling.py +0 -0
  36. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/test_openapi.py +0 -0
  37. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/test_rules.py +0 -0
  38. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/test_translators.py +0 -0
  39. {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/translator_stubs.py +0 -0
@@ -10,7 +10,9 @@ lint:
10
10
  mypy
11
11
 
12
12
  test:
13
- pytest -v
13
+ pytest -v \
14
+ --cov=fastapi_error_map \
15
+ --cov-report=term-missing
14
16
 
15
17
  check: lint test
16
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastapi-error-map
3
- Version: 0.9.9
3
+ Version: 0.9.10
4
4
  Summary: Elegant per-endpoint error handling for FastAPI that keeps OpenAPI in sync
5
5
  Project-URL: Homepage, https://github.com/ivan-borovets/fastapi-error-map
6
6
  Project-URL: Repository, https://github.com/ivan-borovets/fastapi-error-map
@@ -22,7 +22,7 @@ Classifier: Topic :: Software Development :: Libraries
22
22
  Classifier: Typing :: Typed
23
23
  Requires-Python: >=3.9
24
24
  Requires-Dist: fastapi<1.0,>=0.100
25
- Requires-Dist: orjson>=3.11.4
25
+ Requires-Dist: packaging>=21.0
26
26
  Description-Content-Type: text/markdown
27
27
 
28
28
  ## FastAPI Error Map
@@ -4,8 +4,8 @@ from functools import wraps
4
4
  from typing import Any, Callable, Optional, Union
5
5
 
6
6
  from fastapi.encoders import jsonable_encoder
7
- from fastapi.responses import ORJSONResponse
8
7
  from starlette.concurrency import run_in_threadpool
8
+ from starlette.responses import JSONResponse
9
9
 
10
10
  from fastapi_error_map.rules import ErrorMap, resolve_rule_for_error
11
11
  from fastapi_error_map.translators import ErrorTranslator
@@ -52,7 +52,7 @@ async def handle_with_error_map(
52
52
  default_server_error_translator: ErrorTranslator[Any],
53
53
  default_on_error: Optional[Callable[[Exception], Union[Awaitable[None], None]]],
54
54
  exclude_none: bool,
55
- ) -> ORJSONResponse:
55
+ ) -> JSONResponse:
56
56
  try:
57
57
  rule = resolve_rule_for_error(
58
58
  error=error,
@@ -76,7 +76,7 @@ async def handle_with_error_map(
76
76
  await result
77
77
 
78
78
  content = rule.translator.from_error(error)
79
- return ORJSONResponse(
79
+ return JSONResponse(
80
80
  status_code=rule.status,
81
81
  content=jsonable_encoder(
82
82
  content,
@@ -1,9 +1,10 @@
1
- from collections.abc import Sequence
1
+ from collections.abc import Mapping, Sequence
2
2
  from enum import Enum
3
3
  from typing import (
4
4
  Any,
5
5
  Callable,
6
6
  Dict,
7
+ Final,
7
8
  List,
8
9
  Optional,
9
10
  Set,
@@ -11,6 +12,7 @@ from typing import (
11
12
  Union,
12
13
  )
13
14
 
15
+ import fastapi
14
16
  from fastapi import params
15
17
  from fastapi.datastructures import Default, DefaultPlaceholder
16
18
  from fastapi.routing import APIRoute, APIRouter
@@ -19,6 +21,7 @@ from fastapi.utils import (
19
21
  generate_unique_id,
20
22
  get_value_or_default,
21
23
  )
24
+ from packaging.version import Version
22
25
  from starlette.responses import JSONResponse, Response
23
26
  from starlette.routing import (
24
27
  BaseRoute,
@@ -35,6 +38,35 @@ from fastapi_error_map.translators import (
35
38
  ErrorTranslator,
36
39
  )
37
40
 
41
+ _FASTAPI_VERSION: Final[Version] = Version(fastapi.__version__)
42
+ _HAS_STRICT_CONTENT_TYPE: Final[bool] = _FASTAPI_VERSION >= Version("0.132.0") # noqa: SIM300
43
+
44
+
45
+ def _with_strict_content_type(
46
+ strict_content_type: Union[bool, DefaultPlaceholder],
47
+ kwargs: Mapping[str, Any],
48
+ ) -> Dict[str, Any]:
49
+ """
50
+ Returns a new kwargs dict with 'strict_content_type' added only when supported.
51
+
52
+ FastAPI >= 0.132.0:
53
+ - APIRouter/APIRoute accept `strict_content_type=...`
54
+
55
+ FastAPI < 0.132.0:
56
+ - passing strict_content_type as an explicit bool would crash at runtime
57
+ - Default(True) is the safe sentinel (means "don't pass anything")
58
+ """
59
+ out = dict(kwargs)
60
+ if _HAS_STRICT_CONTENT_TYPE:
61
+ out["strict_content_type"] = strict_content_type
62
+ return out
63
+ if not isinstance(strict_content_type, DefaultPlaceholder):
64
+ raise TypeError(
65
+ f"'strict_content_type' requires FastAPI >=0.132.0 "
66
+ f"(installed: {fastapi.__version__})"
67
+ )
68
+ return out
69
+
38
70
 
39
71
  class ErrorAwareRoute(APIRoute):
40
72
  def __init__(
@@ -78,6 +110,8 @@ class ErrorAwareRoute(APIRoute):
78
110
  generate_unique_id_function: Union[
79
111
  Callable[["APIRoute"], str], DefaultPlaceholder
80
112
  ] = Default(generate_unique_id),
113
+ strict_content_type: Union[bool, DefaultPlaceholder] = Default(True),
114
+ **kwargs: Any,
81
115
  ) -> None:
82
116
  self.error_map = error_map if error_map is not None else {}
83
117
  self.default_on_error = default_on_error
@@ -109,6 +143,9 @@ class ErrorAwareRoute(APIRoute):
109
143
  ),
110
144
  **(responses if responses is not None else {}),
111
145
  }
146
+ kwargs_with_strict_content_type = _with_strict_content_type(
147
+ strict_content_type, kwargs
148
+ )
112
149
  super().__init__(
113
150
  path,
114
151
  endpoint,
@@ -136,6 +173,7 @@ class ErrorAwareRoute(APIRoute):
136
173
  callbacks=callbacks,
137
174
  openapi_extra=openapi_extra,
138
175
  generate_unique_id_function=generate_unique_id_function,
176
+ **kwargs_with_strict_content_type,
139
177
  )
140
178
 
141
179
 
@@ -375,7 +413,28 @@ class ErrorAwareRouter(APIRouter):
375
413
  """
376
414
  ),
377
415
  ] = Default(generate_unique_id),
416
+ strict_content_type: Annotated[
417
+ bool,
418
+ Doc(
419
+ """
420
+ Enable strict checking for request Content-Type headers.
421
+
422
+ When `True` (the default), requests with a body that do not include
423
+ a `Content-Type` header will **not** be parsed as JSON.
424
+
425
+ When `False`, requests without a `Content-Type` header will have
426
+ their body parsed as JSON.
427
+
428
+ Read more about it in the
429
+ [FastAPI docs for Strict Content-Type](https://fastapi.tiangolo.com/advanced/strict-content-type/).
430
+ """
431
+ ),
432
+ ] = Default(True),
433
+ **kwargs: Any,
378
434
  ) -> None:
435
+ kwargs_with_strict_content_type = _with_strict_content_type(
436
+ strict_content_type, kwargs
437
+ )
379
438
  super().__init__(
380
439
  prefix=prefix,
381
440
  tags=tags,
@@ -394,6 +453,7 @@ class ErrorAwareRouter(APIRouter):
394
453
  deprecated=deprecated,
395
454
  include_in_schema=include_in_schema,
396
455
  generate_unique_id_function=generate_unique_id_function,
456
+ **kwargs_with_strict_content_type,
397
457
  )
398
458
 
399
459
  def add_api_route(
@@ -437,6 +497,8 @@ class ErrorAwareRouter(APIRouter):
437
497
  generate_unique_id_function: Union[
438
498
  Callable[[APIRoute], str], DefaultPlaceholder
439
499
  ] = Default(generate_unique_id),
500
+ strict_content_type: Union[bool, DefaultPlaceholder] = Default(True),
501
+ **kwargs: Any,
440
502
  ) -> None:
441
503
  route_class = route_class_override or self.route_class
442
504
  responses = responses or {}
@@ -456,6 +518,16 @@ class ErrorAwareRouter(APIRouter):
456
518
  current_generate_unique_id = get_value_or_default(
457
519
  generate_unique_id_function, self.generate_unique_id_function
458
520
  )
521
+ if _HAS_STRICT_CONTENT_TYPE:
522
+ current_strict_content_type = get_value_or_default(
523
+ strict_content_type,
524
+ getattr(self, "strict_content_type", Default(True)),
525
+ )
526
+ else:
527
+ current_strict_content_type = strict_content_type
528
+ kwargs_with_strict_content_type = _with_strict_content_type(
529
+ current_strict_content_type, kwargs
530
+ )
459
531
  if issubclass(route_class, ErrorAwareRoute):
460
532
  route: APIRoute = route_class(
461
533
  self.prefix + path,
@@ -490,6 +562,7 @@ class ErrorAwareRouter(APIRouter):
490
562
  callbacks=current_callbacks,
491
563
  openapi_extra=openapi_extra,
492
564
  generate_unique_id_function=current_generate_unique_id,
565
+ **kwargs_with_strict_content_type,
493
566
  )
494
567
  else:
495
568
  route = route_class(
@@ -519,6 +592,7 @@ class ErrorAwareRouter(APIRouter):
519
592
  callbacks=current_callbacks,
520
593
  openapi_extra=openapi_extra,
521
594
  generate_unique_id_function=current_generate_unique_id,
595
+ **kwargs_with_strict_content_type,
522
596
  )
523
597
  self.routes.append(route)
524
598
 
@@ -559,6 +633,7 @@ class ErrorAwareRouter(APIRouter):
559
633
  generate_unique_id_function: Callable[[APIRoute], str] = Default(
560
634
  generate_unique_id
561
635
  ),
636
+ **kwargs: Any,
562
637
  ) -> Callable[[DecoratedCallable], DecoratedCallable]:
563
638
  def decorator(func: DecoratedCallable) -> DecoratedCallable:
564
639
  self.add_api_route(
@@ -593,6 +668,7 @@ class ErrorAwareRouter(APIRouter):
593
668
  callbacks=callbacks,
594
669
  openapi_extra=openapi_extra,
595
670
  generate_unique_id_function=generate_unique_id_function,
671
+ **kwargs,
596
672
  )
597
673
  return func
598
674
 
@@ -938,6 +1014,7 @@ class ErrorAwareRouter(APIRouter):
938
1014
  """
939
1015
  ),
940
1016
  ] = Default(generate_unique_id),
1017
+ **kwargs: Any,
941
1018
  ) -> Callable[[DecoratedCallable], DecoratedCallable]:
942
1019
  """
943
1020
  Add a *path operation* using an HTTP GET operation.
@@ -988,6 +1065,7 @@ class ErrorAwareRouter(APIRouter):
988
1065
  callbacks=callbacks,
989
1066
  openapi_extra=openapi_extra,
990
1067
  generate_unique_id_function=generate_unique_id_function,
1068
+ **kwargs,
991
1069
  )
992
1070
 
993
1071
  def post(
@@ -1330,6 +1408,7 @@ class ErrorAwareRouter(APIRouter):
1330
1408
  """
1331
1409
  ),
1332
1410
  ] = Default(generate_unique_id),
1411
+ **kwargs: Any,
1333
1412
  ) -> Callable[[DecoratedCallable], DecoratedCallable]:
1334
1413
  """
1335
1414
  Add a *path operation* using an HTTP POST operation.
@@ -1385,6 +1464,7 @@ class ErrorAwareRouter(APIRouter):
1385
1464
  callbacks=callbacks,
1386
1465
  openapi_extra=openapi_extra,
1387
1466
  generate_unique_id_function=generate_unique_id_function,
1467
+ **kwargs,
1388
1468
  )
1389
1469
 
1390
1470
  def put(
@@ -1727,6 +1807,7 @@ class ErrorAwareRouter(APIRouter):
1727
1807
  """
1728
1808
  ),
1729
1809
  ] = Default(generate_unique_id),
1810
+ **kwargs: Any,
1730
1811
  ) -> Callable[[DecoratedCallable], DecoratedCallable]:
1731
1812
  """
1732
1813
  Add a *path operation* using an HTTP PUT operation.
@@ -1782,6 +1863,7 @@ class ErrorAwareRouter(APIRouter):
1782
1863
  callbacks=callbacks,
1783
1864
  openapi_extra=openapi_extra,
1784
1865
  generate_unique_id_function=generate_unique_id_function,
1866
+ **kwargs,
1785
1867
  )
1786
1868
 
1787
1869
  def patch(
@@ -2124,6 +2206,7 @@ class ErrorAwareRouter(APIRouter):
2124
2206
  """
2125
2207
  ),
2126
2208
  ] = Default(generate_unique_id),
2209
+ **kwargs: Any,
2127
2210
  ) -> Callable[[DecoratedCallable], DecoratedCallable]:
2128
2211
  """
2129
2212
  Add a *path operation* using an HTTP PATCH operation.
@@ -2179,6 +2262,7 @@ class ErrorAwareRouter(APIRouter):
2179
2262
  callbacks=callbacks,
2180
2263
  openapi_extra=openapi_extra,
2181
2264
  generate_unique_id_function=generate_unique_id_function,
2265
+ **kwargs,
2182
2266
  )
2183
2267
 
2184
2268
  def delete(
@@ -2521,6 +2605,7 @@ class ErrorAwareRouter(APIRouter):
2521
2605
  """
2522
2606
  ),
2523
2607
  ] = Default(generate_unique_id),
2608
+ **kwargs: Any,
2524
2609
  ) -> Callable[[DecoratedCallable], DecoratedCallable]:
2525
2610
  """
2526
2611
  Add a *path operation* using an HTTP DELETE operation.
@@ -2571,4 +2656,5 @@ class ErrorAwareRouter(APIRouter):
2571
2656
  callbacks=callbacks,
2572
2657
  openapi_extra=openapi_extra,
2573
2658
  generate_unique_id_function=generate_unique_id_function,
2659
+ **kwargs,
2574
2660
  )
@@ -7,8 +7,8 @@ def compatibility(session, fastapi):
7
7
  session.run("uv", "sync", "--locked", "--group", "test", "--active", external=True)
8
8
 
9
9
  if fastapi == "latest":
10
- session.run("uv", "add", "fastapi", "--active", external=True)
10
+ session.run("uv", "pip", "install", "--upgrade", "fastapi", external=True)
11
11
  else:
12
- session.run("uv", "add", f"fastapi=={fastapi}", "--active", external=True)
12
+ session.run("uv", "pip", "install", f"fastapi=={fastapi}", external=True)
13
13
 
14
- session.run("uv", "run", "--active", "make", "test", external=True)
14
+ session.run("uv", "run", "--no-sync", "--active", "make", "test", external=True)
@@ -7,7 +7,7 @@ sources = ["src"]
7
7
 
8
8
  [project]
9
9
  name = "fastapi-error-map"
10
- version = "0.9.9"
10
+ version = "0.9.10"
11
11
  description = "Elegant per-endpoint error handling for FastAPI that keeps OpenAPI in sync"
12
12
  readme = "README.md"
13
13
  license = { text = "Apache-2.0" }
@@ -32,7 +32,7 @@ classifiers = [
32
32
  ]
33
33
  dependencies = [
34
34
  "fastapi>=0.100,<1.0",
35
- "orjson>=3.11.4",
35
+ "packaging>=21.0",
36
36
  ]
37
37
  [dependency-groups]
38
38
  dev = [
@@ -4,8 +4,10 @@ from unittest.mock import Mock
4
4
  import httpx
5
5
  import pytest
6
6
  from fastapi import FastAPI
7
+ from fastapi.routing import APIRouter
7
8
 
8
9
  from fastapi_error_map import ErrorAwareRouter, rule
10
+ from fastapi_error_map.routing import ErrorAwareRoute
9
11
 
10
12
 
11
13
  class CustomError(Exception):
@@ -52,3 +54,43 @@ async def test_error_aware_router_routes(
52
54
  path_item = openapi_data["paths"][router_path][method]
53
55
  documented_responses = path_item["responses"]
54
56
  assert str(error_status_code) in documented_responses
57
+
58
+
59
+ @pytest.mark.asyncio
60
+ async def test_error_aware_route_as_route_class_on_plain_api_router(
61
+ app: FastAPI,
62
+ client: httpx.AsyncClient,
63
+ ) -> None:
64
+ router = APIRouter(route_class=ErrorAwareRoute)
65
+
66
+ @router.get("/health")
67
+ async def health() -> dict[str, str]: # noqa: RUF029
68
+ return {"status": "ok"}
69
+
70
+ app.include_router(router)
71
+
72
+ response = await client.get("/health")
73
+
74
+ assert response.status_code == 200
75
+ assert response.json() == {"status": "ok"}
76
+
77
+
78
+ @pytest.mark.asyncio
79
+ async def test_error_aware_router_included_in_another_router(
80
+ app: FastAPI,
81
+ client: httpx.AsyncClient,
82
+ ) -> None:
83
+ inner = ErrorAwareRouter()
84
+
85
+ @inner.get("/nested")
86
+ async def nested() -> dict[str, bool]: # noqa: RUF029
87
+ return {"nested": True}
88
+
89
+ outer = APIRouter()
90
+ outer.include_router(inner, prefix="/api")
91
+ app.include_router(outer)
92
+
93
+ response = await client.get("/api/nested")
94
+
95
+ assert response.status_code == 200
96
+ assert response.json() == {"nested": True}
@@ -0,0 +1,44 @@
1
+ from unittest.mock import patch
2
+
3
+ import pytest
4
+ from fastapi.datastructures import Default
5
+
6
+ from fastapi_error_map.routing import _with_strict_content_type # noqa: PLC2701
7
+
8
+
9
+ def test_with_strict_content_type_passes_value_when_supported() -> None:
10
+ with patch("fastapi_error_map.routing._HAS_STRICT_CONTENT_TYPE", True):
11
+ result = _with_strict_content_type(False, {"foo": "bar"})
12
+
13
+ assert result == {"foo": "bar", "strict_content_type": False}
14
+
15
+
16
+ def test_with_strict_content_type_passes_default_when_supported() -> None:
17
+ with patch("fastapi_error_map.routing._HAS_STRICT_CONTENT_TYPE", True):
18
+ result = _with_strict_content_type(Default(True), {"foo": "bar"})
19
+
20
+ assert result == {"foo": "bar", "strict_content_type": Default(True)}
21
+
22
+
23
+ def test_with_strict_content_type_skips_default_when_unsupported() -> None:
24
+ with patch("fastapi_error_map.routing._HAS_STRICT_CONTENT_TYPE", False):
25
+ result = _with_strict_content_type(Default(True), {"foo": "bar"})
26
+
27
+ assert result == {"foo": "bar"}
28
+
29
+
30
+ def test_with_strict_content_type_raises_when_explicit_on_old_version() -> None:
31
+ with (
32
+ patch("fastapi_error_map.routing._HAS_STRICT_CONTENT_TYPE", False),
33
+ pytest.raises(TypeError, match=r"requires FastAPI >=0\.132\.0"),
34
+ ):
35
+ _with_strict_content_type(False, {})
36
+
37
+
38
+ def test_with_strict_content_type_does_not_mutate_input() -> None:
39
+ original = {"foo": "bar"}
40
+ with patch("fastapi_error_map.routing._HAS_STRICT_CONTENT_TYPE", True):
41
+ result = _with_strict_content_type(True, original)
42
+
43
+ assert "strict_content_type" not in original
44
+ assert "strict_content_type" in result
@@ -405,11 +405,11 @@ wheels = [
405
405
 
406
406
  [[package]]
407
407
  name = "fastapi-error-map"
408
- version = "0.9.9"
408
+ version = "0.9.10"
409
409
  source = { editable = "." }
410
410
  dependencies = [
411
411
  { name = "fastapi" },
412
- { name = "orjson" },
412
+ { name = "packaging" },
413
413
  ]
414
414
 
415
415
  [package.dev-dependencies]
@@ -455,7 +455,7 @@ test = [
455
455
  [package.metadata]
456
456
  requires-dist = [
457
457
  { name = "fastapi", specifier = ">=0.100,<1.0" },
458
- { name = "orjson", specifier = ">=3.11.4" },
458
+ { name = "packaging", specifier = ">=21.0" },
459
459
  ]
460
460
 
461
461
  [package.metadata.requires-dev]
@@ -874,100 +874,6 @@ wheels = [
874
874
  { url = "https://files.pythonhosted.org/packages/b9/34/434c594e0125a16b05a7bedaea33e63c90abbfbe47e5729a735a8a8a90ea/nox-2025.11.12-py3-none-any.whl", hash = "sha256:707171f9f63bc685da9d00edd8c2ceec8405b8e38b5fb4e46114a860070ef0ff", size = 74447, upload-time = "2025-11-12T18:39:01.575Z" },
875
875
  ]
876
876
 
877
- [[package]]
878
- name = "orjson"
879
- version = "3.11.4"
880
- source = { registry = "https://pypi.org/simple" }
881
- sdist = { url = "https://files.pythonhosted.org/packages/c6/fe/ed708782d6709cc60eb4c2d8a361a440661f74134675c72990f2c48c785f/orjson-3.11.4.tar.gz", hash = "sha256:39485f4ab4c9b30a3943cfe99e1a213c4776fb69e8abd68f66b83d5a0b0fdc6d", size = 5945188, upload-time = "2025-10-24T15:50:38.027Z" }
882
- wheels = [
883
- { url = "https://files.pythonhosted.org/packages/e0/30/5aed63d5af1c8b02fbd2a8d83e2a6c8455e30504c50dbf08c8b51403d873/orjson-3.11.4-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e3aa2118a3ece0d25489cbe48498de8a5d580e42e8d9979f65bf47900a15aba1", size = 243870, upload-time = "2025-10-24T15:48:28.908Z" },
884
- { url = "https://files.pythonhosted.org/packages/44/1f/da46563c08bef33c41fd63c660abcd2184b4d2b950c8686317d03b9f5f0c/orjson-3.11.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a69ab657a4e6733133a3dca82768f2f8b884043714e8d2b9ba9f52b6efef5c44", size = 130622, upload-time = "2025-10-24T15:48:31.361Z" },
885
- { url = "https://files.pythonhosted.org/packages/02/bd/b551a05d0090eab0bf8008a13a14edc0f3c3e0236aa6f5b697760dd2817b/orjson-3.11.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3740bffd9816fc0326ddc406098a3a8f387e42223f5f455f2a02a9f834ead80c", size = 129344, upload-time = "2025-10-24T15:48:32.71Z" },
886
- { url = "https://files.pythonhosted.org/packages/87/6c/9ddd5e609f443b2548c5e7df3c44d0e86df2c68587a0e20c50018cdec535/orjson-3.11.4-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65fd2f5730b1bf7f350c6dc896173d3460d235c4be007af73986d7cd9a2acd23", size = 136633, upload-time = "2025-10-24T15:48:34.128Z" },
887
- { url = "https://files.pythonhosted.org/packages/95/f2/9f04f2874c625a9fb60f6918c33542320661255323c272e66f7dcce14df2/orjson-3.11.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fdc3ae730541086158d549c97852e2eea6820665d4faf0f41bf99df41bc11ea", size = 137695, upload-time = "2025-10-24T15:48:35.654Z" },
888
- { url = "https://files.pythonhosted.org/packages/d2/c2/c7302afcbdfe8a891baae0e2cee091583a30e6fa613e8bdf33b0e9c8a8c7/orjson-3.11.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e10b4d65901da88845516ce9f7f9736f9638d19a1d483b3883dc0182e6e5edba", size = 136879, upload-time = "2025-10-24T15:48:37.483Z" },
889
- { url = "https://files.pythonhosted.org/packages/c6/3a/b31c8f0182a3e27f48e703f46e61bb769666cd0dac4700a73912d07a1417/orjson-3.11.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb6a03a678085f64b97f9d4a9ae69376ce91a3a9e9b56a82b1580d8e1d501aff", size = 136374, upload-time = "2025-10-24T15:48:38.624Z" },
890
- { url = "https://files.pythonhosted.org/packages/29/d0/fd9ab96841b090d281c46df566b7f97bc6c8cd9aff3f3ebe99755895c406/orjson-3.11.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2c82e4f0b1c712477317434761fbc28b044c838b6b1240d895607441412371ac", size = 140519, upload-time = "2025-10-24T15:48:39.756Z" },
891
- { url = "https://files.pythonhosted.org/packages/d6/ce/36eb0f15978bb88e33a3480e1a3fb891caa0f189ba61ce7713e0ccdadabf/orjson-3.11.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:d58c166a18f44cc9e2bad03a327dc2d1a3d2e85b847133cfbafd6bfc6719bd79", size = 406522, upload-time = "2025-10-24T15:48:41.198Z" },
892
- { url = "https://files.pythonhosted.org/packages/85/11/e8af3161a288f5c6a00c188fc729c7ba193b0cbc07309a1a29c004347c30/orjson-3.11.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:94f206766bf1ea30e1382e4890f763bd1eefddc580e08fec1ccdc20ddd95c827", size = 149790, upload-time = "2025-10-24T15:48:42.664Z" },
893
- { url = "https://files.pythonhosted.org/packages/ea/96/209d52db0cf1e10ed48d8c194841e383e23c2ced5a2ee766649fe0e32d02/orjson-3.11.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:41bf25fb39a34cf8edb4398818523277ee7096689db352036a9e8437f2f3ee6b", size = 140040, upload-time = "2025-10-24T15:48:44.042Z" },
894
- { url = "https://files.pythonhosted.org/packages/ef/0e/526db1395ccb74c3d59ac1660b9a325017096dc5643086b38f27662b4add/orjson-3.11.4-cp310-cp310-win32.whl", hash = "sha256:fa9627eba4e82f99ca6d29bc967f09aba446ee2b5a1ea728949ede73d313f5d3", size = 135955, upload-time = "2025-10-24T15:48:45.495Z" },
895
- { url = "https://files.pythonhosted.org/packages/e6/69/18a778c9de3702b19880e73c9866b91cc85f904b885d816ba1ab318b223c/orjson-3.11.4-cp310-cp310-win_amd64.whl", hash = "sha256:23ef7abc7fca96632d8174ac115e668c1e931b8fe4dde586e92a500bf1914dcc", size = 131577, upload-time = "2025-10-24T15:48:46.609Z" },
896
- { url = "https://files.pythonhosted.org/packages/63/1d/1ea6005fffb56715fd48f632611e163d1604e8316a5bad2288bee9a1c9eb/orjson-3.11.4-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:5e59d23cd93ada23ec59a96f215139753fbfe3a4d989549bcb390f8c00370b39", size = 243498, upload-time = "2025-10-24T15:48:48.101Z" },
897
- { url = "https://files.pythonhosted.org/packages/37/d7/ffed10c7da677f2a9da307d491b9eb1d0125b0307019c4ad3d665fd31f4f/orjson-3.11.4-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:5c3aedecfc1beb988c27c79d52ebefab93b6c3921dbec361167e6559aba2d36d", size = 128961, upload-time = "2025-10-24T15:48:49.571Z" },
898
- { url = "https://files.pythonhosted.org/packages/a2/96/3e4d10a18866d1368f73c8c44b7fe37cc8a15c32f2a7620be3877d4c55a3/orjson-3.11.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da9e5301f1c2caa2a9a4a303480d79c9ad73560b2e7761de742ab39fe59d9175", size = 130321, upload-time = "2025-10-24T15:48:50.713Z" },
899
- { url = "https://files.pythonhosted.org/packages/eb/1f/465f66e93f434f968dd74d5b623eb62c657bdba2332f5a8be9f118bb74c7/orjson-3.11.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8873812c164a90a79f65368f8f96817e59e35d0cc02786a5356f0e2abed78040", size = 129207, upload-time = "2025-10-24T15:48:52.193Z" },
900
- { url = "https://files.pythonhosted.org/packages/28/43/d1e94837543321c119dff277ae8e348562fe8c0fafbb648ef7cb0c67e521/orjson-3.11.4-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d7feb0741ebb15204e748f26c9638e6665a5fa93c37a2c73d64f1669b0ddc63", size = 136323, upload-time = "2025-10-24T15:48:54.806Z" },
901
- { url = "https://files.pythonhosted.org/packages/bf/04/93303776c8890e422a5847dd012b4853cdd88206b8bbd3edc292c90102d1/orjson-3.11.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:01ee5487fefee21e6910da4c2ee9eef005bee568a0879834df86f888d2ffbdd9", size = 137440, upload-time = "2025-10-24T15:48:56.326Z" },
902
- { url = "https://files.pythonhosted.org/packages/1e/ef/75519d039e5ae6b0f34d0336854d55544ba903e21bf56c83adc51cd8bf82/orjson-3.11.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d40d46f348c0321df01507f92b95a377240c4ec31985225a6668f10e2676f9a", size = 136680, upload-time = "2025-10-24T15:48:57.476Z" },
903
- { url = "https://files.pythonhosted.org/packages/b5/18/bf8581eaae0b941b44efe14fee7b7862c3382fbc9a0842132cfc7cf5ecf4/orjson-3.11.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95713e5fc8af84d8edc75b785d2386f653b63d62b16d681687746734b4dfc0be", size = 136160, upload-time = "2025-10-24T15:48:59.631Z" },
904
- { url = "https://files.pythonhosted.org/packages/c4/35/a6d582766d351f87fc0a22ad740a641b0a8e6fc47515e8614d2e4790ae10/orjson-3.11.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ad73ede24f9083614d6c4ca9a85fe70e33be7bf047ec586ee2363bc7418fe4d7", size = 140318, upload-time = "2025-10-24T15:49:00.834Z" },
905
- { url = "https://files.pythonhosted.org/packages/76/b3/5a4801803ab2e2e2d703bce1a56540d9f99a9143fbec7bf63d225044fef8/orjson-3.11.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:842289889de515421f3f224ef9c1f1efb199a32d76d8d2ca2706fa8afe749549", size = 406330, upload-time = "2025-10-24T15:49:02.327Z" },
906
- { url = "https://files.pythonhosted.org/packages/80/55/a8f682f64833e3a649f620eafefee175cbfeb9854fc5b710b90c3bca45df/orjson-3.11.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3b2427ed5791619851c52a1261b45c233930977e7de8cf36de05636c708fa905", size = 149580, upload-time = "2025-10-24T15:49:03.517Z" },
907
- { url = "https://files.pythonhosted.org/packages/ad/e4/c132fa0c67afbb3eb88274fa98df9ac1f631a675e7877037c611805a4413/orjson-3.11.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c36e524af1d29982e9b190573677ea02781456b2e537d5840e4538a5ec41907", size = 139846, upload-time = "2025-10-24T15:49:04.761Z" },
908
- { url = "https://files.pythonhosted.org/packages/54/06/dc3491489efd651fef99c5908e13951abd1aead1257c67f16135f95ce209/orjson-3.11.4-cp311-cp311-win32.whl", hash = "sha256:87255b88756eab4a68ec61837ca754e5d10fa8bc47dc57f75cedfeaec358d54c", size = 135781, upload-time = "2025-10-24T15:49:05.969Z" },
909
- { url = "https://files.pythonhosted.org/packages/79/b7/5e5e8d77bd4ea02a6ac54c42c818afb01dd31961be8a574eb79f1d2cfb1e/orjson-3.11.4-cp311-cp311-win_amd64.whl", hash = "sha256:e2d5d5d798aba9a0e1fede8d853fa899ce2cb930ec0857365f700dffc2c7af6a", size = 131391, upload-time = "2025-10-24T15:49:07.355Z" },
910
- { url = "https://files.pythonhosted.org/packages/0f/dc/9484127cc1aa213be398ed735f5f270eedcb0c0977303a6f6ddc46b60204/orjson-3.11.4-cp311-cp311-win_arm64.whl", hash = "sha256:6bb6bb41b14c95d4f2702bce9975fda4516f1db48e500102fc4d8119032ff045", size = 126252, upload-time = "2025-10-24T15:49:08.869Z" },
911
- { url = "https://files.pythonhosted.org/packages/63/51/6b556192a04595b93e277a9ff71cd0cc06c21a7df98bcce5963fa0f5e36f/orjson-3.11.4-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:d4371de39319d05d3f482f372720b841c841b52f5385bd99c61ed69d55d9ab50", size = 243571, upload-time = "2025-10-24T15:49:10.008Z" },
912
- { url = "https://files.pythonhosted.org/packages/1c/2c/2602392ddf2601d538ff11848b98621cd465d1a1ceb9db9e8043181f2f7b/orjson-3.11.4-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:e41fd3b3cac850eaae78232f37325ed7d7436e11c471246b87b2cd294ec94853", size = 128891, upload-time = "2025-10-24T15:49:11.297Z" },
913
- { url = "https://files.pythonhosted.org/packages/4e/47/bf85dcf95f7a3a12bf223394a4f849430acd82633848d52def09fa3f46ad/orjson-3.11.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600e0e9ca042878c7fdf189cf1b028fe2c1418cc9195f6cb9824eb6ed99cb938", size = 130137, upload-time = "2025-10-24T15:49:12.544Z" },
914
- { url = "https://files.pythonhosted.org/packages/b4/4d/a0cb31007f3ab6f1fd2a1b17057c7c349bc2baf8921a85c0180cc7be8011/orjson-3.11.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7bbf9b333f1568ef5da42bc96e18bf30fd7f8d54e9ae066d711056add508e415", size = 129152, upload-time = "2025-10-24T15:49:13.754Z" },
915
- { url = "https://files.pythonhosted.org/packages/f7/ef/2811def7ce3d8576b19e3929fff8f8f0d44bc5eb2e0fdecb2e6e6cc6c720/orjson-3.11.4-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4806363144bb6e7297b8e95870e78d30a649fdc4e23fc84daa80c8ebd366ce44", size = 136834, upload-time = "2025-10-24T15:49:15.307Z" },
916
- { url = "https://files.pythonhosted.org/packages/00/d4/9aee9e54f1809cec8ed5abd9bc31e8a9631d19460e3b8470145d25140106/orjson-3.11.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad355e8308493f527d41154e9053b86a5be892b3b359a5c6d5d95cda23601cb2", size = 137519, upload-time = "2025-10-24T15:49:16.557Z" },
917
- { url = "https://files.pythonhosted.org/packages/db/ea/67bfdb5465d5679e8ae8d68c11753aaf4f47e3e7264bad66dc2f2249e643/orjson-3.11.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a7517482667fb9f0ff1b2f16fe5829296ed7a655d04d68cd9711a4d8a4e708", size = 136749, upload-time = "2025-10-24T15:49:17.796Z" },
918
- { url = "https://files.pythonhosted.org/packages/01/7e/62517dddcfce6d53a39543cd74d0dccfcbdf53967017c58af68822100272/orjson-3.11.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97eb5942c7395a171cbfecc4ef6701fc3c403e762194683772df4c54cfbb2210", size = 136325, upload-time = "2025-10-24T15:49:19.347Z" },
919
- { url = "https://files.pythonhosted.org/packages/18/ae/40516739f99ab4c7ec3aaa5cc242d341fcb03a45d89edeeaabc5f69cb2cf/orjson-3.11.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:149d95d5e018bdd822e3f38c103b1a7c91f88d38a88aada5c4e9b3a73a244241", size = 140204, upload-time = "2025-10-24T15:49:20.545Z" },
920
- { url = "https://files.pythonhosted.org/packages/82/18/ff5734365623a8916e3a4037fcef1cd1782bfc14cf0992afe7940c5320bf/orjson-3.11.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:624f3951181eb46fc47dea3d221554e98784c823e7069edb5dbd0dc826ac909b", size = 406242, upload-time = "2025-10-24T15:49:21.884Z" },
921
- { url = "https://files.pythonhosted.org/packages/e1/43/96436041f0a0c8c8deca6a05ebeaf529bf1de04839f93ac5e7c479807aec/orjson-3.11.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:03bfa548cf35e3f8b3a96c4e8e41f753c686ff3d8e182ce275b1751deddab58c", size = 150013, upload-time = "2025-10-24T15:49:23.185Z" },
922
- { url = "https://files.pythonhosted.org/packages/1b/48/78302d98423ed8780479a1e682b9aecb869e8404545d999d34fa486e573e/orjson-3.11.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:525021896afef44a68148f6ed8a8bf8375553d6066c7f48537657f64823565b9", size = 139951, upload-time = "2025-10-24T15:49:24.428Z" },
923
- { url = "https://files.pythonhosted.org/packages/4a/7b/ad613fdcdaa812f075ec0875143c3d37f8654457d2af17703905425981bf/orjson-3.11.4-cp312-cp312-win32.whl", hash = "sha256:b58430396687ce0f7d9eeb3dd47761ca7d8fda8e9eb92b3077a7a353a75efefa", size = 136049, upload-time = "2025-10-24T15:49:25.973Z" },
924
- { url = "https://files.pythonhosted.org/packages/b9/3c/9cf47c3ff5f39b8350fb21ba65d789b6a1129d4cbb3033ba36c8a9023520/orjson-3.11.4-cp312-cp312-win_amd64.whl", hash = "sha256:c6dbf422894e1e3c80a177133c0dda260f81428f9de16d61041949f6a2e5c140", size = 131461, upload-time = "2025-10-24T15:49:27.259Z" },
925
- { url = "https://files.pythonhosted.org/packages/c6/3b/e2425f61e5825dc5b08c2a5a2b3af387eaaca22a12b9c8c01504f8614c36/orjson-3.11.4-cp312-cp312-win_arm64.whl", hash = "sha256:d38d2bc06d6415852224fcc9c0bfa834c25431e466dc319f0edd56cca81aa96e", size = 126167, upload-time = "2025-10-24T15:49:28.511Z" },
926
- { url = "https://files.pythonhosted.org/packages/23/15/c52aa7112006b0f3d6180386c3a46ae057f932ab3425bc6f6ac50431cca1/orjson-3.11.4-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:2d6737d0e616a6e053c8b4acc9eccea6b6cce078533666f32d140e4f85002534", size = 243525, upload-time = "2025-10-24T15:49:29.737Z" },
927
- { url = "https://files.pythonhosted.org/packages/ec/38/05340734c33b933fd114f161f25a04e651b0c7c33ab95e9416ade5cb44b8/orjson-3.11.4-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:afb14052690aa328cc118a8e09f07c651d301a72e44920b887c519b313d892ff", size = 128871, upload-time = "2025-10-24T15:49:31.109Z" },
928
- { url = "https://files.pythonhosted.org/packages/55/b9/ae8d34899ff0c012039b5a7cb96a389b2476e917733294e498586b45472d/orjson-3.11.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38aa9e65c591febb1b0aed8da4d469eba239d434c218562df179885c94e1a3ad", size = 130055, upload-time = "2025-10-24T15:49:33.382Z" },
929
- { url = "https://files.pythonhosted.org/packages/33/aa/6346dd5073730451bee3681d901e3c337e7ec17342fb79659ec9794fc023/orjson-3.11.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f2cf4dfaf9163b0728d061bebc1e08631875c51cd30bf47cb9e3293bfbd7dcd5", size = 129061, upload-time = "2025-10-24T15:49:34.935Z" },
930
- { url = "https://files.pythonhosted.org/packages/39/e4/8eea51598f66a6c853c380979912d17ec510e8e66b280d968602e680b942/orjson-3.11.4-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89216ff3dfdde0e4070932e126320a1752c9d9a758d6a32ec54b3b9334991a6a", size = 136541, upload-time = "2025-10-24T15:49:36.923Z" },
931
- { url = "https://files.pythonhosted.org/packages/9a/47/cb8c654fa9adcc60e99580e17c32b9e633290e6239a99efa6b885aba9dbc/orjson-3.11.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9daa26ca8e97fae0ce8aa5d80606ef8f7914e9b129b6b5df9104266f764ce436", size = 137535, upload-time = "2025-10-24T15:49:38.307Z" },
932
- { url = "https://files.pythonhosted.org/packages/43/92/04b8cc5c2b729f3437ee013ce14a60ab3d3001465d95c184758f19362f23/orjson-3.11.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c8b2769dc31883c44a9cd126560327767f848eb95f99c36c9932f51090bfce9", size = 136703, upload-time = "2025-10-24T15:49:40.795Z" },
933
- { url = "https://files.pythonhosted.org/packages/aa/fd/d0733fcb9086b8be4ebcfcda2d0312865d17d0d9884378b7cffb29d0763f/orjson-3.11.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1469d254b9884f984026bd9b0fa5bbab477a4bfe558bba6848086f6d43eb5e73", size = 136293, upload-time = "2025-10-24T15:49:42.347Z" },
934
- { url = "https://files.pythonhosted.org/packages/c2/d7/3c5514e806837c210492d72ae30ccf050ce3f940f45bf085bab272699ef4/orjson-3.11.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:68e44722541983614e37117209a194e8c3ad07838ccb3127d96863c95ec7f1e0", size = 140131, upload-time = "2025-10-24T15:49:43.638Z" },
935
- { url = "https://files.pythonhosted.org/packages/9c/dd/ba9d32a53207babf65bd510ac4d0faaa818bd0df9a9c6f472fe7c254f2e3/orjson-3.11.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:8e7805fda9672c12be2f22ae124dcd7b03928d6c197544fe12174b86553f3196", size = 406164, upload-time = "2025-10-24T15:49:45.498Z" },
936
- { url = "https://files.pythonhosted.org/packages/8e/f9/f68ad68f4af7c7bde57cd514eaa2c785e500477a8bc8f834838eb696a685/orjson-3.11.4-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04b69c14615fb4434ab867bf6f38b2d649f6f300af30a6705397e895f7aec67a", size = 149859, upload-time = "2025-10-24T15:49:46.981Z" },
937
- { url = "https://files.pythonhosted.org/packages/b6/d2/7f847761d0c26818395b3d6b21fb6bc2305d94612a35b0a30eae65a22728/orjson-3.11.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:639c3735b8ae7f970066930e58cf0ed39a852d417c24acd4a25fc0b3da3c39a6", size = 139926, upload-time = "2025-10-24T15:49:48.321Z" },
938
- { url = "https://files.pythonhosted.org/packages/9f/37/acd14b12dc62db9a0e1d12386271b8661faae270b22492580d5258808975/orjson-3.11.4-cp313-cp313-win32.whl", hash = "sha256:6c13879c0d2964335491463302a6ca5ad98105fc5db3565499dcb80b1b4bd839", size = 136007, upload-time = "2025-10-24T15:49:49.938Z" },
939
- { url = "https://files.pythonhosted.org/packages/c0/a9/967be009ddf0a1fffd7a67de9c36656b28c763659ef91352acc02cbe364c/orjson-3.11.4-cp313-cp313-win_amd64.whl", hash = "sha256:09bf242a4af98732db9f9a1ec57ca2604848e16f132e3f72edfd3c5c96de009a", size = 131314, upload-time = "2025-10-24T15:49:51.248Z" },
940
- { url = "https://files.pythonhosted.org/packages/cb/db/399abd6950fbd94ce125cb8cd1a968def95174792e127b0642781e040ed4/orjson-3.11.4-cp313-cp313-win_arm64.whl", hash = "sha256:a85f0adf63319d6c1ba06fb0dbf997fced64a01179cf17939a6caca662bf92de", size = 126152, upload-time = "2025-10-24T15:49:52.922Z" },
941
- { url = "https://files.pythonhosted.org/packages/25/e3/54ff63c093cc1697e758e4fceb53164dd2661a7d1bcd522260ba09f54533/orjson-3.11.4-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:42d43a1f552be1a112af0b21c10a5f553983c2a0938d2bbb8ecd8bc9fb572803", size = 243501, upload-time = "2025-10-24T15:49:54.288Z" },
942
- { url = "https://files.pythonhosted.org/packages/ac/7d/e2d1076ed2e8e0ae9badca65bf7ef22710f93887b29eaa37f09850604e09/orjson-3.11.4-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:26a20f3fbc6c7ff2cb8e89c4c5897762c9d88cf37330c6a117312365d6781d54", size = 128862, upload-time = "2025-10-24T15:49:55.961Z" },
943
- { url = "https://files.pythonhosted.org/packages/9f/37/ca2eb40b90621faddfa9517dfe96e25f5ae4d8057a7c0cdd613c17e07b2c/orjson-3.11.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6e3f20be9048941c7ffa8fc523ccbd17f82e24df1549d1d1fe9317712d19938e", size = 130047, upload-time = "2025-10-24T15:49:57.406Z" },
944
- { url = "https://files.pythonhosted.org/packages/c7/62/1021ed35a1f2bad9040f05fa4cc4f9893410df0ba3eaa323ccf899b1c90a/orjson-3.11.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:aac364c758dc87a52e68e349924d7e4ded348dedff553889e4d9f22f74785316", size = 129073, upload-time = "2025-10-24T15:49:58.782Z" },
945
- { url = "https://files.pythonhosted.org/packages/e8/3f/f84d966ec2a6fd5f73b1a707e7cd876813422ae4bf9f0145c55c9c6a0f57/orjson-3.11.4-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d5c54a6d76e3d741dcc3f2707f8eeb9ba2a791d3adbf18f900219b62942803b1", size = 136597, upload-time = "2025-10-24T15:50:00.12Z" },
946
- { url = "https://files.pythonhosted.org/packages/32/78/4fa0aeca65ee82bbabb49e055bd03fa4edea33f7c080c5c7b9601661ef72/orjson-3.11.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f28485bdca8617b79d44627f5fb04336897041dfd9fa66d383a49d09d86798bc", size = 137515, upload-time = "2025-10-24T15:50:01.57Z" },
947
- { url = "https://files.pythonhosted.org/packages/c1/9d/0c102e26e7fde40c4c98470796d050a2ec1953897e2c8ab0cb95b0759fa2/orjson-3.11.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bfc2a484cad3585e4ba61985a6062a4c2ed5c7925db6d39f1fa267c9d166487f", size = 136703, upload-time = "2025-10-24T15:50:02.944Z" },
948
- { url = "https://files.pythonhosted.org/packages/df/ac/2de7188705b4cdfaf0b6c97d2f7849c17d2003232f6e70df98602173f788/orjson-3.11.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e34dbd508cb91c54f9c9788923daca129fe5b55c5b4eebe713bf5ed3791280cf", size = 136311, upload-time = "2025-10-24T15:50:04.441Z" },
949
- { url = "https://files.pythonhosted.org/packages/e0/52/847fcd1a98407154e944feeb12e3b4d487a0e264c40191fb44d1269cbaa1/orjson-3.11.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b13c478fa413d4b4ee606ec8e11c3b2e52683a640b006bb586b3041c2ca5f606", size = 140127, upload-time = "2025-10-24T15:50:07.398Z" },
950
- { url = "https://files.pythonhosted.org/packages/c1/ae/21d208f58bdb847dd4d0d9407e2929862561841baa22bdab7aea10ca088e/orjson-3.11.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:724ca721ecc8a831b319dcd72cfa370cc380db0bf94537f08f7edd0a7d4e1780", size = 406201, upload-time = "2025-10-24T15:50:08.796Z" },
951
- { url = "https://files.pythonhosted.org/packages/8d/55/0789d6de386c8366059db098a628e2ad8798069e94409b0d8935934cbcb9/orjson-3.11.4-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:977c393f2e44845ce1b540e19a786e9643221b3323dae190668a98672d43fb23", size = 149872, upload-time = "2025-10-24T15:50:10.234Z" },
952
- { url = "https://files.pythonhosted.org/packages/cc/1d/7ff81ea23310e086c17b41d78a72270d9de04481e6113dbe2ac19118f7fb/orjson-3.11.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1e539e382cf46edec157ad66b0b0872a90d829a6b71f17cb633d6c160a223155", size = 139931, upload-time = "2025-10-24T15:50:11.623Z" },
953
- { url = "https://files.pythonhosted.org/packages/77/92/25b886252c50ed64be68c937b562b2f2333b45afe72d53d719e46a565a50/orjson-3.11.4-cp314-cp314-win32.whl", hash = "sha256:d63076d625babab9db5e7836118bdfa086e60f37d8a174194ae720161eb12394", size = 136065, upload-time = "2025-10-24T15:50:13.025Z" },
954
- { url = "https://files.pythonhosted.org/packages/63/b8/718eecf0bb7e9d64e4956afaafd23db9f04c776d445f59fe94f54bdae8f0/orjson-3.11.4-cp314-cp314-win_amd64.whl", hash = "sha256:0a54d6635fa3aaa438ae32e8570b9f0de36f3f6562c308d2a2a452e8b0592db1", size = 131310, upload-time = "2025-10-24T15:50:14.46Z" },
955
- { url = "https://files.pythonhosted.org/packages/1a/bf/def5e25d4d8bfce296a9a7c8248109bf58622c21618b590678f945a2c59c/orjson-3.11.4-cp314-cp314-win_arm64.whl", hash = "sha256:78b999999039db3cf58f6d230f524f04f75f129ba3d1ca2ed121f8657e575d3d", size = 126151, upload-time = "2025-10-24T15:50:15.878Z" },
956
- { url = "https://files.pythonhosted.org/packages/1d/b3/08601f14923f4bacb92e920155873e69109c6b3354b27e9960a7a8c5600a/orjson-3.11.4-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:405261b0a8c62bcbd8e2931c26fdc08714faf7025f45531541e2b29e544b545b", size = 243477, upload-time = "2025-10-24T15:50:17.252Z" },
957
- { url = "https://files.pythonhosted.org/packages/90/13/a49832a439ad8f7737fbde30fadf6ca6b5e3f6b74b0efa2c53b386525a5c/orjson-3.11.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af02ff34059ee9199a3546f123a6ab4c86caf1708c79042caf0820dc290a6d4f", size = 130269, upload-time = "2025-10-24T15:50:18.763Z" },
958
- { url = "https://files.pythonhosted.org/packages/01/ca/458c11205db897a66fa00b13360b4f62c2e837b8c14f2ed96b7d59f3f5bb/orjson-3.11.4-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b2eba969ea4203c177c7b38b36c69519e6067ee68c34dc37081fac74c796e10", size = 129207, upload-time = "2025-10-24T15:50:20.883Z" },
959
- { url = "https://files.pythonhosted.org/packages/c4/32/6cc2a8ccaa003c9fd1e1851e01ad6a90909cafce0949b5fda678173e552d/orjson-3.11.4-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0baa0ea43cfa5b008a28d3c07705cf3ada40e5d347f0f44994a64b1b7b4b5350", size = 136312, upload-time = "2025-10-24T15:50:22.258Z" },
960
- { url = "https://files.pythonhosted.org/packages/38/3b/14bf796bb07b69c4fb690e72b8734fe71172de325101b52b57a827eadc09/orjson-3.11.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80fd082f5dcc0e94657c144f1b2a3a6479c44ad50be216cf0c244e567f5eae19", size = 137439, upload-time = "2025-10-24T15:50:23.834Z" },
961
- { url = "https://files.pythonhosted.org/packages/83/63/5b092e5cfa00c0a361704fff46778637007d73dae5ccffcb462e90f0f452/orjson-3.11.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e3704d35e47d5bee811fb1cbd8599f0b4009b14d451c4c57be5a7e25eb89a13", size = 136692, upload-time = "2025-10-24T15:50:25.61Z" },
962
- { url = "https://files.pythonhosted.org/packages/d1/7a/76b8111154457ee5e95016039f9c5e44c180752f966080607a74f8965c65/orjson-3.11.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa447f2b5356779d914658519c874cf3b7629e99e63391ed519c28c8aea4919", size = 136117, upload-time = "2025-10-24T15:50:27.032Z" },
963
- { url = "https://files.pythonhosted.org/packages/bf/73/9424c616173c3e6fef7b739cbb3158f0d16b15d79f482ddf422c3edb96cf/orjson-3.11.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:bba5118143373a86f91dadb8df41d9457498226698ebdf8e11cbb54d5b0e802d", size = 140324, upload-time = "2025-10-24T15:50:28.512Z" },
964
- { url = "https://files.pythonhosted.org/packages/ab/91/7d9e9c72a502810eff2f5ed59b9fcbf86aa066052f5a166aa68ced1a1e58/orjson-3.11.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:622463ab81d19ef3e06868b576551587de8e4d518892d1afab71e0fbc1f9cffc", size = 406365, upload-time = "2025-10-24T15:50:29.961Z" },
965
- { url = "https://files.pythonhosted.org/packages/8e/76/0c78bb6a30adce7f363054ef260d7236500070ce30739b1d2417a46c59f1/orjson-3.11.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3e0a700c4b82144b72946b6629968df9762552ee1344bfdb767fecdd634fbd5a", size = 149593, upload-time = "2025-10-24T15:50:31.87Z" },
966
- { url = "https://files.pythonhosted.org/packages/d9/99/d350e07175e92bf114f9e955722f3aa932c3fd3e94841199bb6fc4a87e57/orjson-3.11.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6e18a5c15e764e5f3fc569b47872450b4bcea24f2a6354c0a0e95ad21045d5a9", size = 139835, upload-time = "2025-10-24T15:50:33.333Z" },
967
- { url = "https://files.pythonhosted.org/packages/4d/e3/3a50e2401809db6800a2da31624a663768c67a76f227c4016e61d07d2f68/orjson-3.11.4-cp39-cp39-win32.whl", hash = "sha256:fb1c37c71cad991ef4d89c7a634b5ffb4447dbd7ae3ae13e8f5ee7f1775e7ab1", size = 135792, upload-time = "2025-10-24T15:50:35.068Z" },
968
- { url = "https://files.pythonhosted.org/packages/84/c7/13bed8834936ddb38a2f366aea9458ebb4fe80c459054e6a0cfbcae68e0d/orjson-3.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:e2985ce8b8c42d00492d0ed79f2bd2b6460d00f2fa671dfde4bf2e02f49bf5c6", size = 131383, upload-time = "2025-10-24T15:50:36.511Z" },
969
- ]
970
-
971
877
  [[package]]
972
878
  name = "packaging"
973
879
  version = "25.0"