mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-29 05:15:12 +00:00

Co-authored-by: Charlie Marsh <charlie.r.marsh@gmail.com> Co-authored-by: Micha Reiser <micha@reiser.io>
180 lines
4.2 KiB
Python
180 lines
4.2 KiB
Python
from typing import Annotated
|
|
|
|
from fastapi import Depends, FastAPI, Path
|
|
|
|
app = FastAPI()
|
|
|
|
|
|
# Errors
|
|
@app.get("/things/{thing_id}")
|
|
async def read_thing(query: str):
|
|
return {"query": query}
|
|
|
|
|
|
@app.get("/books/isbn-{isbn}")
|
|
async def read_thing():
|
|
...
|
|
|
|
|
|
@app.get("/things/{thing_id:path}")
|
|
async def read_thing(query: str):
|
|
return {"query": query}
|
|
|
|
|
|
@app.get("/things/{thing_id : path}")
|
|
async def read_thing(query: str):
|
|
return {"query": query}
|
|
|
|
|
|
@app.get("/books/{author}/{title}")
|
|
async def read_thing(author: str):
|
|
return {"author": author}
|
|
|
|
|
|
@app.get("/books/{author_name}/{title}")
|
|
async def read_thing():
|
|
...
|
|
|
|
|
|
@app.get("/books/{author}/{title}")
|
|
async def read_thing(author: str, title: str, /):
|
|
return {"author": author, "title": title}
|
|
|
|
|
|
@app.get("/books/{author}/{title}/{page}")
|
|
async def read_thing(
|
|
author: str,
|
|
query: str,
|
|
): ...
|
|
|
|
|
|
@app.get("/books/{author}/{title}")
|
|
async def read_thing():
|
|
...
|
|
|
|
|
|
@app.get("/books/{author}/{title}")
|
|
async def read_thing(*, author: str):
|
|
...
|
|
|
|
|
|
@app.get("/books/{author}/{title}")
|
|
async def read_thing(hello, /, *, author: str):
|
|
...
|
|
|
|
|
|
@app.get("/things/{thing_id}")
|
|
async def read_thing(
|
|
query: str,
|
|
):
|
|
return {"query": query}
|
|
|
|
|
|
@app.get("/things/{thing_id}")
|
|
async def read_thing(
|
|
query: str = "default",
|
|
):
|
|
return {"query": query}
|
|
|
|
|
|
@app.get("/things/{thing_id}")
|
|
async def read_thing(
|
|
*, query: str = "default",
|
|
):
|
|
return {"query": query}
|
|
|
|
|
|
@app.get("/books/{name}/{title}")
|
|
async def read_thing(*, author: Annotated[str, Path(alias="author_name")], title: str):
|
|
return {"author": author, "title": title}
|
|
|
|
|
|
# OK
|
|
@app.get("/things/{thing_id}")
|
|
async def read_thing(thing_id: int, query: str):
|
|
return {"thing_id": thing_id, "query": query}
|
|
|
|
|
|
@app.get("/books/isbn-{isbn}")
|
|
async def read_thing(isbn: str):
|
|
return {"isbn": isbn}
|
|
|
|
|
|
@app.get("/things/{thing_id:path}")
|
|
async def read_thing(thing_id: str, query: str):
|
|
return {"thing_id": thing_id, "query": query}
|
|
|
|
|
|
@app.get("/things/{thing_id : path}")
|
|
async def read_thing(thing_id: str, query: str):
|
|
return {"thing_id": thing_id, "query": query}
|
|
|
|
|
|
@app.get("/books/{author}/{title}")
|
|
async def read_thing(author: str, title: str):
|
|
return {"author": author, "title": title}
|
|
|
|
|
|
@app.get("/books/{author}/{title}")
|
|
async def read_thing(*, author: str, title: str):
|
|
return {"author": author, "title": title}
|
|
|
|
|
|
@app.get("/books/{author}/{title:path}")
|
|
async def read_thing(*, author: str, title: str):
|
|
return {"author": author, "title": title}
|
|
|
|
|
|
@app.get("/books/{name}/{title}")
|
|
async def read_thing(*, author: Annotated[str, Path(alias="name")], title: str):
|
|
return {"author": author, "title": title}
|
|
|
|
|
|
# Ignored
|
|
@app.get("/things/{thing-id}")
|
|
async def read_thing(query: str):
|
|
return {"query": query}
|
|
|
|
|
|
@app.get("/things/{thing_id!r}")
|
|
async def read_thing(query: str):
|
|
return {"query": query}
|
|
|
|
|
|
@app.get("/things/{thing_id=}")
|
|
async def read_thing(query: str):
|
|
return {"query": query}
|
|
|
|
|
|
# https://github.com/astral-sh/ruff/issues/13657
|
|
def takes_thing_id(thing_id): ...
|
|
def something_else(lorem): ...
|
|
|
|
from foo import unknown_imported
|
|
unknown_not_function = unknown_imported()
|
|
|
|
|
|
### Errors
|
|
@app.get("/things/{thing_id}")
|
|
async def single(other: Annotated[str, Depends(something_else)]): ...
|
|
@app.get("/things/{thing_id}")
|
|
async def default(other: str = Depends(something_else)): ...
|
|
|
|
|
|
### No errors
|
|
# A parameter with multiple `Depends()` has undefined behaviour.
|
|
# https://github.com/astral-sh/ruff/pull/15364#discussion_r1912551710
|
|
@app.get("/things/{thing_id}")
|
|
async def single(other: Annotated[str, Depends(takes_thing_id)]): ...
|
|
@app.get("/things/{thing_id}")
|
|
async def double(other: Annotated[str, Depends(something_else), Depends(takes_thing_id)]): ...
|
|
@app.get("/things/{thing_id}")
|
|
async def double(other: Annotated[str, Depends(takes_thing_id), Depends(something_else)]): ...
|
|
@app.get("/things/{thing_id}")
|
|
async def default(other: str = Depends(takes_thing_id)): ...
|
|
@app.get("/things/{thing_id}")
|
|
async def unknown_1(other: str = Depends(unknown_unresolved)): ...
|
|
@app.get("/things/{thing_id}")
|
|
async def unknown_2(other: str = Depends(unknown_not_function)): ...
|
|
@app.get("/things/{thing_id}")
|
|
async def unknown_3(other: str = Depends(unknown_imported)): ...
|