API Reference
Complete Python API documentation auto-generated from docstrings.
This section provides comprehensive documentation for all Python modules, classes, and functions in the NHL Scrabble package.
Package Overview
The NHL Scrabble package is organized into six main modules:
Command-Line Interface
- CLI Module
Click-based CLI with analyze command and customizable options.
Data Models
- Models Module
Pydantic models for type-safe data structures:
Player models - Player, PlayerScore
Team models - Team, TeamScore
Standings models - DivisionStandings, ConferenceStandings
NHL API Client
- NHL API Module
Async HTTP client for NHL API integration:
Automatic retry with exponential backoff
Rate limiting and timeout handling
Session management with context manager
Comprehensive error handling
Scoring Logic
- Scoring Module
Scrabble letter value calculations:
Standard Scrabble point values (A=1, Z=10, etc.)
Player name scoring with breakdown
Case-insensitive text scoring
Business Logic
- Processors Module
Team aggregation and playoff calculations:
TeamProcessor - Aggregate player scores into team totals
PlayoffCalculator - Generate NHL playoff bracket
Report Generators
- Reports Module
Rich terminal output formatters:
ConferenceReport - Conference standings
DivisionReport - Division standings
PlayoffReport - Playoff bracket
TeamReport - Detailed team roster
StatsReport - Overall statistics
Module Dependency Graph
┌─────────┐
│ CLI │
└────┬────┘
│
├─────> ┌──────────┐ ┌─────────┐
│ │ NHL API │─────>│ Models │
│ └──────────┘ └─────────┘
│ │
├─────> ┌─────────┐ │
│ │ Scoring │<───────────┘
│ └─────────┘
│ │
├─────> ┌────────────┐
│ │ Processors │
│ └────────────┘
│ │
└─────> ┌─────────┐
│ Reports │
└─────────┘
Quick Example
Complete workflow using all modules:
from nhl_scrabble.api import NHLClient
from nhl_scrabble.scoring import ScrabbleScorer
from nhl_scrabble.processors import TeamProcessor, PlayoffCalculator
from nhl_scrabble.reports import ConferenceReport, PlayoffReport, StatsReport
import asyncio
async def analyze():
# 1. Fetch NHL data
async with NHLClient() as client:
teams = await client.fetch_all_teams()
rosters = await client.fetch_all_rosters()
# 2. Score all players
scorer = ScrabbleScorer()
all_players = []
for roster in rosters.values():
all_players.extend(scorer.score_player(p) for p in roster)
# 3. Process teams
processor = TeamProcessor()
team_scores = processor.process_teams(teams, all_players)
conference_standings = processor.get_conference_standings(team_scores)
# 4. Calculate playoffs
calculator = PlayoffCalculator()
playoff_bracket = calculator.calculate_playoff_bracket(team_scores)
# 5. Generate reports
ConferenceReport(conference_standings).generate()
PlayoffReport(playoff_bracket).generate()
StatsReport(all_players, team_scores).generate()
# Run the analysis
asyncio.run(analyze())
Type Hints and Type Safety
All modules use comprehensive type hints for IDE support and type checking:
from nhl_scrabble.models import Player, PlayerScore
from nhl_scrabble.scoring import ScrabbleScorer
# Type hints provide autocomplete and error detection
scorer: ScrabbleScorer = ScrabbleScorer()
player: Player = Player(id=1, firstName="Alex", lastName="Ovechkin")
score: PlayerScore = scorer.score_player(player)
# MyPy validates types
reveal_type(score.total) # Revealed type is 'int'
Async/Await Support
The NHL API client uses async/await for efficient I/O:
import asyncio
from nhl_scrabble.api import NHLClient
async def fetch_parallel():
"""Fetch multiple teams in parallel."""
async with NHLClient() as client:
# Fetch sequentially
tor = await client.fetch_team_roster("TOR")
mtl = await client.fetch_team_roster("MTL")
# Or use asyncio.gather for parallel fetching
tasks = [
client.fetch_team_roster("TOR"),
client.fetch_team_roster("MTL"),
client.fetch_team_roster("NYR"),
]
results = await asyncio.gather(*tasks)
return results
rosters = asyncio.run(fetch_parallel())
Pydantic Data Validation
All data models use Pydantic for automatic validation:
from nhl_scrabble.models import Player
from pydantic import ValidationError
try:
# Valid player
player = Player(id=1, firstName="Alex", lastName="Ovechkin", positionCode="LW")
# Invalid - missing required fields
bad_player = Player(firstName="Alex") # Raises ValidationError
except ValidationError as e:
print(e)