SYMBOL INDEX (1032 symbols across 51 files) FILE: src/claude_monitor/__main__.py function _main (line 13) | def _main() -> NoReturn: FILE: src/claude_monitor/_version.py function get_version (line 13) | def get_version() -> str: function _get_version_from_pyproject (line 29) | def _get_version_from_pyproject() -> str: function get_package_info (line 66) | def get_package_info() -> Dict[str, Optional[str]]: function get_version_info (line 95) | def get_version_info() -> Dict[str, Any]: function find_project_root (line 115) | def find_project_root(start_path: Optional[Union[str, Path]] = None) -> ... FILE: src/claude_monitor/cli/bootstrap.py function setup_logging (line 13) | def setup_logging( function setup_environment (line 41) | def setup_environment() -> None: function init_timezone (line 55) | def init_timezone(timezone: str = "Europe/Warsaw") -> TimezoneHandler: function ensure_directories (line 70) | def ensure_directories() -> None: FILE: src/claude_monitor/cli/main.py function get_standard_claude_paths (line 44) | def get_standard_claude_paths() -> List[str]: function discover_claude_data_paths (line 49) | def discover_claude_data_paths(custom_paths: Optional[List[str]] = None)... function main (line 72) | def main(argv: Optional[List[str]] = None) -> int: function _run_monitoring (line 110) | def _run_monitoring(args: argparse.Namespace) -> None: function _get_initial_token_limit (line 263) | def _get_initial_token_limit( function handle_application_error (line 315) | def handle_application_error( function validate_cli_environment (line 351) | def validate_cli_environment() -> Optional[str]: function _run_table_view (line 381) | def _run_table_view( FILE: src/claude_monitor/core/calculations.py class BlockLike (line 21) | class BlockLike(Protocol): class BurnRateCalculator (line 31) | class BurnRateCalculator: method calculate_burn_rate (line 34) | def calculate_burn_rate(self, block: BlockLike) -> Optional[BurnRate]: method project_block_usage (line 59) | def project_block_usage(self, block: BlockLike) -> Optional[UsageProje... function calculate_hourly_burn_rate (line 94) | def calculate_hourly_burn_rate( function _calculate_total_tokens_in_hour (line 107) | def _calculate_total_tokens_in_hour( function _process_block_for_burn_rate (line 117) | def _process_block_for_burn_rate( function _parse_block_start_time (line 134) | def _parse_block_start_time(block: Dict[str, Any]) -> Optional[datetime]: function _determine_session_end_time (line 149) | def _determine_session_end_time( function _calculate_tokens_in_hour (line 167) | def _calculate_tokens_in_hour( function _log_timestamp_error (line 190) | def _log_timestamp_error( FILE: src/claude_monitor/core/data_processors.py class TimestampProcessor (line 13) | class TimestampProcessor: method __init__ (line 16) | def __init__(self, timezone_handler: Optional[TimezoneHandler] = None)... method parse_timestamp (line 20) | def parse_timestamp( class TokenExtractor (line 65) | class TokenExtractor: method extract_tokens (line 69) | def extract_tokens(data: Dict[str, Any]) -> Dict[str, int]: class DataConverter (line 172) | class DataConverter: method flatten_nested_dict (line 176) | def flatten_nested_dict(data: Dict[str, Any], prefix: str = "") -> Dic... method extract_model_name (line 199) | def extract_model_name( method to_serializable (line 226) | def to_serializable(obj: Any) -> Any: FILE: src/claude_monitor/core/models.py class CostMode (line 11) | class CostMode(Enum): class UsageEntry (line 20) | class UsageEntry: class TokenCounts (line 35) | class TokenCounts: method total_tokens (line 44) | def total_tokens(self) -> int: class BurnRate (line 55) | class BurnRate: class UsageProjection (line 63) | class UsageProjection: class SessionBlock (line 72) | class SessionBlock: method total_tokens (line 93) | def total_tokens(self) -> int: method total_cost (line 98) | def total_cost(self) -> float: method duration_minutes (line 103) | def duration_minutes(self) -> float: function normalize_model_name (line 112) | def normalize_model_name(model: str) -> str: FILE: src/claude_monitor/core/p90_calculator.py class P90Config (line 10) | class P90Config: function _did_hit_limit (line 17) | def _did_hit_limit(tokens: int, common_limits: Sequence[int], threshold:... function _extract_sessions (line 21) | def _extract_sessions( function _calculate_p90_from_blocks (line 31) | def _calculate_p90_from_blocks(blocks: Sequence[Dict[str, Any]], cfg: P9... class P90Calculator (line 52) | class P90Calculator: method __init__ (line 53) | def __init__(self, config: Optional[P90Config] = None) -> None: method _cached_calc (line 70) | def _cached_calc( method calculate_p90_limit (line 78) | def calculate_p90_limit( FILE: src/claude_monitor/core/plans.py class PlanType (line 12) | class PlanType(Enum): method from_string (line 21) | def from_string(cls, value: str) -> "PlanType": class PlanConfig (line 30) | class PlanConfig: method formatted_token_limit (line 40) | def formatted_token_limit(self) -> str: class Plans (line 81) | class Plans: method _build_config (line 91) | def _build_config(cls, plan_type: PlanType) -> PlanConfig: method all_plans (line 103) | def all_plans(cls) -> Dict[PlanType, PlanConfig]: method get_plan (line 108) | def get_plan(cls, plan_type: PlanType) -> PlanConfig: method get_plan_by_name (line 113) | def get_plan_by_name(cls, name: str) -> Optional[PlanConfig]: method get_token_limit (line 122) | def get_token_limit( method get_cost_limit (line 145) | def get_cost_limit(cls, plan: str) -> float: method get_message_limit (line 151) | def get_message_limit(cls, plan: str) -> int: method is_valid_plan (line 157) | def is_valid_plan(cls, plan: str) -> bool: function get_token_limit (line 181) | def get_token_limit(plan: str, blocks: Optional[List[Dict[str, Any]]] = ... function get_cost_limit (line 194) | def get_cost_limit(plan: str) -> float: FILE: src/claude_monitor/core/pricing.py class PricingCalculator (line 14) | class PricingCalculator: method __init__ (line 50) | def __init__( method calculate_cost (line 71) | def calculate_cost( method _get_pricing_for_model (line 135) | def _get_pricing_for_model( method calculate_cost_for_entry (line 185) | def calculate_cost_for_entry( FILE: src/claude_monitor/core/settings.py class LastUsedParams (line 19) | class LastUsedParams: method __init__ (line 22) | def __init__(self, config_dir: Optional[Path] = None) -> None: method save (line 27) | def save(self, settings: "Settings") -> None: method load (line 55) | def load(self) -> Dict[str, Any]: method clear (line 73) | def clear(self) -> None: method exists (line 82) | def exists(self) -> bool: class Settings (line 87) | class Settings(BaseSettings): method _get_system_timezone (line 113) | def _get_system_timezone() -> str: method _get_system_time_format (line 120) | def _get_system_time_format() -> str: method validate_plan (line 175) | def validate_plan(cls, v: Any) -> str: method validate_view (line 189) | def validate_view(cls, v: Any) -> str: method validate_theme (line 203) | def validate_theme(cls, v: Any) -> str: method validate_timezone (line 217) | def validate_timezone(cls, v: str) -> str: method validate_time_format (line 225) | def validate_time_format(cls, v: str) -> str: method validate_log_level (line 235) | def validate_log_level(cls, v: str) -> str: method settings_customise_sources (line 244) | def settings_customise_sources( method load_with_last_used (line 262) | def load_with_last_used(cls, argv: Optional[List[str]] = None) -> "Set... method to_namespace (line 337) | def to_namespace(self) -> argparse.Namespace: FILE: src/claude_monitor/data/aggregator.py class AggregatedStats (line 20) | class AggregatedStats: method add_entry (line 30) | def add_entry(self, entry: UsageEntry) -> None: method to_dict (line 39) | def to_dict(self) -> Dict[str, Any]: class AggregatedPeriod (line 52) | class AggregatedPeriod: method add_entry (line 62) | def add_entry(self, entry: UsageEntry) -> None: method to_dict (line 74) | def to_dict(self, period_type: str) -> Dict[str, Any]: class UsageAggregator (line 92) | class UsageAggregator: method __init__ (line 95) | def __init__( method _aggregate_by_period (line 110) | def _aggregate_by_period( method aggregate_daily (line 157) | def aggregate_daily( method aggregate_monthly (line 181) | def aggregate_monthly( method aggregate_from_blocks (line 205) | def aggregate_from_blocks( method calculate_totals (line 235) | def calculate_totals(self, aggregated_data: List[Dict[str, Any]]) -> D... method aggregate (line 269) | def aggregate(self) -> List[Dict[str, Any]]: FILE: src/claude_monitor/data/analysis.py function analyze_usage (line 18) | def analyze_usage( function _process_burn_rates (line 103) | def _process_burn_rates( function _create_result (line 121) | def _create_result( function _is_limit_in_block_timerange (line 139) | def _is_limit_in_block_timerange( function _format_limit_info (line 151) | def _format_limit_info(limit_info: Dict[str, Any]) -> Dict[str, Any]: function _convert_blocks_to_dict_format (line 165) | def _convert_blocks_to_dict_format(blocks: List[SessionBlock]) -> List[D... function _create_base_block_dict (line 177) | def _create_base_block_dict(block: SessionBlock) -> Dict[str, Any]: function _format_block_entries (line 206) | def _format_block_entries(entries: List[UsageEntry]) -> List[Dict[str, A... function _add_optional_block_data (line 224) | def _add_optional_block_data(block: SessionBlock, block_dict: Dict[str, ... FILE: src/claude_monitor/data/analyzer.py class SessionAnalyzer (line 22) | class SessionAnalyzer: method __init__ (line 25) | def __init__(self, session_duration_hours: int = 5): method transform_to_blocks (line 35) | def transform_to_blocks(self, entries: List[UsageEntry]) -> List[Sessi... method detect_limits (line 81) | def detect_limits(self, raw_entries: List[Dict[str, Any]]) -> List[Dic... method _should_create_new_block (line 99) | def _should_create_new_block(self, block: SessionBlock, entry: UsageEn... method _round_to_hour (line 109) | def _round_to_hour(self, timestamp: datetime) -> datetime: method _create_new_block (line 118) | def _create_new_block(self, entry: UsageEntry) -> SessionBlock: method _add_entry_to_block (line 133) | def _add_entry_to_block(self, block: SessionBlock, entry: UsageEntry) ... method _finalize_block (line 174) | def _finalize_block(self, block: SessionBlock) -> None: method _check_for_gap (line 182) | def _check_for_gap( method _mark_active_blocks (line 209) | def _mark_active_blocks(self, blocks: List[SessionBlock]) -> None: method _detect_single_limit (line 219) | def _detect_single_limit( method _process_system_message (line 232) | def _process_system_message( method _process_user_message (line 278) | def _process_user_message( method _process_tool_result (line 296) | def _process_tool_result( method _extract_block_context (line 331) | def _extract_block_context( method _is_opus_limit (line 351) | def _is_opus_limit(self, content_lower: str) -> bool: method _extract_wait_time (line 362) | def _extract_wait_time( method _parse_reset_timestamp (line 373) | def _parse_reset_timestamp(self, text: str) -> Optional[datetime]: FILE: src/claude_monitor/data/reader.py function load_usage_entries (line 32) | def load_usage_entries( function load_all_raw_entries (line 87) | def load_all_raw_entries(data_path: Optional[str] = None) -> List[Dict[s... function _find_jsonl_files (line 117) | def _find_jsonl_files(data_path: Path) -> List[Path]: function _process_single_file (line 125) | def _process_single_file( function _should_process_entry (line 192) | def _should_process_entry( function _create_unique_hash (line 211) | def _create_unique_hash(data: Dict[str, Any]) -> Optional[str]: function _update_processed_hashes (line 223) | def _update_processed_hashes(data: Dict[str, Any], processed_hashes: Set... function _map_to_usage_entry (line 230) | def _map_to_usage_entry( class UsageEntryMapper (line 280) | class UsageEntryMapper: method __init__ (line 288) | def __init__( method map (line 295) | def map(self, data: Dict[str, Any], mode: CostMode) -> Optional[UsageE... method _has_valid_tokens (line 301) | def _has_valid_tokens(self, tokens: Dict[str, int]) -> bool: method _extract_timestamp (line 305) | def _extract_timestamp(self, data: Dict[str, Any]) -> Optional[datetime]: method _extract_model (line 312) | def _extract_model(self, data: Dict[str, Any]) -> str: method _extract_metadata (line 316) | def _extract_metadata(self, data: Dict[str, Any]) -> Dict[str, str]: FILE: src/claude_monitor/error_handling.py class ErrorLevel (line 14) | class ErrorLevel(str, Enum): function report_error (line 21) | def report_error( function report_file_error (line 56) | def report_file_error( function get_error_context (line 87) | def get_error_context() -> Dict[str, Any]: function report_application_startup_error (line 102) | def report_application_startup_error( function report_configuration_error (line 128) | def report_configuration_error( FILE: src/claude_monitor/monitoring/data_manager.py class DataManager (line 13) | class DataManager: method __init__ (line 16) | def __init__( method get_data (line 38) | def get_data(self, force_refresh: bool = False) -> Optional[Dict[str, ... method invalidate_cache (line 112) | def invalidate_cache(self) -> None: method _is_cache_valid (line 118) | def _is_cache_valid(self) -> bool: method _set_cache (line 126) | def _set_cache(self, data: Dict[str, Any]) -> None: method cache_age (line 132) | def cache_age(self) -> float: method last_error (line 139) | def last_error(self) -> Optional[str]: method last_successful_fetch_time (line 144) | def last_successful_fetch_time(self) -> Optional[float]: FILE: src/claude_monitor/monitoring/orchestrator.py class MonitoringOrchestrator (line 16) | class MonitoringOrchestrator: method __init__ (line 19) | def __init__( method start (line 41) | def start(self) -> None: method stop (line 57) | def stop(self) -> None: method set_args (line 72) | def set_args(self, args: Any) -> None: method register_update_callback (line 80) | def register_update_callback( method register_session_callback (line 92) | def register_session_callback( method force_refresh (line 102) | def force_refresh(self) -> Optional[Dict[str, Any]]: method wait_for_initial_data (line 110) | def wait_for_initial_data(self, timeout: float = 10.0) -> bool: method _monitoring_loop (line 121) | def _monitoring_loop(self) -> None: method _fetch_and_process_data (line 139) | def _fetch_and_process_data( method _calculate_token_limit (line 212) | def _calculate_token_limit(self, data: Dict[str, Any]) -> int: FILE: src/claude_monitor/monitoring/session_monitor.py class SessionMonitor (line 9) | class SessionMonitor: method __init__ (line 12) | def __init__(self) -> None: method update (line 20) | def update(self, data: Dict[str, Any]) -> Tuple[bool, List[str]]: method validate_data (line 57) | def validate_data(self, data: Any) -> Tuple[bool, List[str]]: method _validate_block (line 86) | def _validate_block(self, block: Any, index: int) -> List[str]: method _on_session_change (line 120) | def _on_session_change( method _on_session_end (line 150) | def _on_session_end(self, session_id: str) -> None: method register_callback (line 164) | def register_callback( method unregister_callback (line 175) | def unregister_callback( method current_session_id (line 187) | def current_session_id(self) -> Optional[str]: method session_count (line 192) | def session_count(self) -> int: method session_history (line 197) | def session_history(self) -> List[Dict[str, Any]]: FILE: src/claude_monitor/terminal/manager.py function setup_terminal (line 22) | def setup_terminal() -> Optional[List[Any]]: function restore_terminal (line 42) | def restore_terminal(old_settings: Optional[List[Any]]) -> None: function enter_alternate_screen (line 58) | def enter_alternate_screen() -> None: function handle_cleanup_and_exit (line 70) | def handle_cleanup_and_exit( function handle_error_and_exit (line 84) | def handle_error_and_exit( FILE: src/claude_monitor/terminal/themes.py class BackgroundType (line 26) | class BackgroundType(Enum): class ThemeConfig (line 35) | class ThemeConfig: method get_color (line 50) | def get_color(self, key: str, default: str = "default") -> str: class AdaptiveColorScheme (line 63) | class AdaptiveColorScheme: method get_light_background_theme (line 73) | def get_light_background_theme() -> Theme: method get_dark_background_theme (line 130) | def get_dark_background_theme() -> Theme: method get_classic_theme (line 187) | def get_classic_theme() -> Theme: class BackgroundDetector (line 243) | class BackgroundDetector: method detect_background (line 251) | def detect_background() -> BackgroundType: method _check_colorfgbg (line 281) | def _check_colorfgbg() -> BackgroundType: method _check_environment_hints (line 309) | def _check_environment_hints() -> BackgroundType: method _query_background_color (line 340) | def _query_background_color() -> BackgroundType: class ThemeManager (line 452) | class ThemeManager: method __init__ (line 455) | def __init__(self): method _load_themes (line 461) | def _load_themes(self) -> Dict[str, ThemeConfig]: method _get_symbols_for_theme (line 500) | def _get_symbols_for_theme( method auto_detect_theme (line 532) | def auto_detect_theme(self) -> str: method get_theme (line 551) | def get_theme( method get_console (line 581) | def get_console( method get_current_theme (line 596) | def get_current_theme(self) -> Optional[ThemeConfig]: function get_cost_style (line 629) | def get_cost_style(cost: float) -> str: function get_velocity_indicator (line 644) | def get_velocity_indicator(burn_rate: float) -> Dict[str, str]: function get_theme (line 665) | def get_theme(name: Optional[str] = None) -> Theme: function get_themed_console (line 678) | def get_themed_console(force_theme: Optional[Union[str, bool]] = None) -... function print_themed (line 692) | def print_themed(text: str, style: str = "info") -> None: FILE: src/claude_monitor/ui/components.py class VelocityIndicator (line 14) | class VelocityIndicator: method get_velocity_emoji (line 18) | def get_velocity_emoji(burn_rate: float) -> str: method get_velocity_description (line 31) | def get_velocity_description(burn_rate: float) -> str: method render (line 44) | def render(burn_rate: float, include_description: bool = False) -> str: class CostIndicator (line 61) | class CostIndicator: method render (line 65) | def render(cost: float, currency: str = "USD") -> str: class ErrorDisplayComponent (line 80) | class ErrorDisplayComponent: method __init__ (line 83) | def __init__(self) -> None: method format_error_screen (line 86) | def format_error_screen( class LoadingScreenComponent (line 114) | class LoadingScreenComponent: method __init__ (line 117) | def __init__(self) -> None: method create_loading_screen (line 120) | def create_loading_screen( method create_loading_screen_renderable (line 161) | def create_loading_screen_renderable( class AdvancedCustomLimitDisplay (line 184) | class AdvancedCustomLimitDisplay: method __init__ (line 187) | def __init__(self, console: Console) -> None: method _collect_session_data (line 190) | def _collect_session_data( method _is_limit_session (line 235) | def _is_limit_session(self, session: Dict[str, Any]) -> bool: method _calculate_session_percentiles (line 250) | def _calculate_session_percentiles( function format_error_screen (line 297) | def format_error_screen( FILE: src/claude_monitor/ui/display_controller.py class DisplayController (line 35) | class DisplayController: method __init__ (line 38) | def __init__(self) -> None: method _extract_session_data (line 52) | def _extract_session_data(self, active_block: Dict[str, Any]) -> Dict[... method _calculate_token_limits (line 64) | def _calculate_token_limits(self, args: Any, token_limit: int) -> Tupl... method _calculate_time_data (line 74) | def _calculate_time_data( method _calculate_cost_predictions (line 80) | def _calculate_cost_predictions( method _check_notifications (line 98) | def _check_notifications( method _format_display_times (line 151) | def _format_display_times( method create_data_display (line 198) | def create_data_display( method _process_active_session_data (line 304) | def _process_active_session_data( method _calculate_model_distribution (line 395) | def _calculate_model_distribution( method create_loading_display (line 438) | def create_loading_display( method create_error_display (line 457) | def create_error_display( method create_live_context (line 472) | def create_live_context(self) -> Live: method set_screen_dimensions (line 480) | def set_screen_dimensions(self, width: int, height: int) -> None: class LiveDisplayManager (line 490) | class LiveDisplayManager: method __init__ (line 493) | def __init__(self, console: Optional[Console] = None) -> None: method create_live_display (line 503) | def create_live_display( class ScreenBufferManager (line 531) | class ScreenBufferManager: method __init__ (line 534) | def __init__(self) -> None: method create_screen_renderable (line 538) | def create_screen_renderable(self, screen_buffer: List[str]) -> Group: function create_screen_renderable (line 565) | def create_screen_renderable(screen_buffer: List[str]) -> Group: class SessionCalculator (line 574) | class SessionCalculator: method __init__ (line 578) | def __init__(self) -> None: method calculate_time_data (line 582) | def calculate_time_data( method calculate_cost_predictions (line 631) | def calculate_cost_predictions( FILE: src/claude_monitor/ui/layouts.py class HeaderManager (line 13) | class HeaderManager: method __init__ (line 21) | def __init__(self) -> None: method create_header (line 26) | def create_header( class ScreenManager (line 50) | class ScreenManager: method __init__ (line 58) | def __init__(self) -> None: method set_screen_dimensions (line 67) | def set_screen_dimensions(self, width: int, height: int) -> None: method set_margins (line 77) | def set_margins( method create_full_screen_layout (line 93) | def create_full_screen_layout( FILE: src/claude_monitor/ui/progress_bars.py class ModelStatsDict (line 15) | class ModelStatsDict(TypedDict, total=False): class ProgressBarStyleConfig (line 24) | class ProgressBarStyleConfig(TypedDict, total=False): class ThresholdConfig (line 33) | class ThresholdConfig(TypedDict): class ProgressBarRenderer (line 40) | class ProgressBarRenderer(Protocol): method render (line 43) | def render(self, *args: Any, **kwargs: Any) -> str: class BaseProgressBar (line 48) | class BaseProgressBar(ABC): method __init__ (line 61) | def __init__(self, width: int = 50) -> None: method _validate_width (line 70) | def _validate_width(self) -> None: method _calculate_filled_segments (line 81) | def _calculate_filled_segments( method _render_bar (line 96) | def _render_bar( method _format_percentage (line 126) | def _format_percentage(self, percentage: float, precision: int = 1) ->... method _get_color_style_by_threshold (line 138) | def _get_color_style_by_threshold( method render (line 156) | def render(self, *args, **kwargs) -> str: class TokenProgressBar (line 166) | class TokenProgressBar(BaseProgressBar): method render (line 185) | def render(self, percentage: float) -> str: class TimeProgressBar (line 224) | class TimeProgressBar(BaseProgressBar): method render (line 227) | def render(self, elapsed_minutes: float, total_minutes: float) -> str: class ModelUsageBar (line 253) | class ModelUsageBar(BaseProgressBar): method render (line 256) | def render(self, per_model_stats: dict[str, Any]) -> str: FILE: src/claude_monitor/ui/session_display.py class SessionDisplayData (line 27) | class SessionDisplayData: class SessionDisplayComponent (line 55) | class SessionDisplayComponent: method __init__ (line 58) | def __init__(self): method _render_wide_progress_bar (line 64) | def _render_wide_progress_bar(self, percentage: float) -> str: method format_active_session_screen_v2 (line 97) | def format_active_session_screen_v2(self, data: SessionDisplayData) ->... method format_active_session_screen (line 131) | def format_active_session_screen( method _add_notifications (line 336) | def _add_notifications( method format_no_active_session_screen (line 378) | def format_no_active_session_screen( FILE: src/claude_monitor/ui/table_views.py class TableViewsController (line 22) | class TableViewsController: method __init__ (line 25) | def __init__(self, console: Optional[Console] = None): method _create_base_table (line 42) | def _create_base_table( method _add_data_rows (line 87) | def _add_data_rows( method _add_totals_row (line 117) | def _add_totals_row(self, table: Table, totals: Dict[str, Any]) -> None: method create_daily_table (line 141) | def create_daily_table( method create_monthly_table (line 172) | def create_monthly_table( method create_summary_panel (line 203) | def create_summary_panel( method _format_models (line 239) | def _format_models(self, models: List[str]) -> str: method create_no_data_display (line 264) | def create_no_data_display(self, view_type: str) -> Panel: method create_aggregate_table (line 290) | def create_aggregate_table( method display_aggregated_view (line 318) | def display_aggregated_view( FILE: src/claude_monitor/utils/formatting.py function format_number (line 16) | def format_number(value: Union[int, float], decimals: int = 0) -> str: function format_currency (line 31) | def format_currency(amount: float, currency: str = "USD") -> str: function format_time (line 50) | def format_time(minutes: float) -> str: function format_display_time (line 66) | def format_display_time( function _get_pref (line 86) | def _get_pref(args: Any) -> bool: FILE: src/claude_monitor/utils/model_utils.py function normalize_model_name (line 14) | def normalize_model_name(model: str) -> str: function get_model_display_name (line 30) | def get_model_display_name(model: str) -> str: function is_claude_model (line 52) | def is_claude_model(model: str) -> bool: function get_model_generation (line 65) | def get_model_generation(model: str) -> str: FILE: src/claude_monitor/utils/notifications.py class NotificationManager (line 9) | class NotificationManager: method __init__ (line 12) | def __init__(self, config_dir: Path) -> None: method _load_states (line 24) | def _load_states(self) -> Dict[str, Dict[str, Union[bool, Optional[dat... method _save_states (line 54) | def _save_states(self) -> None: method should_notify (line 78) | def should_notify(self, key: str, cooldown_hours: Union[int, float] = ... method mark_notified (line 100) | def mark_notified(self, key: str) -> None: method get_notification_state (line 106) | def get_notification_state( method is_notification_active (line 116) | def is_notification_active(self, key: str) -> bool: FILE: src/claude_monitor/utils/time_utils.py function get_timezone_location (line 23) | def get_timezone_location( class TimeFormatDetector (line 129) | class TimeFormatDetector: method detect_from_cli (line 159) | def detect_from_cli(cls, args: Any) -> Optional[bool]: method detect_from_timezone (line 173) | def detect_from_timezone(cls, timezone_name: str) -> Optional[bool]: method detect_from_locale (line 195) | def detect_from_locale(cls) -> bool: method detect_from_system (line 213) | def detect_from_system(cls) -> str: method get_preference (line 268) | def get_preference( class SystemTimeDetector (line 284) | class SystemTimeDetector: method get_timezone (line 288) | def get_timezone() -> str: method get_time_format (line 343) | def get_time_format() -> str: class TimezoneHandler (line 348) | class TimezoneHandler: method __init__ (line 351) | def __init__(self, default_tz: str = "UTC") -> None: method _validate_and_get_tz (line 355) | def _validate_and_get_tz(self, tz_name: str) -> BaseTzInfo: method parse_timestamp (line 363) | def parse_timestamp(self, timestamp_str: str) -> Optional[datetime]: method ensure_utc (line 406) | def ensure_utc(self, dt: datetime) -> datetime: method ensure_timezone (line 412) | def ensure_timezone(self, dt: datetime) -> datetime: method validate_timezone (line 418) | def validate_timezone(self, tz_name: str) -> bool: method convert_to_timezone (line 426) | def convert_to_timezone(self, dt: datetime, tz_name: str) -> datetime: method set_timezone (line 433) | def set_timezone(self, tz_name: str) -> None: method to_utc (line 437) | def to_utc(self, dt: datetime) -> datetime: method to_timezone (line 441) | def to_timezone(self, dt: datetime, tz_name: Optional[str] = None) -> ... method format_datetime (line 447) | def format_datetime(self, dt: datetime, use_12_hour: Optional[bool] = ... function get_time_format_preference (line 461) | def get_time_format_preference(args: Any = None) -> bool: function get_system_timezone (line 466) | def get_system_timezone() -> str: function get_system_time_format (line 471) | def get_system_time_format() -> str: function format_time (line 476) | def format_time(minutes: Union[int, float]) -> str: function percentage (line 487) | def percentage(part: float, whole: float, decimal_places: int = 1) -> fl... function format_display_time (line 504) | def format_display_time( FILE: src/claude_monitor/utils/timezone.py function _detect_timezone_time_preference (line 16) | def _detect_timezone_time_preference(args: Any = None) -> bool: function parse_timestamp (line 31) | def parse_timestamp(timestamp_str: str, default_tz: str = "UTC") -> Opti... function ensure_utc (line 45) | def ensure_utc(dt: datetime, default_tz: str = "UTC") -> datetime: function validate_timezone (line 59) | def validate_timezone(tz_name: str) -> bool: function convert_to_timezone (line 72) | def convert_to_timezone( FILE: src/tests/conftest.py function mock_pricing_calculator (line 13) | def mock_pricing_calculator() -> Mock: function mock_timezone_handler (line 21) | def mock_timezone_handler() -> Mock: function sample_usage_entry (line 32) | def sample_usage_entry() -> UsageEntry: function sample_valid_data (line 48) | def sample_valid_data() -> Dict[str, Any]: function sample_assistant_data (line 68) | def sample_assistant_data() -> Dict[str, Any]: function sample_user_data (line 88) | def sample_user_data() -> Dict[str, Any]: function sample_malformed_data (line 106) | def sample_malformed_data() -> Dict[str, Any]: function sample_minimal_data (line 116) | def sample_minimal_data() -> Dict[str, Any]: function sample_empty_tokens_data (line 126) | def sample_empty_tokens_data() -> Dict[str, Any]: function sample_duplicate_data (line 141) | def sample_duplicate_data() -> List[Dict[str, Any]]: function all_cost_modes (line 166) | def all_cost_modes() -> List[CostMode]: function sample_cutoff_time (line 172) | def sample_cutoff_time() -> datetime: function sample_processed_hashes (line 178) | def sample_processed_hashes() -> Set[str]: function mock_file_reader (line 184) | def mock_file_reader() -> Mock: function mock_data_filter (line 207) | def mock_data_filter() -> Mock: function mock_usage_entry_mapper (line 219) | def mock_usage_entry_mapper() -> Mock: function mock_data_processor (line 237) | def mock_data_processor() -> Mock: function mock_data_manager (line 264) | def mock_data_manager() -> Mock: function mock_session_monitor (line 285) | def mock_session_monitor() -> Mock: function sample_monitoring_data (line 303) | def sample_monitoring_data() -> Dict[str, Any]: function sample_session_data (line 326) | def sample_session_data() -> Dict[str, Any]: function sample_invalid_monitoring_data (line 338) | def sample_invalid_monitoring_data() -> Dict[str, Any]: function mock_orchestrator_args (line 353) | def mock_orchestrator_args() -> Mock: FILE: src/tests/examples/api_examples.py function analyze_usage_with_metadata (line 15) | def analyze_usage_with_metadata( function analyze_usage_json (line 27) | def analyze_usage_json(hours_back=96, use_cache=True, data_path=None, in... function get_usage_summary (line 35) | def get_usage_summary(hours_back=96, use_cache=True, data_path=None): function print_usage_json (line 44) | def print_usage_json(hours_back=96, use_cache=True, data_path=None): function print_usage_summary (line 52) | def print_usage_summary(hours_back=96, use_cache=True, data_path=None): function _create_summary_stats (line 78) | def _create_summary_stats(blocks): function example_basic_usage (line 112) | def example_basic_usage(): function example_advanced_usage (line 152) | def example_advanced_usage(): function example_json_output (line 188) | def example_json_output(): function example_usage_summary (line 213) | def example_usage_summary(): function example_custom_data_path (line 242) | def example_custom_data_path(): function example_direct_import (line 266) | def example_direct_import(): function example_error_handling (line 283) | def example_error_handling(): function example_print_functions (line 304) | def example_print_functions(): function example_compatibility_check (line 323) | def example_compatibility_check(): function run_all_examples (line 367) | def run_all_examples(): FILE: src/tests/run_tests.py function run_tests (line 10) | def run_tests() -> int: FILE: src/tests/test_aggregator.py class TestAggregatedStats (line 16) | class TestAggregatedStats: method test_init_default_values (line 19) | def test_init_default_values(self) -> None: method test_add_entry_single (line 29) | def test_add_entry_single(self, sample_usage_entry: UsageEntry) -> None: method test_add_entry_multiple (line 41) | def test_add_entry_multiple(self) -> None: method test_to_dict (line 80) | def test_to_dict(self) -> None: class TestAggregatedPeriod (line 103) | class TestAggregatedPeriod: method test_init_default_values (line 106) | def test_init_default_values(self) -> None: method test_add_entry_single (line 116) | def test_add_entry_single(self, sample_usage_entry: UsageEntry) -> None: method test_add_entry_multiple_models (line 135) | def test_add_entry_multiple_models(self) -> None: method test_add_entry_with_unknown_model (line 199) | def test_add_entry_with_unknown_model(self) -> None: method test_to_dict_daily (line 220) | def test_to_dict_daily(self) -> None: method test_to_dict_monthly (line 262) | def test_to_dict_monthly(self) -> None: class TestUsageAggregator (line 282) | class TestUsageAggregator: method aggregator (line 286) | def aggregator(self, tmp_path) -> UsageAggregator: method sample_entries (line 291) | def sample_entries(self) -> List[UsageEntry]: method test_aggregate_daily_basic (line 328) | def test_aggregate_daily_basic( method test_aggregate_daily_with_date_filter (line 346) | def test_aggregate_daily_with_date_filter( method test_aggregate_monthly_basic (line 362) | def test_aggregate_monthly_basic( method test_aggregate_monthly_with_date_filter (line 391) | def test_aggregate_monthly_with_date_filter( method test_aggregate_from_blocks_daily (line 403) | def test_aggregate_from_blocks_daily( method test_aggregate_from_blocks_monthly (line 441) | def test_aggregate_from_blocks_monthly( method test_aggregate_from_blocks_invalid_view_type (line 461) | def test_aggregate_from_blocks_invalid_view_type( method test_calculate_totals_empty (line 478) | def test_calculate_totals_empty(self, aggregator: UsageAggregator) -> ... method test_calculate_totals_with_data (line 490) | def test_calculate_totals_with_data(self, aggregator: UsageAggregator)... method test_aggregate_daily_empty_entries (line 525) | def test_aggregate_daily_empty_entries(self, aggregator: UsageAggregat... method test_aggregate_monthly_empty_entries (line 530) | def test_aggregate_monthly_empty_entries(self, aggregator: UsageAggreg... method test_period_sorting (line 535) | def test_period_sorting(self, aggregator: UsageAggregator) -> None: FILE: src/tests/test_analysis.py class TestAnalyzeUsage (line 27) | class TestAnalyzeUsage: method test_analyze_usage_basic (line 33) | def test_analyze_usage_basic( method test_analyze_usage_quick_start_no_hours (line 80) | def test_analyze_usage_quick_start_no_hours( method test_analyze_usage_quick_start_with_hours (line 102) | def test_analyze_usage_quick_start_with_hours( method test_analyze_usage_with_limits (line 124) | def test_analyze_usage_with_limits( method test_analyze_usage_no_raw_entries (line 169) | def test_analyze_usage_no_raw_entries( class TestProcessBurnRates (line 204) | class TestProcessBurnRates: method test_process_burn_rates_active_block (line 207) | def test_process_burn_rates_active_block(self) -> None: method test_process_burn_rates_no_burn_rate (line 248) | def test_process_burn_rates_no_burn_rate(self) -> None: method test_process_burn_rates_no_projection (line 266) | def test_process_burn_rates_no_projection(self) -> None: class TestCreateResult (line 287) | class TestCreateResult: method test_create_result_basic (line 291) | def test_create_result_basic(self, mock_convert: Mock) -> None: method test_create_result_empty (line 320) | def test_create_result_empty(self) -> None: class TestLimitFunctions (line 333) | class TestLimitFunctions: method test_is_limit_in_block_timerange_within_range (line 336) | def test_is_limit_in_block_timerange_within_range(self) -> None: method test_is_limit_in_block_timerange_outside_range (line 348) | def test_is_limit_in_block_timerange_outside_range(self) -> None: method test_is_limit_in_block_timerange_no_timezone (line 360) | def test_is_limit_in_block_timerange_no_timezone(self) -> None: method test_format_limit_info_complete (line 372) | def test_format_limit_info_complete(self) -> None: method test_format_limit_info_no_reset_time (line 390) | def test_format_limit_info_no_reset_time(self) -> None: class TestBlockConversion (line 408) | class TestBlockConversion: method test_format_block_entries (line 411) | def test_format_block_entries(self) -> None: method test_create_base_block_dict (line 452) | def test_create_base_block_dict(self) -> None: method test_add_optional_block_data_all_fields (line 511) | def test_add_optional_block_data_all_fields(self) -> None: method test_add_optional_block_data_no_fields (line 540) | def test_add_optional_block_data_no_fields(self) -> None: method test_convert_blocks_to_dict_format (line 560) | def test_convert_blocks_to_dict_format( FILE: src/tests/test_calculations.py class TestBurnRateCalculator (line 18) | class TestBurnRateCalculator: method calculator (line 22) | def calculator(self) -> BurnRateCalculator: method mock_active_block (line 27) | def mock_active_block(self) -> Mock: method mock_inactive_block (line 43) | def mock_inactive_block(self) -> Mock: method test_calculate_burn_rate_active_block (line 52) | def test_calculate_burn_rate_active_block( method test_calculate_burn_rate_inactive_block (line 65) | def test_calculate_burn_rate_inactive_block( method test_calculate_burn_rate_zero_duration (line 72) | def test_calculate_burn_rate_zero_duration( method test_calculate_burn_rate_no_tokens (line 80) | def test_calculate_burn_rate_no_tokens( method test_calculate_burn_rate_edge_case_small_duration (line 93) | def test_calculate_burn_rate_edge_case_small_duration( method test_project_block_usage_success (line 104) | def test_project_block_usage_success( method test_project_block_usage_no_remaining_time (line 129) | def test_project_block_usage_no_remaining_time( method test_project_block_usage_no_burn_rate (line 145) | def test_project_block_usage_no_burn_rate( class TestHourlyBurnRateCalculation (line 153) | class TestHourlyBurnRateCalculation: method current_time (line 157) | def current_time(self) -> datetime: method mock_blocks (line 162) | def mock_blocks(self) -> List[Dict[str, Any]]: method test_calculate_hourly_burn_rate_empty_blocks (line 187) | def test_calculate_hourly_burn_rate_empty_blocks( method test_calculate_hourly_burn_rate_none_blocks (line 194) | def test_calculate_hourly_burn_rate_none_blocks( method test_calculate_hourly_burn_rate_success (line 202) | def test_calculate_hourly_burn_rate_success( method test_calculate_hourly_burn_rate_zero_tokens (line 217) | def test_calculate_hourly_burn_rate_zero_tokens( method test_calculate_total_tokens_in_hour (line 229) | def test_calculate_total_tokens_in_hour( method test_process_block_for_burn_rate_gap_block (line 246) | def test_process_block_for_burn_rate_gap_block( method test_process_block_for_burn_rate_invalid_start_time (line 257) | def test_process_block_for_burn_rate_invalid_start_time( method test_process_block_for_burn_rate_old_session (line 271) | def test_process_block_for_burn_rate_old_session( class TestCalculationEdgeCases (line 287) | class TestCalculationEdgeCases: method test_burn_rate_with_negative_duration (line 290) | def test_burn_rate_with_negative_duration(self) -> None: method test_projection_with_zero_cost (line 303) | def test_projection_with_zero_cost(self) -> None: method test_very_large_token_counts (line 319) | def test_very_large_token_counts(self) -> None: class TestP90Calculator (line 342) | class TestP90Calculator: method test_p90_config_creation (line 345) | def test_p90_config_creation(self) -> None: method test_did_hit_limit_true (line 361) | def test_did_hit_limit_true(self) -> None: method test_did_hit_limit_false (line 373) | def test_did_hit_limit_false(self) -> None: method test_extract_sessions_basic (line 385) | def test_extract_sessions_basic(self) -> None: method test_extract_sessions_complex_filter (line 405) | def test_extract_sessions_complex_filter(self) -> None: method test_calculate_p90_from_blocks_with_hits (line 423) | def test_calculate_p90_from_blocks_with_hits(self) -> None: method test_calculate_p90_from_blocks_no_hits (line 450) | def test_calculate_p90_from_blocks_no_hits(self) -> None: method test_calculate_p90_from_blocks_empty (line 477) | def test_calculate_p90_from_blocks_empty(self) -> None: method test_p90_calculator_init (line 502) | def test_p90_calculator_init(self) -> None: method test_p90_calculator_custom_config (line 513) | def test_p90_calculator_custom_config(self) -> None: method test_p90_calculator_calculate_basic (line 530) | def test_p90_calculator_calculate_basic(self) -> None: method test_p90_calculator_calculate_empty (line 547) | def test_p90_calculator_calculate_empty(self) -> None: method test_p90_calculator_caching (line 557) | def test_p90_calculator_caching(self) -> None: method test_p90_calculation_edge_cases (line 576) | def test_p90_calculation_edge_cases(self) -> None: method test_p90_quantiles_calculation (line 604) | def test_p90_quantiles_calculation(self) -> None: FILE: src/tests/test_cli_main.py class TestMain (line 9) | class TestMain: method test_version_flag (line 12) | def test_version_flag(self) -> None: method test_v_flag (line 20) | def test_v_flag(self) -> None: method test_keyboard_interrupt_handling (line 29) | def test_keyboard_interrupt_handling(self, mock_load: Mock) -> None: method test_exception_handling (line 38) | def test_exception_handling(self, mock_load_settings: Mock) -> None: method test_successful_main_execution (line 47) | def test_successful_main_execution(self, mock_load_settings: Mock) -> ... class TestFunctions (line 99) | class TestFunctions: method test_get_standard_claude_paths (line 102) | def test_get_standard_claude_paths(self) -> None: method test_discover_claude_data_paths_no_paths (line 111) | def test_discover_claude_data_paths_no_paths(self) -> None: method test_discover_claude_data_paths_with_custom (line 119) | def test_discover_claude_data_paths_with_custom(self) -> None: FILE: src/tests/test_data_reader.py class TestLoadUsageEntries (line 32) | class TestLoadUsageEntries: method test_load_usage_entries_basic (line 37) | def test_load_usage_entries_basic( method test_load_usage_entries_no_files (line 73) | def test_load_usage_entries_no_files(self, mock_find_files: Mock) -> N... method test_load_usage_entries_without_raw (line 83) | def test_load_usage_entries_without_raw( method test_load_usage_entries_sorting (line 104) | def test_load_usage_entries_sorting( method test_load_usage_entries_with_cutoff_time (line 132) | def test_load_usage_entries_with_cutoff_time( method test_load_usage_entries_default_path (line 149) | def test_load_usage_entries_default_path(self) -> None: class TestLoadAllRawEntries (line 160) | class TestLoadAllRawEntries: method test_load_all_raw_entries_basic (line 164) | def test_load_all_raw_entries_basic(self, mock_find_files: Mock) -> None: method test_load_all_raw_entries_with_empty_lines (line 182) | def test_load_all_raw_entries_with_empty_lines(self, mock_find_files: ... method test_load_all_raw_entries_with_invalid_json (line 196) | def test_load_all_raw_entries_with_invalid_json( method test_load_all_raw_entries_file_error (line 212) | def test_load_all_raw_entries_file_error(self, mock_find_files: Mock) ... method test_load_all_raw_entries_default_path (line 223) | def test_load_all_raw_entries_default_path(self) -> None: class TestFindJsonlFiles (line 234) | class TestFindJsonlFiles: method test_find_jsonl_files_nonexistent_path (line 237) | def test_find_jsonl_files_nonexistent_path(self) -> None: method test_find_jsonl_files_existing_path (line 244) | def test_find_jsonl_files_existing_path(self) -> None: class TestProcessSingleFile (line 266) | class TestProcessSingleFile: method mock_components (line 270) | def mock_components(self) -> Tuple[Mock, Mock]: method test_process_single_file_valid_data (line 275) | def test_process_single_file_valid_data( method test_process_single_file_without_raw (line 326) | def test_process_single_file_without_raw( method test_process_single_file_filtered_entries (line 366) | def test_process_single_file_filtered_entries(self, mock_components): method test_process_single_file_invalid_json (line 392) | def test_process_single_file_invalid_json(self, mock_components): method test_process_single_file_read_error (line 418) | def test_process_single_file_read_error(self, mock_components): method test_process_single_file_mapping_failure (line 438) | def test_process_single_file_mapping_failure(self, mock_components): class TestShouldProcessEntry (line 466) | class TestShouldProcessEntry: method timezone_handler (line 470) | def timezone_handler(self) -> Mock: method test_should_process_entry_no_cutoff_no_hash (line 473) | def test_should_process_entry_no_cutoff_no_hash( method test_should_process_entry_with_time_filter_pass (line 485) | def test_should_process_entry_with_time_filter_pass( method test_should_process_entry_with_time_filter_fail (line 509) | def test_should_process_entry_with_time_filter_fail(self, timezone_han... method test_should_process_entry_with_duplicate_hash (line 526) | def test_should_process_entry_with_duplicate_hash(self, timezone_handl... method test_should_process_entry_no_timestamp (line 539) | def test_should_process_entry_no_timestamp(self, timezone_handler): method test_should_process_entry_invalid_timestamp (line 550) | def test_should_process_entry_invalid_timestamp(self, timezone_handler): class TestCreateUniqueHash (line 571) | class TestCreateUniqueHash: method test_create_unique_hash_with_message_id_and_request_id (line 574) | def test_create_unique_hash_with_message_id_and_request_id(self) -> None: method test_create_unique_hash_with_nested_message_id (line 580) | def test_create_unique_hash_with_nested_message_id(self) -> None: method test_create_unique_hash_missing_message_id (line 586) | def test_create_unique_hash_missing_message_id(self) -> None: method test_create_unique_hash_missing_request_id (line 592) | def test_create_unique_hash_missing_request_id(self) -> None: method test_create_unique_hash_invalid_message_structure (line 598) | def test_create_unique_hash_invalid_message_structure(self) -> None: method test_create_unique_hash_empty_data (line 604) | def test_create_unique_hash_empty_data(self) -> None: class TestUpdateProcessedHashes (line 611) | class TestUpdateProcessedHashes: method test_update_processed_hashes_valid_hash (line 614) | def test_update_processed_hashes_valid_hash(self) -> None: method test_update_processed_hashes_no_hash (line 626) | def test_update_processed_hashes_no_hash(self) -> None: class TestMapToUsageEntry (line 636) | class TestMapToUsageEntry: method mock_components (line 640) | def mock_components(self) -> Tuple[Mock, Mock]: method test_map_to_usage_entry_valid_data (line 645) | def test_map_to_usage_entry_valid_data( method test_map_to_usage_entry_no_timestamp (line 710) | def test_map_to_usage_entry_no_timestamp( method test_map_to_usage_entry_no_tokens (line 730) | def test_map_to_usage_entry_no_tokens(self, mock_components): method test_map_to_usage_entry_exception_handling (line 761) | def test_map_to_usage_entry_exception_handling(self, mock_components): method test_map_to_usage_entry_minimal_data (line 777) | def test_map_to_usage_entry_minimal_data(self, mock_components): class TestIntegration (line 824) | class TestIntegration: method test_full_workflow_integration (line 827) | def test_full_workflow_integration(self) -> None: method test_error_handling_integration (line 926) | def test_error_handling_integration(self) -> None: class TestPerformanceAndEdgeCases (line 998) | class TestPerformanceAndEdgeCases: method test_large_file_processing (line 1001) | def test_large_file_processing(self) -> None: method test_empty_directory (line 1063) | def test_empty_directory(self) -> None: method test_memory_efficiency (line 1071) | def test_memory_efficiency(self) -> None: class TestUsageEntryMapper (line 1101) | class TestUsageEntryMapper: method mapper_components (line 1105) | def mapper_components(self) -> Tuple[Any, Mock, Mock]: method test_usage_entry_mapper_init (line 1117) | def test_usage_entry_mapper_init( method test_usage_entry_mapper_map_success (line 1126) | def test_usage_entry_mapper_map_success( method test_usage_entry_mapper_map_failure (line 1157) | def test_usage_entry_mapper_map_failure(self, mapper_components): method test_usage_entry_mapper_has_valid_tokens (line 1168) | def test_usage_entry_mapper_has_valid_tokens(self, mapper_components): method test_usage_entry_mapper_extract_timestamp (line 1181) | def test_usage_entry_mapper_extract_timestamp(self, mapper_components): method test_usage_entry_mapper_extract_model (line 1201) | def test_usage_entry_mapper_extract_model(self, mapper_components): method test_usage_entry_mapper_extract_metadata (line 1216) | def test_usage_entry_mapper_extract_metadata(self, mapper_components): method test_usage_entry_mapper_extract_metadata_nested (line 1227) | def test_usage_entry_mapper_extract_metadata_nested(self, mapper_compo... method test_usage_entry_mapper_extract_metadata_defaults (line 1238) | def test_usage_entry_mapper_extract_metadata_defaults(self, mapper_com... class TestAdditionalEdgeCases (line 1250) | class TestAdditionalEdgeCases: method test_create_unique_hash_edge_cases (line 1253) | def test_create_unique_hash_edge_cases(self): method test_should_process_entry_edge_cases (line 1270) | def test_should_process_entry_edge_cases(self): method test_map_to_usage_entry_error_scenarios (line 1288) | def test_map_to_usage_entry_error_scenarios(self): method test_load_usage_entries_timezone_handling (line 1346) | def test_load_usage_entries_timezone_handling(self): method test_process_single_file_empty_file (line 1418) | def test_process_single_file_empty_file(self): method test_load_usage_entries_cost_modes (line 1441) | def test_load_usage_entries_cost_modes(self): class TestDataProcessors (line 1504) | class TestDataProcessors: method test_timestamp_processor_init (line 1507) | def test_timestamp_processor_init(self): method test_timestamp_processor_parse_datetime (line 1520) | def test_timestamp_processor_parse_datetime(self): method test_timestamp_processor_parse_string_iso (line 1534) | def test_timestamp_processor_parse_string_iso(self): method test_timestamp_processor_parse_string_fallback (line 1552) | def test_timestamp_processor_parse_string_fallback(self): method test_timestamp_processor_parse_numeric (line 1567) | def test_timestamp_processor_parse_numeric(self): method test_timestamp_processor_parse_invalid (line 1585) | def test_timestamp_processor_parse_invalid(self): method test_token_extractor_basic_extraction (line 1600) | def test_token_extractor_basic_extraction(self): method test_token_extractor_usage_field (line 1620) | def test_token_extractor_usage_field(self): method test_token_extractor_message_usage (line 1632) | def test_token_extractor_message_usage(self): method test_token_extractor_empty_data (line 1653) | def test_token_extractor_empty_data(self): method test_data_converter_extract_model_name (line 1665) | def test_data_converter_extract_model_name(self): method test_data_converter_flatten_nested_dict (line 1691) | def test_data_converter_flatten_nested_dict(self): method test_data_converter_flatten_with_prefix (line 1712) | def test_data_converter_flatten_with_prefix(self): method test_data_converter_to_serializable (line 1721) | def test_data_converter_to_serializable(self): FILE: src/tests/test_display_controller.py class TestDisplayController (line 17) | class TestDisplayController: method controller (line 21) | def controller(self) -> Any: method sample_active_block (line 26) | def sample_active_block(self) -> Dict[str, Any]: method sample_args (line 46) | def sample_args(self) -> Mock: method test_init (line 55) | def test_init(self, controller: Any) -> None: method test_extract_session_data (line 64) | def test_extract_session_data( method test_calculate_token_limits_standard_plan (line 76) | def test_calculate_token_limits_standard_plan(self, controller, sample... method test_calculate_token_limits_custom_plan (line 84) | def test_calculate_token_limits_custom_plan(self, controller, sample_a... method test_calculate_token_limits_custom_plan_no_limit (line 94) | def test_calculate_token_limits_custom_plan_no_limit(self, controller,... method test_calculate_time_data (line 105) | def test_calculate_time_data(self, mock_burn_rate, controller): method test_calculate_cost_predictions_valid_plan (line 129) | def test_calculate_cost_predictions_valid_plan( method test_calculate_cost_predictions_invalid_plan (line 153) | def test_calculate_cost_predictions_invalid_plan(self, controller, sam... method test_check_notifications_switch_to_custom (line 173) | def test_check_notifications_switch_to_custom(self, controller): method test_check_notifications_exceed_limit (line 207) | def test_check_notifications_exceed_limit(self, controller): method test_check_notifications_cost_will_exceed (line 241) | def test_check_notifications_cost_will_exceed(self, controller): method test_format_display_times (line 271) | def test_format_display_times( method test_calculate_model_distribution_empty_stats (line 300) | def test_calculate_model_distribution_empty_stats(self, controller): method test_calculate_model_distribution_valid_stats (line 306) | def test_calculate_model_distribution_valid_stats(self, mock_normalize... method test_create_data_display_no_data (line 327) | def test_create_data_display_no_data(self, controller, sample_args): method test_create_data_display_no_active_block (line 334) | def test_create_data_display_no_active_block(self, controller, sample_... method test_create_data_display_with_active_block (line 346) | def test_create_data_display_with_active_block( method test_create_loading_display (line 400) | def test_create_loading_display(self, controller): method test_create_error_display (line 406) | def test_create_error_display(self, controller): method test_create_live_context (line 412) | def test_create_live_context(self, controller): method test_set_screen_dimensions (line 418) | def test_set_screen_dimensions(self, controller): class TestLiveDisplayManager (line 425) | class TestLiveDisplayManager: method test_init_default (line 428) | def test_init_default(self): method test_init_with_console (line 436) | def test_init_with_console(self): method test_create_live_display_default (line 444) | def test_create_live_display_default(self, mock_live_class): method test_create_live_display_custom (line 461) | def test_create_live_display_custom(self, mock_live_class): class TestScreenBufferManager (line 481) | class TestScreenBufferManager: method test_init (line 484) | def test_init(self): method test_create_screen_renderable (line 493) | def test_create_screen_renderable(self, mock_group, mock_text, mock_ge... method test_create_screen_renderable_with_objects (line 515) | def test_create_screen_renderable_with_objects(self, mock_group, mock_... class TestDisplayControllerEdgeCases (line 533) | class TestDisplayControllerEdgeCases: method controller (line 537) | def controller(self): method sample_args (line 543) | def sample_args(self): method test_process_active_session_data_exception_handling (line 552) | def test_process_active_session_data_exception_handling( method test_format_display_times_invalid_timezone (line 569) | def test_format_display_times_invalid_timezone(self, controller, sampl... method test_calculate_model_distribution_invalid_stats (line 586) | def test_calculate_model_distribution_invalid_stats(self, controller): class TestDisplayControllerAdvanced (line 600) | class TestDisplayControllerAdvanced: method controller (line 604) | def controller(self): method sample_args_custom (line 610) | def sample_args_custom(self): method test_create_data_display_custom_plan (line 622) | def test_create_data_display_custom_plan( method test_create_data_display_exception_handling (line 687) | def test_create_data_display_exception_handling(self, controller): method test_create_data_display_format_session_exception (line 714) | def test_create_data_display_format_session_exception(self, controller): method test_process_active_session_data_comprehensive (line 765) | def test_process_active_session_data_comprehensive(self, controller): class TestSessionCalculator (line 845) | class TestSessionCalculator: method calculator (line 849) | def calculator(self): method test_init (line 853) | def test_init(self, calculator): method test_calculate_time_data_with_start_end (line 857) | def test_calculate_time_data_with_start_end(self, calculator): method test_calculate_time_data_no_end_time (line 880) | def test_calculate_time_data_no_end_time(self, calculator): method test_calculate_time_data_no_start_time (line 899) | def test_calculate_time_data_no_start_time(self, calculator): method test_calculate_cost_predictions_with_cost (line 913) | def test_calculate_cost_predictions_with_cost(self, calculator): method test_calculate_cost_predictions_no_cost_limit (line 933) | def test_calculate_cost_predictions_no_cost_limit(self, calculator): method test_calculate_cost_predictions_zero_cost_rate (line 954) | def test_calculate_cost_predictions_zero_cost_rate(self, calculator): function test_create_screen_renderable_legacy (line 978) | def test_create_screen_renderable_legacy(mock_manager_class): FILE: src/tests/test_error_handling.py class TestErrorLevel (line 11) | class TestErrorLevel: method test_error_level_values (line 14) | def test_error_level_values(self) -> None: method test_error_level_string_conversion (line 19) | def test_error_level_string_conversion(self) -> None: class TestReportError (line 25) | class TestReportError: method sample_exception (line 29) | def sample_exception(self) -> ValueError: method sample_context_data (line 37) | def sample_context_data(self) -> Dict[str, str]: method sample_tags (line 46) | def sample_tags(self) -> Dict[str, str]: method test_report_error_basic (line 51) | def test_report_error_basic( method test_report_error_with_full_context (line 65) | def test_report_error_with_full_context( method test_report_error_with_info_level (line 96) | def test_report_error_with_info_level( method test_report_error_logging_only (line 114) | def test_report_error_logging_only( method test_report_error_with_context (line 130) | def test_report_error_with_context( method test_report_error_exception_handling (line 152) | def test_report_error_exception_handling( method test_report_error_none_exception (line 167) | def test_report_error_none_exception(self) -> None: method test_report_error_empty_component (line 181) | def test_report_error_empty_component(self, sample_exception: ValueErr... method test_report_error_no_tags (line 195) | def test_report_error_no_tags( method test_report_error_no_context (line 209) | def test_report_error_no_context( method test_report_error_complex_exception (line 228) | def test_report_error_complex_exception(self, mock_get_logger: Mock) -... method test_report_error_empty_tags_dict (line 247) | def test_report_error_empty_tags_dict( method test_report_error_special_characters_in_component (line 265) | def test_report_error_special_characters_in_component( class TestErrorHandlingEdgeCases (line 281) | class TestErrorHandlingEdgeCases: method test_error_level_equality (line 284) | def test_error_level_equality(self) -> None: method test_error_level_in_list (line 290) | def test_error_level_in_list(self) -> None: method test_report_error_with_unicode_data (line 298) | def test_report_error_with_unicode_data(self, mock_get_logger: Mock) -... FILE: src/tests/test_formatting.py class TestFormatTime (line 20) | class TestFormatTime: method test_format_time_less_than_hour (line 23) | def test_format_time_less_than_hour(self) -> None: method test_format_time_exact_hours (line 30) | def test_format_time_exact_hours(self) -> None: method test_format_time_hours_and_minutes (line 36) | def test_format_time_hours_and_minutes(self) -> None: method test_format_time_large_values (line 43) | def test_format_time_large_values(self) -> None: method test_format_time_float_values (line 49) | def test_format_time_float_values(self) -> None: class TestFormatCurrency (line 58) | class TestFormatCurrency: method test_format_usd_default (line 61) | def test_format_usd_default(self) -> None: method test_format_usd_explicit (line 69) | def test_format_usd_explicit(self) -> None: method test_format_other_currencies (line 74) | def test_format_other_currencies(self) -> None: method test_format_currency_edge_cases (line 80) | def test_format_currency_edge_cases(self) -> None: class TestGetTimeFormatPreference (line 87) | class TestGetTimeFormatPreference: method test_get_time_format_preference_no_args (line 91) | def test_get_time_format_preference_no_args(self, mock_get_pref: Mock)... method test_get_time_format_preference_with_args (line 99) | def test_get_time_format_preference_with_args(self, mock_get_pref: Moc... class TestFormatDisplayTime (line 108) | class TestFormatDisplayTime: method setUp (line 111) | def setUp(self) -> None: method test_format_display_time_24h_with_seconds (line 116) | def test_format_display_time_24h_with_seconds(self, mock_pref: Mock) -... method test_format_display_time_24h_without_seconds (line 124) | def test_format_display_time_24h_without_seconds(self, mock_pref: Mock... method test_format_display_time_12h_with_seconds (line 132) | def test_format_display_time_12h_with_seconds(self, mock_pref: Mock) -... method test_format_display_time_12h_without_seconds (line 141) | def test_format_display_time_12h_without_seconds(self, mock_pref: Mock... method test_format_display_time_auto_preference (line 150) | def test_format_display_time_auto_preference(self, mock_pref: Mock) ->... method test_format_display_time_platform_compatibility (line 159) | def test_format_display_time_platform_compatibility(self) -> None: method test_format_display_time_edge_cases (line 173) | def test_format_display_time_edge_cases(self) -> None: class TestFormattingAdvanced (line 191) | class TestFormattingAdvanced: method test_format_currency_extensive_edge_cases (line 194) | def test_format_currency_extensive_edge_cases(self) -> None: method test_format_currency_precision_handling (line 212) | def test_format_currency_precision_handling(self) -> None: method test_format_currency_international_formats (line 221) | def test_format_currency_international_formats(self) -> None: method test_format_time_comprehensive_coverage (line 242) | def test_format_time_comprehensive_coverage(self) -> None: method test_format_time_extreme_values (line 263) | def test_format_time_extreme_values(self) -> None: method test_format_display_time_comprehensive_platform_support (line 274) | def test_format_display_time_comprehensive_platform_support(self) -> N... method test_get_time_format_preference_edge_cases (line 297) | def test_get_time_format_preference_edge_cases(self) -> None: method test_internal_get_pref_function (line 318) | def test_internal_get_pref_function(self) -> None: class TestFormattingErrorHandling (line 333) | class TestFormattingErrorHandling: method test_format_currency_error_conditions (line 336) | def test_format_currency_error_conditions(self) -> None: method test_format_time_error_conditions (line 355) | def test_format_time_error_conditions(self) -> None: method test_format_display_time_invalid_inputs (line 366) | def test_format_display_time_invalid_inputs(self) -> None: class TestFormattingPerformance (line 378) | class TestFormattingPerformance: method test_format_currency_performance_with_large_datasets (line 381) | def test_format_currency_performance_with_large_datasets(self) -> None: method test_format_time_performance_with_large_datasets (line 397) | def test_format_time_performance_with_large_datasets(self) -> None: class TestModelUtils (line 414) | class TestModelUtils: method test_normalize_model_name (line 417) | def test_normalize_model_name(self) -> None: method test_get_model_display_name (line 436) | def test_get_model_display_name(self) -> None: method test_is_claude_model (line 449) | def test_is_claude_model(self) -> None: method test_get_model_generation (line 462) | def test_get_model_generation(self) -> None: FILE: src/tests/test_monitoring_orchestrator.py function mock_data_manager (line 15) | def mock_data_manager() -> Mock: function mock_session_monitor (line 33) | def mock_session_monitor() -> Mock: function orchestrator (line 43) | def orchestrator( class TestMonitoringOrchestratorInit (line 60) | class TestMonitoringOrchestratorInit: method test_init_with_defaults (line 63) | def test_init_with_defaults(self) -> None: method test_init_with_custom_params (line 81) | def test_init_with_custom_params(self) -> None: class TestMonitoringOrchestratorLifecycle (line 95) | class TestMonitoringOrchestratorLifecycle: method test_start_monitoring (line 98) | def test_start_monitoring(self, orchestrator: MonitoringOrchestrator) ... method test_start_monitoring_already_running (line 112) | def test_start_monitoring_already_running( method test_stop_monitoring (line 123) | def test_stop_monitoring(self, orchestrator: MonitoringOrchestrator) -... method test_stop_monitoring_not_running (line 133) | def test_stop_monitoring_not_running( method test_stop_monitoring_with_timeout (line 143) | def test_stop_monitoring_with_timeout( class TestMonitoringOrchestratorCallbacks (line 159) | class TestMonitoringOrchestratorCallbacks: method test_register_update_callback (line 162) | def test_register_update_callback( method test_register_duplicate_callback (line 172) | def test_register_duplicate_callback( method test_register_session_callback (line 183) | def test_register_session_callback( class TestMonitoringOrchestratorDataProcessing (line 194) | class TestMonitoringOrchestratorDataProcessing: method test_force_refresh (line 197) | def test_force_refresh(self, orchestrator: MonitoringOrchestrator) -> ... method test_force_refresh_no_data (line 209) | def test_force_refresh_no_data(self, orchestrator: MonitoringOrchestra... method test_set_args (line 217) | def test_set_args(self, orchestrator: MonitoringOrchestrator) -> None: method test_wait_for_initial_data_success (line 226) | def test_wait_for_initial_data_success( method test_wait_for_initial_data_timeout (line 241) | def test_wait_for_initial_data_timeout( class TestMonitoringOrchestratorMonitoringLoop (line 251) | class TestMonitoringOrchestratorMonitoringLoop: method test_monitoring_loop_initial_fetch (line 254) | def test_monitoring_loop_initial_fetch( method test_monitoring_loop_periodic_updates (line 269) | def test_monitoring_loop_periodic_updates( method test_monitoring_loop_stop_event (line 285) | def test_monitoring_loop_stop_event( class TestMonitoringOrchestratorFetchAndProcess (line 302) | class TestMonitoringOrchestratorFetchAndProcess: method test_fetch_and_process_success (line 305) | def test_fetch_and_process_success( method test_fetch_and_process_no_data (line 341) | def test_fetch_and_process_no_data( method test_fetch_and_process_validation_failure (line 351) | def test_fetch_and_process_validation_failure( method test_fetch_and_process_callback_success (line 363) | def test_fetch_and_process_callback_success( method test_fetch_and_process_callback_error (line 394) | def test_fetch_and_process_callback_error( method test_fetch_and_process_exception_handling (line 423) | def test_fetch_and_process_exception_handling( method test_fetch_and_process_first_data_event (line 437) | def test_fetch_and_process_first_data_event( class TestMonitoringOrchestratorTokenLimitCalculation (line 459) | class TestMonitoringOrchestratorTokenLimitCalculation: method test_calculate_token_limit_no_args (line 462) | def test_calculate_token_limit_no_args( method test_calculate_token_limit_pro_plan (line 472) | def test_calculate_token_limit_pro_plan( method test_calculate_token_limit_custom_plan (line 491) | def test_calculate_token_limit_custom_plan( method test_calculate_token_limit_exception (line 514) | def test_calculate_token_limit_exception( class TestMonitoringOrchestratorIntegration (line 533) | class TestMonitoringOrchestratorIntegration: method test_full_monitoring_cycle (line 536) | def test_full_monitoring_cycle(self, orchestrator: MonitoringOrchestra... method test_monitoring_with_session_changes (line 586) | def test_monitoring_with_session_changes( method test_monitoring_error_recovery (line 659) | def test_monitoring_error_recovery( class TestMonitoringOrchestratorThreadSafety (line 704) | class TestMonitoringOrchestratorThreadSafety: method test_concurrent_callback_registration (line 707) | def test_concurrent_callback_registration( method test_concurrent_start_stop (line 733) | def test_concurrent_start_stop(self, orchestrator: MonitoringOrchestra... class TestMonitoringOrchestratorProperties (line 758) | class TestMonitoringOrchestratorProperties: method test_last_valid_data_property (line 761) | def test_last_valid_data_property( method test_monitoring_state_consistency (line 781) | def test_monitoring_state_consistency( class TestSessionMonitor (line 800) | class TestSessionMonitor: method test_session_monitor_init (line 803) | def test_session_monitor_init(self) -> None: method test_session_monitor_update_valid_data (line 813) | def test_session_monitor_update_valid_data(self) -> None: method test_session_monitor_update_invalid_data (line 836) | def test_session_monitor_update_invalid_data(self) -> None: method test_session_monitor_validation_empty_data (line 847) | def test_session_monitor_validation_empty_data(self) -> None: method test_session_monitor_validation_missing_blocks (line 858) | def test_session_monitor_validation_missing_blocks(self) -> None: method test_session_monitor_validation_invalid_blocks (line 870) | def test_session_monitor_validation_invalid_blocks(self) -> None: method test_session_monitor_register_callback (line 882) | def test_session_monitor_register_callback(self) -> None: method test_session_monitor_callback_execution (line 893) | def test_session_monitor_callback_execution(self) -> None: method test_session_monitor_session_history (line 920) | def test_session_monitor_session_history(self) -> None: method test_session_monitor_current_session_tracking (line 943) | def test_session_monitor_current_session_tracking(self) -> None: method test_session_monitor_multiple_blocks (line 966) | def test_session_monitor_multiple_blocks(self) -> None: method test_session_monitor_no_active_session (line 996) | def test_session_monitor_no_active_session(self) -> None: FILE: src/tests/test_pricing.py class TestPricingCalculator (line 11) | class TestPricingCalculator: method calculator (line 15) | def calculator(self) -> PricingCalculator: method custom_pricing (line 20) | def custom_pricing(self) -> Dict[str, Dict[str, float]]: method custom_calculator (line 32) | def custom_calculator( method sample_entry_data (line 39) | def sample_entry_data(self) -> Dict[str, Union[str, int, None]]: method token_counts (line 51) | def token_counts(self) -> TokenCounts: method test_init_default_pricing (line 60) | def test_init_default_pricing(self, calculator: PricingCalculator) -> ... method test_init_custom_pricing (line 69) | def test_init_custom_pricing( method test_fallback_pricing_structure (line 78) | def test_fallback_pricing_structure(self, calculator: PricingCalculato... method test_calculate_cost_claude_3_haiku_basic (line 98) | def test_calculate_cost_claude_3_haiku_basic( method test_calculate_cost_claude_3_opus_with_cache (line 110) | def test_calculate_cost_claude_3_opus_with_cache( method test_calculate_cost_claude_3_sonnet (line 131) | def test_calculate_cost_claude_3_sonnet( method test_calculate_cost_claude_3_5_sonnet (line 142) | def test_calculate_cost_claude_3_5_sonnet( method test_calculate_cost_with_token_counts_object (line 153) | def test_calculate_cost_with_token_counts_object( method test_calculate_cost_token_counts_overrides_individual_params (line 167) | def test_calculate_cost_token_counts_overrides_individual_params( method test_calculate_cost_synthetic_model (line 187) | def test_calculate_cost_synthetic_model( method test_calculate_cost_unknown_model (line 196) | def test_calculate_cost_unknown_model(self, calculator: PricingCalcula... method test_calculate_cost_zero_tokens (line 203) | def test_calculate_cost_zero_tokens(self, calculator: PricingCalculato... method test_calculate_cost_for_entry_auto_mode (line 210) | def test_calculate_cost_for_entry_auto_mode( method test_calculate_cost_for_entry_cached_mode_with_existing_cost (line 226) | def test_calculate_cost_for_entry_cached_mode_with_existing_cost( method test_calculate_cost_for_entry_cached_mode_without_existing_cost (line 240) | def test_calculate_cost_for_entry_cached_mode_without_existing_cost( method test_calculate_cost_for_entry_calculated_mode (line 252) | def test_calculate_cost_for_entry_calculated_mode( method test_calculate_cost_for_entry_missing_model (line 269) | def test_calculate_cost_for_entry_missing_model( method test_calculate_cost_for_entry_with_defaults (line 282) | def test_calculate_cost_for_entry_with_defaults( method test_custom_pricing_calculator (line 294) | def test_custom_pricing_calculator( method test_cost_calculation_precision (line 305) | def test_cost_calculation_precision(self, calculator: PricingCalculato... method test_cost_calculation_large_numbers (line 315) | def test_cost_calculation_large_numbers( method test_all_supported_models (line 328) | def test_all_supported_models(self, calculator: PricingCalculator) -> ... method test_cache_token_costs (line 347) | def test_cache_token_costs(self, calculator: PricingCalculator) -> None: method test_model_name_normalization_integration (line 373) | def test_model_name_normalization_integration( FILE: src/tests/test_session_analyzer.py class TestSessionAnalyzer (line 10) | class TestSessionAnalyzer: method test_session_analyzer_init (line 13) | def test_session_analyzer_init(self) -> None: method test_session_analyzer_init_custom_duration (line 21) | def test_session_analyzer_init_custom_duration(self) -> None: method test_transform_to_blocks_empty_list (line 28) | def test_transform_to_blocks_empty_list(self) -> None: method test_transform_to_blocks_single_entry (line 35) | def test_transform_to_blocks_single_entry(self) -> None: method test_transform_to_blocks_multiple_entries_same_block (line 53) | def test_transform_to_blocks_multiple_entries_same_block(self) -> None: method test_transform_to_blocks_multiple_blocks (line 80) | def test_transform_to_blocks_multiple_blocks(self) -> None: method test_should_create_new_block_time_gap (line 108) | def test_should_create_new_block_time_gap(self) -> None: method test_round_to_hour (line 140) | def test_round_to_hour(self) -> None: method test_create_new_block (line 164) | def test_create_new_block(self) -> None: method test_add_entry_to_block (line 182) | def test_add_entry_to_block(self) -> None: method test_finalize_block (line 216) | def test_finalize_block(self) -> None: method test_detect_limits_empty_list (line 242) | def test_detect_limits_empty_list(self) -> None: method test_detect_limits_no_limits (line 249) | def test_detect_limits_no_limits(self) -> None: method test_detect_single_limit_rate_limit (line 265) | def test_detect_single_limit_rate_limit(self) -> None: method test_detect_single_limit_opus_limit (line 287) | def test_detect_single_limit_opus_limit(self) -> None: method test_is_opus_limit (line 309) | def test_is_opus_limit(self) -> None: method test_extract_wait_time (line 333) | def test_extract_wait_time(self) -> None: method test_parse_reset_timestamp (line 352) | def test_parse_reset_timestamp(self) -> None: method test_mark_active_blocks (line 368) | def test_mark_active_blocks(self) -> None: class TestSessionAnalyzerIntegration (line 396) | class TestSessionAnalyzerIntegration: method test_full_analysis_workflow (line 399) | def test_full_analysis_workflow(self) -> None: method test_limit_detection_workflow (line 447) | def test_limit_detection_workflow(self) -> None: class TestSessionAnalyzerEdgeCases (line 484) | class TestSessionAnalyzerEdgeCases: method test_malformed_entry_handling (line 487) | def test_malformed_entry_handling(self) -> None: method test_negative_token_counts (line 504) | def test_negative_token_counts(self) -> None: method test_very_large_time_gaps (line 522) | def test_very_large_time_gaps(self) -> None: FILE: src/tests/test_settings.py class TestLastUsedParams (line 15) | class TestLastUsedParams: method setup_method (line 18) | def setup_method(self) -> None: method teardown_method (line 23) | def teardown_method(self) -> None: method test_init_default_config_dir (line 29) | def test_init_default_config_dir(self) -> None: method test_init_custom_config_dir (line 36) | def test_init_custom_config_dir(self) -> None: method test_save_success (line 43) | def test_save_success(self) -> None: method test_save_without_custom_limit (line 81) | def test_save_without_custom_limit(self) -> None: method test_save_creates_directory (line 106) | def test_save_creates_directory(self) -> None: method test_save_error_handling (line 133) | def test_save_error_handling(self, mock_logger: Mock) -> None: method test_load_success (line 153) | def test_load_success(self) -> None: method test_load_file_not_exists (line 182) | def test_load_file_not_exists(self) -> None: method test_load_error_handling (line 188) | def test_load_error_handling(self, mock_logger: Mock) -> None: method test_clear_success (line 199) | def test_clear_success(self) -> None: method test_clear_file_not_exists (line 213) | def test_clear_file_not_exists(self) -> None: method test_clear_error_handling (line 219) | def test_clear_error_handling(self, mock_logger: Mock) -> None: method test_exists_true (line 229) | def test_exists_true(self) -> None: method test_exists_false (line 236) | def test_exists_false(self) -> None: class TestSettings (line 241) | class TestSettings: method test_default_values (line 244) | def test_default_values(self) -> None: method test_plan_validator_valid_values (line 262) | def test_plan_validator_valid_values(self) -> None: method test_plan_validator_case_insensitive (line 270) | def test_plan_validator_case_insensitive(self) -> None: method test_plan_validator_invalid_value (line 278) | def test_plan_validator_invalid_value(self) -> None: method test_theme_validator_valid_values (line 283) | def test_theme_validator_valid_values(self) -> None: method test_theme_validator_case_insensitive (line 291) | def test_theme_validator_case_insensitive(self) -> None: method test_theme_validator_invalid_value (line 299) | def test_theme_validator_invalid_value(self) -> None: method test_timezone_validator_valid_values (line 304) | def test_timezone_validator_valid_values(self) -> None: method test_timezone_validator_invalid_value (line 320) | def test_timezone_validator_invalid_value(self) -> None: method test_time_format_validator_valid_values (line 325) | def test_time_format_validator_valid_values(self) -> None: method test_time_format_validator_invalid_value (line 333) | def test_time_format_validator_invalid_value(self) -> None: method test_log_level_validator_valid_values (line 338) | def test_log_level_validator_valid_values(self) -> None: method test_log_level_validator_invalid_value (line 350) | def test_log_level_validator_invalid_value(self) -> None: method test_field_constraints (line 355) | def test_field_constraints(self) -> None: method test_load_with_last_used_version_flag (line 385) | def test_load_with_last_used_version_flag( method test_load_with_last_used_clear_flag (line 398) | def test_load_with_last_used_clear_flag( method test_load_with_last_used_merge_params (line 426) | def test_load_with_last_used_merge_params( method test_load_with_last_used_cli_priority (line 460) | def test_load_with_last_used_cli_priority( method test_load_with_last_used_auto_timezone (line 491) | def test_load_with_last_used_auto_timezone( method test_load_with_last_used_debug_flag (line 510) | def test_load_with_last_used_debug_flag( method test_load_with_last_used_theme_detection (line 530) | def test_load_with_last_used_theme_detection( method test_load_with_last_used_custom_plan_reset (line 556) | def test_load_with_last_used_custom_plan_reset( method test_to_namespace (line 576) | def test_to_namespace(self) -> None: method test_to_namespace_none_values (line 608) | def test_to_namespace_none_values(self) -> None: class TestSettingsIntegration (line 618) | class TestSettingsIntegration: method test_complete_workflow (line 621) | def test_complete_workflow(self) -> None: method test_settings_customise_sources (line 657) | def test_settings_customise_sources(self) -> None: FILE: src/tests/test_table_views.py class TestTableViewsController (line 12) | class TestTableViewsController: method controller (line 16) | def controller(self) -> TableViewsController: method sample_daily_data (line 21) | def sample_daily_data(self) -> List[Dict[str, Any]]: method sample_monthly_data (line 75) | def sample_monthly_data(self) -> List[Dict[str, Any]]: method sample_totals (line 137) | def sample_totals(self) -> Dict[str, Any]: method test_init_styles (line 149) | def test_init_styles(self, controller: TableViewsController) -> None: method test_create_daily_table_structure (line 160) | def test_create_daily_table_structure( method test_create_daily_table_data (line 189) | def test_create_daily_table_data( method test_create_monthly_table_structure (line 205) | def test_create_monthly_table_structure( method test_create_monthly_table_data (line 236) | def test_create_monthly_table_data( method test_create_summary_panel (line 254) | def test_create_summary_panel( method test_format_models_single (line 267) | def test_format_models_single(self, controller: TableViewsController) ... method test_format_models_multiple (line 272) | def test_format_models_multiple(self, controller: TableViewsController... method test_format_models_empty (line 280) | def test_format_models_empty(self, controller: TableViewsController) -... method test_create_no_data_display (line 285) | def test_create_no_data_display(self, controller: TableViewsController... method test_create_aggregate_table_daily (line 296) | def test_create_aggregate_table_daily( method test_create_aggregate_table_monthly (line 310) | def test_create_aggregate_table_monthly( method test_create_aggregate_table_invalid_view_type (line 324) | def test_create_aggregate_table_invalid_view_type( method test_daily_table_timezone_display (line 336) | def test_daily_table_timezone_display( method test_monthly_table_timezone_display (line 350) | def test_monthly_table_timezone_display( method test_table_with_zero_tokens (line 362) | def test_table_with_zero_tokens(self, controller: TableViewsController... method test_summary_panel_different_periods (line 396) | def test_summary_panel_different_periods( method test_no_data_display_different_view_types (line 413) | def test_no_data_display_different_view_types( method test_number_formatting_integration (line 422) | def test_number_formatting_integration( method test_currency_formatting_integration (line 436) | def test_currency_formatting_integration( method test_table_column_alignment (line 450) | def test_table_column_alignment( method test_empty_data_lists (line 463) | def test_empty_data_lists(self, controller: TableViewsController) -> N... FILE: src/tests/test_time_utils.py class TestTimeFormatDetector (line 25) | class TestTimeFormatDetector: method test_detect_from_cli_12h (line 28) | def test_detect_from_cli_12h(self) -> None: method test_detect_from_cli_24h (line 36) | def test_detect_from_cli_24h(self) -> None: method test_detect_from_cli_none (line 44) | def test_detect_from_cli_none(self) -> None: method test_detect_from_cli_no_args (line 52) | def test_detect_from_cli_no_args(self) -> None: method test_detect_from_cli_no_attribute (line 57) | def test_detect_from_cli_no_attribute(self) -> None: method test_detect_from_timezone_with_babel_12h (line 67) | def test_detect_from_timezone_with_babel_12h(self, mock_get_location: ... method test_detect_from_timezone_with_babel_24h (line 76) | def test_detect_from_timezone_with_babel_24h(self, mock_get_location: ... method test_detect_from_timezone_with_babel_exception (line 85) | def test_detect_from_timezone_with_babel_exception( method test_detect_from_timezone_no_babel (line 95) | def test_detect_from_timezone_no_babel(self) -> None: method test_detect_from_locale_12h_ampm (line 102) | def test_detect_from_locale_12h_ampm( method test_detect_from_locale_12h_dt_fmt (line 115) | def test_detect_from_locale_12h_dt_fmt( method test_detect_from_locale_24h (line 128) | def test_detect_from_locale_24h( method test_detect_from_locale_exception (line 138) | def test_detect_from_locale_exception(self, mock_setlocale: Mock) -> N... method test_detect_from_system_macos_12h (line 147) | def test_detect_from_system_macos_12h( method test_detect_from_system_macos_24h (line 170) | def test_detect_from_system_macos_24h( method test_detect_from_system_linux_12h (line 193) | def test_detect_from_system_linux_12h( method test_detect_from_system_linux_24h (line 209) | def test_detect_from_system_linux_24h( method test_detect_from_system_windows_12h (line 225) | def test_detect_from_system_windows_12h(self, mock_system: Mock) -> None: method test_detect_from_system_windows_24h (line 243) | def test_detect_from_system_windows_24h(self, mock_system: Mock) -> None: method test_detect_from_system_windows_exception (line 261) | def test_detect_from_system_windows_exception(self, mock_system: Mock)... method test_detect_from_system_unknown_platform (line 278) | def test_detect_from_system_unknown_platform(self, mock_system: Mock) ... method test_get_preference_cli_priority (line 286) | def test_get_preference_cli_priority(self) -> None: method test_get_preference_timezone_fallback (line 297) | def test_get_preference_timezone_fallback(self) -> None: method test_get_preference_system_fallback (line 308) | def test_get_preference_system_fallback(self) -> None: class TestSystemTimeDetector (line 318) | class TestSystemTimeDetector: method test_get_timezone_linux_timezone_file (line 325) | def test_get_timezone_linux_timezone_file( method test_get_timezone_linux_timedatectl (line 345) | def test_get_timezone_linux_timedatectl( method test_get_timezone_windows (line 364) | def test_get_timezone_windows(self, mock_run: Mock, mock_system: Mock)... method test_get_timezone_unknown_system (line 377) | def test_get_timezone_unknown_system(self, mock_system: Mock) -> None: method test_get_time_format (line 384) | def test_get_time_format(self) -> None: class TestTimezoneHandler (line 391) | class TestTimezoneHandler: method test_init_default (line 394) | def test_init_default(self) -> None: method test_init_custom_valid (line 399) | def test_init_custom_valid(self) -> None: method test_init_custom_invalid (line 404) | def test_init_custom_invalid(self) -> None: method test_validate_and_get_tz_valid (line 411) | def test_validate_and_get_tz_valid(self) -> None: method test_validate_and_get_tz_invalid (line 417) | def test_validate_and_get_tz_invalid(self) -> None: method test_parse_timestamp_iso_with_z (line 425) | def test_parse_timestamp_iso_with_z(self) -> None: method test_parse_timestamp_iso_with_offset (line 433) | def test_parse_timestamp_iso_with_offset(self) -> None: method test_parse_timestamp_iso_with_microseconds (line 441) | def test_parse_timestamp_iso_with_microseconds(self) -> None: method test_parse_timestamp_iso_no_timezone (line 449) | def test_parse_timestamp_iso_no_timezone(self) -> None: method test_parse_timestamp_invalid_iso (line 457) | def test_parse_timestamp_invalid_iso(self) -> None: method test_parse_timestamp_alternative_formats (line 465) | def test_parse_timestamp_alternative_formats(self) -> None: method test_parse_timestamp_empty (line 481) | def test_parse_timestamp_empty(self) -> None: method test_parse_timestamp_none (line 487) | def test_parse_timestamp_none(self) -> None: method test_parse_timestamp_invalid_format (line 493) | def test_parse_timestamp_invalid_format(self) -> None: method test_ensure_utc_naive (line 499) | def test_ensure_utc_naive(self) -> None: method test_ensure_utc_aware (line 507) | def test_ensure_utc_aware(self) -> None: method test_ensure_timezone_naive (line 515) | def test_ensure_timezone_naive(self) -> None: method test_ensure_timezone_aware (line 523) | def test_ensure_timezone_aware(self) -> None: method test_validate_timezone_valid (line 531) | def test_validate_timezone_valid(self) -> None: method test_validate_timezone_invalid (line 537) | def test_validate_timezone_invalid(self) -> None: method test_convert_to_timezone_naive (line 542) | def test_convert_to_timezone_naive(self) -> None: method test_convert_to_timezone_aware (line 550) | def test_convert_to_timezone_aware(self) -> None: method test_set_timezone (line 558) | def test_set_timezone(self) -> None: method test_to_utc (line 564) | def test_to_utc(self) -> None: method test_to_timezone_default (line 572) | def test_to_timezone_default(self) -> None: method test_to_timezone_specific (line 580) | def test_to_timezone_specific(self) -> None: method test_format_datetime_default (line 588) | def test_format_datetime_default(self) -> None: method test_format_datetime_24h (line 597) | def test_format_datetime_24h(self) -> None: method test_format_datetime_12h (line 605) | def test_format_datetime_12h(self) -> None: class TestPublicAPI (line 614) | class TestPublicAPI: method test_get_time_format_preference (line 617) | def test_get_time_format_preference(self) -> None: method test_get_system_timezone (line 629) | def test_get_system_timezone(self) -> None: method test_get_system_time_format (line 638) | def test_get_system_time_format(self) -> None: class TestFormattingUtilities (line 648) | class TestFormattingUtilities: method test_format_time_minutes_only (line 651) | def test_format_time_minutes_only(self) -> None: method test_format_time_hours_only (line 656) | def test_format_time_hours_only(self) -> None: method test_format_time_hours_and_minutes (line 662) | def test_format_time_hours_and_minutes(self) -> None: method test_percentage_normal (line 668) | def test_percentage_normal(self) -> None: method test_percentage_zero_whole (line 674) | def test_percentage_zero_whole(self) -> None: method test_percentage_decimal_places (line 678) | def test_percentage_decimal_places(self) -> None: method test_format_display_time_12h_with_seconds (line 684) | def test_format_display_time_12h_with_seconds(self) -> None: method test_format_display_time_12h_without_seconds (line 706) | def test_format_display_time_12h_without_seconds(self) -> None: method test_format_display_time_24h_with_seconds (line 719) | def test_format_display_time_24h_with_seconds(self) -> None: method test_format_display_time_24h_without_seconds (line 726) | def test_format_display_time_24h_without_seconds(self) -> None: method test_format_display_time_auto_detect (line 733) | def test_format_display_time_auto_detect(self) -> None: method test_format_display_time_windows_fallback (line 744) | def test_format_display_time_windows_fallback(self) -> None: FILE: src/tests/test_timezone.py class TestTimezoneHandler (line 16) | class TestTimezoneHandler: method handler (line 20) | def handler(self) -> TimezoneHandler: method custom_handler (line 25) | def custom_handler(self) -> TimezoneHandler: method test_init_default_timezone (line 29) | def test_init_default_timezone(self, handler: TimezoneHandler) -> None: method test_init_custom_timezone (line 34) | def test_init_custom_timezone(self, custom_handler: TimezoneHandler) -... method test_init_invalid_timezone_fallback (line 38) | def test_init_invalid_timezone_fallback(self) -> None: method test_validate_timezone_valid_timezones (line 46) | def test_validate_timezone_valid_timezones(self, handler: TimezoneHand... method test_validate_timezone_invalid_timezones (line 59) | def test_validate_timezone_invalid_timezones( method test_parse_timestamp_iso_format_with_z (line 83) | def test_parse_timestamp_iso_format_with_z(self, handler: TimezoneHand... method test_parse_timestamp_iso_format_with_offset (line 91) | def test_parse_timestamp_iso_format_with_offset( method test_parse_timestamp_iso_format_without_timezone (line 102) | def test_parse_timestamp_iso_format_without_timezone( method test_parse_timestamp_with_microseconds (line 113) | def test_parse_timestamp_with_microseconds(self, handler: TimezoneHand... method test_parse_timestamp_unix_timestamp_string (line 121) | def test_parse_timestamp_unix_timestamp_string( method test_parse_timestamp_unix_timestamp_with_milliseconds (line 132) | def test_parse_timestamp_unix_timestamp_with_milliseconds( method test_parse_timestamp_invalid_format (line 143) | def test_parse_timestamp_invalid_format(self, handler: TimezoneHandler... method test_parse_timestamp_empty_string (line 148) | def test_parse_timestamp_empty_string(self, handler: TimezoneHandler) ... method test_ensure_utc_with_utc_datetime (line 153) | def test_ensure_utc_with_utc_datetime(self, handler: TimezoneHandler) ... method test_ensure_utc_with_naive_datetime (line 161) | def test_ensure_utc_with_naive_datetime(self, handler: TimezoneHandler... method test_ensure_utc_with_different_timezone (line 169) | def test_ensure_utc_with_different_timezone(self, handler: TimezoneHan... method test_ensure_timezone_utc_to_est (line 181) | def test_ensure_timezone_utc_to_est(self, handler: TimezoneHandler) ->... method test_ensure_timezone_with_custom_timezone (line 189) | def test_ensure_timezone_with_custom_timezone( method test_ensure_timezone_with_naive_datetime (line 199) | def test_ensure_timezone_with_naive_datetime( method test_to_utc_from_different_timezone (line 210) | def test_to_utc_from_different_timezone(self, handler: TimezoneHandler... method test_to_utc_with_naive_datetime (line 222) | def test_to_utc_with_naive_datetime(self, handler: TimezoneHandler) ->... method test_to_utc_with_custom_default_timezone (line 231) | def test_to_utc_with_custom_default_timezone( method test_to_timezone_conversion (line 243) | def test_to_timezone_conversion(self, handler: TimezoneHandler) -> None: method test_to_timezone_with_default (line 251) | def test_to_timezone_with_default(self, custom_handler: TimezoneHandle... method test_error_handling_integration (line 260) | def test_error_handling_integration(self, handler: TimezoneHandler) ->... method test_format_datetime_with_timezone_preference (line 266) | def test_format_datetime_with_timezone_preference( method test_detect_timezone_preference_integration (line 280) | def test_detect_timezone_preference_integration( method test_comprehensive_timestamp_parsing (line 293) | def test_comprehensive_timestamp_parsing(self, handler: TimezoneHandle... class TestTimezonePreferenceDetection (line 313) | class TestTimezonePreferenceDetection: method test_detect_timezone_time_preference_delegation (line 316) | def test_detect_timezone_time_preference_delegation(self) -> None: method test_detect_timezone_time_preference_with_args (line 326) | def test_detect_timezone_time_preference_with_args(self) -> None: FILE: src/tests/test_version.py function test_get_version_from_metadata (line 11) | def test_get_version_from_metadata() -> None: function test_get_version_fallback_to_pyproject (line 20) | def test_get_version_fallback_to_pyproject() -> None: function test_get_version_fallback_unknown (line 52) | def test_get_version_fallback_unknown() -> None: function test_version_import_from_main_module (line 62) | def test_version_import_from_main_module() -> None: function test_version_format (line 70) | def test_version_format() -> None: function test_version_consistency (line 86) | def test_version_consistency() -> None: function test_version_matches_pyproject (line 95) | def test_version_matches_pyproject() -> None: