resolved RESOLVED PASS · 15 tool calls · 179 s · fastapi/fastapi
🐛 Fix using class (not instance) dependency that has `__call__` method As reported in https://github.com/fastapi/fastapi/discussions/14452, FastAPI 0.123.6 introduced a regression - if we use class (not instance) as dependency and this class has `__call__` method that is coroutine or generator, it is mistakenly treated as coroutine\generator (actually class is not coroutine\generator, instance of this class is). So, to fix this we need to check if the callable is class before inspecting its `dunder_call` in `is_coroutine_callable`, `is_async_gen_callable`, and `is_gen_callable`.
| # | Tool | Arguments | Result |
|---|---|---|---|
| 1 | run_command | {
"command": "grep -rn \"is_coroutine_callable\" fastapi | head -20"
} | {"status": "ok", "stdout": "fastapi/dependencies/models.py:154: def is_coroutine_callable(self) -> bool:\nfastapi/dependencies/utils.py:666: elif use_sub_dependfull{"status": "ok", "stdout": "fastapi/dependencies/models.py:154: def is_coroutine_callable(self) -> bool:\nfastapi/dependencies/utils.py:666: elif use_sub_dependant.is_coroutine_callable:\nfastapi/routing.py:305: is_coroutine = dependant.is_coroutine_callable\n", "exit_code": 0} |
| 2 | read_file | {
"filepath": "fastapi/dependencies/models.py",
"start_line": 150,
"end_line": 200
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " return True\n return False\n\n @cached_property\n def is_coroutine_callable(self) ->full{"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " return True\n return False\n\n @cached_property\n def is_coroutine_callable(self) -> bool:\n if self.call is None:\n return False # pragma: no cover\n if inspect.isroutine(_impartial(self.call)) and iscoroutinefunction(\n _impartial(self.call)\n ):\n return True\n if inspect.isroutine(_unwrapped_call(self.call)) and iscoroutinefunction(\n _unwrapped_call(self.call)\n ):\n return True\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(_impartial(dunder_call)) or iscoroutinefunction(\n _unwrapped_call(dunder_call)\n ):\n return True\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(\n _impartial(dunder_unwrapped_call)\n ) or iscoroutinefunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n # if inspect.isclass(self.call): False, covered by default return\n return False\n\n @cached_property\n def computed_scope(self) -> Union[str, None]:\n if self.scope:\n return self.scope\n if self.is_gen_callable or self.is_async_gen_callable:\n return \"request\"\n return None\n", "start_line": 150, "end_line": 188, "total_lines": 188, "is_truncated": false} |
| 3 | read_file | {
"end_line": 250,
"filepath": "fastapi/dependencies/models.py",
"start_line": 180
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " return False\n\n @cached_property\n def computed_scope(self) -> Union[str, None]:\n full{"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " return False\n\n @cached_property\n def computed_scope(self) -> Union[str, None]:\n if self.scope:\n return self.scope\n if self.is_gen_callable or self.is_async_gen_callable:\n return \"request\"\n return None\n", "start_line": 180, "end_line": 188, "total_lines": 188, "is_truncated": false} |
| 4 | read_file | {
"end_line": 250,
"filepath": "fastapi/dependencies/models.py",
"start_line": 150
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " return True\n return False\n\n @cached_property\n def is_coroutine_callable(self) ->full{"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " return True\n return False\n\n @cached_property\n def is_coroutine_callable(self) -> bool:\n if self.call is None:\n return False # pragma: no cover\n if inspect.isroutine(_impartial(self.call)) and iscoroutinefunction(\n _impartial(self.call)\n ):\n return True\n if inspect.isroutine(_unwrapped_call(self.call)) and iscoroutinefunction(\n _unwrapped_call(self.call)\n ):\n return True\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(_impartial(dunder_call)) or iscoroutinefunction(\n _unwrapped_call(dunder_call)\n ):\n return True\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(\n _impartial(dunder_unwrapped_call)\n ) or iscoroutinefunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n # if inspect.isclass(self.call): False, covered by default return\n return False\n\n @cached_property\n def computed_scope(self) -> Union[str, None]:\n if self.scope:\n return self.scope\n if self.is_gen_callable or self.is_async_gen_callable:\n return \"request\"\n return None\n", "start_line": 150, "end_line": 188, "total_lines": 188, "is_truncated": false} |
| 5 | read_file | {
"end_line": 250,
"filepath": "fastapi/dependencies/models.py",
"start_line": 160
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " return True\n if inspect.isroutine(_unwrapped_call(self.call)) and iscoroutinefunctifull{"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " return True\n if inspect.isroutine(_unwrapped_call(self.call)) and iscoroutinefunction(\n _unwrapped_call(self.call)\n ):\n return True\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(_impartial(dunder_call)) or iscoroutinefunction(\n _unwrapped_call(dunder_call)\n ):\n return True\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(\n _impartial(dunder_unwrapped_call)\n ) or iscoroutinefunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n # if inspect.isclass(self.call): False, covered by default return\n return False\n\n @cached_property\n def computed_scope(self) -> Union[str, None]:\n if self.scope:\n return self.scope\n if self.is_gen_callable or self.is_async_gen_callable:\n return \"request\"\n return None\n", "start_line": 160, "end_line": 188, "total_lines": 188, "is_truncated": false} |
| 6 | read_file | {
"end_line": 250,
"filepath": "fastapi/dependencies/models.py",
"start_line": 1
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": "import inspect\nimport sys\nfrom dataclasses import dataclass, field\nfrom functools full{"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": "import inspect\nimport sys\nfrom dataclasses import dataclass, field\nfrom functools import cached_property, partial\nfrom typing import Any, Callable, List, Optional, Union\n\nfrom fastapi._compat import ModelField\nfrom fastapi.security.base import SecurityBase\nfrom fastapi.types import DependencyCacheKey\nfrom typing_extensions import Literal\n\nif sys.version_info >= (3, 13): # pragma: no cover\n from inspect import iscoroutinefunction\nelse: # pragma: no cover\n from asyncio import iscoroutinefunction\n\n\ndef _unwrapped_call(call: Optional[Callable[..., Any]]) -> Any:\n if call is None:\n return call # pragma: no cover\n unwrapped = inspect.unwrap(_impartial(call))\n return unwrapped\n\n\ndef _impartial(func: Callable[..., Any]) -> Callable[..., Any]:\n while isinstance(func, partial):\n func = func.func\n return func\n\n\n@dataclass\nclass Dependant:\n path_params: List[ModelField] = field(default_factory=list)\n query_params: List[ModelField] = field(default_factory=list)\n header_params: List[ModelField] = field(default_factory=list)\n cookie_params: List[ModelField] = field(default_factory=list)\n body_params: List[ModelField] = field(default_factory=list)\n dependencies: List[\"Dependant\"] = field(default_factory=list)\n name: Optional[str] = None\n call: Optional[Callable[..., Any]] = None\n request_param_name: Optional[str] = None\n websocket_param_name: Optional[str] = None\n http_connection_param_name: Optional[str] = None\n response_param_name: Optional[str] = None\n background_tasks_param_name: Optional[str] = None\n security_scopes_param_name: Optional[str] = None\n own_oauth_scopes: Optional[List[str]] = None\n parent_oauth_scopes: Optional[List[str]] = None\n use_cache: bool = True\n path: Optional[str] = None\n scope: Union[Literal[\"function\", \"request\"], None] = None\n\n |
| 7 | read_file | {
"end_line": 188,
"filepath": "fastapi/dependencies/models.py",
"start_line": 150
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " return True\n return False\n\n @cached_property\n def is_coroutine_callable(self) ->full{"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " return True\n return False\n\n @cached_property\n def is_coroutine_callable(self) -> bool:\n if self.call is None:\n return False # pragma: no cover\n if inspect.isroutine(_impartial(self.call)) and iscoroutinefunction(\n _impartial(self.call)\n ):\n return True\n if inspect.isroutine(_unwrapped_call(self.call)) and iscoroutinefunction(\n _unwrapped_call(self.call)\n ):\n return True\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(_impartial(dunder_call)) or iscoroutinefunction(\n _unwrapped_call(dunder_call)\n ):\n return True\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(\n _impartial(dunder_unwrapped_call)\n ) or iscoroutinefunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n # if inspect.isclass(self.call): False, covered by default return\n return False\n\n @cached_property\n def computed_scope(self) -> Union[str, None]:\n if self.scope:\n return self.scope\n if self.is_gen_callable or self.is_async_gen_callable:\n return \"request\"\n return None\n", "start_line": 150, "end_line": 188, "total_lines": 188, "is_truncated": false} |
| 8 | run_command | {
"command": "python3 -c \"\nimport inspect\nfrom asyncio import iscoroutinefunction\nfrom functools import partial\n\ndef _impartial(func):\n while isinstance(func, partial):\n func = func.func\n return func\n\ndef _unwrapped_call(call):\n if call is None: return None\n return inspect.unwrap(_impartial(call))\n\nclass CoroCall:\n async def __call__(self):\n pass\n\nclass GenCall:\n def __iter__(self):\n yield 1\n\n def __call__(self):\n yield 1\n\nclass AsyncGenCall:\n async def __call__(self):\n yield 1\n\ndef test_is_coroutine_callable(call):\n if call is None: return False\n if inspect.isroutine(_impartial(call)) and iscoroutinefunction(_impartial(call)):\n return True\n if inspect.isroutine(_unwrapped_call(call)) and iscoroutinefunction(_unwrapped_call(call)):\n return True\n dunder_call = getattr(_impartial(call), '__call__', None)\n if dunder_call is None: return False\n if iscoroutinefunction(_impartial(dunder_call)) or iscoroutinefunction(_unwrapped_call(dunder_call)):\n return True\n dunder_unwrapped_call = getattr(_unwrapped_call(call), '__call__', None)\n if dunder_unwrapped_call is None: return False\n if iscoroutinefunction(_impartial(dunder_unwrapped_call)) or iscoroutinefunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n return False\n\nprint(f'CoroCall class: {test_is_coroutine_callable(CoroCall)}')\nprint(f'CoroCall instance: {test_is_coroutine_callable(CoroCall())}')\n\""
} | {"status": "ok", "stdout": "CoroCall class: True\nCoroCall instance: True\n", "exit_code": 0}full{"status": "ok", "stdout": "CoroCall class: True\nCoroCall instance: True\n", "exit_code": 0} |
| 9 | run_command | {
"command": "python3 -c \"\nimport inspect\nfrom asyncio import iscoroutinefunction\nfrom functools import partial\n\ndef _impartial(func):\n while isinstance(func, partial):\n func = func.func\n return func\n\ndef _unwrapped_call(call):\n if call is None: return None\n return inspect.unwrap(_impartial(call))\n\nclass CoroCall:\n async def __call__(self):\n pass\n\ndef test_is_coroutine_callable(call):\n if call is None: return False\n if inspect.isroutine(_impartial(call)) and iscoroutinefunction(_impartial(call)):\n return True\n if inspect.isroutine(_unwrapped_call(call)) and iscoroutinefunction(_unwrapped_call(call)):\n return True\n \n # The fix: check if it is a class before inspecting __call__\n if inspect.isclass(_impartial(call)):\n return False\n \n dunder_call = getattr(_impartial(call), '__call__', None)\n if dunder_call is None: return False\n if iscoroutinefunction(_impartial(dunder_call)) or iscoroutinefunction(_unwrapped_call(dunder_call)):\n return True\n \n if inspect.isclass(_unwrapped_call(call)):\n return False\n\n dunder_unwrapped_call = getattr(_unwrapped_call(call), '__call__', None)\n if dunder_unwrapped_call is None: return False\n if iscoroutinefunction(_impartial(dunder_unwrapped_call)) or iscoroutinefunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n return False\n\nprint(f'CoroCall class: {test_is_coroutine_callable(CoroCall)}')\nprint(f'CoroCall instance: {test_is_coroutine_callable(CoroCall())}')\n\""
} | {"status": "ok", "stdout": "CoroCall class: False\nCoroCall instance: True\n", "exit_code": 0}full{"status": "ok", "stdout": "CoroCall class: False\nCoroCall instance: True\n", "exit_code": 0} |
| 10 | read_file | {
"end_line": 150,
"filepath": "fastapi/dependencies/models.py",
"start_line": 100
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " @cached_property\n def _security_dependencies(self) -> List[\"Dependant\"]:\n securifull{"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " @cached_property\n def _security_dependencies(self) -> List[\"Dependant\"]:\n security_deps = [dep for dep in self.dependencies if dep._is_security_scheme]\n return security_deps\n\n @cached_property\n def is_gen_callable(self) -> bool:\n if self.call is None:\n return False # pragma: no cover\n if inspect.isgeneratorfunction(\n _impartial(self.call)\n ) or inspect.isgeneratorfunction(_unwrapped_call(self.call)):\n return True\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if inspect.isgeneratorfunction(\n _impartial(dunder_call)\n ) or inspect.isgeneratorfunction(_unwrapped_call(dunder_call)):\n return True\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if inspect.isgeneratorfunction(\n _impartial(dunder_unwrapped_call)\n ) or inspect.isgeneratorfunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n return False\n\n @cached_property\n def is_async_gen_callable(self) -> bool:\n if self.call is None:\n return False # pragma: no cover\n if inspect.isasyncgenfunction(\n _impartial(self.call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(self.call)):\n return True\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if inspect.isasyncgenfunction(\n _impartial(dunder_call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(dunder_call)):\n return True\n |
| 11 | edit_file | {
"filepath": "fastapi/dependencies/models.py",
"new_string": " if inspect.isgeneratorfunction(\n _impartial(self.call)\n ) or inspect.isgeneratorfunction(_unwrapped_call(self.call)):\n return True\n if inspect.isclass(_impartial(self.call)):\n return False\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if inspect.isgeneratorfunction(\n _impartial(dunder_call)\n ) or inspect.isgeneratorfunction(_unwrapped_call(dunder_call)):\n return True\n if inspect.isclass(_unwrapped_call(self.call)):\n return False\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if inspect.isgeneratorfunction(\n _impartial(dunder_unwrapped_call)\n ) or inspect.isgeneratorfunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n return False",
"old_string": " if inspect.isgeneratorfunction(\n _impartial(self.call)\n ) or inspect.isgeneratorfunction(_unwrapped_call(self.call)):\n return True\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if inspect.isgeneratorfunction(\n _impartial(dunder_call)\n ) or inspect.isgeneratorfunction(_unwrapped_call(dunder_call)):\n return True\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if inspect.isgeneratorfunction(\n _impartial(dunder_unwrapped_call)\n ) or inspect.isgeneratorfunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n return False"
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/fastapi/dependencies/models.py\n+++ b/fastafull{"status": "ok", "filepath": "fastapi/dependencies/models.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/fastapi/dependencies/models.py\n+++ b/fastapi/dependencies/models.py\n@@ -110,6 +110,8 @@\n _impartial(self.call)\n ) or inspect.isgeneratorfunction(_unwrapped_call(self.call)):\n return True\n+ if inspect.isclass(_impartial(self.call)):\n+ return False\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n@@ -117,6 +119,8 @@\n _impartial(dunder_call)\n ) or inspect.isgeneratorfunction(_unwrapped_call(dunder_call)):\n return True\n+ if inspect.isclass(_unwrapped_call(self.call)):\n+ return False\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n", "is_truncated": false} |
| 12 | edit_file | {
"filepath": "fastapi/dependencies/models.py",
"new_string": " if inspect.isasyncgenfunction(\n _impartial(self.call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(self.call)):\n return True\n if inspect.isclass(_impartial(self.call)):\n return False\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if inspect.isasyncgenfunction(\n _impartial(dunder_call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(dunder_call)):\n return True\n if inspect.isclass(_unwrapped_call(self.call)):\n return False\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if inspect.isasyncgenfunction(\n _impartial(dunder_unwrapped_call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n return False",
"old_string": " if inspect.isasyncgenfunction(\n _impartial(self.call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(self.call)):\n return True\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if inspect.isasyncgenfunction(\n _impartial(dunder_call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(dunder_call)):\n return True\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if inspect.isasyncgenfunction(\n _impartial(dunder_unwrapped_call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(dunder_unwrapped_call)):\n return True"
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/fastapi/dependencies/models.py\n+++ b/fastafull{"status": "ok", "filepath": "fastapi/dependencies/models.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/fastapi/dependencies/models.py\n+++ b/fastapi/dependencies/models.py\n@@ -138,6 +138,8 @@\n _impartial(self.call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(self.call)):\n return True\n+ if inspect.isclass(_impartial(self.call)):\n+ return False\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n@@ -145,6 +147,8 @@\n _impartial(dunder_call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(dunder_call)):\n return True\n+ if inspect.isclass(_unwrapped_call(self.call)):\n+ return False\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n@@ -152,6 +156,7 @@\n _impartial(dunder_unwrapped_call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n+ return False\n return False\n \n @cached_property\n", "is_truncated": false} |
| 13 | read_file | {
"end_line": 165,
"filepath": "fastapi/dependencies/models.py",
"start_line": 150
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " if inspect.isclass(_unwrapped_call(self.call)):\n return False\n dunder_unwrapped_cafull{"status": "ok", "filepath": "fastapi/dependencies/models.py", "content": " if inspect.isclass(_unwrapped_call(self.call)):\n return False\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if inspect.isasyncgenfunction(\n _impartial(dunder_unwrapped_call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n return False\n return False\n\n @cached_property\n def is_coroutine_callable(self) -> bool:\n if self.call is None:\n return False # pragma: no cover\n", "start_line": 150, "end_line": 165, "total_lines": 197, "is_truncated": false} |
| 14 | edit_file | {
"filepath": "fastapi/dependencies/models.py",
"new_string": " if inspect.isasyncgenfunction(\n _impartial(dunder_unwrapped_call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n return False\n\n @cached_property",
"old_string": " if inspect.isasyncgenfunction(\n _impartial(dunder_unwrapped_call)\n ) or inspect.isasyncgenfunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n return False\n return False\n\n @cached_property"
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/fastapi/dependencies/models.py\n+++ b/fastafull{"status": "ok", "filepath": "fastapi/dependencies/models.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/fastapi/dependencies/models.py\n+++ b/fastapi/dependencies/models.py\n@@ -157,7 +157,6 @@\n ) or inspect.isasyncgenfunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n return False\n- return False\n \n @cached_property\n def is_coroutine_callable(self) -> bool:\n", "is_truncated": false} |
| 15 | edit_file | {
"filepath": "fastapi/dependencies/models.py",
"new_string": " @cached_property\n def is_coroutine_callable(self) -> bool:\n if self.call is None:\n return False # pragma: no cover\n if inspect.isroutine(_impartial(self.call)) and iscoroutinefunction(\n _impartial(self.call)\n ):\n return True\n if inspect.isroutine(_unwrapped_call(self.call)) and iscoroutinefunction(\n _unwrapped_call(self.call)\n ):\n return True\n if inspect.isclass(_impartial(self.call)):\n return False\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(_impartial(dunder_call)) or iscoroutinefunction(\n _unwrapped_call(dunder_call)\n ):\n return True\n if inspect.isclass(_unwrapped_call(self.call)):\n return False\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(\n _impartial(dunder_unwrapped_call)\n ) or iscoroutinefunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n # if inspect.isclass(self.call): False, covered by default return\n return False",
"old_string": " @cached_property\n def is_coroutine_callable(self) -> bool:\n if self.call is None:\n return False # pragma: no cover\n if inspect.isroutine(_impartial(self.call)) and iscoroutinefunction(\n _impartial(self.call)\n ):\n return True\n if inspect.isroutine(_unwrapped_call(self.call)) and iscoroutinefunction(\n _unwrapped_call(self.call)\n ):\n return True\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(_impartial(dunder_call)) or iscoroutinefunction(\n _unwrapped_call(dunder_call)\n ):\n return True\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n if iscoroutinefunction(\n _impartial(dunder_unwrapped_call)\n ) or iscoroutinefunction(_unwrapped_call(dunder_unwrapped_call)):\n return True\n # if inspect.isclass(self.call): False, covered by default return\n return False"
} | {"status": "ok", "filepath": "fastapi/dependencies/models.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/fastapi/dependencies/models.py\n+++ b/fastafull{"status": "ok", "filepath": "fastapi/dependencies/models.py", "occurrences": 1, "strategy": "exact", "diff": "--- a/fastapi/dependencies/models.py\n+++ b/fastapi/dependencies/models.py\n@@ -170,6 +170,8 @@\n _unwrapped_call(self.call)\n ):\n return True\n+ if inspect.isclass(_impartial(self.call)):\n+ return False\n dunder_call = getattr(_impartial(self.call), \"__call__\", None) # noqa: B004\n if dunder_call is None:\n return False # pragma: no cover\n@@ -177,6 +179,8 @@\n _unwrapped_call(dunder_call)\n ):\n return True\n+ if inspect.isclass(_unwrapped_call(self.call)):\n+ return False\n dunder_unwrapped_call = getattr(_unwrapped_call(self.call), \"__call__\", None) # noqa: B004\n if dunder_unwrapped_call is None:\n return False # pragma: no cover\n", "is_truncated": false} |
| 16 | submit_patch | [] | {"status": "ok", "patch_size": 2639, "files_changed": 1}full{"status": "ok", "patch_size": 2639, "files_changed": 1} |
diff --git a/fastapi/dependencies/models.py b/fastapi/dependencies/models.py
index af168a17..843c66b9 100644
--- a/fastapi/dependencies/models.py
+++ b/fastapi/dependencies/models.py
@@ -110,6 +110,8 @@ class Dependant:
_impartial(self.call)
) or inspect.isgeneratorfunction(_unwrapped_call(self.call)):
return True
+ if inspect.isclass(_impartial(self.call)):
+ return False
dunder_call = getattr(_impartial(self.call), "__call__", None) # noqa: B004
if dunder_call is None:
return False # pragma: no cover
@@ -117,6 +119,8 @@ class Dependant:
_impartial(dunder_call)
) or inspect.isgeneratorfunction(_unwrapped_call(dunder_call)):
return True
+ if inspect.isclass(_unwrapped_call(self.call)):
+ return False
dunder_unwrapped_call = getattr(_unwrapped_call(self.call), "__call__", None) # noqa: B004
if dunder_unwrapped_call is None:
return False # pragma: no cover
@@ -134,6 +138,8 @@ class Dependant:
_impartial(self.call)
) or inspect.isasyncgenfunction(_unwrapped_call(self.call)):
return True
+ if inspect.isclass(_impartial(self.call)):
+ return False
dunder_call = getattr(_impartial(self.call), "__call__", None) # noqa: B004
if dunder_call is None:
return False # pragma: no cover
@@ -141,6 +147,8 @@ class Dependant:
_impartial(dunder_call)
) or inspect.isasyncgenfunction(_unwrapped_call(dunder_call)):
return True
+ if inspect.isclass(_unwrapped_call(self.call)):
+ return False
dunder_unwrapped_call = getattr(_unwrapped_call(self.call), "__call__", None) # noqa: B004
if dunder_unwrapped_call is None:
return False # pragma: no cover
@@ -162,6 +170,8 @@ class Dependant:
_unwrapped_call(self.call)
):
return True
+ if inspect.isclass(_impartial(self.call)):
+ return False
dunder_call = getattr(_impartial(self.call), "__call__", None) # noqa: B004
if dunder_call is None:
return False # pragma: no cover
@@ -169,6 +179,8 @@ class Dependant:
_unwrapped_call(dunder_call)
):
return True
+ if inspect.isclass(_unwrapped_call(self.call)):
+ return False
dunder_unwrapped_call = getattr(_unwrapped_call(self.call), "__call__", None) # noqa: B004
if dunder_unwrapped_call is None:
return False # pragma: no cover
............ [100%]
=============================== warnings summary ===============================
../../../../../../kaggle/tmp/envs/overlays/starlette-0.50.0-py3-none-any/starlette/testclient.py:45
/kaggle/tmp/envs/overlays/starlette-0.50.0-py3-none-any/starlette/testclient.py:45: DeprecationWarning: The anyio.abc.BlockingPortal alias is deprecated, use anyio.from_thread.BlockingPortal instead.
_PortalFactoryType = Callable[[], AbstractContextManager[anyio.abc.BlockingPortal]]
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
12 passed, 1 warning in 0.74s