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

1from datetime import datetime, timezone 1=?@[]^_

2 

3 

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

7 

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+,-./:;

12 

13 if updated.tzinfo is None: 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI

14 updated = updated.replace(tzinfo=timezone.utc) 1abcdefg

15 

16 now = datetime.now(timezone.utc) 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI

17 seconds = int((now - updated).total_seconds()) 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI

18 

19 if seconds < 60: 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI

20 return "just now" 1abcdefg

21 

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

25 

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

29 

30 days = hours // 24 1JKLoahpqMNOrbistPQRucjvwSTUxdkyzVWXAelBCYZ0DfmEF123GgnHI

31 if days < 30: 1JKLoahpqMNOrbistPQRucjvwSTUxdkyzVWXAelBCYZ0DfmEF123GgnHI

32 return _format_time_ago(days, "day") 1JKLhMNOiPQRjSTUkVWXlYZ0m123n

33 

34 months = days // 30 1oahpqrbistucjvwxdkyzAelBCDfmEFGgnHI

35 if months < 12: 1oahpqrbistucjvwxdkyzAelBCDfmEFGgnHI

36 return _format_time_ago(months, "month") 1ohpqristujvwxkyzAlBCDmEFGnHI

37 

38 years = days // 365 1abcdefg

39 return _format_time_ago(years, "year") 1abcdefg

40 

41 

42def _format_time_ago(value: int, unit: str) -> str: 1=?@[]^_

43 suffix = "" if value == 1 else "s" 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI

44 

45 return f"{value} {unit}{suffix} ago" 1JKLo45ahpqMNOr67bistPQRu89cjvwSTUx!#dkyzVWXA$%elBCYZ0D'(fmEF123G)*gnHI