Skip to content

Commit 81596d7

Browse files
committed
Improves test coverage
1 parent b7787bb commit 81596d7

21 files changed

+361
-121
lines changed

.coveragerc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
[run]
2-
omit = pendulum/lang/*,pendulum/_compat.py,pendulum/version.py
2+
omit = pendulum/lang/*,
3+
pendulum/_compat.py,
4+
pendulum/version.py,
5+
pendulum/_extensions/*,
6+
pendulum/formatting/formatter.py

pendulum/formatting/alternative_formatter.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,6 @@ def _format_token(self, dt, token, locale):
168168

169169
return '{}{:02d}{}{:02d}'.format(sign, hour, separator, minute)
170170

171-
return token
172-
173171
def _format_localizable_token(self, dt, token, locale):
174172
"""
175173
Formats a Pendulum instance
@@ -186,6 +184,9 @@ def _format_localizable_token(self, dt, token, locale):
186184
187185
:rtype: str
188186
"""
187+
trans_id = ''
188+
count = 0
189+
189190
if token == 'MMM':
190191
count = dt.month
191192
trans_id = 'months_abbrev'
@@ -219,8 +220,6 @@ def _format_localizable_token(self, dt, token, locale):
219220
elif token == 'A':
220221
count = (dt.hour, dt.minute)
221222
trans_id = 'meridian'
222-
else:
223-
return token
224223

225224
trans = dt.translator().transchoice(trans_id, count, locale=locale)
226225

pendulum/pendulum.py

Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,6 @@ def _timezone(cls, zone):
131131
if isinstance(zone, Timezone):
132132
return zone
133133

134-
if isinstance(zone, TimezoneInfo):
135-
return zone.tz
136-
137134
return Timezone.load(zone)
138135

139136
def __new__(cls, year, month, day,
@@ -217,8 +214,6 @@ def instance(cls, dt, tz=UTC):
217214
# the timezone name, we fallback
218215
# on a fixed offset
219216
offset = dt.utcoffset()
220-
if not offset:
221-
raise ValueError('Unsupported tzinfo [{}]'.format(tz))
222217

223218
tz = dt.utcoffset().total_seconds() / 3600
224219

@@ -249,13 +244,8 @@ def parse(cls, time=None, tz=UTC):
249244

250245
dt = dateparser.parse(time)
251246

252-
if not dt:
253-
raise PendulumException('Invalid time string "{}"'.format(time))
254-
255247
if dt.tzinfo:
256-
offset = dt.tzinfo.utcoffset(dt)
257-
if not offset:
258-
offset = datetime.timedelta()
248+
offset = dt.utcoffset()
259249

260250
tz = offset.total_seconds() / 3600
261251

@@ -941,6 +931,9 @@ def set_formatter(cls, formatter=None):
941931
if formatter is None:
942932
formatter = cls._DEFAULT_FORMATTER
943933

934+
if formatter not in FORMATTERS:
935+
raise ValueError('Invalid formatter [{}]'.format(formatter))
936+
944937
cls._FORMATTER = formatter
945938

946939
@classmethod
@@ -1836,7 +1829,7 @@ def first_of(self, unit, day_of_week=None):
18361829
:rtype: Pendulum
18371830
"""
18381831
if unit not in ['month', 'quarter', 'year']:
1839-
raise PendulumException('Invalid unit "{}" for first_of()'.format(unit))
1832+
raise ValueError('Invalid unit "{}" for first_of()'.format(unit))
18401833

18411834
return getattr(self, '_first_of_{}'.format(unit))(day_of_week)
18421835

@@ -1857,7 +1850,7 @@ def last_of(self, unit, day_of_week=None):
18571850
:rtype: Pendulum
18581851
"""
18591852
if unit not in ['month', 'quarter', 'year']:
1860-
raise PendulumException('Invalid unit "{}" for first_of()'.format(unit))
1853+
raise ValueError('Invalid unit "{}" for first_of()'.format(unit))
18611854

18621855
return getattr(self, '_last_of_{}'.format(unit))(day_of_week)
18631856

@@ -1881,7 +1874,7 @@ def nth_of(self, unit, nth, day_of_week):
18811874
:rtype: Pendulum
18821875
"""
18831876
if unit not in ['month', 'quarter', 'year']:
1884-
raise PendulumException('Invalid unit "{}" for first_of()'.format(unit))
1877+
raise ValueError('Invalid unit "{}" for first_of()'.format(unit))
18851878

18861879
dt = getattr(self, '_nth_of_{}'.format(unit))(nth, day_of_week)
18871880
if dt is False:
@@ -2151,15 +2144,10 @@ def __rsub__(self, other):
21512144
return self.diff(self._get_datetime(other, True), False)
21522145

21532146
def __add__(self, other):
2154-
if isinstance(other, datetime.timedelta):
2155-
return self.add_timedelta(other)
2156-
2157-
result = self._datetime + other
2147+
if not isinstance(other, datetime.timedelta):
2148+
return NotImplemented
21582149

2159-
if isinstance(result, datetime.datetime):
2160-
return Pendulum.instance(result)
2161-
2162-
return result
2150+
return self.add_timedelta(other)
21632151

21642152
def __radd__(self, other):
21652153
return self.__add__(other)
@@ -2236,23 +2224,9 @@ def _getstate(self):
22362224
return (
22372225
self.year, self.month, self.day,
22382226
self.hour, self.minute, self.second, self.microsecond,
2239-
self.timezone
2227+
self.timezone_name
22402228
)
22412229

2242-
def __setstate__(self, year, month, day, hour, minute, second, microsecond, tz):
2243-
self._year = year
2244-
self._month = year
2245-
self._day = year
2246-
self._hour = year
2247-
self._minute = year
2248-
self._second = year
2249-
self._datetime = tz.convert(datetime.datetime(
2250-
year, month, day,
2251-
hour, minute, second, microsecond
2252-
))
2253-
self._tz = tz
2254-
self._tzinfo = self._datetime.tzinfo
2255-
22562230
def __reduce__(self):
22572231
return self.__class__, self._getstate()
22582232

pendulum/tz/timezone.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,6 @@ def _find_utc_index(self, dt):
323323
def __repr__(self):
324324
return '<Timezone [{}]>'.format(self._name)
325325

326-
327326
class FixedTimezone(Timezone):
328327
"""
329328
A timezone that has a fixed offset to UTC.

pendulum/tz/transition.py

Lines changed: 3 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -64,46 +64,9 @@ def pre_time(self):
6464
def time(self):
6565
return self._time
6666

67-
def __eq__(self, other):
68-
own, other = self._get_comparables(other)
69-
70-
return own == other
71-
72-
def __ne__(self, other):
73-
own, other = self._get_comparables(other)
74-
75-
return own != other
76-
77-
def __lt__(self, other):
78-
own, other = self._get_comparables(other)
79-
80-
return own < other
81-
82-
def __le__(self, other):
83-
own, other = self._get_comparables(other)
84-
85-
return own <= other
86-
87-
def __gt__(self, other):
88-
own, other = self._get_comparables(other)
89-
90-
return own > other
91-
92-
def __ge__(self, other):
93-
own, other = self._get_comparables(other)
94-
95-
return own >= other
96-
97-
def _get_comparables(self, other):
98-
if isinstance(other, Transition):
99-
own = self._unix_time
100-
other = other._unix_time
101-
elif isinstance(other, datetime):
102-
own = self._time
103-
else:
104-
own = self._unix_time
105-
106-
return own, other
67+
@property
68+
def utc_time(self):
69+
return self._utc_time
10770

10871
def __repr__(self):
10972
return '<Transition [{} UTC, {} -> {}]>'.format(

tests/formatting_tests/classic_formatter_test.py

Lines changed: 0 additions & 29 deletions
This file was deleted.

tests/formatting_tests/test_alternative_formatter.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,24 @@
22

33
from pendulum import Pendulum
44
from pendulum.formatting.alternative_formatter import AlternativeFormatter
5+
from pendulum.lang import TRANSLATIONS
56
from .. import AbstractTestCase
67

78

89
class ClassicFormatterTest(AbstractTestCase):
910

11+
def setUp(self):
12+
super(ClassicFormatterTest, self).setUp()
13+
14+
# Add dummy locale for testing purposes
15+
TRANSLATIONS['dummy'] = {}
16+
17+
def tearDown(self):
18+
super(ClassicFormatterTest, self).tearDown()
19+
20+
# Add dummy locale for testing purposes
21+
del TRANSLATIONS['dummy']
22+
1023
def test_year_tokens(self):
1124
d = Pendulum(2009, 1, 14, 15, 25, 50, 123456)
1225
f = AlternativeFormatter()
@@ -69,6 +82,12 @@ def test_day_of_year(self):
6982
self.assertEqual('241e', f.format(d, 'DDDo', locale='fr'))
7083
self.assertEqual('244e', f.format(d.add(days=3), 'DDDo', locale='fr'))
7184

85+
def test_week_of_year(self):
86+
f = AlternativeFormatter()
87+
d = Pendulum(2016, 8, 28)
88+
89+
self.assertEqual('34th', f.format(d, 'wo'))
90+
7291
def test_day_of_week(self):
7392
f = AlternativeFormatter()
7493
d = Pendulum(2016, 8, 28)
@@ -82,6 +101,8 @@ def test_day_of_week(self):
82101
self.assertEqual('dim', f.format(d, 'ddd', locale='fr'))
83102
self.assertEqual('dimanche', f.format(d, 'dddd', locale='fr'))
84103

104+
self.assertEqual('0th', f.format(d, 'do'))
105+
85106
def test_am_pm(self):
86107
f = AlternativeFormatter()
87108
d = Pendulum(2016, 8, 28, 23)
@@ -156,6 +177,10 @@ def test_timezone_offset(self):
156177
self.assertEqual('+0100', f.format(d, 'Z'))
157178
self.assertEqual('+01:00', f.format(d, 'ZZ'))
158179

180+
d = Pendulum(2016, 1, 28, 7, 3, 6, 123456, 'America/Guayaquil')
181+
self.assertEqual('-0500', f.format(d, 'Z'))
182+
self.assertEqual('-05:00', f.format(d, 'ZZ'))
183+
159184
def test_timestamp(self):
160185
f = AlternativeFormatter()
161186
d = Pendulum(1970, 1, 1)
@@ -184,3 +209,20 @@ def test_escape(self):
184209
d = Pendulum(2016, 8, 28)
185210
self.assertEqual('YYYY 2016 [2016]', f.format(d, '[YYYY] YYYY \[YYYY\]'))
186211
self.assertEqual('D 28 \\28', f.format(d, '\D D \\\D'))
212+
213+
def test_date_formats_missing(self):
214+
f = AlternativeFormatter()
215+
d = Pendulum(2016, 8, 28, 7, 3, 6, 123456)
216+
217+
self.assertEqual('7:03 AM', f.format(d, 'LT', locale='dummy'))
218+
self.assertEqual('7:03:06 AM', f.format(d, 'LTS', locale='dummy'))
219+
self.assertEqual('08/28/2016', f.format(d, 'L', locale='dummy'))
220+
self.assertEqual('August 28, 2016', f.format(d, 'LL', locale='dummy'))
221+
self.assertEqual('August 28, 2016 7:03 AM', f.format(d, 'LLL', locale='dummy'))
222+
self.assertEqual('Sunday, August 28, 2016 7:03 AM', f.format(d, 'LLLL', locale='dummy'))
223+
224+
def test_unknown_token(self):
225+
f = AlternativeFormatter()
226+
d = Pendulum(2016, 8, 28, 7, 3, 6, 123456)
227+
228+
self.assertEqual('J', f.format(d, 'J'))
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# -*- coding: utf-8 -*-
2+
3+
import re
4+
from pendulum import Pendulum
5+
from pendulum.formatting.classic_formatter import ClassicFormatter
6+
from .. import AbstractTestCase
7+
8+
9+
class ClassicFormatterTest(AbstractTestCase):
10+
11+
def test_custom_formatters(self):
12+
d = Pendulum(1975, 12, 25, 14, 15, 16, tzinfo='local')
13+
f = ClassicFormatter()
14+
self.assertEqual(
15+
'Thursday 25th of December 1975 02:15:16 PM -05:00',
16+
f.format(d, '%A %-d%_t of %B %Y %I:%M:%S %p %_z')
17+
)
18+
19+
def test_format_with_locale(self):
20+
d = Pendulum(1975, 12, 25, 14, 15, 16, tzinfo='Europe/Paris')
21+
f = ClassicFormatter()
22+
self.assertEqual(
23+
'jeudi 25e jour de décembre 1975 02:15:16 +01:00',
24+
f.format(d, '%A %-d%_t jour de %B %Y %I:%M:%S %p %_z', locale='fr')
25+
)
26+
27+
def test_unlocalizable_directive(self):
28+
d = Pendulum(1975, 12, 25, 14, 15, 16, tzinfo='local')
29+
f = ClassicFormatter()
30+
self.assertRaises(ValueError, f._localize_directive, d, '%8', 'en')
31+
32+
def test_day_of_week(self):
33+
f = ClassicFormatter()
34+
d = Pendulum(2016, 8, 28)
35+
36+
self.assertEqual('Sun', f.format(d, '%a'))
37+
self.assertEqual('Sunday', f.format(d, '%A'))
38+
39+
self.assertEqual('dim', f.format(d, '%a', locale='fr'))
40+
self.assertEqual('dimanche', f.format(d, '%A', locale='fr'))
41+
42+
def test_month(self):
43+
f = ClassicFormatter()
44+
d = Pendulum(2016, 8, 28)
45+
46+
self.assertEqual('Aug', f.format(d, '%b'))
47+
self.assertEqual('August', f.format(d, '%B'))
48+
49+
self.assertEqual('août', f.format(d, '%b', locale='fr'))
50+
self.assertEqual('août', f.format(d, '%B', locale='fr'))
51+
52+
def test_strftime(self):
53+
f = ClassicFormatter()
54+
d = Pendulum(2016, 8, 28)
55+
m = re.match('(.*)', '%_TTT')
56+
57+
self.assertRaises(ValueError, f._strftime, d, m, 'fr')

tests/helpers_tests/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# -*- coding: utf-8 -*-
2+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# -*- coding: utf-8 -*-
2+
3+
from pendulum.helpers import local_time
4+
from pendulum import Pendulum
5+
from .. import AbstractTestCase
6+
7+
8+
class LocalTimeTest(AbstractTestCase):
9+
10+
def test_local_time_positive_integer(self):
11+
d = Pendulum(2016, 8, 7, 12, 34, 56)
12+
13+
t = local_time(d.timestamp, 0)
14+
self.assertEqual(d.year, t[0])
15+
self.assertEqual(d.month, t[1])
16+
self.assertEqual(d.day, t[2])
17+
self.assertEqual(d.hour, t[3])
18+
self.assertEqual(d.minute, t[4])
19+
self.assertEqual(d.second, t[5])

0 commit comments

Comments
 (0)