From c36c4bd3b8b577f186d2983f8a04beac434b80b9 Mon Sep 17 00:00:00 2001 From: Jack Jackson Date: Wed, 14 Feb 2024 22:43:25 -0800 Subject: [PATCH] Enable ruff, black, and pytest in pre-commit --- .github/workflows/lint-and-test.yaml | 9 ++++++-- DEVELOPMENT.md | 6 ++++++ app/routers/decks.py | 7 +++--- app/routers/games.py | 32 +++++++++++++++++----------- app/routers/players.py | 10 +++++---- app/sql/__init__.py | 1 + app/sql/models.py | 2 +- requirements-dev.txt | 10 +++++++++ requirements.txt | 7 ------ 9 files changed, 54 insertions(+), 30 deletions(-) create mode 100644 requirements-dev.txt diff --git a/.github/workflows/lint-and-test.yaml b/.github/workflows/lint-and-test.yaml index fa305d0..6ae9701 100644 --- a/.github/workflows/lint-and-test.yaml +++ b/.github/workflows/lint-and-test.yaml @@ -1,5 +1,8 @@ -name: 'Lint and Test' -on: push +# Shouldn't really be needed, what with the pre-commit setup (see `DEVELOPMENT.md`) - +# but, doesn't hurt! +name: 'Lint And Test' +on: + push: jobs: lint_and_test: @@ -12,5 +15,7 @@ jobs: python-version: '3.x' cache: 'pip' - run: 'python3 -m pip install -r requirements.txt' + - run: 'python3 -m pip install -r requirements-dev.txt' - run: 'ruff check .' + - run: 'black --check .' - run: 'pytest .' diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index 1c1ffa9..7800161 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -4,3 +4,9 @@ In increasing complexity: * `./basic-run.sh` - just raw-dog it * `docker compose up --build` + +# Pre-commit + +This repo uses [pre-commit](https://pre-commit.com/). Install the tool with `pip install pre-commit` (or just `pip install -r requirements-dev.txt`), then install the hooks with `pre-commit install` + +Not yet configured to run this in CI, as I'm the only contributor :P but I definitely should if I start getting contributions! diff --git a/app/routers/decks.py b/app/routers/decks.py index 6f33d10..dc5e196 100644 --- a/app/routers/decks.py +++ b/app/routers/decks.py @@ -10,15 +10,15 @@ from .players import list_players api_router = APIRouter(prefix="/deck", tags=["deck"]) html_router = APIRouter( - prefix="/deck", - include_in_schema=False, - default_response_class=HTMLResponse) + prefix="/deck", include_in_schema=False, default_response_class=HTMLResponse +) ######## # API Routes ######## + @api_router.post("/", response_model=schemas.Deck, status_code=201) def create_deck(deck: schemas.DeckCreate, db: Session = Depends(get_db)): db_player = crud.get_player_by_id(db, deck.owner_id) @@ -53,6 +53,7 @@ def delete_deck(deck_id: str, db=Depends(get_db)): # HTML Routes ######## + @html_router.get("/create") def deck_create_html(request: Request, db=Depends(get_db)): players = list_players(db=db) diff --git a/app/routers/games.py b/app/routers/games.py index 8268dee..c2990b5 100644 --- a/app/routers/games.py +++ b/app/routers/games.py @@ -11,14 +11,14 @@ from ..sql.database import get_db api_router = APIRouter(prefix="/game", tags=["game"]) html_router = APIRouter( - prefix="/game", - include_in_schema=False, - default_response_class=HTMLResponse) + prefix="/game", include_in_schema=False, default_response_class=HTMLResponse +) ######## # API Routes ######## + @api_router.post("/", response_model=schemas.Game, status_code=201) def create_game(game: schemas.GameCreate, db: Session = Depends(get_db)): return crud.create_game(db=db, game=game) @@ -46,23 +46,29 @@ def delete_game(game_id: str, db=Depends(get_db)): # HTML Routes ######## + @html_router.get("/create", response_class=HTMLResponse) def game_create_html(request: Request, db=Depends(get_db)): players = list_players(db=db) return jinja_templates.TemplateResponse( - request, "games/create.html", { + request, + "games/create.html", + { "players": players, # `json.dumps` is necessary because otherwise # the keys are surrounded with single-quotes, # on which JavaScript's `JSON.parse` will choke. - "player_decks": json.dumps({ - str(player.id): [{ - key: getattr(deck, key) - for key in ['id', 'name'] - } for deck in player.decks] - for player in players - }) - }) + "player_decks": json.dumps( + { + str(player.id): [ + {key: getattr(deck, key) for key in ["id", "name"]} + for deck in player.decks + ] + for player in players + } + ), + }, + ) # TODO - pagination @@ -80,4 +86,4 @@ def game_html(request: Request, game_id: str, db=Depends(get_db)): game_info = read_game(game_id, db) return jinja_templates.TemplateResponse( request, "games/detail.html", {"game": game_info} - ) \ No newline at end of file + ) diff --git a/app/routers/players.py b/app/routers/players.py index 2ccae8a..bbb915c 100644 --- a/app/routers/players.py +++ b/app/routers/players.py @@ -8,9 +8,8 @@ from ..sql.database import get_db api_router = APIRouter(prefix="/player", tags=["player"]) html_router = APIRouter( - prefix="/player", - include_in_schema=False, - default_response_class=HTMLResponse) + prefix="/player", include_in_schema=False, default_response_class=HTMLResponse +) ######## # API Routes @@ -44,15 +43,18 @@ def delete_player(player_id: str, db=Depends(get_db)): # HTML Routes ######## + @html_router.get("/create") def player_create_html(request: Request, db=Depends(get_db)): return jinja_templates.TemplateResponse(request, "players/create.html") + @html_router.get("/list", response_class=HTMLResponse) def player_list_html(request: Request, db=Depends(get_db)): players = list_players(db=db) return jinja_templates.TemplateResponse( - request, "players/list.html", {"players": players}) + request, "players/list.html", {"players": players} + ) # This must be after the static-path routes, lest it take priority over them diff --git a/app/sql/__init__.py b/app/sql/__init__.py index daef4e1..8d1d1d0 100644 --- a/app/sql/__init__.py +++ b/app/sql/__init__.py @@ -1,6 +1,7 @@ from . import models from .database import SessionLocal + def prime_database(): db = SessionLocal() win_types = db.query(models.WinType).all() diff --git a/app/sql/models.py b/app/sql/models.py index cb6c6e5..c854faa 100644 --- a/app/sql/models.py +++ b/app/sql/models.py @@ -25,7 +25,7 @@ class Deck(Base): class WinType(Base): - __tablename__ = 'wintypes' + __tablename__ = "wintypes" id = Column(Integer, primary_key=True) name = Column(String, nullable=False) diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..5dd96d4 --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1,10 @@ +# Meta tool for running pre-commits +pre-commit + +# Linting +ruff +black + +# Testing +httpx +pytest diff --git a/requirements.txt b/requirements.txt index c949438..0816db8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,10 +2,3 @@ fastapi uvicorn sqlalchemy Jinja2 - -# Linting -ruff - -# Testing -httpx -pytest