Pacchetto Windows: backend su SQLite locale e Python 3.13 su Windows #77

Closed
opened 2026-10-17 07:03:07 +00:00 by Adriano · 2 comments
Owner

ANALISI (passo 1, Opus 5.5) — piano A del pacchetto Windows (issue madre e contratto: piano C, stessa serie)
COSA: il backend deve girare su un file SQLite locale (PC singolo della fiera, nessun MySQL) e su Windows con Python 3.13.
PERCHÉ: setup Windows nativo offline deciso da Adriano il 17/10/2026; i test applicano già tutta la catena Alembic su SQLite (src/backend/tests/test_migrations.py).
FILE E MODIFICHE:

  1. src/backend/config.py — nuovo campo db_url: str | None = None (env DB_URL); database_url restituisce db_url se impostato, altrimenti la stringa mysql+asyncmy di oggi. Il controllo di produzione sul DB_PASSWORD di default si salta quando db_url inizia con "sqlite". upload_path accetta UPLOAD_DIR assoluto (Windows, con lettera di unità).
  2. src/backend/database.py — con SQLite: niente pool_size/max_overflow/pool_recycle; listener "connect" con PRAGMA foreign_keys=ON, journal_mode=WAL, busy_timeout=5000.
  3. src/backend/migrations/env.py — solo se upgrade head su un file SQLite nuovo non passa (render_as_batch per SQLite se un ALTER fallisce).
  4. Codice del backend che a runtime usa costrutti solo MySQL (oltre agli argomenti mysql_engine/mysql_charset, innocui): cercarli; correggere solo con un test rosso che lo dimostri.
    TEST:
  • src/backend/tests/test_sqlite_file.py (nuovo): DB_URL su file temporaneo, upgrade head da vuoto, poi l'app risponde 200 su /api/health e crea/legge un utente; foreign key attive (PRAGMA foreign_keys = 1); UPLOAD_DIR assoluto rispettato; senza DB_URL database_url resta mysql+asyncmy (nessuna regressione).
  • Suite completa su daitarn con Python 3.13: uv run --python 3.13 --extra server --extra client --extra dev pytest src/backend/tests src/frontend/flask_app/tests -q, numeri nel rapporto; i rossi solo-Windows del backend si correggono, gli altri si elencano.
    NON TOCCARE: pyproject.toml, uv.lock, packaging/, src/backend/services/report_service.py, scripts/, src/frontend/, src/vision*/, vendor/, Dockerfile*, docker-compose*.
ANALISI (passo 1, Opus 5.5) — piano A del pacchetto Windows (issue madre e contratto: piano C, stessa serie) COSA: il backend deve girare su un file SQLite locale (PC singolo della fiera, nessun MySQL) e su Windows con Python 3.13. PERCHÉ: setup Windows nativo offline deciso da Adriano il 17/10/2026; i test applicano già tutta la catena Alembic su SQLite (src/backend/tests/test_migrations.py). FILE E MODIFICHE: 1. src/backend/config.py — nuovo campo `db_url: str | None = None` (env DB_URL); `database_url` restituisce db_url se impostato, altrimenti la stringa mysql+asyncmy di oggi. Il controllo di produzione sul DB_PASSWORD di default si salta quando db_url inizia con "sqlite". `upload_path` accetta UPLOAD_DIR assoluto (Windows, con lettera di unità). 2. src/backend/database.py — con SQLite: niente pool_size/max_overflow/pool_recycle; listener "connect" con PRAGMA foreign_keys=ON, journal_mode=WAL, busy_timeout=5000. 3. src/backend/migrations/env.py — solo se upgrade head su un file SQLite nuovo non passa (render_as_batch per SQLite se un ALTER fallisce). 4. Codice del backend che a runtime usa costrutti solo MySQL (oltre agli argomenti mysql_engine/mysql_charset, innocui): cercarli; correggere solo con un test rosso che lo dimostri. TEST: - src/backend/tests/test_sqlite_file.py (nuovo): DB_URL su file temporaneo, upgrade head da vuoto, poi l'app risponde 200 su /api/health e crea/legge un utente; foreign key attive (PRAGMA foreign_keys = 1); UPLOAD_DIR assoluto rispettato; senza DB_URL database_url resta mysql+asyncmy (nessuna regressione). - Suite completa su daitarn con Python 3.13: `uv run --python 3.13 --extra server --extra client --extra dev pytest src/backend/tests src/frontend/flask_app/tests -q`, numeri nel rapporto; i rossi solo-Windows del backend si correggono, gli altri si elencano. NON TOCCARE: pyproject.toml, uv.lock, packaging/, src/backend/services/report_service.py, scripts/, src/frontend/, src/vision*/, vendor/, Dockerfile*, docker-compose*.
Adriano added the sviluppoassegnata:daitarn labels 2026-10-17 07:03:19 +00:00
Author
Owner

🔵 daitarn — preso in carico 2026-10-17T07:03:19Z
ramo: lavoro/daitarn · capacità: build-windows, gpu

🔵 daitarn — **preso in carico** 2026-10-17T07:03:19Z ramo: `lavoro/daitarn` · capacità: build-windows, gpu
Author
Owner

Soluzione

ESITO: fatto
COSA: backend su file SQLite (DB_URL) per il pacchetto Windows.
FILE: src/backend/config.py (db_url, database_url, upload_path assoluto, guardia produzione saltata con sqlite), src/backend/database.py (engine sqlite senza pool, PRAGMA foreign_keys/WAL/busy_timeout), src/backend/tests/test_sqlite_file.py (7 test).
COMMIT: 242add0 su lavoro/daitarn-tmf-sqlite, unito in V3.0.0 con 114e4a1 (V3.0.0 a 0e92959), tag v3.0.0-rc1.
PROVA: ramo integrato A+B+C su daitarn, Python 3.13: pytest test_sqlite_file + packaging/windows/tests -> verdi; suite backend+frontend -n 8 -> 886 passati, 8 rossi preesistenti (6 TieMeasureFlow#79, test_offline CRLF, test_recipe_rules_ui instabile sotto xdist: da solo 13/13). Exe installato: migrazioni su tmf.db e login ok (agente piano C).

**Soluzione** ESITO: fatto COSA: backend su file SQLite (DB_URL) per il pacchetto Windows. FILE: src/backend/config.py (db_url, database_url, upload_path assoluto, guardia produzione saltata con sqlite), src/backend/database.py (engine sqlite senza pool, PRAGMA foreign_keys/WAL/busy_timeout), src/backend/tests/test_sqlite_file.py (7 test). COMMIT: 242add0 su lavoro/daitarn-tmf-sqlite, unito in V3.0.0 con 114e4a1 (V3.0.0 a 0e92959), tag v3.0.0-rc1. PROVA: ramo integrato A+B+C su daitarn, Python 3.13: pytest test_sqlite_file + packaging/windows/tests -> verdi; suite backend+frontend -n 8 -> 886 passati, 8 rossi preesistenti (6 TieMeasureFlow#79, test_offline CRLF, test_recipe_rules_ui instabile sotto xdist: da solo 13/13). Exe installato: migrazioni su tmf.db e login ok (agente piano C).
Adriano removed the assegnata:daitarn label 2026-10-17 10:54:26 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Adriano/TieMeasureFlow#77