8
8
if t .TYPE_CHECKING :
9
9
from pendulum import Duration
10
10
11
+ DAYS_THRESHOLD_FOR_HALF_WEEK = 3
12
+ DAYS_THRESHOLD_FOR_HALF_MONTH = 15
13
+ MONTHS_THRESHOLD_FOR_HALF_YEAR = 6
14
+
15
+ HOURS_IN_NEARLY_A_DAY = 22
16
+ DAYS_IN_NEARLY_A_MONTH = 27
17
+ MONTHS_IN_NEARLY_A_YEAR = 11
18
+
19
+ DAYS_OF_WEEK = 7
20
+ SECONDS_OF_MINUTE = 60
21
+ FEW_SECONDS_MAX = 10
22
+
23
+ KEY_FUTURE = ".future"
24
+ KEY_PAST = ".past"
25
+ KEY_AFTER = ".after"
26
+ KEY_BEFORE = ".before"
27
+
11
28
12
29
class DifferenceFormatter :
13
30
"""
@@ -38,36 +55,41 @@ def format(
38
55
unit = "year"
39
56
count = diff .years
40
57
41
- if diff .months > 6 :
58
+ if diff .months > MONTHS_THRESHOLD_FOR_HALF_YEAR :
42
59
count += 1
43
- elif diff .months == 11 and (diff .weeks * 7 + diff .remaining_days ) > 15 :
60
+ elif (diff .months == MONTHS_IN_NEARLY_A_YEAR ) and (
61
+ (diff .weeks * DAYS_OF_WEEK + diff .remaining_days )
62
+ > DAYS_THRESHOLD_FOR_HALF_MONTH
63
+ ):
44
64
unit = "year"
45
65
count = 1
46
66
elif diff .months > 0 :
47
67
unit = "month"
48
68
count = diff .months
49
69
50
- if (diff .weeks * 7 + diff .remaining_days ) >= 27 :
70
+ if (
71
+ diff .weeks * DAYS_OF_WEEK + diff .remaining_days
72
+ ) >= DAYS_IN_NEARLY_A_MONTH :
51
73
count += 1
52
74
elif diff .weeks > 0 :
53
75
unit = "week"
54
76
count = diff .weeks
55
77
56
- if diff .remaining_days > 3 :
78
+ if diff .remaining_days > DAYS_THRESHOLD_FOR_HALF_WEEK :
57
79
count += 1
58
80
elif diff .remaining_days > 0 :
59
81
unit = "day"
60
82
count = diff .remaining_days
61
83
62
- if diff .hours >= 22 :
84
+ if diff .hours >= HOURS_IN_NEARLY_A_DAY :
63
85
count += 1
64
86
elif diff .hours > 0 :
65
87
unit = "hour"
66
88
count = diff .hours
67
89
elif diff .minutes > 0 :
68
90
unit = "minute"
69
91
count = diff .minutes
70
- elif 10 < diff .remaining_seconds <= 59 :
92
+ elif FEW_SECONDS_MAX < diff .remaining_seconds < SECONDS_OF_MINUTE :
71
93
unit = "second"
72
94
count = diff .remaining_seconds
73
95
else :
@@ -86,42 +108,39 @@ def format(
86
108
key += ".ago"
87
109
else :
88
110
if is_future :
89
- key += ".after"
111
+ key += KEY_AFTER
90
112
else :
91
- key += ".before"
113
+ key += KEY_BEFORE
92
114
93
115
return t .cast ("str" , locale .get (key ).format (time ))
94
116
else :
95
117
unit = "second"
96
118
count = diff .remaining_seconds
97
-
98
119
if count == 0 :
99
120
count = 1
100
-
101
121
if absolute :
102
122
key = f"translations.units.{ unit } "
103
123
else :
104
124
is_future = diff .invert
105
-
106
125
if is_now :
107
126
# Relative to now, so we can use
108
127
# the CLDR data
109
128
key = f"translations.relative.{ unit } "
110
129
111
130
if is_future :
112
- key += ".future"
131
+ key += KEY_FUTURE
113
132
else :
114
- key += ".past"
133
+ key += KEY_PAST
115
134
else :
116
135
# Absolute comparison
117
136
# So we have to use the custom locale data
118
137
119
138
# Checking for special pluralization rules
120
139
key = "custom.units_relative"
121
140
if is_future :
122
- key += f".{ unit } .future "
141
+ key += f".{ unit } { KEY_FUTURE } "
123
142
else :
124
- key += f".{ unit } .past "
143
+ key += f".{ unit } { KEY_PAST } "
125
144
126
145
trans = locale .get (key )
127
146
if not trans :
@@ -133,9 +152,9 @@ def format(
133
152
134
153
key = "custom"
135
154
if is_future :
136
- key += ".after"
155
+ key += KEY_AFTER
137
156
else :
138
- key += ".before"
157
+ key += KEY_BEFORE
139
158
140
159
return t .cast ("str" , locale .get (key ).format (time ))
141
160
0 commit comments