Ruff-format

This commit is contained in:
Jack Jackson 2024-01-31 20:46:04 -08:00
parent 608df42388
commit 83d2fcb9d1
9 changed files with 51 additions and 50 deletions

View File

@ -6,27 +6,30 @@ from ..templates import jinja_templates, _jsonify
from ..sql import crud, schemas from ..sql import crud, schemas
from ..sql.database import get_db from ..sql.database import get_db
from .players import read_player, list_players from .players import list_players
api_router = APIRouter(prefix="/deck", tags=["deck"]) api_router = APIRouter(prefix="/deck", tags=["deck"])
html_router = APIRouter(prefix="/deck", include_in_schema=False) html_router = APIRouter(prefix="/deck", include_in_schema=False)
@api_router.post("/", response_model=schemas.Deck, status_code=201) @api_router.post("/", response_model=schemas.Deck, status_code=201)
def create_deck(deck: schemas.DeckCreate, db: Session = Depends(get_db)): def create_deck(deck: schemas.DeckCreate, db: Session = Depends(get_db)):
db_player = crud.get_player_by_id(db, deck.owner_id) db_player = crud.get_player_by_id(db, deck.owner_id)
if db_player is None: if db_player is None:
raise HTTPException(status_code=400, detail=f"Owner id {deck.owner_id} not found") raise HTTPException(
status_code=400, detail=f"Owner id {deck.owner_id} not found"
)
return crud.create_deck(db=db, deck=deck) return crud.create_deck(db=db, deck=deck)
@api_router.get("/list", response_model=list[schemas.Deck]) @api_router.get("/list", response_model=list[schemas.Deck])
def list_decks(skip: int = 0, limit: int = 100, db = Depends(get_db)): def list_decks(skip: int = 0, limit: int = 100, db=Depends(get_db)):
return crud.get_decks(db, skip=skip, limit=limit) return crud.get_decks(db, skip=skip, limit=limit)
@api_router.get("/{deck_id}", response_model=schemas.Deck) @api_router.get("/{deck_id}", response_model=schemas.Deck)
def read_deck(deck_id: int, db = Depends(get_db)): def read_deck(deck_id: int, db=Depends(get_db)):
print(deck_id) print(deck_id)
db_deck = crud.get_deck_by_id(db, deck_id) db_deck = crud.get_deck_by_id(db, deck_id)
if db_deck is None: if db_deck is None:
@ -35,44 +38,33 @@ def read_deck(deck_id: int, db = Depends(get_db)):
@api_router.delete("/{deck_id}", status_code=204) @api_router.delete("/{deck_id}", status_code=204)
def delete_deck(deck_id: str, db = Depends(get_db)): def delete_deck(deck_id: str, db=Depends(get_db)):
crud.delete_deck_by_id(db, int(deck_id)) crud.delete_deck_by_id(db, int(deck_id))
@html_router.get("/create", response_class=HTMLResponse) @html_router.get("/create", response_class=HTMLResponse)
def deck_create_html(request: Request, db = Depends(get_db)): def deck_create_html(request: Request, db=Depends(get_db)):
players = list_players(db=db) players = list_players(db=db)
return jinja_templates.TemplateResponse( return jinja_templates.TemplateResponse(
request, request, "decks/create.html", {"players": players}
"decks/create.html",
{
"players": players
}
) )
# TODO - pagination # TODO - pagination
@html_router.get("/list", response_class=HTMLResponse) @html_router.get("/list", response_class=HTMLResponse)
def decks_html(request: Request, db = Depends(get_db)): def decks_html(request: Request, db=Depends(get_db)):
decks = list_decks(db=db) decks = list_decks(db=db)
return jinja_templates.TemplateResponse( return jinja_templates.TemplateResponse(
request, request, "decks/list.html", {"decks": decks}
"decks/list.html",
{
"decks": decks
}
) )
# This must be after the static-path routes, lest it take priority over them # This must be after the static-path routes, lest it take priority over them
@html_router.get("/{deck_id}", response_class=HTMLResponse) @html_router.get("/{deck_id}", response_class=HTMLResponse)
def deck_html(request: Request, deck_id: str, db = Depends(get_db)): def deck_html(request: Request, deck_id: str, db=Depends(get_db)):
deck_info = read_deck(deck_id, db) deck_info = read_deck(deck_id, db)
return jinja_templates.TemplateResponse( return jinja_templates.TemplateResponse(
request, request,
"decks/detail.html", "decks/detail.html",
{ {"deck": _jsonify(deck_info), "owner": _jsonify(deck_info.owner)},
"deck": _jsonify(deck_info),
"owner": _jsonify(deck_info.owner)
}
) )

View File

@ -9,13 +9,14 @@ from ..sql.database import get_db
api_router = APIRouter(prefix="/player", tags=["player"]) api_router = APIRouter(prefix="/player", tags=["player"])
html_router = APIRouter(prefix="/player", include_in_schema=False) html_router = APIRouter(prefix="/player", include_in_schema=False)
@api_router.post("/", response_model=schemas.Player, status_code=201) @api_router.post("/", response_model=schemas.Player, status_code=201)
def create_player(player: schemas.PlayerCreate, db: Session = Depends(get_db)): def create_player(player: schemas.PlayerCreate, db: Session = Depends(get_db)):
return crud.create_player(db=db, player=player) return crud.create_player(db=db, player=player)
@api_router.get("/list", response_model=list[schemas.Player]) @api_router.get("/list", response_model=list[schemas.Player])
def list_players(skip: int = 0, limit: int = 100, db = Depends(get_db)): def list_players(skip: int = 0, limit: int = 100, db=Depends(get_db)):
return crud.get_players(db, skip=skip, limit=limit) return crud.get_players(db, skip=skip, limit=limit)
@ -31,26 +32,19 @@ def read_player(player_id: int, db=Depends(get_db)):
@api_router.delete("/{player_id}", status_code=204) @api_router.delete("/{player_id}", status_code=204)
def delete_player(player_id: str, db = Depends(get_db)): def delete_player(player_id: str, db=Depends(get_db)):
crud.delete_player_by_id(db, int(player_id)) crud.delete_player_by_id(db, int(player_id))
@html_router.get("/create", response_class=HTMLResponse) @html_router.get("/create", response_class=HTMLResponse)
def player_create_html(request: Request, db = Depends(get_db)): def player_create_html(request: Request, db=Depends(get_db)):
return jinja_templates.TemplateResponse( return jinja_templates.TemplateResponse(request, "players/create.html")
request,
"players/create.html"
)
# This must be after the static-path routes, lest it take priority over them # This must be after the static-path routes, lest it take priority over them
@html_router.get("/{player_id}", response_class=HTMLResponse) @html_router.get("/{player_id}", response_class=HTMLResponse)
def player_html(request: Request, player_id: str, db = Depends(get_db)): def player_html(request: Request, player_id: str, db=Depends(get_db)):
player_info = read_player(player_id, db) player_info = read_player(player_id, db)
return jinja_templates.TemplateResponse( return jinja_templates.TemplateResponse(
request, request, "players/detail.html", {"player": player_info}
"players/detail.html",
{
"player": player_info
}
) )

View File

@ -2,12 +2,15 @@ from sqlalchemy.orm import Session
from . import models, schemas from . import models, schemas
def get_player_by_id(db: Session, player_id: int): def get_player_by_id(db: Session, player_id: int):
return db.query(models.Player).filter(models.Player.id == player_id).first() return db.query(models.Player).filter(models.Player.id == player_id).first()
def get_players(db: Session, skip: int = 0, limit: int = 100): def get_players(db: Session, skip: int = 0, limit: int = 100):
return db.query(models.Player).offset(skip).limit(limit).all() return db.query(models.Player).offset(skip).limit(limit).all()
def create_player(db: Session, player: schemas.PlayerCreate): def create_player(db: Session, player: schemas.PlayerCreate):
db_player = models.Player(**player.model_dump()) db_player = models.Player(**player.model_dump())
db.add(db_player) db.add(db_player)
@ -15,16 +18,20 @@ def create_player(db: Session, player: schemas.PlayerCreate):
db.refresh(db_player) db.refresh(db_player)
return db_player return db_player
def delete_player_by_id(db: Session, player_id: int): def delete_player_by_id(db: Session, player_id: int):
db.query(models.Player).filter(models.Player.id == player_id).delete() db.query(models.Player).filter(models.Player.id == player_id).delete()
db.commit() db.commit()
def get_deck_by_id(db: Session, deck_id: int): def get_deck_by_id(db: Session, deck_id: int):
return db.query(models.Deck).filter(models.Deck.id == deck_id).first() return db.query(models.Deck).filter(models.Deck.id == deck_id).first()
def get_decks(db: Session, skip: int = 0, limit: int = 100): def get_decks(db: Session, skip: int = 0, limit: int = 100):
return db.query(models.Deck).offset(skip).limit(limit).all() return db.query(models.Deck).offset(skip).limit(limit).all()
def create_deck(db: Session, deck: schemas.DeckCreate): def create_deck(db: Session, deck: schemas.DeckCreate):
db_deck = models.Deck(**deck.model_dump()) db_deck = models.Deck(**deck.model_dump())
db.add(db_deck) db.add(db_deck)
@ -32,6 +39,7 @@ def create_deck(db: Session, deck: schemas.DeckCreate):
db.refresh(db_deck) db.refresh(db_deck)
return db_deck return db_deck
def delete_deck_by_id(db: Session, deck_id: int): def delete_deck_by_id(db: Session, deck_id: int):
db.query(models.Deck).filter(models.Deck.id == deck_id).delete() db.query(models.Deck).filter(models.Deck.id == deck_id).delete()
db.commit() db.commit()

View File

@ -3,7 +3,9 @@ import os
from sqlalchemy import create_engine from sqlalchemy import create_engine
from sqlalchemy.orm import declarative_base, sessionmaker from sqlalchemy.orm import declarative_base, sessionmaker
SQLALCHEMY_DATABASE_URL = os.environ.get('DATABASE_URL', "sqlite:///database/sql_app.db") SQLALCHEMY_DATABASE_URL = os.environ.get(
"DATABASE_URL", "sqlite:///database/sql_app.db"
)
engine = create_engine( engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
@ -12,6 +14,7 @@ SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base() Base = declarative_base()
def get_db(): def get_db():
db = SessionLocal() db = SessionLocal()
try: try:

View File

@ -3,6 +3,7 @@ from sqlalchemy.orm import relationship
from .database import Base from .database import Base
class Player(Base): class Player(Base):
__tablename__ = "players" __tablename__ = "players"
@ -11,6 +12,7 @@ class Player(Base):
decks = relationship("Deck", back_populates="owner") decks = relationship("Deck", back_populates="owner")
class Deck(Base): class Deck(Base):
__tablename__ = "decks" __tablename__ = "decks"

View File

@ -13,9 +13,7 @@ class PlayerCreate(PlayerBase):
class Player(PlayerBase): class Player(PlayerBase):
id: int id: int
model_config = { model_config = {"from_attributes": True}
'from_attributes': True
}
class DeckBase(BaseModel): class DeckBase(BaseModel):
@ -31,6 +29,4 @@ class DeckCreate(DeckBase):
class Deck(DeckBase): class Deck(DeckBase):
id: int id: int
model_config = { model_config = {"from_attributes": True}
'from_attributes': True
}

View File

@ -9,6 +9,7 @@ from fastapi.templating import Jinja2Templates
jinja_templates = Jinja2Templates(directory="app/templates") jinja_templates = Jinja2Templates(directory="app/templates")
# TODO - would this be better as a method on a class extending `db.Model` that the classes in `models.py` could then # TODO - would this be better as a method on a class extending `db.Model` that the classes in `models.py` could then
# extend? # extend?
# (Probably not, as we'd still need to explicitly call it - it wouldn't be implicitly called _by_ Flask) # (Probably not, as we'd still need to explicitly call it - it wouldn't be implicitly called _by_ Flask)

View File

@ -4,6 +4,7 @@ import pytest
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
def prime_database(): def prime_database():
# Start afresh! # Start afresh!
database_dir = "database" database_dir = "database"
@ -18,8 +19,9 @@ def prime_database():
if db_path.exists(): if db_path.exists():
db_path.unlink() db_path.unlink()
print(f'Setting database_url using {db_path}') print(f"Setting database_url using {db_path}")
os.environ['DATABASE_URL'] = f'sqlite:///{db_path}' os.environ["DATABASE_URL"] = f"sqlite:///{db_path}"
prime_database() prime_database()
@ -27,6 +29,7 @@ prime_database()
# during the import, and must do so after the environment-var setting # during the import, and must do so after the environment-var setting
from app import app # noqa: E402 from app import app # noqa: E402
@pytest.fixture() @pytest.fixture()
def test_client() -> TestClient: def test_client() -> TestClient:
return TestClient(app) return TestClient(app)

View File

@ -33,7 +33,7 @@ def test_add_and_retrieve_deck(test_client: TestClient):
test_client, "/deck", {"name": "Baby's First Deck", "owner_id": 1} test_client, "/deck", {"name": "Baby's First Deck", "owner_id": 1}
) )
assert invalid_owner_response.status_code == 400 assert invalid_owner_response.status_code == 400
assert invalid_owner_response.json()['detail'] == "Owner id 1 not found" assert invalid_owner_response.json()["detail"] == "Owner id 1 not found"
create_jim_response = _json_post(test_client, "/player", {"name": "jim"}) create_jim_response = _json_post(test_client, "/player", {"name": "jim"})
assert create_jim_response.status_code == 201 assert create_jim_response.status_code == 201
@ -60,12 +60,14 @@ def test_add_and_retrieve_deck(test_client: TestClient):
def _json_get(c: TestClient, path: str) -> httpx.Response: def _json_get(c: TestClient, path: str) -> httpx.Response:
return c.get(f'/api{path}', headers={"Content-Type": "application/json"}) return c.get(f"/api{path}", headers={"Content-Type": "application/json"})
def _json_post(c: TestClient, path: str, body: Mapping) -> httpx.Response: def _json_post(c: TestClient, path: str, body: Mapping) -> httpx.Response:
return c.post(f'/api{path}', headers={"Content-Type": "application/json"}, json=body) return c.post(
f"/api{path}", headers={"Content-Type": "application/json"}, json=body
)
def _json_delete(c: TestClient, path: str) -> httpx.Response: def _json_delete(c: TestClient, path: str) -> httpx.Response:
return c.delete(f'/api{path}', headers={"Content-Type": "application/json"}) return c.delete(f"/api{path}", headers={"Content-Type": "application/json"})