Ruff-format
This commit is contained in:
parent
608df42388
commit
83d2fcb9d1
@ -6,16 +6,19 @@ 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)
|
||||||
|
|
||||||
@ -43,11 +46,7 @@ def delete_deck(deck_id: str, db = Depends(get_db)):
|
|||||||
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
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -56,11 +55,7 @@ def deck_create_html(request: Request, db = Depends(get_db)):
|
|||||||
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
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@ -71,8 +66,5 @@ def deck_html(request: Request, deck_id: str, db = Depends(get_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)
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
@ -9,6 +9,7 @@ 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)
|
||||||
@ -37,10 +38,7 @@ def delete_player(player_id: str, db = Depends(get_db)):
|
|||||||
|
|
||||||
@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
|
||||||
@ -48,9 +46,5 @@ def player_create_html(request: Request, db = Depends(get_db)):
|
|||||||
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
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
@ -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()
|
||||||
|
@ -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:
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
}
|
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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"})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user