mirror of https://github.com/tiangolo/fastapi.git
♻️ Make the result of `Depends()` and `Security()` hashable, as a workaround for other tools interacting with these internal parts (#14372)
This commit is contained in:
parent
566e3157a5
commit
85701631a0
|
|
@ -1,3 +1,4 @@
|
||||||
|
import dataclasses
|
||||||
import inspect
|
import inspect
|
||||||
from contextlib import AsyncExitStack, contextmanager
|
from contextlib import AsyncExitStack, contextmanager
|
||||||
from copy import copy, deepcopy
|
from copy import copy, deepcopy
|
||||||
|
|
@ -428,7 +429,7 @@ def analyze_param(
|
||||||
if depends is not None and depends.dependency is None:
|
if depends is not None and depends.dependency is None:
|
||||||
# Copy `depends` before mutating it
|
# Copy `depends` before mutating it
|
||||||
depends = copy(depends)
|
depends = copy(depends)
|
||||||
depends.dependency = type_annotation
|
depends = dataclasses.replace(depends, dependency=type_annotation)
|
||||||
|
|
||||||
# Handle non-param type annotations like Request
|
# Handle non-param type annotations like Request
|
||||||
if lenient_issubclass(
|
if lenient_issubclass(
|
||||||
|
|
|
||||||
|
|
@ -762,13 +762,13 @@ class File(Form): # type: ignore[misc]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass(frozen=True)
|
||||||
class Depends:
|
class Depends:
|
||||||
dependency: Optional[Callable[..., Any]] = None
|
dependency: Optional[Callable[..., Any]] = None
|
||||||
use_cache: bool = True
|
use_cache: bool = True
|
||||||
scope: Union[Literal["function", "request"], None] = None
|
scope: Union[Literal["function", "request"], None] = None
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass(frozen=True)
|
||||||
class Security(Depends):
|
class Security(Depends):
|
||||||
scopes: Optional[Sequence[str]] = None
|
scopes: Optional[Sequence[str]] = None
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
# This is more or less a workaround to make Depends and Security hashable
|
||||||
|
# as other tools that use them depend on that
|
||||||
|
# Ref: https://github.com/fastapi/fastapi/pull/14320
|
||||||
|
|
||||||
|
from fastapi import Depends, Security
|
||||||
|
|
||||||
|
|
||||||
|
def dep():
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def test_depends_hashable():
|
||||||
|
dep() # just for coverage
|
||||||
|
d1 = Depends(dep)
|
||||||
|
d2 = Depends(dep)
|
||||||
|
d3 = Depends(dep, scope="function")
|
||||||
|
d4 = Depends(dep, scope="function")
|
||||||
|
|
||||||
|
s1 = Security(dep)
|
||||||
|
s2 = Security(dep)
|
||||||
|
|
||||||
|
assert hash(d1) == hash(d2)
|
||||||
|
assert hash(s1) == hash(s2)
|
||||||
|
assert hash(d1) != hash(d3)
|
||||||
|
assert hash(d3) == hash(d4)
|
||||||
Loading…
Reference in New Issue