From 541783495023cf17b9d55b9b7f8e7c8059528974 Mon Sep 17 00:00:00 2001 From: Egutierrez Date: Mon, 4 May 2026 14:24:54 +0200 Subject: [PATCH] feat(0035e): gx-cli group visual espejea visual heredado del Group Subcomando que ejecuta SELECT DISTINCT type_ref FROM entities WHERE group_id = ? AND type_ref != 'Group' (mismo SQL que el lado C++ de apply_group_inherited_visuals). Devuelve homogeneous bool, child_types ordenado y inherited (tipo unico o 'Group' generico). Permite a los tests pytest validar el contrato sin ejecutar el binario. --- gx-cli | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/gx-cli b/gx-cli index 7fcb6a6..6855f12 100755 --- a/gx-cli +++ b/gx-cli @@ -570,6 +570,39 @@ def cmd_table_page(args) -> None: # group ops (issue 0036b) — espejo Python del loader C++ kind=Group # ---------------------------------------------------------------------------- +def cmd_group_visual(args) -> None: + """Resuelve la iconografia heredada de un Group (issue 0035e). + + Mira los `type_ref` distintos de los hijos de `container_id` + (entities con group_id=container_id, excluyendo subgrupos). Si todos + comparten un solo tipo, devuelve `inherited: `. Si la familia + es heterogenea (>1 tipos distintos) o vacia, devuelve + `inherited: 'Group'` (visual generico). + + Espejea la query SQL del lado C++ (`apply_group_inherited_visuals` + en data.cpp) para que los tests pytest verifiquen el contrato sin + el binario. La forma sigue siendo siempre 'square'. + """ + cn = _connect(_ops_db(), readonly=True) + cur = cn.execute( + "SELECT DISTINCT type_ref FROM entities " + "WHERE group_id = ? AND type_ref != 'Group'", + (args.container_id,), + ) + types = sorted({r["type_ref"] for r in cur.fetchall() if r["type_ref"]}) + cn.close() + homogeneous = (len(types) == 1) + inherited = types[0] if homogeneous else "Group" + _emit({ + "ok": True, + "container": args.container_id, + "child_types": types, + "homogeneous": homogeneous, + "inherited": inherited, + "shape": "square", + }) + + def cmd_group_page(args) -> None: """Lista entidades hijas de un Group (entities.group_id = ?). @@ -1155,6 +1188,11 @@ def main() -> None: sp.add_argument("--offset", type=int, default=0) sp.add_argument("--limit", type=int, default=200) sp.set_defaults(fn=cmd_group_page) + # 0035e: visual heredado del tipo mayoritario + sp = g.add_parser("visual", + help="Resuelve iconografia heredada del Group (homogeneo vs heterogeneo)") + sp.add_argument("container_id") + sp.set_defaults(fn=cmd_group_visual) # enricher e = sub.add_parser("enricher").add_subparsers(dest="op", required=True)