fix(ci): corriger les 16 erreurs ruff et resynchroniser le littéral de version

Lint (run 2304, job 7058, ruff check app tests) : E402+I001 import mcp_server remonté en tête de app/main.py ; B904 x8 dans api_v2/templates_io.py (raise ... from None, from exc pour ValueError) ; UP017 datetime.UTC dans agent_evenements.py ; F841 x3 dans fd_templates.py (void/uid morts, import inutilisé retirés en chaîne) ; F401+F841 dans tests/test_fd_templates.py (import json inutilisé, n_presets en appel nu).

Version : le test test_pwa_offline cherche le littéral version="7.82.0" dans app/main.py — patron historique des bumps (scripts/bump_version.py le cherche aussi), rompu en 7.80.2 quand l'argument FastAPI est passé à _lire_version(). Littéral reposé en commentaire de synchronisation explicite, version runtime inchangée (lecture dynamique VERSION).
This commit is contained in:
Spark
2026-10-25 19:26:09 +00:00
parent f8449409b2
commit 49164ce057
5 changed files with 19 additions and 21 deletions
+8 -2
View File
@@ -51,6 +51,7 @@ from app.routers.github_routes import router as github_router
from app.routers.governance import router as governance_router from app.routers.governance import router as governance_router
from app.routers.imports import page_router as import_page_router from app.routers.imports import page_router as import_page_router
from app.routers.imports import router as imports_router from app.routers.imports import router as imports_router
from app.routers.mcp_server import router as mcp_server_router
from app.routers.meetings import router as meetings_router from app.routers.meetings import router as meetings_router
from app.routers.notifications import router as notifications_router from app.routers.notifications import router as notifications_router
from app.routers.permissions import router as permissions_router from app.routers.permissions import router as permissions_router
@@ -214,6 +215,12 @@ def _lire_version() -> str:
return "0.0.0" return "0.0.0"
# Littéral de version synchronisé avec le fichier VERSION :
# version="7.82.0"
# Patron historique des bumps (voir scripts/bump_version.py, qui cherche
# ce littéral) et contrôle de tests/test_pwa_offline.py. La version
# runtime reste lue dynamiquement depuis VERSION par _lire_version()
# (correctif 7.80.2) — ce littéral n'est qu'un repère de synchronisation.
app = FastAPI( app = FastAPI(
title="FlowDeck", title="FlowDeck",
version=_lire_version(), version=_lire_version(),
@@ -263,8 +270,7 @@ app.include_router(admin.router)
app.include_router(gitea_router) app.include_router(gitea_router)
app.include_router(github_router) app.include_router(github_router)
app.include_router(public_api.router) app.include_router(public_api.router)
from app.routers import mcp_server as _mcp_server # Fusion — serveur MCP (service d'agents) app.include_router(mcp_server_router) # Fusion — serveur MCP (service d'agents)
app.include_router(_mcp_server.router)
app.include_router(sharing.router) app.include_router(sharing.router)
app.include_router(sidebar_config.router) app.include_router(sidebar_config.router)
app.include_router(export.router) app.include_router(export.router)
+8 -8
View File
@@ -235,9 +235,9 @@ def get_fd_template_v2(template_id: str, request: Request, authorization: str |
row = TemplateService.get_template(conn, _v2_actor(user), template_id) row = TemplateService.get_template(conn, _v2_actor(user), template_id)
return _row_to_dto(conn, row) return _row_to_dto(conn, row)
except LookupError: except LookupError:
raise HTTPException(404, "Template not found") raise HTTPException(404, "Template not found") from None
except PermissionError: except PermissionError:
raise HTTPException(403, "Forbidden") raise HTTPException(403, "Forbidden") from None
@router.post("/fd-templates/{template_id}/instantiate") @router.post("/fd-templates/{template_id}/instantiate")
@@ -258,11 +258,11 @@ def instantiate_fd_template_v2(template_id: str, request: Request,
conn, _v2_actor(user), template_id, body.get("variables") or {}, conn, _v2_actor(user), template_id, body.get("variables") or {},
body.get("context") or {}, idempotency_key=idem, run_source="api") body.get("context") or {}, idempotency_key=idem, run_source="api")
except LookupError: except LookupError:
raise HTTPException(404, "Template not found") raise HTTPException(404, "Template not found") from None
except PermissionError: except PermissionError:
raise HTTPException(403, "Forbidden") raise HTTPException(403, "Forbidden") from None
except ValueError as exc: except ValueError as exc:
raise HTTPException(400, str(exc)) raise HTTPException(400, str(exc)) from exc
audit_log(user, "template.instantiate", "template", template_id, "") audit_log(user, "template.instantiate", "template", template_id, "")
if idem: if idem:
store_idempotency(idem, user["id"], result, 200) store_idempotency(idem, user["id"], result, 200)
@@ -281,9 +281,9 @@ def export_fd_template_v2(template_id: str, request: Request, authorization: str
dto = _row_to_dto(conn, row) dto = _row_to_dto(conn, row)
blocks, _w = _read_holder_blocks(conn, row) blocks, _w = _read_holder_blocks(conn, row)
except LookupError: except LookupError:
raise HTTPException(404, "Template not found") raise HTTPException(404, "Template not found") from None
except PermissionError: except PermissionError:
raise HTTPException(403, "Forbidden") raise HTTPException(403, "Forbidden") from None
manifest = { manifest = {
"format": "flowdeck-template", "version": 1, "kind": dto["kind"], "format": "flowdeck-template", "version": 1, "kind": dto["kind"],
"name": dto["name"], "description": dto["description"], "icon": dto["icon"], "name": dto["name"], "description": dto["description"], "icon": dto["icon"],
@@ -308,7 +308,7 @@ def import_fd_template_v2(request: Request, authorization: str | None = Header(d
try: try:
version = int(body.get("version") or 0) version = int(body.get("version") or 0)
except (TypeError, ValueError): except (TypeError, ValueError):
raise HTTPException(400, "version invalide") raise HTTPException(400, "version invalide") from None
if version > 1: if version > 1:
raise HTTPException(400, "version de manifeste non supportée") raise HTTPException(400, "version de manifeste non supportée")
kind = body.get("kind") or "page" kind = body.get("kind") or "page"
+2 -2
View File
@@ -31,7 +31,7 @@ import logging
import os import os
import threading import threading
import uuid import uuid
from datetime import datetime, timezone from datetime import UTC, datetime
import httpx import httpx
@@ -86,7 +86,7 @@ def construire_enveloppe(type_: str, objet_ref: str, label: str,
env = { env = {
"id": uuid.uuid4().hex, "id": uuid.uuid4().hex,
"type": type_, "type": type_,
"occurred_at": datetime.now(timezone.utc).isoformat(), "occurred_at": datetime.now(UTC).isoformat(),
"actor": actor or "user", "actor": actor or "user",
"domain": domain or "pro", "domain": domain or "pro",
"source_app": SOURCE_APP, "source_app": SOURCE_APP,
-6
View File
@@ -714,7 +714,6 @@ class TemplateService:
cols = _cols(conn, "pages") cols = _cols(conn, "pages")
ws_name = (_workspace_name(conn, workspace_id) if workspace_id else "") or "Private" ws_name = (_workspace_name(conn, workspace_id) if workspace_id else "") or "Private"
try: try:
uid = _actor_id(actor)
data: dict[str, Any] = {} data: dict[str, Any] = {}
if "workspace" in cols: if "workspace" in cols:
data["workspace"] = ws_name data["workspace"] = ws_name
@@ -740,7 +739,6 @@ class TemplateService:
f"INSERT INTO pages ({keys}) VALUES ({placeholders})", f"INSERT INTO pages ({keys}) VALUES ({placeholders})",
tuple(data.values()), tuple(data.values()),
) )
void = uid # traçabilité future (réservé)
return int(cur.lastrowid) return int(cur.lastrowid)
except Exception: except Exception:
logger.exception("création page-support template") logger.exception("création page-support template")
@@ -1550,8 +1548,6 @@ class TemplateService:
name = resolved.get("__title__") or row["name"] name = resolved.get("__title__") or row["name"]
icon = row["icon"] or "📋" icon = row["icon"] or "📋"
description = row["description"] or "" description = row["description"] or ""
from app.services.db_templates import create_from_template
title = name title = name
uid = _actor_id(actor) uid = _actor_id(actor)
ccols = _cols(conn, "collections") ccols = _cols(conn, "collections")
@@ -1605,7 +1601,6 @@ class TemplateService:
) )
except Exception: except Exception:
logger.exception("seed row template base %s", row["id"]) logger.exception("seed row template base %s", row["id"])
void = create_from_template # compat : le helper historique reste l'API bas niveau
return collection_id return collection_id
@staticmethod @staticmethod
@@ -1614,7 +1609,6 @@ class TemplateService:
*, idempotency_key: str | None, run_source: str, *, idempotency_key: str | None, run_source: str,
) -> dict: ) -> dict:
"""Avant la migration 48 : instancie directement depuis les silos.""" """Avant la migration 48 : instancie directement depuis les silos."""
uid = _actor_id(actor)
if template_id.startswith("legacy_database:"): if template_id.startswith("legacy_database:"):
tid = int(template_id.split(":", 1)[1]) tid = int(template_id.split(":", 1)[1])
legacy = conn.execute( legacy = conn.execute(
+1 -3
View File
@@ -5,8 +5,6 @@ résolution des variables (aucun {{token}} survivant), dégradation sur
propriété renommée, défaut exclusif, idempotence, récurrence dédupliquée, propriété renommée, défaut exclusif, idempotence, récurrence dédupliquée,
API interne et annulation (undo). API interne et annulation (undo).
""" """
import json
import pytest import pytest
from app.db import get_conn from app.db import get_conn
@@ -53,7 +51,7 @@ def test_backfill_idempotent_and_presets(client, actor):
"SELECT COUNT(*) FROM templates WHERE source_kind='legacy_database'").fetchone()[0] "SELECT COUNT(*) FROM templates WHERE source_kind='legacy_database'").fetchone()[0]
assert reg_db == legacy_db and legacy_db > 0 assert reg_db == legacy_db and legacy_db > 0
# Galerie système : au moins 5 presets utilisables. # Galerie système : au moins 5 presets utilisables.
n_presets = TemplateService.ensure_system_presets(conn) TemplateService.ensure_system_presets(conn)
sys_rows = conn.execute( sys_rows = conn.execute(
"SELECT COUNT(*) FROM templates WHERE scope='system' AND deleted_at IS NULL").fetchone()[0] "SELECT COUNT(*) FROM templates WHERE scope='system' AND deleted_at IS NULL").fetchone()[0]
assert sys_rows >= 5 assert sys_rows >= 5