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