auto-sync: tudo-para-ia-mais-humana 2026-05-02 06:19:15
This commit is contained in:
171
tools/generate_canonical_identity_registry.py
Normal file
171
tools/generate_canonical_identity_registry.py
Normal file
@@ -0,0 +1,171 @@
|
||||
"""Generate the canonical identity registry for Mais Humana.
|
||||
|
||||
The output is importable Python source. It lets tests, CLI commands, MCP
|
||||
providers, and central reports validate aliases without rescanning the
|
||||
workspace or parsing Markdown during runtime.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
from typing import Iterable
|
||||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
SRC = ROOT / "src"
|
||||
OUTPUT = SRC / "mais_humana" / "generated_canonical_identity_registry.py"
|
||||
|
||||
|
||||
def ensure_import_path() -> None:
|
||||
import sys
|
||||
|
||||
src = str(SRC)
|
||||
if src not in sys.path:
|
||||
sys.path.insert(0, src)
|
||||
|
||||
|
||||
def q(value: object) -> str:
|
||||
return repr(str(value))
|
||||
|
||||
|
||||
def bool_literal(value: bool) -> str:
|
||||
return "True" if value else "False"
|
||||
|
||||
|
||||
def tuple_literal(values: Iterable[object], *, indent: int = 8) -> str:
|
||||
cleaned = [str(value) for value in values if str(value).strip()]
|
||||
if not cleaned:
|
||||
return "()"
|
||||
if len(cleaned) <= 8:
|
||||
return "(" + ", ".join(q(value) for value in cleaned) + ("," if len(cleaned) == 1 else "") + ")"
|
||||
pad = " " * indent
|
||||
lines = ["("]
|
||||
for value in cleaned:
|
||||
lines.append(f"{pad}{q(value)},")
|
||||
lines.append(" " * (indent - 4) + ")")
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def alias_block(alias: object, *, indent: int = 12) -> str:
|
||||
return "\n".join(
|
||||
[
|
||||
" " * indent + "CanonicalAlias(",
|
||||
" " * (indent + 4) + f"identifier={q(getattr(alias, 'identifier'))},",
|
||||
" " * (indent + 4) + f"kind=CanonicalAliasKind.{getattr(alias, 'kind').name},",
|
||||
" " * (indent + 4) + f"accepted={bool_literal(getattr(alias, 'accepted'))},",
|
||||
" " * (indent + 4) + f"canonical={bool_literal(getattr(alias, 'canonical'))},",
|
||||
" " * (indent + 4) + f"reason={q(getattr(alias, 'reason'))},",
|
||||
" " * (indent + 4) + f"required_action={q(getattr(alias, 'required_action'))},",
|
||||
" " * indent + "),",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def record_block(record: object) -> str:
|
||||
alias_lines = [" aliases=("]
|
||||
alias_lines.extend(alias_block(alias, indent=12) for alias in getattr(record, "aliases"))
|
||||
alias_lines.append(" ),")
|
||||
return "\n".join(
|
||||
[
|
||||
" CanonicalIdentityRecord(",
|
||||
f" platform_id={q(getattr(record, 'platform_id'))},",
|
||||
f" canonical_project_id={q(getattr(record, 'canonical_project_id'))},",
|
||||
f" current_project_id={q(getattr(record, 'current_project_id'))},",
|
||||
f" central_folder={q(getattr(record, 'central_folder'))},",
|
||||
f" gitea_repo={q(getattr(record, 'gitea_repo'))},",
|
||||
f" expected_remote_url={q(getattr(record, 'expected_remote_url'))},",
|
||||
f" owner_platform_id={q(getattr(record, 'owner_platform_id'))},",
|
||||
*alias_lines,
|
||||
f" decision_status={q(getattr(record, 'decision_status'))},",
|
||||
f" decision_source={q(getattr(record, 'decision_source'))},",
|
||||
f" compatibility_rule={q(getattr(record, 'compatibility_rule'))},",
|
||||
f" migration_safe_now={bool_literal(getattr(record, 'migration_safe_now'))},",
|
||||
f" notes={tuple_literal(getattr(record, 'notes'), indent=12)},",
|
||||
" ),",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def case_block(case: object) -> str:
|
||||
return "\n".join(
|
||||
[
|
||||
" CanonicalIdentityAcceptanceCase(",
|
||||
f" case_id={q(getattr(case, 'case_id'))},",
|
||||
f" platform_id={q(getattr(case, 'platform_id'))},",
|
||||
f" operation={q(getattr(case, 'operation'))},",
|
||||
f" permission_scope={q(getattr(case, 'permission_scope'))},",
|
||||
f" field_name={q(getattr(case, 'field_name'))},",
|
||||
f" candidate_value={q(getattr(case, 'candidate_value'))},",
|
||||
f" canonical_project_id={q(getattr(case, 'canonical_project_id'))},",
|
||||
f" accepted={bool_literal(getattr(case, 'accepted'))},",
|
||||
f" status={q(getattr(case, 'status'))},",
|
||||
f" decision_reason={q(getattr(case, 'decision_reason'))},",
|
||||
f" required_action={q(getattr(case, 'required_action'))},",
|
||||
f" mcp_transit_required={bool_literal(getattr(case, 'mcp_transit_required'))},",
|
||||
f" direct_platform_bypass_blocked={bool_literal(getattr(case, 'direct_platform_bypass_blocked'))},",
|
||||
" ),",
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
def main() -> int:
|
||||
ensure_import_path()
|
||||
from mais_humana.canonical_identity import build_acceptance_cases, build_identity_records
|
||||
|
||||
records = build_identity_records()
|
||||
cases = build_acceptance_cases(records)
|
||||
lines = [
|
||||
'"""Generated canonical identity registry for Mais Humana.',
|
||||
"",
|
||||
"Do not edit this file by hand. Regenerate it with:",
|
||||
"",
|
||||
" python tools/generate_canonical_identity_registry.py",
|
||||
"",
|
||||
"The registry is source code so it can be imported, tested, packaged,",
|
||||
"hashed, and exposed through MCP without parsing Markdown at runtime.",
|
||||
'"""',
|
||||
"",
|
||||
"from __future__ import annotations",
|
||||
"",
|
||||
"from .canonical_identity import (",
|
||||
" CanonicalAlias,",
|
||||
" CanonicalAliasKind,",
|
||||
" CanonicalIdentityAcceptanceCase,",
|
||||
" CanonicalIdentityRecord,",
|
||||
")",
|
||||
"",
|
||||
f"GENERATED_RECORDS_COUNT = {len(records)}",
|
||||
f"GENERATED_ACCEPTANCE_CASES_COUNT = {len(cases)}",
|
||||
"",
|
||||
"RECORDS = (",
|
||||
]
|
||||
lines.extend(record_block(record) for record in records)
|
||||
lines.extend(
|
||||
[
|
||||
")",
|
||||
"",
|
||||
"ACCEPTANCE_CASES = (",
|
||||
]
|
||||
)
|
||||
lines.extend(case_block(case) for case in cases)
|
||||
lines.extend(
|
||||
[
|
||||
")",
|
||||
"",
|
||||
"",
|
||||
"def iter_records():",
|
||||
" return RECORDS",
|
||||
"",
|
||||
"",
|
||||
"def iter_acceptance_cases():",
|
||||
" return ACCEPTANCE_CASES",
|
||||
"",
|
||||
]
|
||||
)
|
||||
OUTPUT.write_text("\n".join(lines), encoding="utf-8")
|
||||
print(f"generated {OUTPUT} records={len(records)} cases={len(cases)} lines={len(lines)}")
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
Reference in New Issue
Block a user