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:
+8
-2
@@ -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)
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user