Skip to content

Commit 85568c0

Browse files
committed
Fixes Pendulum instances comparison to unsupported types.
Removes support for comparison to int, floats and integers.
1 parent 594a1db commit 85568c0

File tree

4 files changed

+58
-28
lines changed

4 files changed

+58
-28
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,15 @@
22

33
## [Unreleased]
44

5+
### Changed
6+
7+
- `Pendulum` instances can no longer be compared to strings and integers.
8+
59
### Fixed
610

711
- Fixes `Timezone._convert()` method for fixed timezones.
812
- Fixes `instances()` for some `tzinfo`.
13+
- Fixes comparisons to incompatible objects raising an error.
914

1015

1116
## [0.6.0] - 2016-09-12

pendulum/pendulum.py

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1092,22 +1092,40 @@ def to_w3c_string(self):
10921092

10931093
# Comparisons
10941094
def __eq__(self, other):
1095-
return self._datetime == self._get_datetime(other)
1095+
try:
1096+
return self._datetime == self._get_datetime(other)
1097+
except ValueError:
1098+
return NotImplemented
10961099

10971100
def __ne__(self, other):
1098-
return self._datetime != self._get_datetime(other)
1101+
try:
1102+
return self._datetime != self._get_datetime(other)
1103+
except ValueError:
1104+
return NotImplemented
10991105

11001106
def __gt__(self, other):
1101-
return self._datetime > self._get_datetime(other)
1107+
try:
1108+
return self._datetime > self._get_datetime(other)
1109+
except ValueError:
1110+
return NotImplemented
11021111

11031112
def __ge__(self, other):
1104-
return self._datetime >= self._get_datetime(other)
1113+
try:
1114+
return self._datetime >= self._get_datetime(other)
1115+
except ValueError:
1116+
return NotImplemented
11051117

11061118
def __lt__(self, other):
1107-
return self._datetime < self._get_datetime(other)
1119+
try:
1120+
return self._datetime < self._get_datetime(other)
1121+
except ValueError:
1122+
return NotImplemented
11081123

11091124
def __le__(self, other):
1110-
return self._datetime <= self._get_datetime(other)
1125+
try:
1126+
return self._datetime <= self._get_datetime(other)
1127+
except ValueError:
1128+
return NotImplemented
11111129

11121130
def between(self, dt1, dt2, equal=True):
11131131
"""
@@ -2110,20 +2128,6 @@ def _get_datetime(self, value, pendulum=False):
21102128

21112129
return value if not pendulum else Pendulum.instance(value)
21122130

2113-
if isinstance(value, (int, float)):
2114-
d = Pendulum.create_from_timestamp(value, self.timezone)
2115-
if pendulum:
2116-
return d
2117-
2118-
return d._datetime
2119-
2120-
if isinstance(value, basestring):
2121-
d = Pendulum.parse(value, tz=self.timezone)
2122-
if pendulum:
2123-
return d
2124-
2125-
return d._datetime
2126-
21272131
raise ValueError('Invalid datetime "{}"'.format(value))
21282132

21292133
def for_json(self):
@@ -2138,10 +2142,16 @@ def __sub__(self, other):
21382142
if isinstance(other, datetime.timedelta):
21392143
return self.subtract_timedelta(other)
21402144

2141-
return self._get_datetime(other, True).diff(self, False)
2145+
try:
2146+
return self._get_datetime(other, True).diff(self, False)
2147+
except ValueError:
2148+
return NotImplemented
21422149

21432150
def __rsub__(self, other):
2144-
return self.diff(self._get_datetime(other, True), False)
2151+
try:
2152+
return self.diff(self._get_datetime(other, True), False)
2153+
except ValueError:
2154+
return NotImplemented
21452155

21462156
def __add__(self, other):
21472157
if not isinstance(other, datetime.timedelta):

tests/pendulum_tests/test_comparison.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,9 @@ def test_equal_to_true(self):
1414
d1 = Pendulum(2000, 1, 1, 1, 2, 3)
1515
d2 = Pendulum(2000, 1, 1, 1, 2, 3)
1616
d3 = datetime(2000, 1, 1, 1, 2, 3)
17-
d4 = 946688523
18-
d5 = 946688523.0
19-
d6 = '2000-01-01 01:02:03'
2017

2118
self.assertEqual(d1, d2)
2219
self.assertEqual(d1, d3)
23-
self.assertEqual(d1, d4)
24-
self.assertEqual(d1, d5)
25-
self.assertEqual(d1, d6)
2620

2721
def test_equal_to_false(self):
2822
d1 = Pendulum(2000, 1, 1, 1, 2, 3)
@@ -427,3 +421,9 @@ def test_is_same_day(self):
427421
self.assertTrue(dt1.is_same_day(dt3))
428422
self.assertTrue(dt1.is_same_day(dt4))
429423
self.assertFalse(dt1.is_same_day(dt5))
424+
425+
def test_comparison_to_unsupported(self):
426+
dt1 = Pendulum.now()
427+
428+
self.assertFalse(dt1 == 'test')
429+
self.assertFalse(dt1 in ['test'])

tests/pendulum_tests/test_sub.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,3 +88,18 @@ def test_subtract_timedelta(self):
8888
self.assertEqual(11, d.minute)
8989
self.assertEqual(59, d.second)
9090
self.assertEqual(123456, d.microsecond)
91+
92+
def test_subtract_invalid_type(self):
93+
d = Pendulum(1975, 5, 21, 0, 0, 0)
94+
95+
try:
96+
d - 'ab'
97+
self.fail()
98+
except TypeError:
99+
pass
100+
101+
try:
102+
'ab' - d
103+
self.fail()
104+
except TypeError:
105+
pass

0 commit comments

Comments
 (0)