fastapi-injected 0.3.2__tar.gz → 0.3.3__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.
Potentially problematic release.
This version of fastapi-injected might be problematic. Click here for more details.
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/PKG-INFO +1 -1
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_bind.py +7 -5
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/pyproject.toml +1 -1
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_bind.py +37 -3
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/uv.lock +1 -1
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.github/dependabot.yml +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.github/workflows/automerge.yml +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.github/workflows/lint.yml +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.github/workflows/publish.yml +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.github/workflows/test.yml +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.gitignore +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.pre-commit-config.yaml +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/LICENSE +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/README.md +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/__init__.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_cache.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_dataclass.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_deps_tp.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_fastapi_lifecycle.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_given.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_injected.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_overrides.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_rlock.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/deps.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/inject.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/overrides.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/resolve.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/scope.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/sign.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/types.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/__init__.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/__init__.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/annotations.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/arg.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/bind.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/dataclass.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/deps.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/errors.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/given.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/inject.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/injected.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/integration.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/markers.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/overrides.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/resolve.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/scope.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/deps.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/ext/__init__.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/ext/test_pydantic_ai.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_cache.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_concurrency.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_dataclass.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_dependant_cache.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_errors.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_fastapi.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_given.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_inject.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_injected.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_overrides.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_resolve.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_rlock.py +0 -0
- {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_scope.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: fastapi-injected
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: Yet another library to reuse fastapi dependency injection
|
|
5
5
|
Project-URL: Repository, https://github.com/uriyyo/fastapi-injected
|
|
6
6
|
Author-email: Yurii Karabas <1998uriyyo@gmail.com>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import inspect
|
|
2
2
|
from collections.abc import Callable, Sequence
|
|
3
3
|
from functools import wraps
|
|
4
|
-
from typing import Annotated, Any, Concatenate, overload
|
|
4
|
+
from typing import Annotated, Any, Concatenate, get_origin, overload
|
|
5
5
|
|
|
6
6
|
from fastapi.dependencies.utils import get_typed_signature
|
|
7
7
|
from fastapi.params import Depends
|
|
8
8
|
|
|
9
|
-
from ._deps_tp import
|
|
9
|
+
from ._deps_tp import unwrap_tp
|
|
10
10
|
from .sign import update_func_sign
|
|
11
11
|
from .types import AsyncFunc, DepOf, Func
|
|
12
12
|
|
|
@@ -33,13 +33,15 @@ def _dep_arg_index(name: str, /) -> int | None:
|
|
|
33
33
|
return int(index) if index.isdigit() else None
|
|
34
34
|
|
|
35
35
|
|
|
36
|
+
def _is_annotation(tp: Any, /) -> bool:
|
|
37
|
+
return get_origin(unwrap_tp(tp)) is Annotated
|
|
38
|
+
|
|
39
|
+
|
|
36
40
|
def _dep_annotation(dep: DepOf[Any] | Callable[..., Any], /) -> Any:
|
|
37
41
|
if isinstance(dep, Depends):
|
|
38
42
|
return Annotated[Any, dep]
|
|
39
43
|
|
|
40
|
-
|
|
41
|
-
# `resolve` takes one - anything else is left as it was written
|
|
42
|
-
if is_dep(dep) or not callable(dep):
|
|
44
|
+
if _is_annotation(dep) or not callable(dep):
|
|
43
45
|
return dep
|
|
44
46
|
|
|
45
47
|
return Annotated[Any, Depends(dep)]
|
|
@@ -2,9 +2,19 @@ from dataclasses import dataclass
|
|
|
2
2
|
from typing import Annotated, Any
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
|
-
from fastapi import Depends
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
from fastapi import Depends, FastAPI, Header
|
|
6
|
+
from fastapi.testclient import TestClient
|
|
7
|
+
|
|
8
|
+
from fastapi_injected import (
|
|
9
|
+
Given,
|
|
10
|
+
bind_deps,
|
|
11
|
+
init_inject_scope,
|
|
12
|
+
inject,
|
|
13
|
+
push_inject_scope,
|
|
14
|
+
push_overrides,
|
|
15
|
+
resolve,
|
|
16
|
+
signature_with_deps,
|
|
17
|
+
)
|
|
8
18
|
from fastapi_injected._bind import UnboundDepArgsError, dep_arg_name, remap_dep_args, take_dep_args
|
|
9
19
|
|
|
10
20
|
pytestmark = pytest.mark.asyncio
|
|
@@ -87,6 +97,30 @@ async def test_a_dependency_can_be_bound_however_it_is_written(dep):
|
|
|
87
97
|
assert await resolve(bind_deps(describe, Given(Doc()), dep)) == "readme:admin"
|
|
88
98
|
|
|
89
99
|
|
|
100
|
+
TitleHeader = Annotated[str, Header(alias="x-title")]
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
async def titled(title: str, role: Role) -> str:
|
|
104
|
+
return f"{title}:{role.name}"
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
async def test_a_request_marker_is_bound_as_written() -> None:
|
|
108
|
+
sign = signature_with_deps(titled, TitleHeader, RoleDep)
|
|
109
|
+
|
|
110
|
+
assert next(iter(sign.parameters.values())).annotation == TitleHeader
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
async def test_a_request_marker_resolves_from_the_request() -> None:
|
|
114
|
+
app = FastAPI(dependencies=[Depends(init_inject_scope)])
|
|
115
|
+
|
|
116
|
+
@app.get("/marker")
|
|
117
|
+
async def _route(described: Annotated[str, Depends(bind_deps(titled, TitleHeader, RoleDep))]) -> str:
|
|
118
|
+
return described
|
|
119
|
+
|
|
120
|
+
with TestClient(app) as client:
|
|
121
|
+
assert client.get("/marker", headers={"x-title": "readme"}).json() == "readme:admin"
|
|
122
|
+
|
|
123
|
+
|
|
90
124
|
async def test_signature_with_deps_names_the_bound_parameters() -> None:
|
|
91
125
|
sign = signature_with_deps(describe, Given(Doc()), RoleDep)
|
|
92
126
|
|
|
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
|
|
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
|
|
File without changes
|