Coverage for src/main.py: 73%

56 statements  

« 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 

4 

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""" 

10 

11import sys 

12 

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 

24 

25console = Console() 

26 

27 

28def main(): 

29 """Main entry point for czdt.""" 

30 try: 

31 args, is_valid = parse_and_validate_args() 

32 

33 if not is_valid: 

34 sys.exit(1) 

35 

36 # Handle schema generation (doesn't require data loading) 

37 if args.generate_schema: 

38 generate_schema_manifest(args.generate_schema) 

39 return 

40 

41 # Determine optimization settings 

42 use_lazy_loading = args.lazy or args.fast 

43 

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 ) 

53 

54 # Load data with optimizations 

55 df = load_data_optimized( 

56 args.input_file, required_cols, use_lazy=use_lazy_loading 

57 ) 

58 

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 ) 

66 

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) 

94 

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 

106 

107 console.print("\n✨ [green]Analysis complete![/green]") 

108 

109 console.print("\n✨ [green]Analysis complete![/green]") 

110 

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) 

117 

118 

119if __name__ == "__main__": 

120 main()