return True
return False
+ @cached_property
+ def _unwrapped_call(self) -> Any:
+ if self.call is None:
+ return self.call # pragma: no cover
+ return inspect.unwrap(self.call)
+
@cached_property
def is_gen_callable(self) -> bool:
- if inspect.isgeneratorfunction(self.call):
+ if inspect.isgeneratorfunction(self._unwrapped_call):
return True
- dunder_call = getattr(self.call, "__call__", None) # noqa: B004
+ dunder_call = getattr(self._unwrapped_call, "__call__", None) # noqa: B004
return inspect.isgeneratorfunction(dunder_call)
@cached_property
def is_async_gen_callable(self) -> bool:
- if inspect.isasyncgenfunction(self.call):
+ if inspect.isasyncgenfunction(self._unwrapped_call):
return True
- dunder_call = getattr(self.call, "__call__", None) # noqa: B004
+ dunder_call = getattr(self._unwrapped_call, "__call__", None) # noqa: B004
return inspect.isasyncgenfunction(dunder_call)
@cached_property
def is_coroutine_callable(self) -> bool:
- if inspect.isroutine(self.call):
- return iscoroutinefunction(self.call)
- if inspect.isclass(self.call):
+ if inspect.isroutine(self._unwrapped_call):
+ return iscoroutinefunction(self._unwrapped_call)
+ if inspect.isclass(self._unwrapped_call):
return False
- dunder_call = getattr(self.call, "__call__", None) # noqa: B004
+ dunder_call = getattr(self._unwrapped_call, "__call__", None) # noqa: B004
return iscoroutinefunction(dunder_call)
@cached_property
--- /dev/null
+from functools import wraps
+from typing import AsyncGenerator, Generator
+
+import pytest
+from fastapi import Depends, FastAPI
+from fastapi.testclient import TestClient
+
+
+def noop_wrap(func):
+ @wraps(func)
+ def wrapper(*args, **kwargs):
+ return func(*args, **kwargs)
+
+ return wrapper
+
+
+app = FastAPI()
+
+
+@noop_wrap
+def wrapped_dependency() -> bool:
+ return True
+
+
+@noop_wrap
+def wrapped_gen_dependency() -> Generator[bool, None, None]:
+ yield True
+
+
+@noop_wrap
+async def async_wrapped_dependency() -> bool:
+ return True
+
+
+@noop_wrap
+async def async_wrapped_gen_dependency() -> AsyncGenerator[bool, None]:
+ yield True
+
+
+@app.get("/wrapped-dependency/")
+async def get_wrapped_dependency(value: bool = Depends(wrapped_dependency)):
+ return value
+
+
+@app.get("/wrapped-gen-dependency/")
+async def get_wrapped_gen_dependency(value: bool = Depends(wrapped_gen_dependency)):
+ return value
+
+
+@app.get("/async-wrapped-dependency/")
+async def get_async_wrapped_dependency(value: bool = Depends(async_wrapped_dependency)):
+ return value
+
+
+@app.get("/async-wrapped-gen-dependency/")
+async def get_async_wrapped_gen_dependency(
+ value: bool = Depends(async_wrapped_gen_dependency),
+):
+ return value
+
+
+client = TestClient(app)
+
+
+@pytest.mark.parametrize(
+ "route",
+ [
+ "/wrapped-dependency",
+ "/wrapped-gen-dependency",
+ "/async-wrapped-dependency",
+ "/async-wrapped-gen-dependency",
+ ],
+)
+def test_class_dependency(route):
+ response = client.get(route)
+ assert response.status_code == 200, response.text
+ assert response.json() is True