Logger for CLI with support for verbose and normal modes.
| 9 | |
| 10 | |
| 11 | class CLILogger: |
| 12 | """Logger for CLI with support for verbose and normal modes.""" |
| 13 | |
| 14 | def __init__(self, verbose: bool = False): |
| 15 | """ |
| 16 | Initialize the logger. |
| 17 | |
| 18 | Args: |
| 19 | verbose: Enable verbose output |
| 20 | """ |
| 21 | self.verbose = verbose |
| 22 | self.start_time = datetime.now() |
| 23 | |
| 24 | def debug(self, message: str): |
| 25 | """Log debug message (only in verbose mode).""" |
| 26 | if self.verbose: |
| 27 | timestamp = datetime.now().strftime("%H:%M:%S") |
| 28 | click.secho(f"[{timestamp}] {message}", fg="cyan", dim=True) |
| 29 | |
| 30 | def info(self, message: str): |
| 31 | """Log info message.""" |
| 32 | click.echo(message) |
| 33 | |
| 34 | def success(self, message: str): |
| 35 | """Log success message in green.""" |
| 36 | click.secho(f"✓ {message}", fg="green") |
| 37 | |
| 38 | def warning(self, message: str): |
| 39 | """Log warning message in yellow.""" |
| 40 | click.secho(f"⚠️ {message}", fg="yellow") |
| 41 | |
| 42 | def error(self, message: str): |
| 43 | """Log error message in red.""" |
| 44 | click.secho(f"✗ {message}", fg="red", err=True) |
| 45 | |
| 46 | def step(self, message: str, step: Optional[int] = None, total: Optional[int] = None): |
| 47 | """ |
| 48 | Log a processing step. |
| 49 | |
| 50 | Args: |
| 51 | message: Step description |
| 52 | step: Current step number |
| 53 | total: Total number of steps |
| 54 | """ |
| 55 | if step is not None and total is not None: |
| 56 | prefix = f"[{step}/{total}]" |
| 57 | else: |
| 58 | prefix = "→" |
| 59 | |
| 60 | click.secho(f"{prefix} {message}", fg="blue", bold=True) |
| 61 | |
| 62 | def elapsed_time(self) -> str: |
| 63 | """Get elapsed time since logger was created.""" |
| 64 | elapsed = datetime.now() - self.start_time |
| 65 | minutes = int(elapsed.total_seconds() // 60) |
| 66 | seconds = int(elapsed.total_seconds() % 60) |
| 67 | |
| 68 | if minutes > 0: |