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.

Files changed (62) hide show
  1. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/PKG-INFO +1 -1
  2. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_bind.py +7 -5
  3. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/pyproject.toml +1 -1
  4. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_bind.py +37 -3
  5. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/uv.lock +1 -1
  6. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.github/dependabot.yml +0 -0
  7. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.github/workflows/automerge.yml +0 -0
  8. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.github/workflows/lint.yml +0 -0
  9. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.github/workflows/publish.yml +0 -0
  10. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.github/workflows/test.yml +0 -0
  11. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.gitignore +0 -0
  12. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/.pre-commit-config.yaml +0 -0
  13. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/LICENSE +0 -0
  14. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/README.md +0 -0
  15. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/__init__.py +0 -0
  16. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_cache.py +0 -0
  17. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_dataclass.py +0 -0
  18. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_deps_tp.py +0 -0
  19. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_fastapi_lifecycle.py +0 -0
  20. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_given.py +0 -0
  21. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_injected.py +0 -0
  22. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_overrides.py +0 -0
  23. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/_rlock.py +0 -0
  24. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/deps.py +0 -0
  25. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/inject.py +0 -0
  26. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/overrides.py +0 -0
  27. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/resolve.py +0 -0
  28. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/scope.py +0 -0
  29. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/sign.py +0 -0
  30. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/fastapi_injected/types.py +0 -0
  31. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/__init__.py +0 -0
  32. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/__init__.py +0 -0
  33. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/annotations.py +0 -0
  34. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/arg.py +0 -0
  35. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/bind.py +0 -0
  36. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/dataclass.py +0 -0
  37. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/deps.py +0 -0
  38. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/errors.py +0 -0
  39. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/given.py +0 -0
  40. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/inject.py +0 -0
  41. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/injected.py +0 -0
  42. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/integration.py +0 -0
  43. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/markers.py +0 -0
  44. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/overrides.py +0 -0
  45. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/resolve.py +0 -0
  46. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/_typing/scope.py +0 -0
  47. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/deps.py +0 -0
  48. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/ext/__init__.py +0 -0
  49. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/ext/test_pydantic_ai.py +0 -0
  50. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_cache.py +0 -0
  51. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_concurrency.py +0 -0
  52. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_dataclass.py +0 -0
  53. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_dependant_cache.py +0 -0
  54. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_errors.py +0 -0
  55. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_fastapi.py +0 -0
  56. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_given.py +0 -0
  57. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_inject.py +0 -0
  58. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_injected.py +0 -0
  59. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_overrides.py +0 -0
  60. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_resolve.py +0 -0
  61. {fastapi_injected-0.3.2 → fastapi_injected-0.3.3}/tests/test_rlock.py +0 -0
  62. {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.2
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 is_dep
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
- # a marker is an annotation already, while a callable is a dependency the same way
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)]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fastapi-injected"
3
- version = "0.3.2"
3
+ version = "0.3.3"
4
4
  description = "Yet another library to reuse fastapi dependency injection"
5
5
  authors = [
6
6
  { name = "Yurii Karabas", email = "1998uriyyo@gmail.com" },
@@ -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
- from fastapi_injected import Given, bind_deps, inject, push_inject_scope, push_overrides, resolve, signature_with_deps
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
 
@@ -186,7 +186,7 @@ wheels = [
186
186
 
187
187
  [[package]]
188
188
  name = "fastapi-injected"
189
- version = "0.3.2"
189
+ version = "0.3.3"
190
190
  source = { editable = "." }
191
191
  dependencies = [
192
192
  { name = "fastapi" },