fix: add models and utils modules
This commit is contained in:
@@ -1,65 +1,32 @@
|
|||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from typing import Tuple
|
from typing import Optional, Tuple
|
||||||
|
|
||||||
|
|
||||||
def get_date_range(days: int) -> Tuple[datetime, datetime]:
|
def parse_date(date_str: Optional[str]) -> Optional[datetime]:
|
||||||
"""Get date range for the last N days."""
|
"""Parse a date string into a datetime object."""
|
||||||
end_date = datetime.now()
|
if not date_str:
|
||||||
start_date = end_date - timedelta(days=days)
|
return None
|
||||||
return start_date, end_date
|
|
||||||
|
|
||||||
|
|
||||||
def parse_timestamp(timestamp_str: str) -> datetime:
|
|
||||||
"""Parse a timestamp string to datetime."""
|
|
||||||
formats = [
|
formats = [
|
||||||
|
"%Y-%m-%d",
|
||||||
"%Y-%m-%d %H:%M:%S",
|
"%Y-%m-%d %H:%M:%S",
|
||||||
"%Y-%m-%dT%H:%M:%S",
|
"%Y-%m-%dT%H:%M:%S",
|
||||||
"%Y-%m-%d %H:%M:%S%z",
|
"%Y/%m/%d",
|
||||||
"%Y-%m-%dT%H:%M:%SZ",
|
"%m/%d/%Y",
|
||||||
|
"%d/%m/%Y",
|
||||||
]
|
]
|
||||||
|
|
||||||
for fmt in formats:
|
for fmt in formats:
|
||||||
try:
|
try:
|
||||||
return datetime.strptime(timestamp_str, fmt)
|
return datetime.strptime(date_str, fmt)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
raise ValueError(f"Cannot parse timestamp: {timestamp_str}")
|
return None
|
||||||
|
|
||||||
|
|
||||||
def format_duration(seconds: float) -> str:
|
def get_date_range(days: int) -> Tuple[datetime, datetime]:
|
||||||
"""Format duration in human-readable format."""
|
"""Get a date range for the last N days."""
|
||||||
if seconds < 60:
|
end_date = datetime.now()
|
||||||
return f"{seconds:.1f}s"
|
start_date = end_date - timedelta(days=days)
|
||||||
elif seconds < 3600:
|
return start_date, end_date
|
||||||
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")
|
|
||||||
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
|
|
||||||
|
|||||||
Reference in New Issue
Block a user