Coverage for src/main.py: 73%
56 statements
« prev ^ index » next coverage.py v7.8.2, created at 2025-05-25 13:51 -0400
« prev ^ index » next coverage.py v7.8.2, created at 2025-05-25 13:51 -0400
1# Copyright (c) CloudZero - ALL RIGHTS RESERVED - PROPRIETARY AND CONFIDENTIAL
2# Unauthorized copying of this file and/or project, via any medium is strictly prohibited.
3# Direct all questions to legal@cloudzero.com
5#!/usr/bin/env python3
6"""
7CloudZero Data Tool (czdt) - Main entry point.
8High-performance data analysis tool for processing and analyzing large-scale CSV datasets.
9"""
11import sys
13from rich.console import Console
14from utils.cli import parse_and_validate_args
15from utils.data import (
16 generate_schema_manifest,
17 get_required_columns,
18 load_data_optimized,
19)
20from utils.ui import get_column_choice
21from common.analysis import analyze_column
22from common.telemetry_analysis import run_telemetry_analysis
23from common.rollup import create_rollup
25console = Console()
28def main():
29 """Main entry point for czdt."""
30 try:
31 args, is_valid = parse_and_validate_args()
33 if not is_valid:
34 sys.exit(1)
36 # Handle schema generation (doesn't require data loading)
37 if args.generate_schema:
38 generate_schema_manifest(args.generate_schema)
39 return
41 # Determine optimization settings
42 use_lazy_loading = args.lazy or args.fast
44 # Determine required columns for optimization
45 required_cols = None
46 if args.fast or args.lazy:
47 required_cols = get_required_columns(
48 rollup_spec=args.rollup,
49 column=args.column,
50 analysis=args.analysis,
51 group_by_time=args.group_by,
52 )
54 # Load data with optimizations
55 df = load_data_optimized(
56 args.input_file, required_cols, use_lazy=use_lazy_loading
57 )
59 # Apply sampling if requested
60 if args.sample and args.sample < len(df):
61 original_size = len(df)
62 df = df.sample(n=args.sample, seed=42)
63 console.print(
64 f"📊 [yellow]Sampling {args.sample:,} rows from {original_size:,} total rows[/yellow]"
65 )
67 # Execute the requested analysis
68 if args.analysis:
69 run_telemetry_analysis(df, args.input_file, args.costformation, args.config)
70 elif args.rollup:
71 create_rollup(
72 df,
73 args.rollup,
74 args.rollup_limit,
75 args.group_by,
76 args.datetime_col,
77 not args.allow_none,
78 args.out,
79 )
80 elif args.column:
81 if args.column not in df.columns:
82 console.print(f"❌ [red]Error: Column '{args.column}' not found[/red]")
83 console.print(
84 f"📋 [cyan]Available columns: {', '.join(df.columns)}[/cyan]"
85 )
86 sys.exit(1)
87 analyze_column(df, args.column)
88 elif args.interactive:
89 # Interactive mode
90 while True:
91 try:
92 column = get_column_choice(df)
93 analyze_column(df, column)
95 continue_analysis = (
96 console.input(
97 "\n[bold green]Analyze another column? (y/n): [/bold green]"
98 )
99 .strip()
100 .lower()
101 )
102 if continue_analysis not in ["y", "yes"]:
103 break
104 except KeyboardInterrupt:
105 break
107 console.print("\n✨ [green]Analysis complete![/green]")
109 console.print("\n✨ [green]Analysis complete![/green]")
111 except KeyboardInterrupt:
112 console.print("\n\n👋 [yellow]Analysis interrupted by user. Goodbye![/yellow]")
113 sys.exit(0)
114 except Exception as e:
115 console.print(f"\n❌ [red]Error: {e}[/red]")
116 sys.exit(1)
119if __name__ == "__main__":
120 main()