943acbc573
Durcit la convention de nommage des projets (dérive constatée : 'Sliding Automation', 'code_versioning'... au lieu des formes canoniques). - trilium_api.py : projets_canoniques() lit le référentiel = valeurs du label projet sur les notes de type=projet (source unique, pas de constante en dur). Note-projet CodeVersioning créée (manquait). - mcp_server.py : _valider_projet() branché dans les 6 tools de création (add_decision/history/backlog, new_conversation, create_entite, add_skill). Refuse un projet non canonique (suggestion si faute) ou inconnu (renvoi au processus de création de projet). Ne verrouille pas si référentiel illisible. - lint_audit.py : VAL-nommage aligné sur le référentiel (attrape casse, espace ET snake_case ; l'ancien 'contient un espace' ratait code_versioning). - Données : 79 notes ré-étiquetées vers les 3 formes canoniques. Quality by design : l'erreur de nommage devient impossible à l'écriture, le Lint n'est plus que le filet de sécurité.
54 lines
1.5 KiB
Python
54 lines
1.5 KiB
Python
from __future__ import annotations
|
|
|
|
import collections
|
|
import collections.abc
|
|
import typing
|
|
from typing import Any
|
|
|
|
from pydantic_core import PydanticOmit, core_schema
|
|
|
|
SEQUENCE_ORIGIN_MAP: dict[Any, Any] = {
|
|
typing.Deque: collections.deque, # noqa: UP006
|
|
collections.deque: collections.deque,
|
|
list: list,
|
|
typing.List: list, # noqa: UP006
|
|
tuple: tuple,
|
|
typing.Tuple: tuple, # noqa: UP006
|
|
set: set,
|
|
typing.AbstractSet: set,
|
|
typing.Set: set, # noqa: UP006
|
|
frozenset: frozenset,
|
|
typing.FrozenSet: frozenset, # noqa: UP006
|
|
typing.Sequence: list,
|
|
typing.MutableSequence: list,
|
|
typing.MutableSet: set,
|
|
# this doesn't handle subclasses of these
|
|
# parametrized typing.Set creates one of these
|
|
collections.abc.MutableSet: set,
|
|
collections.abc.Set: frozenset,
|
|
}
|
|
|
|
|
|
def serialize_sequence_via_list(
|
|
v: Any, handler: core_schema.SerializerFunctionWrapHandler, info: core_schema.SerializationInfo
|
|
) -> Any:
|
|
items: list[Any] = []
|
|
|
|
mapped_origin = SEQUENCE_ORIGIN_MAP.get(type(v), None)
|
|
if mapped_origin is None:
|
|
# we shouldn't hit this branch, should probably add a serialization error or something
|
|
return v
|
|
|
|
for index, item in enumerate(v):
|
|
try:
|
|
v = handler(item, index)
|
|
except PydanticOmit: # noqa: PERF203
|
|
pass
|
|
else:
|
|
items.append(v)
|
|
|
|
if info.mode_is_json():
|
|
return items
|
|
else:
|
|
return mapped_origin(items)
|