From 7afe237bcc147b370338e60556e072b0fa6ed0ef Mon Sep 17 00:00:00 2001 From: 7000pctAUTO Date: Sun, 1 Feb 2026 08:29:02 +0000 Subject: [PATCH] Add utils module (date utilities and config loader) --- src/utils/date_utils.py | 62 ++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/src/utils/date_utils.py b/src/utils/date_utils.py index 500e4c6..f15232d 100644 --- a/src/utils/date_utils.py +++ b/src/utils/date_utils.py @@ -1,32 +1,62 @@ from datetime import datetime, timedelta -from typing import Optional, Tuple +from typing import Tuple -def parse_date(date_str: Optional[str]) -> Optional[datetime]: - """Parse a date string into a datetime object.""" - if not date_str: - return None +def get_date_range(days: int) -> Tuple[datetime, datetime]: + """Get date range for the last N days.""" + end_date = datetime.now() + start_date = end_date - timedelta(days=days) + return start_date, end_date + +def parse_timestamp(timestamp_str: str) -> datetime: + """Parse a timestamp string to datetime.""" formats = [ - "%Y-%m-%d", "%Y-%m-%d %H:%M:%S", "%Y-%m-%dT%H:%M:%S", - "%Y/%m/%d", - "%m/%d/%Y", - "%d/%m/%Y", + "%Y-%m-%d %H:%M:%S%z", + "%Y-%m-%dT%H:%M:%SZ", ] for fmt in formats: try: - return datetime.strptime(date_str, fmt) + return datetime.strptime(timestamp_str, fmt) except ValueError: continue - return None + raise ValueError(f"Cannot parse timestamp: {timestamp_str}") -def get_date_range(days: int) -> Tuple[datetime, datetime]: - """Get a date range for the last N days.""" - end_date = datetime.now() - start_date = end_date - timedelta(days=days) - return start_date, end_date +def format_duration(seconds: float) -> str: + """Format duration in human-readable format.""" + if seconds < 60: + return f"{seconds:.1f}s" + elif seconds < 3600: + minutes = seconds / 60 + return f"{minutes:.1f}m" + elif seconds < 86400: + hours = seconds / 3600 + return f"{hours:.1f}h" + else: + days = seconds / 86400 + return f"{days:.1f}d" + + +def group_by_period(commits: list, period: str = "day") -> dict: + """Group commits by time period.""" + result = {} + for commit in commits: + if period == "hour": + key = commit.timestamp.strftime("%Y-%m-%d %H:00") + elif period == "day": + key = commit.timestamp.strftime("%Y-%m-%d") + elif period == "week": + key = commit.timestamp.strftime("%Y-W%U") + elif period == "month": + key = commit.timestamp.strftime("%Y-%m") + else: + key = commit.timestamp.strftime("%Y-%m-%d") + + result[key] = result.get(key, 0) + 1 + + return result