resolved RESOLVED PASS ยท 25 tool calls ยท 74 s ยท fastapi/fastapi
๐ Add a custom `FastAPIDeprecationWarning` ๐ Add a custom `FastAPIDeprecationWarning` and use it for deprecated logic, like Pydantic v1 models. Motivated by: https://sethmlarson.dev/deprecations-via-warnings-dont-work-for-python-libraries
| # | Tool | Arguments | Result |
|---|---|---|---|
| 1 | run_command | {
"command": "grep -rn \"DeprecationWarning\" fastapi | head -20"
} | {"status": "ok", "stdout": "fastapi/params.py:78: category=DeprecationWarning,\nfastapi/params.py:108: category=DeprecationWarning,\nfastapi/params.py:533: catefull{"status": "ok", "stdout": "fastapi/params.py:78: category=DeprecationWarning,\nfastapi/params.py:108: category=DeprecationWarning,\nfastapi/params.py:533: category=DeprecationWarning,\nfastapi/params.py:563: category=DeprecationWarning,\nfastapi/dependencies/utils.py:330: category=DeprecationWarning,\nfastapi/openapi/utils.py:220: DeprecationWarning,\nfastapi/utils.py:200: DeprecationWarning,\nfastapi/routing.py:643: category=DeprecationWarning,\nfastapi/routing.py:683: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:66: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:96: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:506: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:536: category=DeprecationWarning,\n", "stderr": "", "exit_code": 0} |
| 2 | run_command | {
"command": "ls fastapi/__init__.py fastapi/utils.py"
} | {"status": "ok", "stdout": "fastapi/__init__.py\nfastapi/utils.py\n", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "fastapi/__init__.py\nfastapi/utils.py\n", "stderr": "", "exit_code": 0} |
| 3 | run_command | {
"command": "cat fastapi/__init__.py"
} | {"status": "ok", "stdout": "\"\"\"FastAPI framework, high performance, easy to learn, fast to code, ready for production\"\"\"\n\n__version__ = \"0.127.0\"\n\nffull{"status": "ok", "stdout": "\"\"\"FastAPI framework, high performance, easy to learn, fast to code, ready for production\"\"\"\n\n__version__ = \"0.127.0\"\n\nfrom starlette import status as status\n\nfrom .applications import FastAPI as FastAPI\nfrom .background import BackgroundTasks as BackgroundTasks\nfrom .datastructures import UploadFile as UploadFile\nfrom .exceptions import HTTPException as HTTPException\nfrom .exceptions import WebSocketException as WebSocketException\nfrom .param_functions import Body as Body\nfrom .param_functions import Cookie as Cookie\nfrom .param_functions import Depends as Depends\nfrom .param_functions import File as File\nfrom .param_functions import Form as Form\nfrom .param_functions import Header as Header\nfrom .param_functions import Path as Path\nfrom .param_functions import Query as Query\nfrom .param_functions import Security as Security\nfrom .requests import Request as Request\nfrom .responses import Response as Response\nfrom .routing import APIRouter as APIRouter\nfrom .websockets import WebSocket as WebSocket\nfrom .websockets import WebSocketDisconnect as WebSocketDisconnect\n", "stderr": "", "exit_code": 0} |
| 4 | run_command | {
"command": "cat fastapi/utils.py"
} | {"status": "ok", "stdout": "import re\nimport warnings\nfrom collections.abc import MutableMapping\nfrom typing import (\n TYPE_CHECKING,\n Any,\n Optional,\n Ufull{"status": "ok", "stdout": "import re\nimport warnings\nfrom collections.abc import MutableMapping\nfrom typing import (\n TYPE_CHECKING,\n Any,\n Optional,\n Union,\n cast,\n)\nfrom weakref import WeakKeyDictionary\n\nimport fastapi\nfrom fastapi._compat import (\n BaseConfig,\n ModelField,\n PydanticSchemaGenerationError,\n Undefined,\n UndefinedType,\n Validator,\n annotation_is_pydantic_v1,\n lenient_issubclass,\n may_v1,\n)\nfrom fastapi.datastructures import DefaultPlaceholder, DefaultType\nfrom pydantic import BaseModel\nfrom pydantic.fields import FieldInfo\nfrom typing_extensions import Literal\n\nfrom ._compat import v2\n\nif TYPE_CHECKING: # pragma: nocover\n from .routing import APIRoute\n\n# Cache for `create_cloned_field`\n_CLONED_TYPES_CACHE: MutableMapping[type[BaseModel], type[BaseModel]] = (\n WeakKeyDictionary()\n)\n\n\ndef is_body_allowed_for_status_code(status_code: Union[int, str, None]) -> bool:\n if status_code is None:\n return True\n # Ref: https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.0.md#patterned-fields-1\n if status_code in {\n \"default\",\n \"1XX\",\n \"2XX\",\n \"3XX\",\n \"4XX\",\n \"5XX\",\n }:\n return True\n current_status_code = int(status_code)\n return not (current_status_code < 200 or current_status_code in {204, 205, 304})\n\n\ndef get_path_param_names(path: str) -> set[str]:\n return set(re.findall(\"{(.*?)}\", path))\n\n\n_invalid_args_message = (\n \"Invalid args for response field! Hint: \"\n \"check that {type_} is a valid Pydantic field type. \"\n \"If you are using a return type annotation that is not a valid Pydantic \"\n \"field (e.g. Union[Response, dict, None]) you can disable generating the \"\n \"response model from the type annotation with the path operation decorator \"\n \"parameter response_model=None. Read more: \"\n \"https://fastapi.tiang |
| 5 | run_command | {
"command": "grep -rn \"DeprecationWarning\" fastapi/temp_pydantic_v1_params.py"
} | {"status": "ok", "stdout": "fastapi/temp_pydantic_v1_params.py:66: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:96: category=DeprecationWarnfull{"status": "ok", "stdout": "fastapi/temp_pydantic_v1_params.py:66: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:96: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:506: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:536: category=DeprecationWarning,\n", "stderr": "", "exit_code": 0} |
| 6 | run_command | {
"command": "cat fastapi/temp_pydantic_v1_params.py"
} | {"status": "ok", "stdout": "import warnings\nfrom typing import Annotated, Any, Callable, Optional, Union\n\nfrom fastapi.openapi.models import Example\nfrom fafull{"status": "ok", "stdout": "import warnings\nfrom typing import Annotated, Any, Callable, Optional, Union\n\nfrom fastapi.openapi.models import Example\nfrom fastapi.params import ParamTypes\nfrom typing_extensions import deprecated\n\nfrom ._compat.may_v1 import FieldInfo, Undefined\n\n_Unset: Any = Undefined\n\n\nclass Param(FieldInfo):\n in_: ParamTypes\n\n def __init__(\n self,\n default: Any = Undefined,\n *,\n default_factory: Union[Callable[[], Any], None] = _Unset,\n annotation: Optional[Any] = None,\n alias: Optional[str] = None,\n alias_priority: Union[int, None] = _Unset,\n # TODO: update when deprecating Pydantic v1, import these types\n # validation_alias: str | AliasPath | AliasChoices | None\n validation_alias: Union[str, None] = None,\n serialization_alias: Union[str, None] = None,\n title: Optional[str] = None,\n description: Optional[str] = None,\n gt: Optional[float] = None,\n ge: Optional[float] = None,\n lt: Optional[float] = None,\n le: Optional[float] = None,\n min_length: Optional[int] = None,\n max_length: Optional[int] = None,\n pattern: Optional[str] = None,\n regex: Annotated[\n Optional[str],\n deprecated(\n \"Deprecated in FastAPI 0.100.0 and Pydantic v2, use `pattern` instead.\"\n ),\n ] = None,\n discriminator: Union[str, None] = None,\n strict: Union[bool, None] = _Unset,\n multiple_of: Union[float, None] = _Unset,\n allow_inf_nan: Union[bool, None] = _Unset,\n max_digits: Union[int, None] = _Unset,\n decimal_places: Union[int, None] = _Unset,\n examples: Optional[list[Any]] = None,\n example: Annotated[\n Optional[Any],\n deprecated(\n \"Deprecated in OpenAPI 3.1.0 that now uses JSON Schema 2020-12, \"\n \"although still s |
| 7 | run_command | {
"command": "grep -rn \"DeprecationWarning\" fastapi | head -40"
} | {"status": "ok", "stdout": "fastapi/params.py:78: category=DeprecationWarning,\nfastapi/params.py:108: category=DeprecationWarning,\nfastapi/params.py:533: catefull{"status": "ok", "stdout": "fastapi/params.py:78: category=DeprecationWarning,\nfastapi/params.py:108: category=DeprecationWarning,\nfastapi/params.py:533: category=DeprecationWarning,\nfastapi/params.py:563: category=DeprecationWarning,\nfastapi/dependencies/utils.py:330: category=DeprecationWarning,\nfastapi/openapi/utils.py:220: DeprecationWarning,\nfastapi/utils.py:200: DeprecationWarning,\nfastapi/routing.py:643: category=DeprecationWarning,\nfastapi/routing.py:683: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:66: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:96: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:506: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:536: category=DeprecationWarning,\n", "stderr": "", "exit_code": 0} |
| 8 | run_command | {
"command": "cat fastapi/exceptions.py"
} | {"status": "ok", "stdout": "from collections.abc import Sequence\nfrom typing import Annotated, Any, Optional, TypedDict, Union\n\nfrom annotated_doc import Docfull{"status": "ok", "stdout": "from collections.abc import Sequence\nfrom typing import Annotated, Any, Optional, TypedDict, Union\n\nfrom annotated_doc import Doc\nfrom pydantic import BaseModel, create_model\nfrom starlette.exceptions import HTTPException as StarletteHTTPException\nfrom starlette.exceptions import WebSocketException as StarletteWebSocketException\n\n\nclass EndpointContext(TypedDict, total=False):\n function: str\n path: str\n file: str\n line: int\n\n\nclass HTTPException(StarletteHTTPException):\n \"\"\"\n An HTTP exception you can raise in your own code to show errors to the client.\n\n This is for client errors, invalid authentication, invalid data, etc. Not for server\n errors in your code.\n\n Read more about it in the\n [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/).\n\n ## Example\n\n ```python\n from fastapi import FastAPI, HTTPException\n\n app = FastAPI()\n\n items = {\"foo\": \"The Foo Wrestlers\"}\n\n\n @app.get(\"/items/{item_id}\")\n async def read_item(item_id: str):\n if item_id not in items:\n raise HTTPException(status_code=404, detail=\"Item not found\")\n return {\"item\": items[item_id]}\n ```\n \"\"\"\n\n def __init__(\n self,\n status_code: Annotated[\n int,\n Doc(\n \"\"\"\n HTTP status code to send to the client.\n \"\"\"\n ),\n ],\n detail: Annotated[\n Any,\n Doc(\n \"\"\"\n Any data to be sent to the client in the `detail` key of the JSON\n response.\n \"\"\"\n ),\n ] = None,\n headers: Annotated[\n Optional[dict[str, str]],\n Doc(\n \"\"\"\n Any headers to send to the client in the response.\n \"\"\"\n ),\n |
| 9 | run_command | {
"command": "cat fastapi/exceptions.py | tail -n 20"
} | {"status": "ok", "stdout": "class WebSocketRequestValidationError(ValidationException):\n def __init__(\n self,\n errors: Sequence[Any],\n *,\n endpoint_ctx: Opfull{"status": "ok", "stdout": "class WebSocketRequestValidationError(ValidationException):\n def __init__(\n self,\n errors: Sequence[Any],\n *,\n endpoint_ctx: Optional[EndpointContext] = None,\n ) -> None:\n super().__init__(errors, endpoint_ctx=endpoint_ctx)\n\n\nclass ResponseValidationError(ValidationException):\n def __init__(\n self,\n errors: Sequence[Any],\n *,\n body: Any = None,\n endpoint_ctx: Optional[EndpointContext] = None,\n ) -> None:\n super().__init__(errors, endpoint_ctx=endpoint_ctx)\n self.body = body\n", "stderr": "", "exit_code": 0} |
| 10 | run_command | {
"command": "cd /workspace && python3 - <<'PY'\nfrom pathlib import Path\np = Path(\"fastapi/exceptions.py\")\ns = p.read_text()\n# Find a good place to insert FastAPIDeprecationWarning. \n# Maybe after FastAPIError.\nold = \"\"\"class FastAPIError(RuntimeError):\n \\\"\\\"\\\"\n A generic, FastAPI-specific error.\n \\\"\\\"\\\"\n\"\"\"\nnew = \"\"\"class FastAPIError(RuntimeError):\n \\\"\\\"\\\"\n A generic, FastAPI-specific error.\n \\\"\\\"\\\"\n\n\nclass FastAPIDeprecationWarning(DeprecationWarning):\n \\\"\\\"\\\"\n A warning for deprecated FastAPI features.\n \\\"\\\"\\\"\n\"\"\"\nassert s.count(old) == 1\nt = s.replace(old, new)\np.write_text(t)\nPY\n"
} | {"status": "ok", "stdout": "", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "", "stderr": "", "exit_code": 0} |
| 11 | run_command | {
"command": "grep -rn \"category=DeprecationWarning\" fastapi | head -20"
} | {"status": "ok", "stdout": "fastapi/params.py:78: category=DeprecationWarning,\nfastapi/params.py:108: category=DeprecationWarning,\nfastapi/params.py:533: catefull{"status": "ok", "stdout": "fastapi/params.py:78: category=DeprecationWarning,\nfastapi/params.py:108: category=DeprecationWarning,\nfastapi/params.py:533: category=DeprecationWarning,\nfastapi/params.py:563: category=DeprecationWarning,\nfastapi/dependencies/utils.py:330: category=DeprecationWarning,\nfastapi/routing.py:643: category=DeprecationWarning,\nfastapi/routing.py:683: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:66: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:96: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:506: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:536: category=DeprecationWarning,\n", "stderr": "", "exit_code": 0} |
| 12 | run_command | {
"command": "grep -rn \"DeprecationWarning\" fastapi | head -20"
} | {"status": "ok", "stdout": "fastapi/params.py:78: category=DeprecationWarning,\nfastapi/params.py:108: category=DeprecationWarning,\nfastapi/params.py:533: catefull{"status": "ok", "stdout": "fastapi/params.py:78: category=DeprecationWarning,\nfastapi/params.py:108: category=DeprecationWarning,\nfastapi/params.py:533: category=DeprecationWarning,\nfastapi/params.py:563: category=DeprecationWarning,\nfastapi/dependencies/utils.py:330: category=DeprecationWarning,\nfastapi/openapi/utils.py:220: DeprecationWarning,\nfastapi/utils.py:200: DeprecationWarning,\nfastapi/routing.py:643: category=DeprecationWarning,\nfastapi/routing.py:683: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:66: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:96: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:506: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:536: category=DeprecationWarning,\nfastapi/exceptions.py:157:class FastAPIDeprecationWarning(DeprecationWarning):\n", "stderr": "", "exit_code": 0} |
| 13 | run_command | {
"command": "cd /workspace && python3 - <<'PY'\nimport warnings\nfrom fastapi.exceptions import FastAPIDeprecationWarning\nwith warnings.catch_warnings(record=True) as w:\n warnings.warn(\"test\", category=FastAPIDeprecationWarning)\n assert len(w) == 1\n assert issubclass(w[-1].category, DeprecationWarning)\nPY\n"
} | {"status": "ok", "stdout": "", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "", "stderr": "", "exit_code": 0} |
| 14 | run_command | {
"command": "grep -rn \"category=DeprecationWarning\" fastapi | head -20"
} | {"status": "ok", "stdout": "fastapi/params.py:78: category=DeprecationWarning,\nfastapi/params.py:108: category=DeprecationWarning,\nfastapi/params.py:533: catefull{"status": "ok", "stdout": "fastapi/params.py:78: category=DeprecationWarning,\nfastapi/params.py:108: category=DeprecationWarning,\nfastapi/params.py:533: category=DeprecationWarning,\nfastapi/params.py:563: category=DeprecationWarning,\nfastapi/dependencies/utils.py:330: category=DeprecationWarning,\nfastapi/routing.py:643: category=DeprecationWarning,\nfastapi/routing.py:683: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:66: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:96: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:506: category=DeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:536: category=DeprecationWarning,\n", "stderr": "", "exit_code": 0} |
| 15 | run_command | {
"command": "cd /workspace && python3 - <<'PY'\nfrom pathlib import Path\nimport re\n\nfiles_to_fix = [\n \"fastapi/params.py\",\n \"fastapi/dependencies/utils.py\",\n \"fastapi/routing.py\",\n \"fastapi/temp_pydantic_v1_params.py\",\n]\n\nfor file_path in files_to_fix:\n p = Path(file_path)\n if not p.exists():\n continue\n s = p.read_text()\n if \"from fastapi.exceptions import FastAPIDeprecationWarning\" not in s:\n # Try to find where imports are\n # This is a bit naive, but let's try to add it to the top\n # or after other fastapi imports.\n \n # Find the first fastapi import\n match = re.search(r\"from fastapi\\.(.*?) import\", s)\n if match:\n import_line = f\"from fastapi.exceptions import FastAPIDeprecationWarning\\n\"\n # Insert before the first fastapi import\n s = s[:match.start()] + import_line + s[match.start():]\n else:\n # Just prepend\n s = \"from fastapi.exceptions import FastAPIDeprecationWarning\\n\" + s\n \n s = s.replace(\"category=DeprecationWarning\", \"category=FastAPIDeprecationWarning\")\n p.write_text(s)\nPY\n"
} | {"status": "ok", "stdout": "", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "", "stderr": "", "exit_code": 0} |
| 16 | run_command | {
"command": "grep -rn \"category=FastAPIDeprecationWarning\" fastapi | head -20"
} | {"status": "ok", "stdout": "fastapi/params.py:79: category=FastAPIDeprecationWarning,\nfastapi/params.py:109: category=FastAPIDeprecationWarning,\nfastapi/paramfull{"status": "ok", "stdout": "fastapi/params.py:79: category=FastAPIDeprecationWarning,\nfastapi/params.py:109: category=FastAPIDeprecationWarning,\nfastapi/params.py:534: category=FastAPIDeprecationWarning,\nfastapi/params.py:564: category=FastAPIDeprecationWarning,\nfastapi/dependencies/utils.py:331: category=FastAPIDeprecationWarning,\nfastapi/routing.py:644: category=FastAPIDeprecationWarning,\nfastapi/routing.py:684: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:67: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:97: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:507: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:537: category=FastAPIDeprecationWarning,\n", "stderr": "", "exit_code": 0} |
| 17 | run_command | {
"command": "grep -rn \"DeprecationWarning\" fastapi | head -20"
} | {"status": "ok", "stdout": "fastapi/params.py:7:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/params.py:79: category=FastAPIDeprecationWarnifull{"status": "ok", "stdout": "fastapi/params.py:7:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/params.py:79: category=FastAPIDeprecationWarning,\nfastapi/params.py:109: category=FastAPIDeprecationWarning,\nfastapi/params.py:534: category=FastAPIDeprecationWarning,\nfastapi/params.py:564: category=FastAPIDeprecationWarning,\nfastapi/dependencies/utils.py:21:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/dependencies/utils.py:331: category=FastAPIDeprecationWarning,\nfastapi/openapi/utils.py:220: DeprecationWarning,\nfastapi/utils.py:200: DeprecationWarning,\nfastapi/routing.py:26:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/routing.py:644: category=FastAPIDeprecationWarning,\nfastapi/routing.py:684: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:4:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/temp_pydantic_v1_params.py:67: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:97: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:507: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:537: category=FastAPIDeprecationWarning,\nfastapi/exceptions.py:157:class FastAPIDeprecationWarning(DeprecationWarning):\n", "stderr": "", "exit_code": 0} |
| 18 | run_command | {
"command": "grep -rn \"DeprecationWarning\" fastapi | grep -v \"FastAPIDeprecationWarning\""
} | {"status": "ok", "stdout": "fastapi/openapi/utils.py:220: DeprecationWarning,\nfastapi/utils.py:200: DeprecationWarning,\n", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "fastapi/openapi/utils.py:220: DeprecationWarning,\nfastapi/utils.py:200: DeprecationWarning,\n", "stderr": "", "exit_code": 0} |
| 19 | run_command | {
"command": "cat fastapi/openapi/utils.py | sed -n '210,230p'"
} | {"status": "ok", "stdout": " request_body_oai[\"content\"] = {request_media_type: request_media_content}\n return request_body_oai\n\n\ndef generate_operation_ifull{"status": "ok", "stdout": " request_body_oai[\"content\"] = {request_media_type: request_media_content}\n return request_body_oai\n\n\ndef generate_operation_id(\n *, route: routing.APIRoute, method: str\n) -> str: # pragma: nocover\n warnings.warn(\n \"fastapi.openapi.utils.generate_operation_id() was deprecated, \"\n \"it is not used internally, and will be removed soon\",\n DeprecationWarning,\n stacklevel=2,\n )\n if route.operation_id:\n return route.operation_id\n path: str = route.path_format\n return generate_operation_id_for_path(name=route.name, path=path, method=method)\n\n\ndef generate_operation_summary(*, route: routing.APIRoute, method: str) -> str:\n if route.summary:\n", "stderr": "", "exit_code": 0} |
| 20 | run_command | {
"command": "cat fastapi/utils.py | sed -n '190,210p'"
} | {"status": "ok", "stdout": " new_field.populate_validators() # type: ignore[attr-defined]\n return new_field\n\n\ndef generate_operation_id_for_path(\n *, name:full{"status": "ok", "stdout": " new_field.populate_validators() # type: ignore[attr-defined]\n return new_field\n\n\ndef generate_operation_id_for_path(\n *, name: str, path: str, method: str\n) -> str: # pragma: nocover\n warnings.warn(\n \"fastapi.utils.generate_operation_id_for_path() was deprecated, \"\n \"it is not used internally, and will be removed soon\",\n DeprecationWarning,\n stacklevel=2,\n )\n operation_id = f\"{name}{path}\"\n operation_id = re.sub(r\"\\W\", \"_\", operation_id)\n operation_id = f\"{operation_id}_{method.lower()}\"\n return operation_id\n\n\ndef generate_unique_id(route: \"APIRoute\") -> str:\n operation_id = f\"{route.name}{route.path_format}\"\n", "stderr": "", "exit_code": 0} |
| 21 | run_command | {
"command": "cd /workspace && python3 - <<'PY'\nfrom pathlib import Path\nimport re\n\nfiles_to_fix = [\n \"fastapi/openapi/utils.py\",\n \"fastapi/utils.py\",\n]\n\nfor file_path in files_to_fix:\n p = Path(file_path)\n if not p.exists():\n continue\n s = p.read_text()\n if \"from fastapi.exceptions import FastAPIDeprecationWarning\" not in s:\n match = re.search(r\"from fastapi\\.(.*?) import\", s)\n if match:\n import_line = f\"from fastapi.exceptions import FastAPIDeprecationWarning\\n\"\n s = s[:match.start()] + import_line + s[match.start():]\n else:\n s = \"from fastapi.exceptions import FastAPIDeprecationWarning\\n\" + s\n \n s = s.replace(\"DeprecationWarning,\", \"FastAPIDeprecationWarning,\")\n p.write_text(s)\nPY\n"
} | {"status": "ok", "stdout": "", "stderr": "", "exit_code": 0}full{"status": "ok", "stdout": "", "stderr": "", "exit_code": 0} |
| 22 | run_command | {
"command": "grep -rn \"DeprecationWarning\" fastapi | grep -v \"FastAPIDeprecationWarning\""
} | {"status": "error", "error_type": "CommandError", "error_message": "", "details": {"stdout": "", "stderr": "", "exit_code": 1}}full{"status": "error", "error_type": "CommandError", "error_message": "", "details": {"stdout": "", "stderr": "", "exit_code": 1}} |
| 23 | run_command | {
"command": "grep -rn \"FastAPIDeprecationWarning\" fastapi | head -20"
} | {"status": "ok", "stdout": "fastapi/params.py:7:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/params.py:79: category=FastAPIDeprecationWarnifull{"status": "ok", "stdout": "fastapi/params.py:7:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/params.py:79: category=FastAPIDeprecationWarning,\nfastapi/params.py:109: category=FastAPIDeprecationWarning,\nfastapi/params.py:534: category=FastAPIDeprecationWarning,\nfastapi/params.py:564: category=FastAPIDeprecationWarning,\nfastapi/dependencies/utils.py:21:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/dependencies/utils.py:331: category=FastAPIDeprecationWarning,\nfastapi/openapi/utils.py:8:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/openapi/utils.py:221: FastAPIDeprecationWarning,\nfastapi/utils.py:14:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/utils.py:201: FastAPIDeprecationWarning,\nfastapi/routing.py:26:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/routing.py:644: category=FastAPIDeprecationWarning,\nfastapi/routing.py:684: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:4:from fastapi.exceptions import FastAPIDeprecationWarning\nfastapi/temp_pydantic_v1_params.py:67: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:97: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:507: category=FastAPIDeprecationWarning,\nfastapi/temp_pydantic_v1_params.py:537: category=FastAPIDeprecationWarning,\nfastapi/exceptions.py:157:class FastAPIDeprecationWarning(DeprecationWarning):\n", "stderr": "", "exit_code": 0} |
| 24 | run_command | {
"command": "git status"
} | {"status": "ok", "stdout": "On branch main\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <full{"status": "ok", "stdout": "On branch main\nChanges not staged for commit:\n (use \"git add <file>...\" to update what will be committed)\n (use \"git restore <file>...\" to discard changes in working directory)\n\tmodified: fastapi/dependencies/utils.py\n\tmodified: fastapi/exceptions.py\n\tmodified: fastapi/openapi/utils.py\n\tmodified: fastapi/params.py\n\tmodified: fastapi/routing.py\n\tmodified: fastapi/temp_pydantic_v1_params.py\n\tmodified: fastapi/utils.py\n\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\n", "stderr": "", "exit_code": 0} |
| 25 | run_command | {
"command": "submit_patch"
} | {"status": "error", "error_type": "CommandError", "error_message": "/bin/bash: submit_patch: command not found\n", "details": {"stdout": "", "stderr": "/bin/basfull{"status": "error", "error_type": "CommandError", "error_message": "/bin/bash: submit_patch: command not found\n", "details": {"stdout": "", "stderr": "/bin/bash: submit_patch: command not found\n", "exit_code": 127}} |
| 26 | submit_patch | {} | {"status": "ok", "patch_size": 8109, "files_changed": 7}full{"status": "ok", "patch_size": 8109, "files_changed": 7} |
diff --git a/fastapi/dependencies/utils.py b/fastapi/dependencies/utils.py
index 39d0bd89..dc951a70 100644
--- a/fastapi/dependencies/utils.py
+++ b/fastapi/dependencies/utils.py
@@ -18,6 +18,7 @@ from typing import (
import anyio
from fastapi import params
+from fastapi.exceptions import FastAPIDeprecationWarning
from fastapi._compat import (
ModelField,
RequiredParam,
@@ -327,7 +328,7 @@ def get_dependant(
warnings.warn(
"pydantic.v1 is deprecated and will soon stop being supported by FastAPI."
f" Please update the param {param_name}: {param_details.type_annotation!r}.",
- category=DeprecationWarning,
+ category=FastAPIDeprecationWarning,
stacklevel=5,
)
if isinstance(
diff --git a/fastapi/exceptions.py b/fastapi/exceptions.py
index 8e0c5590..8e943574 100644
--- a/fastapi/exceptions.py
+++ b/fastapi/exceptions.py
@@ -154,6 +154,12 @@ class FastAPIError(RuntimeError):
"""
+class FastAPIDeprecationWarning(DeprecationWarning):
+ """
+ A warning for deprecated FastAPI features.
+ """
+
+
class DependencyScopeError(FastAPIError):
"""
A dependency declared that it depends on another dependency with an invalid
diff --git a/fastapi/openapi/utils.py b/fastapi/openapi/utils.py
index a99d4188..ac389de3 100644
--- a/fastapi/openapi/utils.py
+++ b/fastapi/openapi/utils.py
@@ -5,6 +5,7 @@ from collections.abc import Sequence
from typing import Any, Optional, Union, cast
from fastapi import routing
+from fastapi.exceptions import FastAPIDeprecationWarning
from fastapi._compat import (
JsonSchemaValue,
ModelField,
@@ -217,7 +218,7 @@ def generate_operation_id(
warnings.warn(
"fastapi.openapi.utils.generate_operation_id() was deprecated, "
"it is not used internally, and will be removed soon",
- DeprecationWarning,
+ FastAPIDeprecationWarning,
stacklevel=2,
)
if route.operation_id:
diff --git a/fastapi/params.py b/fastapi/params.py
index c776c4a5..cc2934f4 100644
--- a/fastapi/params.py
+++ b/fastapi/params.py
@@ -4,6 +4,7 @@ from dataclasses import dataclass
from enum import Enum
from typing import Annotated, Any, Callable, Optional, Union
+from fastapi.exceptions import FastAPIDeprecationWarning
from fastapi.openapi.models import Example
from pydantic.fields import FieldInfo
from typing_extensions import Literal, deprecated
@@ -75,7 +76,7 @@ class Param(FieldInfo): # type: ignore[misc]
if example is not _Unset:
warnings.warn(
"`example` has been deprecated, please use `examples` instead",
- category=DeprecationWarning,
+ category=FastAPIDeprecationWarning,
stacklevel=4,
)
self.example = example
@@ -105,7 +106,7 @@ class Param(FieldInfo): # type: ignore[misc]
if regex is not None:
warnings.warn(
"`regex` has been deprecated, please use `pattern` instead",
- category=DeprecationWarning,
+ category=FastAPIDeprecationWarning,
stacklevel=4,
)
current_json_schema_extra = json_schema_extra or extra
@@ -530,7 +531,7 @@ class Body(FieldInfo): # type: ignore[misc]
if example is not _Unset:
warnings.warn(
"`example` has been deprecated, please use `examples` instead",
- category=DeprecationWarning,
+ category=FastAPIDeprecationWarning,
stacklevel=4,
)
self.example = example
@@ -560,7 +561,7 @@ class Body(FieldInfo): # type: ignore[misc]
if regex is not None:
warnings.warn(
"`regex` has been deprecated, please use `pattern` instead",
- category=DeprecationWarning,
+ category=FastAPIDeprecationWarning,
stacklevel=4,
)
current_json_schema_extra = json_schema_extra or extra
diff --git a/fastapi/routing.py b/fastapi/routing.py
index 2770e325..231c711b 100644
--- a/fastapi/routing.py
+++ b/fastapi/routing.py
@@ -23,6 +23,7 @@ from typing import (
from annotated_doc import Doc
from fastapi import params, temp_pydantic_v1_params
+from fastapi.exceptions import FastAPIDeprecationWarning
from fastapi._compat import (
ModelField,
Undefined,
@@ -640,7 +641,7 @@ class APIRoute(routing.Route):
warnings.warn(
"pydantic.v1 is deprecated and will soon stop being supported by FastAPI."
f" Please update the response model {self.response_model!r}.",
- category=DeprecationWarning,
+ category=FastAPIDeprecationWarning,
stacklevel=4,
)
self.response_field = create_model_field(
@@ -680,7 +681,7 @@ class APIRoute(routing.Route):
warnings.warn(
"pydantic.v1 is deprecated and will soon stop being supported by FastAPI."
f" In responses={{}}, please update {model}.",
- category=DeprecationWarning,
+ category=FastAPIDeprecationWarning,
stacklevel=4,
)
response_field = create_model_field(
diff --git a/fastapi/temp_pydantic_v1_params.py b/fastapi/temp_pydantic_v1_params.py
index 1bda0ea9..62230e42 100644
--- a/fastapi/temp_pydantic_v1_params.py
+++ b/fastapi/temp_pydantic_v1_params.py
@@ -1,6 +1,7 @@
import warnings
from typing import Annotated, Any, Callable, Optional, Union
+from fastapi.exceptions import FastAPIDeprecationWarning
from fastapi.openapi.models import Example
from fastapi.params import ParamTypes
from typing_extensions import deprecated
@@ -63,7 +64,7 @@ class Param(FieldInfo):
if example is not _Unset:
warnings.warn(
"`example` has been deprecated, please use `examples` instead",
- category=DeprecationWarning,
+ category=FastAPIDeprecationWarning,
stacklevel=4,
)
self.example = example
@@ -93,7 +94,7 @@ class Param(FieldInfo):
if regex is not None:
warnings.warn(
"`regex` has been deprecated, please use `pattern` instead",
- category=DeprecationWarning,
+ category=FastAPIDeprecationWarning,
stacklevel=4,
)
current_json_schema_extra = json_schema_extra or extra
@@ -503,7 +504,7 @@ class Body(FieldInfo):
if example is not _Unset:
warnings.warn(
"`example` has been deprecated, please use `examples` instead",
- category=DeprecationWarning,
+ category=FastAPIDeprecationWarning,
stacklevel=4,
)
self.example = example
@@ -533,7 +534,7 @@ class Body(FieldInfo):
if regex is not None:
warnings.warn(
"`regex` has been deprecated, please use `pattern` instead",
- category=DeprecationWarning,
+ category=FastAPIDeprecationWarning,
stacklevel=4,
)
current_json_schema_extra = json_schema_extra or extra
diff --git a/fastapi/utils.py b/fastapi/utils.py
index c4631d7e..a7c29fca 100644
--- a/fastapi/utils.py
+++ b/fastapi/utils.py
@@ -11,6 +11,7 @@ from typing import (
from weakref import WeakKeyDictionary
import fastapi
+from fastapi.exceptions import FastAPIDeprecationWarning
from fastapi._compat import (
BaseConfig,
ModelField,
@@ -197,7 +198,7 @@ def generate_operation_id_for_path(
warnings.warn(
"fastapi.utils.generate_operation_id_for_path() was deprecated, "
"it is not used internally, and will be removed soon",
- DeprecationWarning,
+ FastAPIDeprecationWarning,
stacklevel=2,
)
operation_id = f"{name}{path}"
........................................................................ [ 72%]
........................... [100%]
=============================== warnings summary ===============================
../../../../../../../Users/jp/repos/kaggle-gemini-coding-agent-post-training/.envs/overlays/starlette-0.50.0-py3-none-any/starlette/testclient.py:45
/Users/jp/repos/kaggle-gemini-coding-agent-post-training/.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
99 passed, 1 skipped, 1 warning in 0.94s