File size: 3,424 Bytes
23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 23c96f8 58582d3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
import logging
from typing import Dict, Any, List, Optional
logger = logging.getLogger(__name__)
class LogFormatter:
"""Utility class for consistent log formatting across the application"""
@staticmethod
def section(title: str) -> str:
"""Create a section header"""
return f"\n{'=' * 20} {title.upper()} {'=' * 20}"
@staticmethod
def subsection(title: str) -> str:
"""Create a subsection header"""
return f"\n{'β' * 20} {title} {'β' * 20}"
@staticmethod
def tree(items: Dict[str, Any], title: str = None) -> List[str]:
"""Create a tree view of dictionary data"""
lines = []
if title:
lines.append(f"π {title}:")
# Get the maximum length for alignment
max_key_length = max(len(str(k)) for k in items.keys())
# Format each item
for i, (key, value) in enumerate(items.items()):
prefix = "βββ" if i == len(items) - 1 else "βββ"
if isinstance(value, (int, float)):
value = f"{value:,}" # Add thousand separators
lines.append(f"{prefix} {str(key):<{max_key_length}}: {value}")
return lines
@staticmethod
def stats(stats: Dict[str, int], title: str = None) -> List[str]:
"""Format statistics with icons"""
lines = []
if title:
lines.append(f"π {title}:")
# Get the maximum length for alignment
max_key_length = max(len(str(k)) for k in stats.keys())
# Format each stat with an appropriate icon
icons = {
"total": "π",
"success": "β
",
"error": "β",
"pending": "β³",
"processing": "βοΈ",
"finished": "β¨",
"evaluating": "π",
"downloads": "β¬οΈ",
"files": "π",
"cached": "πΎ",
"size": "π",
"time": "β±οΈ",
"rate": "π",
}
# Format each item
for i, (key, value) in enumerate(stats.items()):
prefix = "βββ" if i == len(stats) - 1 else "βββ"
icon = icons.get(key.lower().split("_")[0], "β’")
if isinstance(value, (int, float)):
value = f"{value:,}" # Add thousand separators
lines.append(f"{prefix} {icon} {str(key):<{max_key_length}}: {value}")
return lines
@staticmethod
def progress_bar(current: int, total: int, width: int = 20) -> str:
"""Create a progress bar"""
percentage = (current * 100) // total
filled = "β" * (percentage * width // 100)
empty = "β" * (width - len(filled))
return f"{filled}{empty} {percentage:3d}%"
@staticmethod
def error(message: str, error: Optional[Exception] = None) -> str:
"""Format error message"""
error_msg = f"\nβ Error: {message}"
if error:
error_msg += f"\n βββ Details: {str(error)}"
return error_msg
@staticmethod
def success(message: str) -> str:
"""Format success message"""
return f"β
{message}"
@staticmethod
def warning(message: str) -> str:
"""Format warning message"""
return f"β οΈ {message}"
@staticmethod
def info(message: str) -> str:
"""Format info message"""
return f"βΉοΈ {message}"
|