feat: metrics summary panel for overview pane
This commit is contained in:
@@ -0,0 +1,61 @@
|
|||||||
|
"""Compact metrics panel for overview pane right side.
|
||||||
|
Run: watch -n10 python3 bin/metrics.py
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from datetime import datetime, timezone
|
||||||
|
|
||||||
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
from log_append import read_entries
|
||||||
|
|
||||||
|
from rich.console import Console
|
||||||
|
from rich.panel import Panel
|
||||||
|
from rich.text import Text
|
||||||
|
|
||||||
|
console = Console(width=38)
|
||||||
|
|
||||||
|
|
||||||
|
def summarize(entries: list) -> tuple:
|
||||||
|
today = datetime.now(timezone.utc).date().isoformat()
|
||||||
|
today_entries = [e for e in entries if (e.get('ts') or '').startswith(today)]
|
||||||
|
total = len(today_entries)
|
||||||
|
kept = sum(1 for e in today_entries if e.get('kept'))
|
||||||
|
projects: dict = {}
|
||||||
|
for e in today_entries:
|
||||||
|
p = e.get('project') or 'unknown'
|
||||||
|
projects.setdefault(p, {'total': 0, 'kept': 0})
|
||||||
|
projects[p]['total'] += 1
|
||||||
|
if e.get('kept'):
|
||||||
|
projects[p]['kept'] += 1
|
||||||
|
return total, kept, projects
|
||||||
|
|
||||||
|
|
||||||
|
def render() -> None:
|
||||||
|
entries = read_entries()
|
||||||
|
total, kept, projects = summarize(entries)
|
||||||
|
rate = f"{kept / total * 100:.0f}%" if total else "—"
|
||||||
|
|
||||||
|
text = Text()
|
||||||
|
text.append(f"Today: {total} experiments\n", style="bold")
|
||||||
|
text.append(f"Kept: {kept}", style="green bold")
|
||||||
|
text.append(f" ({rate})\n\n", style="dim")
|
||||||
|
|
||||||
|
if projects:
|
||||||
|
text.append("Per project:\n", style="bold dim")
|
||||||
|
for p, s in sorted(projects.items()):
|
||||||
|
r = f"{s['kept']}/{s['total']}"
|
||||||
|
bar = "█" * s['kept'] + "░" * (s['total'] - s['kept'])
|
||||||
|
text.append(f" {p[:14]:<14} {r:>5} {bar[:8]}\n")
|
||||||
|
else:
|
||||||
|
text.append("No experiments today.", style="dim italic")
|
||||||
|
|
||||||
|
console.print(Panel(
|
||||||
|
text,
|
||||||
|
title="[bold #DA251C]Metrics[/bold #DA251C]",
|
||||||
|
border_style="#FFD802",
|
||||||
|
expand=False,
|
||||||
|
))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
render()
|
||||||
Reference in New Issue
Block a user