Skip to content

Commit 6b47c9d

Browse files
committed
Makes replace() accept the same tzinfo types as the constructor.
1 parent bb3b37c commit 6b47c9d

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

pendulum/pendulum.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2193,7 +2193,14 @@ def replace(self, year=None, month=None, day=None, hour=None,
21932193
minute = minute if minute is not None else self._minute
21942194
second = second if second is not None else self._second
21952195
microsecond = microsecond if microsecond is not None else self._microsecond
2196-
tzinfo = tzinfo if tzinfo is not True else self._tzinfo
2196+
2197+
# Checking tzinfo
2198+
if tzinfo is not None and tzinfo is not True:
2199+
tzinfo = self._safe_create_datetime_zone(tzinfo)
2200+
elif tzinfo is None:
2201+
tzinfo = tzinfo
2202+
else:
2203+
tzinfo = self._tzinfo
21972204

21982205
return self.instance(
21992206
self._datetime.replace(year=year, month=month, day=day,

tests/pendulum_tests/test_fluent_setters.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# -*- coding: utf-8 -*-
22

3+
import pendulum
34
from pendulum import Pendulum
5+
from pendulum.tz.exceptions import NonExistingTime
46

57
from .. import AbstractTestCase
68

@@ -146,3 +148,34 @@ def test_with_timestamp(self):
146148

147149
self.assertIsInstanceOfPendulum(new)
148150
self.assertPendulum(new, 1970, 1, 1, 0, 0, 0)
151+
152+
def test_replace_tzinfo(self):
153+
d = Pendulum.create(2016, 7, 2, 0, 41, 20)
154+
new = d.replace(tzinfo='Europe/Paris')
155+
156+
self.assertEqual(new.timezone_name, 'Europe/Paris')
157+
158+
def test_replace_tzinfo_dst(self):
159+
d = Pendulum.create(2013, 3, 31, 2, 30)
160+
new = d.replace(tzinfo='Europe/Paris')
161+
162+
self.assertPendulum(new, 2013, 3, 31, 3, 30)
163+
self.assertTrue(new.is_dst)
164+
self.assertEqual(new.offset, 7200)
165+
self.assertEqual(new.timezone_name, 'Europe/Paris')
166+
167+
def test_replace_tzinfo_dst_with_pre_transition_rule(self):
168+
Pendulum.set_transition_rule(pendulum.PRE_TRANSITION)
169+
d = Pendulum.create(2013, 3, 31, 2, 30)
170+
new = d.replace(tzinfo='Europe/Paris')
171+
172+
self.assertPendulum(new, 2013, 3, 31, 2, 30)
173+
self.assertFalse(new.is_dst)
174+
self.assertEqual(new.offset, 3600)
175+
self.assertEqual(new.timezone_name, 'Europe/Paris')
176+
177+
def test_replace_tzinfo_dst_with_error_transition_rule(self):
178+
Pendulum.set_transition_rule(pendulum.TRANSITION_ERROR)
179+
d = Pendulum.create(2013, 3, 31, 2, 30)
180+
181+
self.assertRaises(NonExistingTime, d.replace, tzinfo='Europe/Paris')

0 commit comments

Comments
 (0)