Source code for analyzer.postprocessing.explain
from __future__ import annotations
from rich.tree import Tree
from rich.text import Text
from .grouping import GroupTrace, GroupBuilder
[docs]
def renderSelect(tree, sel, verbose=False):
sel_style = "green" if sel.selected_count > 0 else "red"
sel_node = tree.add(
Text(
f"Select: {sel.pattern} -> "
f"{sel.selected_count} kept, {sel.dropped_count} dropped",
style=sel_style,
)
)
if verbose and sel.dropped_items:
dropped_node = sel_node.add(Text("Dropped:", style="red"))
for desc in sel.dropped_items:
dropped_node.add(Text(desc, style="dim red"))
if verbose and sel.selected_items:
kept_node = sel_node.add(Text("Kept:", style="green"))
for desc in sel.selected_items:
kept_node.add(Text(desc, style="dim green"))
[docs]
def renderGroup(tree, grp, verbose=False):
group_node = tree.add(
Text(
f"Group by: {grp.pattern} -> {len(grp.groups)} groups",
style="yellow",
)
)
for cg in grp.groups:
g_node = group_node.add(
Text(f"{cg.key} ({cg.count} items)", style="bold yellow")
)
if verbose and cg.items:
for desc in cg.items:
g_node.add(Text(desc, style="dim"))
[docs]
def renderSubgroup(tree, subgroup, verbose=False):
for group_idx, sub in enumerate(subgroup):
group_label = (
f"Group {group_idx}" if len(subgroup) > 1 else "Subgroups"
)
if isinstance(sub, dict):
sub_node = tree.add(Text(f"{group_label} (dict):", style="bold blue"))
for name, sub_trace in sub.items():
child = renderTrace(sub_trace, label=name)
sub_node.add(child)
elif isinstance(sub, list):
sub_node = tree.add(Text(f"{group_label} (list):", style="bold blue"))
for i, sub_trace in enumerate(sub):
child = renderTrace(sub_trace, label=f"[{i}]")
sub_node.add(child)
[docs]
def renderTrace(trace: GroupTrace, label, verbose=False) -> Tree:
tree = Tree(Text(label, style="bold cyan"))
input_node = tree.add(Text(f"Input: {trace.input.count} items", style="bold"))
if verbose and trace.input.items:
for desc in trace.input.items:
input_node.add(Text(desc, style="dim"))
if (sel := trace.select) is not None:
renderSelect(tree, sel, verbose)
if (grp := trace.grouping) is not None:
renderGroup(tree, grp, verbose)
if trace.transforms:
t_node = tree.add(Text("Transforms:", style="magenta"))
for step in trace.transforms:
t_node.add(
Text(f"{step.name} -> {step.post_count} items after", style="magenta")
)
if subgroup := trace.subgroup_traces:
renderSubgroup(tree, subgroup, verbose)
return tree