From 54137b88d73db3b1a9f6649e520aaaaeb917c11b Mon Sep 17 00:00:00 2001 From: zwitschi Date: Mon, 27 Oct 2025 18:39:20 +0100 Subject: [PATCH] feat: Enhance Python environment setup with system Python option and improve dependency installation refactor: Clean up imports in currencies and users routes fix: Update theme settings saving logic and clean up test imports --- .gitea/actions/setup-python-env/action.yml | 30 +++++++++++++++++----- .gitea/workflows/test.yml | 1 + routes/currencies.py | 2 +- routes/settings.py | 2 +- routes/users.py | 16 ++++++++---- scripts/backfill_currency.py | 7 +++-- scripts/seed_data.py | 3 +-- tests/unit/test_theme_settings.py | 7 ----- 8 files changed, 42 insertions(+), 26 deletions(-) diff --git a/.gitea/actions/setup-python-env/action.yml b/.gitea/actions/setup-python-env/action.yml index 0658ec0..d824b84 100644 --- a/.gitea/actions/setup-python-env/action.yml +++ b/.gitea/actions/setup-python-env/action.yml @@ -5,30 +5,48 @@ inputs: python-version: description: Python version to install. required: false - default: "3.10" + default: '3.10' + use-system-python: + description: Skip setup-python and rely on the system Python already available in the environment. + required: false + default: 'false' install-playwright: description: Install Playwright browsers when true. required: false - default: "false" + default: 'false' install-requirements: description: Space-delimited list of requirement files to install. required: false - default: "requirements.txt requirements-test.txt" + default: 'requirements.txt requirements-test.txt' run-db-setup: description: Run database wait and setup scripts when true. required: false - default: "true" + default: 'true' db-dry-run: description: Execute setup script dry run before live run when true. required: false - default: "true" + default: 'true' runs: using: composite steps: - name: Set up Python + if: ${{ inputs.use-system-python != 'true' }} uses: actions/setup-python@v5 with: python-version: ${{ inputs.python-version }} + + - name: Verify system Python + if: ${{ inputs.use-system-python == 'true' }} + shell: bash + run: | + set -euo pipefail + if ! command -v python >/dev/null 2>&1; then + echo "Python executable not found on PATH" >&2 + exit 1 + fi + python --version + python -m pip --version >/dev/null 2>&1 || python -m ensurepip --upgrade + python -m pip --version - name: Configure apt proxy shell: bash run: | @@ -59,7 +77,7 @@ runs: if [ -n "${requirements}" ]; then for requirement in ${requirements}; do if [ -f "${requirement}" ]; then - pip install -r "${requirement}" + python -m pip install -r "${requirement}" else echo "Requirement file ${requirement} not found" >&2 exit 1 diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index 974ead1..78f56f2 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -58,6 +58,7 @@ jobs: uses: ./.gitea/actions/setup-python-env with: install-playwright: ${{ matrix.target != 'e2e' }} + use-system-python: 'true' - name: Run tests run: | diff --git a/routes/currencies.py b/routes/currencies.py index 642bb11..8899366 100644 --- a/routes/currencies.py +++ b/routes/currencies.py @@ -1,4 +1,4 @@ -from typing import Dict, List, Optional +from typing import List, Optional from fastapi import APIRouter, Depends, HTTPException, Query, status from pydantic import BaseModel, ConfigDict, Field, field_validator diff --git a/routes/settings.py b/routes/settings.py index 2308d7b..ed06fb5 100644 --- a/routes/settings.py +++ b/routes/settings.py @@ -101,7 +101,7 @@ class ThemeSettings(BaseModel): @router.post("/theme") async def update_theme(theme_data: ThemeSettings, db: Session = Depends(get_db)): data_dict = theme_data.model_dump() - saved = save_theme_settings(db, data_dict) + save_theme_settings(db, data_dict) return {"message": "Theme updated", "theme": data_dict} diff --git a/routes/users.py b/routes/users.py index d538292..5de7092 100644 --- a/routes/users.py +++ b/routes/users.py @@ -3,9 +3,15 @@ from sqlalchemy.orm import Session from config.database import get_db from models.user import User -from services.security import get_password_hash, verify_password, create_access_token, SECRET_KEY, ALGORITHM, get_current_user, oauth2_scheme -from jose import jwt, JWTError -from schemas.user import UserCreate, UserInDB, UserLogin, UserUpdate, PasswordResetRequest, PasswordReset, Token +from services.security import create_access_token, get_current_user +from schemas.user import ( + PasswordReset, + PasswordResetRequest, + UserCreate, + UserInDB, + UserLogin, + UserUpdate, +) router = APIRouter(prefix="/users", tags=["users"]) @@ -62,7 +68,7 @@ async def update_user_me(user_update: UserUpdate, current_user: User = Depends(g if existing_user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Username already taken") - current_user.username = user_update.username + setattr(current_user, "username", user_update.username) if user_update.email and user_update.email != current_user.email: existing_user = db.query(User).filter( @@ -70,7 +76,7 @@ async def update_user_me(user_update: UserUpdate, current_user: User = Depends(g if existing_user: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="Email already registered") - current_user.email = user_update.email + setattr(current_user, "email", user_update.email) if user_update.password: current_user.set_password(user_update.password) diff --git a/scripts/backfill_currency.py b/scripts/backfill_currency.py index c56d6af..4651021 100644 --- a/scripts/backfill_currency.py +++ b/scripts/backfill_currency.py @@ -43,15 +43,14 @@ def backfill( engine = create_engine(db_url) with engine.begin() as conn: # Ensure currency table exists - res = ( + if db_url.startswith("sqlite:"): conn.execute( text( "SELECT name FROM sqlite_master WHERE type='table' AND name='currency';" ) ) - if db_url.startswith("sqlite:") - else conn.execute(text("SELECT to_regclass('public.currency');")) - ) + else: + conn.execute(text("SELECT to_regclass('public.currency');")) # Note: we don't strictly depend on the above - we assume migration was already applied # Helper: find or create currency by code diff --git a/scripts/seed_data.py b/scripts/seed_data.py index 4db4c1c..b762d04 100644 --- a/scripts/seed_data.py +++ b/scripts/seed_data.py @@ -16,8 +16,7 @@ from __future__ import annotations import argparse import logging -import os -from typing import Iterable, Optional +from typing import Optional import psycopg2 from psycopg2 import errors diff --git a/tests/unit/test_theme_settings.py b/tests/unit/test_theme_settings.py index c1e79ba..e24f7ec 100644 --- a/tests/unit/test_theme_settings.py +++ b/tests/unit/test_theme_settings.py @@ -1,15 +1,8 @@ -import pytest from sqlalchemy.orm import Session -from fastapi.testclient import TestClient -from main import app -from models.theme_setting import ThemeSetting from services.settings import save_theme_settings, get_theme_settings -client = TestClient(app) - - def test_save_theme_settings(db_session: Session): theme_data = { "theme_name": "dark",