From 22aad42c0537be76b0af847668bb5dbb8ca3679e Mon Sep 17 00:00:00 2001 From: Zachary Deziel Date: Wed, 31 Jul 2024 10:17:00 -0700 Subject: [PATCH 1/6] Add pre-commit with ruff and mypy Fix errors and warning flagged by mypy around typing. --- .pre-commit-config.yaml | 15 +++++++++++++++ space2stats_api/app/routers/api.py | 16 ++++------------ space2stats_api/tests/test_api.py | 1 - space2stats_api/tests/test_h3_utils.py | 2 +- 4 files changed, 20 insertions(+), 14 deletions(-) create mode 100644 .pre-commit-config.yaml diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..299bf20 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,15 @@ +repos: + - repo: https://github.com/charliermarsh/ruff-pre-commit + rev: v0.5.5 + hooks: + - id: ruff + args: [--fix] + files: ^space2stats_api/ + + - repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.11.1 + hooks: + - id: mypy + args: [--ignore-missing-imports] + files: ^space2stats_api/ + exclude: ^space2stats/env/ \ No newline at end of file diff --git a/space2stats_api/app/routers/api.py b/space2stats_api/app/routers/api.py index 3935c87..9dabf67 100644 --- a/space2stats_api/app/routers/api.py +++ b/space2stats_api/app/routers/api.py @@ -1,7 +1,7 @@ -from typing import List, Dict, Any, Literal, Optional +from typing import List, Dict, Any, Literal, Optional, TypeAlias from fastapi import APIRouter -from pydantic import BaseModel, create_model +from pydantic import BaseModel from geojson_pydantic import Feature, Polygon from app.utils.h3_utils import generate_h3_ids, generate_h3_geometries @@ -10,22 +10,14 @@ router = APIRouter() -AOIModel = Feature[Polygon, Dict] +AOIModel: TypeAlias = Feature[Polygon, Dict] class SummaryRequest(BaseModel): aoi: AOIModel spatial_join_method: Literal["touches", "centroid", "within"] fields: List[str] - geometry: Optional[Literal["polygon", "point"]] = False - - -def create_response_model(fields: List[str]): - field_definitions = {field: (Any, ...) for field in fields} - field_definitions["hex_id"] = (str, ...) - if "geometry" in fields: - field_definitions["geometry"] = (Dict[str, Any], ...) - return create_model("DynamicSummaryResponse", **field_definitions) + geometry: Optional[Literal["polygon", "point"]] = None @router.post("/summary", response_model=List[Dict[str, Any]]) diff --git a/space2stats_api/tests/test_api.py b/space2stats_api/tests/test_api.py index 8eb42a2..649f12b 100644 --- a/space2stats_api/tests/test_api.py +++ b/space2stats_api/tests/test_api.py @@ -3,7 +3,6 @@ from unittest.mock import patch from app.main import app -from app.utils.h3_utils import generate_h3_geometries client = TestClient(app) diff --git a/space2stats_api/tests/test_h3_utils.py b/space2stats_api/tests/test_h3_utils.py index fd1d0da..8813581 100644 --- a/space2stats_api/tests/test_h3_utils.py +++ b/space2stats_api/tests/test_h3_utils.py @@ -1,5 +1,5 @@ import pytest -from shapely.geometry import Polygon, mapping, Point +from shapely.geometry import Polygon, mapping from app.utils.h3_utils import generate_h3_ids, generate_h3_geometries polygon_coords = [ From e4093baf7b454be537fac6265774495c7765d2f0 Mon Sep 17 00:00:00 2001 From: Zachary Deziel Date: Wed, 31 Jul 2024 10:40:56 -0700 Subject: [PATCH 2/6] Add pytest to pre-commit Required adding relative path handling to settings.py to manage running uvicorn/pytest from the space2stats_api directory but also support running pre-commit from the root. --- .pre-commit-config.yaml | 11 ++++++++++- space2stats_api/app/settings.py | 14 ++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 299bf20..6f926ef 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,4 +12,13 @@ repos: - id: mypy args: [--ignore-missing-imports] files: ^space2stats_api/ - exclude: ^space2stats/env/ \ No newline at end of file + exclude: ^space2stats/env/ + + - repo: local + hooks: + - id: pytest + name: Run pytest + entry: bash -c 'PYTHONPATH=space2stats_api python -m pytest space2stats_api' + language: system + pass_filenames: false + always_run: true \ No newline at end of file diff --git a/space2stats_api/app/settings.py b/space2stats_api/app/settings.py index 630898a..bbf4f2e 100644 --- a/space2stats_api/app/settings.py +++ b/space2stats_api/app/settings.py @@ -1,6 +1,16 @@ +import os + from pydantic_settings import BaseSettings, SettingsConfigDict +current_directory = os.getcwd() +env_file_name = 'local_db.env' + +if os.path.basename(current_directory) == "space2stats_api": + env_path = os.path.join(current_directory, env_file_name) +else: + env_path = os.path.join(current_directory, env_file_name) + class Settings(BaseSettings): DB_HOST: str DB_PORT: int @@ -8,8 +18,8 @@ class Settings(BaseSettings): DB_USER: str DB_PASSWORD: str DB_TABLE_NAME: str - - model_config = SettingsConfigDict(env_file="../local_db.env") + + model_config = SettingsConfigDict(env_file=env_path) settings = Settings() From f8461f5974a8d0310893fb42c26a7df6092b78f2 Mon Sep 17 00:00:00 2001 From: Zachary Deziel Date: Wed, 31 Jul 2024 10:57:35 -0700 Subject: [PATCH 3/6] Small typo fix in relative path --- space2stats_api/app/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/space2stats_api/app/settings.py b/space2stats_api/app/settings.py index bbf4f2e..a08cf13 100644 --- a/space2stats_api/app/settings.py +++ b/space2stats_api/app/settings.py @@ -7,7 +7,7 @@ env_file_name = 'local_db.env' if os.path.basename(current_directory) == "space2stats_api": - env_path = os.path.join(current_directory, env_file_name) + env_path = os.path.join(current_directory, '..', env_file_name) else: env_path = os.path.join(current_directory, env_file_name) From f9eeb586f3fe2c04b51197d43858b68b1f244e04 Mon Sep 17 00:00:00 2001 From: Zachary Deziel Date: Thu, 1 Aug 2024 07:45:49 -0700 Subject: [PATCH 4/6] Update from feedback on PR Remove execution of tests on pre-commit. Remove current directory check for setting path of env file. --- .pre-commit-config.yaml | 9 --------- space2stats_api/app/settings.py | 12 +----------- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 6f926ef..d8ad7b7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,12 +13,3 @@ repos: args: [--ignore-missing-imports] files: ^space2stats_api/ exclude: ^space2stats/env/ - - - repo: local - hooks: - - id: pytest - name: Run pytest - entry: bash -c 'PYTHONPATH=space2stats_api python -m pytest space2stats_api' - language: system - pass_filenames: false - always_run: true \ No newline at end of file diff --git a/space2stats_api/app/settings.py b/space2stats_api/app/settings.py index a08cf13..f8ecaf1 100644 --- a/space2stats_api/app/settings.py +++ b/space2stats_api/app/settings.py @@ -1,16 +1,6 @@ -import os - from pydantic_settings import BaseSettings, SettingsConfigDict -current_directory = os.getcwd() -env_file_name = 'local_db.env' - -if os.path.basename(current_directory) == "space2stats_api": - env_path = os.path.join(current_directory, '..', env_file_name) -else: - env_path = os.path.join(current_directory, env_file_name) - class Settings(BaseSettings): DB_HOST: str DB_PORT: int @@ -19,7 +9,7 @@ class Settings(BaseSettings): DB_PASSWORD: str DB_TABLE_NAME: str - model_config = SettingsConfigDict(env_file=env_path) + model_config = SettingsConfigDict(env_file='../db.env') settings = Settings() From e917cb06032e16ab05d025ce4eafee8817b9fd02 Mon Sep 17 00:00:00 2001 From: Zachary Deziel Date: Thu, 1 Aug 2024 07:51:50 -0700 Subject: [PATCH 5/6] Add pre-commit to CI --- .github/workflows/{test.yml => ci.yml} | 4 ++++ 1 file changed, 4 insertions(+) rename .github/workflows/{test.yml => ci.yml} (88%) diff --git a/.github/workflows/test.yml b/.github/workflows/ci.yml similarity index 88% rename from .github/workflows/test.yml rename to .github/workflows/ci.yml index 81d8e28..7687425 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/ci.yml @@ -27,9 +27,13 @@ jobs: run: | python -m pip install --upgrade pip pip install -r space2stats_api/requirements.txt + pip install pre-commit - name: Set PYTHONPATH run: echo "PYTHONPATH=$(pwd)/space2stats_api" >> $GITHUB_ENV + - name: Run pre-commit + run: pre-commit run --all-files + - name: Run tests run: pytest space2stats_api/tests \ No newline at end of file From 6cb33676624d286e55dfb277b99f8184b3edb7e2 Mon Sep 17 00:00:00 2001 From: Zachary Deziel Date: Thu, 1 Aug 2024 08:45:05 -0700 Subject: [PATCH 6/6] Move env file to space2stats_api directory --- space2stats_api/app/settings.py | 2 +- local_db.env => space2stats_api/local_db.env | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename local_db.env => space2stats_api/local_db.env (100%) diff --git a/space2stats_api/app/settings.py b/space2stats_api/app/settings.py index f8ecaf1..e6f48eb 100644 --- a/space2stats_api/app/settings.py +++ b/space2stats_api/app/settings.py @@ -9,7 +9,7 @@ class Settings(BaseSettings): DB_PASSWORD: str DB_TABLE_NAME: str - model_config = SettingsConfigDict(env_file='../db.env') + model_config = SettingsConfigDict(env_file='db.env') settings = Settings() diff --git a/local_db.env b/space2stats_api/local_db.env similarity index 100% rename from local_db.env rename to space2stats_api/local_db.env