Coverage for src/fastapi_cloud_cli/utils/dates.py: 100%
31 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-11-09 00:25 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-11-09 00:25 +0000
1from datetime import datetime, timezone 1=?@[]^_
4def format_last_updated(updated_at: str | None) -> str: 1=?@[]^_
5 if updated_at is None: 2J K L o 4 5 a + h ` p q M N O r 6 7 b , i { s t P Q R u 8 9 c - j | v w S T U x ! # d . k } y z V W X A $ % e / l ~ B C Y Z 0 D ' ( f : m abE F 1 2 3 G ) * g ; n bbH I
6 return "-" 2` { | } ~ abbb
8 try: 1JKLo45a+hpqMNOr67b,istPQRu89c-jvwSTUx!#d.kyzVWXA$%e/lBCYZ0D'(f:mEF123G)*g;nHI
9 updated = datetime.fromisoformat(updated_at.replace("Z", "+00:00")) 1JKLo45a+hpqMNOr67b,istPQRu89c-jvwSTUx!#d.kyzVWXA$%e/lBCYZ0D'(f:mEF123G)*g;nHI
10 except ValueError: 1+,-./:;
11 return updated_at 1+,-./:;
13 if updated.tzinfo is None: 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI
14 updated = updated.replace(tzinfo=timezone.utc) 1abcdefg
16 now = datetime.now(timezone.utc) 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI
17 seconds = int((now - updated).total_seconds()) 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI
19 if seconds < 60: 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI
20 return "just now" 1abcdefg
22 minutes = seconds // 60 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI
23 if minutes < 60: 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI
24 return _format_time_ago(minutes, "minute") 1abcdefg
26 hours = minutes // 60 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI
27 if hours < 24: 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI
28 return _format_time_ago(hours, "hour") 145a67b89c!#d$%e'(f)*g
30 days = hours // 24 1JKLoahpqMNOrbistPQRucjvwSTUxdkyzVWXAelBCYZ0DfmEF123GgnHI
31 if days < 30: 1JKLoahpqMNOrbistPQRucjvwSTUxdkyzVWXAelBCYZ0DfmEF123GgnHI
32 return _format_time_ago(days, "day") 1JKLhMNOiPQRjSTUkVWXlYZ0m123n
34 months = days // 30 1oahpqrbistucjvwxdkyzAelBCDfmEFGgnHI
35 if months < 12: 1oahpqrbistucjvwxdkyzAelBCDfmEFGgnHI
36 return _format_time_ago(months, "month") 1ohpqristujvwxkyzAlBCDmEFGnHI
38 years = days // 365 1abcdefg
39 return _format_time_ago(years, "year") 1abcdefg
42def _format_time_ago(value: int, unit: str) -> str: 1=?@[]^_
43 suffix = "" if value == 1 else "s" 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI
45 return f"{value} {unit}{suffix} ago" 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI