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.
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/Makefile +3 -1
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/PKG-INFO +2 -2
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/error_handling.py +3 -3
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/routing.py +87 -1
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/noxfile.py +3 -3
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/pyproject.toml +2 -2
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/test_routing.py +42 -0
- fastapi_error_map-0.9.10/tests/unit/test_routing.py +44 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/uv.lock +3 -97
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/.github/workflows/ci.yaml +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/.github/workflows/publish.yaml +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/.github/workflows/test-compatibility.yaml +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/.gitignore +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/.pre-commit-config.yaml +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/LICENSE +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/README.md +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/docs/example-openapi.png +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/examples/__init__.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/examples/errors.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/examples/main.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/__init__.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/openapi.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/py.typed +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/rules.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/translator_policy.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/fastapi_error_map/translators.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/__init__.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/__init__.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/conftest.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/test_example.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/test_exclude_none.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/integration/test_threadpool.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/__init__.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/error_stubs.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/test_error_handling.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/test_openapi.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/test_rules.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/test_translators.py +0 -0
- {fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/tests/unit/translator_stubs.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fastapi-error-map
|
|
3
|
-
Version: 0.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:
|
|
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
|
-
) ->
|
|
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
|
|
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", "
|
|
10
|
+
session.run("uv", "pip", "install", "--upgrade", "fastapi", external=True)
|
|
11
11
|
else:
|
|
12
|
-
session.run("uv", "
|
|
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.
|
|
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
|
-
"
|
|
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.
|
|
408
|
+
version = "0.9.10"
|
|
409
409
|
source = { editable = "." }
|
|
410
410
|
dependencies = [
|
|
411
411
|
{ name = "fastapi" },
|
|
412
|
-
{ name = "
|
|
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 = "
|
|
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"
|
|
File without changes
|
|
File without changes
|
{fastapi_error_map-0.9.9 → fastapi_error_map-0.9.10}/.github/workflows/test-compatibility.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|