From faf4841016ca9bbdeea6613ab3e6fd9700993f4c Mon Sep 17 00:00:00 2001 From: Colin Goutte Date: Fri, 25 Aug 2023 15:02:42 +0200 Subject: [PATCH 1/3] GREEN: But this is really coding *against* the framework This is noe the proper way to do it. FastAPI define schemas to do such work. The 'name' parameter was not passed (but seemed to work on live) and i was looking for a database issue. There might have been some colisions on import However this show how to evolve from a mindset to another. --- crud.py | 27 +++++++++++++++++++++++++++ dev.py | 17 ++++++++++++++--- test_sql_database.py | 10 +++------- 3 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 crud.py diff --git a/crud.py b/crud.py new file mode 100644 index 0000000..e1b51d6 --- /dev/null +++ b/crud.py @@ -0,0 +1,27 @@ +from sqlalchemy.orm import Session + +import models + +# import schemas + + +def create_movie(db: Session, name: str = ""): + db_movie = models.Movie(name=name) + db.add(db_movie) + db.commit() + db.refresh(db_movie) + return db_movie + + +def get_movie_by_name(db: Session, name: str = ""): + db_movie = db.query(models.Movie).filter(models.Movie.name == name) + return db.movie.all() + + +def get_movie_by_id(db: Session, id_: str = ""): + try: + id_ = int(id_) + except ValueError: + pass + db_movie = db.query(models.Movie).filter(models.Movie.id == id_) + return db_movie.one() diff --git a/dev.py b/dev.py index 6cb807a..338a5e2 100644 --- a/dev.py +++ b/dev.py @@ -1,10 +1,10 @@ -from fastapi import FastAPI, Depends +from fastapi import FastAPI, Depends, Request from sqlalchemy.orm import Session import uvicorn from database import SessionLocal, engine import models - +import crud models.Base.metadata.create_all(bind=engine) @@ -26,8 +26,12 @@ async def root(): @app.post("/movies/") -async def create_movie(name: str = "", db: Session = Depends(get_db)): +async def create_movie( + name: str = "", db: Session = Depends(get_db), request: Request = None +): out = {} + data = await request.json() + name = name or data["name"] movie = models.Movie() movie.name = name db.add(movie) @@ -38,5 +42,12 @@ async def create_movie(name: str = "", db: Session = Depends(get_db)): return out +@app.get("/movies/{id_}") +async def get_movie(id_: str, db: Session = Depends(get_db)): + movie = crud.get_movie_by_id(db, id_) + out = {k: v for (k, v) in movie.__dict__.items() if not k.startswith("_")} + return out + + if __name__ == "__main__": uvicorn.run(app, host="127.0.0.1", port=5000) diff --git a/test_sql_database.py b/test_sql_database.py index b9526a0..a368476 100644 --- a/test_sql_database.py +++ b/test_sql_database.py @@ -7,6 +7,8 @@ from database import Base from dev import app, get_db from models import Movie +import pytest + SQLALCHEMY_DATABASE_URL = "sqlite://" engine = create_engine( @@ -41,12 +43,6 @@ def test_create_moviem_models(): assert movie.name == name -import pytest - -import pytest - - -@pytest.mark.xfail def test_create_movie_api(): import random @@ -55,5 +51,5 @@ def test_create_movie_api(): assert response.status_code == 200 movie_id = response.json()["id"] assert f"Created {name}" in response.json()["message"] - response = client.get("movie", movie_id) + response = client.get(f"/movies/{movie_id}") assert response.json()["name"] == name From 33ea9742b26c9c809a7a877c5cb16030cec228e0 Mon Sep 17 00:00:00 2001 From: Colin Goutte Date: Fri, 25 Aug 2023 15:11:51 +0200 Subject: [PATCH 2/3] Add directiv in normal makefile for venv --- Makefile | 7 +++++++ requirements.txt | 15 +++++++++++++++ requirements_dev.txt | 22 ++++++++++++++++++++++ test_sql_database.py | 1 - 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d2b2955..8912cc5 100644 --- a/Makefile +++ b/Makefile @@ -31,3 +31,10 @@ docs: cd docs && firefox ./_build/html/README.html ./_build/html/index.html & .PHONY: docs + +venv_install: + make -f MakefileVenv install_dev + + +venv_test: + make -f MakefileVenv test diff --git a/requirements.txt b/requirements.txt index e4f81fa..2c80ff2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,16 @@ -i https://pypi.org/simple +annotated-types==0.5.0 ; python_version >= '3.7' +anyio==3.7.1 ; python_version >= '3.7' +click==8.1.7 ; python_version >= '3.7' +fastapi==0.101.1 +greenlet==2.0.2 ; python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32'))))) +h11==0.14.0 ; python_version >= '3.7' +idna==3.4 ; python_version >= '3.5' +pydantic==2.3.0 ; python_version >= '3.7' +pydantic-core==2.6.3 ; python_version >= '3.7' +sniffio==1.3.0 ; python_version >= '3.7' +sqlalchemy==1.4.49 +starlette==0.27.0 ; python_version >= '3.7' +typing-extensions==4.7.1 ; python_version >= '3.7' +uvicorn==0.23.2 +wheel==0.41.2 diff --git a/requirements_dev.txt b/requirements_dev.txt index f9e31e3..8edcb73 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,5 +1,27 @@ -i https://pypi.org/simple +anyio==3.7.1 ; python_version >= '3.7' +attrs==23.1.0 ; python_version >= '3.7' +certifi==2023.7.22 ; python_version >= '3.6' +exceptiongroup==1.1.3 ; python_version >= '3.7' +fancycompleter==0.9.1 +h11==0.14.0 ; python_version >= '3.7' +httpcore==0.17.3 ; python_version >= '3.7' +httpx==0.24.1 +idna==3.4 ; python_version >= '3.5' iniconfig==2.0.0 ; python_version >= '3.7' +outcome==1.2.0 ; python_version >= '3.7' packaging==23.1 ; python_version >= '3.7' +pdbpp==0.10.3 pluggy==1.2.0 ; python_version >= '3.7' +pygments==2.16.1 ; python_version >= '3.7' +pyrepl==0.9.0 +pysocks==1.7.1 pytest==7.4.0 +selenium==4.11.2 +sniffio==1.3.0 ; python_version >= '3.7' +sortedcontainers==2.4.0 +trio==0.22.2 ; python_version >= '3.7' +trio-websocket==0.10.3 ; python_version >= '3.7' +urllib3[socks]==2.0.4 ; python_version >= '3.7' +wmctrl==0.4 +wsproto==1.2.0 ; python_full_version >= '3.7.0' diff --git a/test_sql_database.py b/test_sql_database.py index a368476..81a73a0 100644 --- a/test_sql_database.py +++ b/test_sql_database.py @@ -7,7 +7,6 @@ from database import Base from dev import app, get_db from models import Movie -import pytest SQLALCHEMY_DATABASE_URL = "sqlite://" From a64ab9189ee61c4b008118601e4fb99f3fc0e0c6 Mon Sep 17 00:00:00 2001 From: Colin Goutte Date: Fri, 25 Aug 2023 15:12:38 +0200 Subject: [PATCH 3/3] Add pdbpp for dev --- Pipfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Pipfile b/Pipfile index 6c46347..c0f4fc3 100644 --- a/Pipfile +++ b/Pipfile @@ -13,6 +13,7 @@ wheel = "*" pytest = "*" selenium = "*" httpx = "*" +pdbpp = "*" [requires] python_version = "3.11"