summaryrefslogtreecommitdiff
path: root/nba/cli.py
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-15 22:28:45 -0500
committerChristian Cleberg <[email protected]>2026-04-15 22:28:45 -0500
commit4cbe592e0a0fae13f0a89918a66fd983dd84464f (patch)
treec2aac9d6e3c7b0f44adf07b86385f2ce06f1cf10 /nba/cli.py
parent00f695c765aead8aa0160a3c676cf85716178beb (diff)
downloadnba-scores-4cbe592e0a0fae13f0a89918a66fd983dd84464f.tar.gz
nba-scores-4cbe592e0a0fae13f0a89918a66fd983dd84464f.tar.bz2
nba-scores-4cbe592e0a0fae13f0a89918a66fd983dd84464f.zip
feat: add Textual TUI with auto-refresh, leaders, playoff picture, and box score
Introduces an interactive terminal UI via the `--tui` flag backed by the Textual framework. Scores and standings auto-refresh on a configurable interval (default 60s, minimum 10s) using asyncio with nba_api calls offloaded to a thread pool to keep the event loop unblocked. New tabs: - Scores / Standings (existing views, now live-updating) - Leaders: top-25 by stat category, cycle with < / > keys - Playoff Picture: conference seeding with clinch/elimination status - Box Score: per-player live stats, load any game with keys 1–9 Refactored scores.py and standings.py to separate rendering from I/O (get_scoreboard_table, get_east/west_standings_table), keeping the existing static CLI path fully intact. Added -sc / -st shortcut flags. Adds textual>=0.89.1,<7.0 dependency, build-system declaration for uv, and package-data entry for the bundled .tcss stylesheet.
Diffstat (limited to 'nba/cli.py')
-rw-r--r--nba/cli.py27
1 files changed, 24 insertions, 3 deletions
diff --git a/nba/cli.py b/nba/cli.py
index 82c3883..e5f460d 100644
--- a/nba/cli.py
+++ b/nba/cli.py
@@ -13,12 +13,33 @@ def nba() -> None:
Parse command-line arguments and display either scoreboard or standings.
"""
parser = argparse.ArgumentParser(description="NBA Scoreboard and Standings")
- parser.add_argument("--scores", action="store_true", help="Display the scoreboard")
parser.add_argument(
- "--standings", action="store_true", help="Display the standings"
+ "--scores", "-sc", action="store_true", help="Display the scoreboard"
+ )
+ parser.add_argument(
+ "--standings", "-st", action="store_true", help="Display the standings"
+ )
+ parser.add_argument(
+ "--tui", action="store_true", help="Launch the interactive TUI"
+ )
+ parser.add_argument(
+ "--refresh",
+ type=int,
+ default=60,
+ metavar="SECONDS",
+ help="Auto-refresh interval in TUI mode (default: 60, minimum: 10)",
)
args = parser.parse_args()
+ if args.tui:
+ from nba.tui.app import NBAApp
+
+ initial_tab = "standings" if args.standings else "scores"
+ refresh_interval = max(args.refresh, 10)
+ NBAApp(initial_tab=initial_tab, refresh_interval=refresh_interval).run()
+ return
+
+ # Legacy static mode
games, ranks = fetch_data.fetch_data()
if args.scores:
@@ -26,4 +47,4 @@ def nba() -> None:
elif args.standings:
standings.build_standings(ranks)
else:
- print("Please specify --scores or --standings")
+ print("Please specify --scores or --standings (or use --tui for interactive mode)")