Skip to content

Commit 6996820

Browse files
committed
update packages
1 parent b8f017e commit 6996820

4 files changed

Lines changed: 317 additions & 313 deletions

File tree

‎CLAUDE.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,4 @@ Python is 3.14, dependencies managed by `uv`. Inside the container, raw commands
4040
- Routes live in `app/api/`, registered into a single `ROUTER` (prefix `/api`) referenced from `application.py`. Add a new resource by creating `app/api/<name>.py`, defining handlers + a `Router`, and adding it to `application.build_app`.
4141
- Pydantic schemas in `app/schemas.py` use `from_attributes=True` (via `Base`) so they validate directly from ORM instances (`schemas.X.model_validate(orm_instance)`).
4242
- Domain exceptions: register handlers in `application.build_app`'s `exception_handlers` dict (see `DuplicateKeyError` → `exceptions.duplicate_key_error_handler`). For per-handler 404s the code raises `litestar.exceptions.HTTPException` directly.
43-
- `ruff` is configured with `select = ["ALL"]` and a line length of 120 — expect strict lint. Type-check with `ty`; use `# ty: ignore[<rule>]` for suppressions (already used for `invalid-argument-type` around `LifespanManager` / `ASGITransport` / DTO list construction).
43+
- `ruff` is configured with `select = ["ALL"]` and a line length of 120 — expect strict lint. Type-check with `ty`; use `# ty: ignore[<rule>]` for suppressions (already used for `invalid-argument-type` around `LifespanManager` / `ASGITransport` / DTO list construction).

‎app/api/decks.py‎

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from advanced_alchemy.exceptions import NotFoundError
55
from litestar import status_codes
66
from litestar.exceptions import HTTPException
7+
from litestar.params import FromPath # noqa: TC002
78
from litestar.plugins.pydantic import PydanticDTO
89
from sqlalchemy import orm
910

@@ -13,12 +14,12 @@
1314

1415
@litestar.get("/decks/")
1516
async def list_decks(decks_repository: DecksRepository) -> schemas.Decks:
16-
objects = await decks_repository.list()
17+
objects = await decks_repository.get_many()
1718
return schemas.Decks(items=objects) # ty: ignore[invalid-argument-type]
1819

1920

2021
@litestar.get("/decks/{deck_id:int}/")
21-
async def get_deck(deck_id: int, decks_repository: DecksRepository) -> schemas.Deck:
22+
async def get_deck(deck_id: FromPath[int], decks_repository: DecksRepository) -> schemas.Deck:
2223
instance = await decks_repository.get_one_or_none(
2324
models.Deck.id == deck_id,
2425
load=[orm.selectinload(models.Deck.cards)],
@@ -31,7 +32,7 @@ async def get_deck(deck_id: int, decks_repository: DecksRepository) -> schemas.D
3132

3233
@litestar.put("/decks/{deck_id:int}/")
3334
async def update_deck(
34-
deck_id: int,
35+
deck_id: FromPath[int],
3536
data: schemas.DeckCreate,
3637
decks_repository: DecksRepository,
3738
) -> schemas.Deck:
@@ -49,13 +50,13 @@ async def create_deck(data: schemas.DeckCreate, decks_repository: DecksRepositor
4950

5051

5152
@litestar.get("/decks/{deck_id:int}/cards/")
52-
async def list_cards(deck_id: int, cards_repository: CardsRepository) -> schemas.Cards:
53-
objects = await cards_repository.list(models.Card.deck_id == deck_id)
53+
async def list_cards(deck_id: FromPath[int], cards_repository: CardsRepository) -> schemas.Cards:
54+
objects = await cards_repository.get_many(models.Card.deck_id == deck_id)
5455
return schemas.Cards(items=objects) # ty: ignore[invalid-argument-type]
5556

5657

5758
@litestar.get("/cards/{card_id:int}/", return_dto=PydanticDTO[schemas.Card])
58-
async def get_card(card_id: int, cards_repository: CardsRepository) -> schemas.Card:
59+
async def get_card(card_id: FromPath[int], cards_repository: CardsRepository) -> schemas.Card:
5960
instance = await cards_repository.get_one_or_none(models.Card.id == card_id)
6061
if not instance:
6162
raise HTTPException(status_code=status_codes.HTTP_404_NOT_FOUND, detail="Card is not found")
@@ -64,7 +65,7 @@ async def get_card(card_id: int, cards_repository: CardsRepository) -> schemas.C
6465

6566
@litestar.post("/decks/{deck_id:int}/cards/")
6667
async def create_cards(
67-
deck_id: int, data: list[schemas.CardCreate], cards_repository: CardsRepository
68+
deck_id: FromPath[int], data: list[schemas.CardCreate], cards_repository: CardsRepository
6869
) -> schemas.Cards:
6970
objects = await cards_repository.create_many(
7071
data=[models.Card(**card.model_dump(), deck_id=deck_id) for card in data],
@@ -73,7 +74,9 @@ async def create_cards(
7374

7475

7576
@litestar.put("/decks/{deck_id:int}/cards/")
76-
async def update_cards(deck_id: int, data: list[schemas.Card], cards_repository: CardsRepository) -> schemas.Cards:
77+
async def update_cards(
78+
deck_id: FromPath[int], data: list[schemas.Card], cards_repository: CardsRepository
79+
) -> schemas.Cards:
7780
objects = await cards_repository.upsert_many(
7881
data=[models.Card(**card.model_dump(exclude={"deck_id"}), deck_id=deck_id) for card in data],
7982
)

‎pyproject.toml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,4 @@ exclude_also = [
8585

8686
[tool.coverage.run]
8787
concurrency = ["thread", "greenlet"]
88+
disable_warnings = ["couldnt-parse"]

0 commit comments

Comments
 (0)