Skip to content

Commit 0a884dd

Browse files
authored
Fix handling of the fold attribute when deep copying DateTime objects (#776)
Fixes #767
1 parent c811ecd commit 0a884dd

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

src/pendulum/datetime.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,17 +1357,32 @@ def _getstate(
13571357
def __reduce__(
13581358
self,
13591359
) -> tuple[
1360-
type[Self], tuple[int, int, int, int, int, int, int, datetime.tzinfo | None]
1360+
type[Self],
1361+
tuple[int, int, int, int, int, int, int, datetime.tzinfo | None],
13611362
]:
13621363
return self.__reduce_ex__(2)
13631364

13641365
def __reduce_ex__(
13651366
self, protocol: SupportsIndex
13661367
) -> tuple[
1367-
type[Self], tuple[int, int, int, int, int, int, int, datetime.tzinfo | None]
1368+
type[Self],
1369+
tuple[int, int, int, int, int, int, int, datetime.tzinfo | None],
13681370
]:
13691371
return self.__class__, self._getstate(protocol)
13701372

1373+
def __deepcopy__(self, _: dict[int, Self]) -> Self:
1374+
return self.__class__(
1375+
self.year,
1376+
self.month,
1377+
self.day,
1378+
self.hour,
1379+
self.minute,
1380+
self.second,
1381+
self.microsecond,
1382+
tzinfo=self.tz,
1383+
fold=self.fold,
1384+
)
1385+
13711386
def _cmp(self, other: datetime.datetime, **kwargs: Any) -> int:
13721387
# Fix for pypy which compares using this method
13731388
# which would lead to infinite recursion if we didn't override

tests/datetime/test_behavior.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,14 @@ def test_deepcopy():
158158
assert dt == deepcopy(dt)
159159

160160

161+
def test_deepcopy_on_transition():
162+
dt = pendulum.datetime(2023, 11, 5, 1, 0, 0, tz="US/Pacific")
163+
clone = deepcopy(dt)
164+
165+
assert dt == clone
166+
assert dt.offset == clone.offset
167+
168+
161169
def test_pickle_timezone():
162170
dt1 = pendulum.timezone("Europe/Amsterdam")
163171
s = pickle.dumps(dt1)

0 commit comments

Comments
 (0)