Skip to content

Commit 74859ae

Browse files
Make Duration().in_words() return "0 milliseconds" (#301)
* Introduce 0 microseconds representation for duration or period objects * Prepare additional tests for in_words method of period object
1 parent 779e745 commit 74859ae

File tree

4 files changed

+90
-8
lines changed

4 files changed

+90
-8
lines changed

pendulum/duration.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,15 @@ def in_words(self, locale=None, separator=" "):
230230
)
231231
parts.append(translation.format(count))
232232

233-
if not parts and abs(self.microseconds) > 0:
234-
translation = locale.translation("units.second.{}".format(locale.plural(1)))
235-
us = abs(self.microseconds) / 1e6
236-
parts.append(translation.format("{:.2f}".format(us)))
233+
if not parts:
234+
if abs(self.microseconds) > 0:
235+
unit = "units.second.{}".format(locale.plural(1))
236+
count = "{:.2f}".format(abs(self.microseconds) / 1e6)
237+
else:
238+
unit = "units.microsecond.{}".format(locale.plural(0))
239+
count = 0
240+
translation = locale.translation(unit)
241+
parts.append(translation.format(count))
237242

238243
return decode(separator.join(parts))
239244

pendulum/period.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -266,10 +266,15 @@ def in_words(self, locale=None, separator=" "):
266266
)
267267
parts.append(translation.format(count))
268268

269-
if not parts and abs(self.microseconds) > 0:
270-
translation = locale.translation("units.second.{}".format(locale.plural(1)))
271-
us = abs(self.microseconds) / 1e6
272-
parts.append(translation.format("{:.2f}").format(us))
269+
if not parts:
270+
if abs(self.microseconds) > 0:
271+
unit = "units.second.{}".format(locale.plural(1))
272+
count = "{:.2f}".format(abs(self.microseconds) / 1e6)
273+
else:
274+
unit = "units.microsecond.{}".format(locale.plural(0))
275+
count = 0
276+
translation = locale.translation(unit)
277+
parts.append(translation.format(count))
273278

274279
return decode(separator.join(parts))
275280

tests/duration/test_in_words.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,9 @@ def test_subseconds_with_seconds():
6767
pi = pendulum.duration(seconds=12, microseconds=123456)
6868

6969
assert pi.in_words() == "12 seconds"
70+
71+
72+
def test_duration_with_all_zero_values():
73+
pi = pendulum.duration()
74+
75+
assert pi.in_words() == "0 microseconds"

tests/period/test_in_words.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import pendulum
2+
3+
4+
def test_week():
5+
start_date = pendulum.datetime(2012, 1, 1)
6+
period = pendulum.period(start=start_date, end=start_date.add(weeks=1))
7+
assert period.in_words() == "1 week"
8+
9+
10+
def test_week_and_day():
11+
start_date = pendulum.datetime(2012, 1, 1)
12+
period = pendulum.period(start=start_date, end=start_date.add(weeks=1, days=1))
13+
assert period.in_words() == "1 week 1 day"
14+
15+
16+
def test_all():
17+
start_date = pendulum.datetime(2012, 1, 1)
18+
period = pendulum.period(
19+
start=start_date,
20+
end=start_date.add(years=1, months=1, days=1, seconds=1, microseconds=1),
21+
)
22+
assert period.in_words() == "1 year 1 month 1 day 1 second"
23+
24+
25+
def test_in_french():
26+
start_date = pendulum.datetime(2012, 1, 1)
27+
period = pendulum.period(
28+
start=start_date,
29+
end=start_date.add(years=1, months=1, days=1, seconds=1, microseconds=1),
30+
)
31+
assert period.in_words(locale="fr") == "1 an 1 mois 1 jour 1 seconde"
32+
33+
34+
def test_singular_negative_values():
35+
start_date = pendulum.datetime(2012, 1, 1)
36+
period = pendulum.period(start=start_date, end=start_date.subtract(days=1))
37+
assert period.in_words() == "-1 day"
38+
39+
40+
def test_separator():
41+
start_date = pendulum.datetime(2012, 1, 1)
42+
period = pendulum.period(
43+
start=start_date,
44+
end=start_date.add(years=1, months=1, days=1, seconds=1, microseconds=1),
45+
)
46+
assert period.in_words(separator=", ") == "1 year, 1 month, 1 day, 1 second"
47+
48+
49+
def test_subseconds():
50+
start_date = pendulum.datetime(2012, 1, 1)
51+
period = pendulum.period(start=start_date, end=start_date.add(microseconds=123456))
52+
assert period.in_words() == "0.12 second"
53+
54+
55+
def test_subseconds_with_seconds():
56+
start_date = pendulum.datetime(2012, 1, 1)
57+
period = pendulum.period(
58+
start=start_date, end=start_date.add(seconds=12, microseconds=123456)
59+
)
60+
assert period.in_words() == "12 seconds"
61+
62+
63+
def test_zero_period():
64+
start_date = pendulum.datetime(2012, 1, 1)
65+
period = pendulum.period(start=start_date, end=start_date)
66+
assert period.in_words() == "0 microseconds"

0 commit comments

Comments
 (0)