feat(0035e): gx-cli group visual <id> 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.
This commit is contained in:
2026-05-04 14:24:54 +02:00
parent c27d8e7ffc
commit 5417834950
+38
View File
@@ -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: <type>`. 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)