Skip to content

Commit b6989fe

Browse files
committed
Fixes setters and modifiers (start_of/end_of) to properly apply transitions.
Fixes #36
1 parent 66336bc commit b6989fe

File tree

3 files changed

+56
-13
lines changed

3 files changed

+56
-13
lines changed

pendulum/pendulum.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -480,25 +480,30 @@ def copy(self):
480480
### Getters/Setters
481481

482482
def year_(self, year):
483-
return self.instance(self._datetime.replace(year=year))
483+
return self._setter(year=year)
484484

485485
def month_(self, month):
486-
return self.instance(self._datetime.replace(month=month))
486+
return self._setter(month=month)
487487

488488
def day_(self, day):
489-
return self.instance(self._datetime.replace(day=day))
489+
return self._setter(day=day)
490490

491491
def hour_(self, hour):
492-
return self.instance(self._datetime.replace(hour=hour))
492+
return self._setter(hour=hour)
493493

494494
def minute_(self, minute):
495-
return self.instance(self._datetime.replace(minute=minute))
495+
return self._setter(minute=minute)
496496

497497
def second_(self, second):
498-
return self.instance(self._datetime.replace(second=second))
498+
return self._setter(second=second)
499499

500500
def microsecond_(self, microsecond):
501-
return self.instance(self._datetime.replace(microsecond=microsecond))
501+
return self._setter(microsecond=microsecond)
502+
503+
def _setter(self, **kwargs):
504+
kwargs['tzinfo'] = None
505+
506+
return self.instance(self._datetime.replace(**kwargs), self._tz)
502507

503508
def timezone_(self, tz):
504509
tz = self._safe_create_datetime_zone(tz)
@@ -651,10 +656,11 @@ def with_date(self, year, month, day):
651656
:rtype: Pendulum
652657
"""
653658
dt = self._datetime.replace(
654-
year=int(year), month=int(month), day=int(day)
659+
year=int(year), month=int(month), day=int(day),
660+
tzinfo=None
655661
)
656662

657-
return self.instance(dt)
663+
return self.instance(dt, self._tz)
658664

659665
def with_time(self, hour, minute, second, microsecond=0):
660666
"""
@@ -676,10 +682,11 @@ def with_time(self, hour, minute, second, microsecond=0):
676682
"""
677683
dt = self._datetime.replace(
678684
hour=int(hour), minute=int(minute), second=int(second),
679-
microsecond=microsecond
685+
microsecond=microsecond,
686+
tzinfo=None
680687
)
681688

682-
return self.instance(dt)
689+
return self.instance(dt, self._tz)
683690

684691
def with_date_time(self, year, month, day, hour, minute, second, microsecond=0):
685692
"""
@@ -697,10 +704,11 @@ def with_date_time(self, year, month, day, hour, minute, second, microsecond=0):
697704
dt = self._datetime.replace(
698705
year=year, month=month, day=day,
699706
hour=int(hour), minute=int(minute), second=int(second),
700-
microsecond=microsecond
707+
microsecond=microsecond,
708+
tzinfo=None
701709
)
702710

703-
return self.instance(dt)
711+
return self.instance(dt, self._tz)
704712

705713
def with_time_from_string(self, time):
706714
"""

tests/pendulum_tests/test_fluent_setters.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,19 @@ def test_fluid_with_date(self):
7979
self.assertEqual(7, d.month)
8080
self.assertEqual(2, d.day)
8181

82+
def test_fluid_with_date_with_transition(self):
83+
d = Pendulum.create(2013, 3, 31, 0, 0, 0, 0, 'Europe/Paris')
84+
new = d.with_date(2013, 4, 1)
85+
self.assertIsInstanceOfPendulum(new)
86+
self.assertEqual(2013, new.year)
87+
self.assertEqual(4, new.month)
88+
self.assertEqual(1, new.day)
89+
self.assertEqual(7200, new.offset)
90+
self.assertEqual(2013, d.year)
91+
self.assertEqual(3, d.month)
92+
self.assertEqual(31, d.day)
93+
self.assertEqual(3600, d.offset)
94+
8295
def test_fluid_set_time(self):
8396
d = Pendulum.create(2016, 7, 2, 0, 41, 20)
8497
new = d.with_time(5, 32, 49)
@@ -90,6 +103,14 @@ def test_fluid_set_time(self):
90103
self.assertEqual(41, d.minute)
91104
self.assertEqual(20, d.second)
92105

106+
def test_fluid_set_time_with_transition(self):
107+
d = Pendulum.create(2013, 3, 31, 0, 0, 0, 0, 'Europe/Paris')
108+
new = d.with_time(2, 30, 0)
109+
self.assertIsInstanceOfPendulum(new)
110+
self.assertEqual(3, new.hour)
111+
self.assertEqual(30, new.minute)
112+
self.assertEqual(0, new.second)
113+
93114
def test_fluid_set_timestamp(self):
94115
d = Pendulum.create(2016, 7, 2, 0, 41, 20)
95116
new = d.timestamp_(0)

tests/pendulum_tests/test_start_end_of.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,17 @@ def start_of_with_invalid_unit(self):
191191

192192
def end_of_with_invalid_unit(self):
193193
self.assertRaises(ValueError, Pendulum.now().end_of('invalid'))
194+
195+
def test_start_of_with_transition(self):
196+
d = Pendulum(2013, 10, 27, 23, 59, 59, tzinfo='Europe/Paris')
197+
self.assertEqual(3600, d.offset)
198+
self.assertEqual(7200, d.start_of('month').offset)
199+
self.assertEqual(7200, d.start_of('day').offset)
200+
self.assertEqual(3600, d.start_of('year').offset)
201+
202+
def test_end_of_with_transition(self):
203+
d = Pendulum(2013, 3, 31, tzinfo='Europe/Paris')
204+
self.assertEqual(3600, d.offset)
205+
self.assertEqual(7200, d.end_of('month').offset)
206+
self.assertEqual(7200, d.end_of('day').offset)
207+
self.assertEqual(3600, d.end_of('year').offset)

0 commit comments

Comments
 (0)