Skip to content

Commit 8cc6392

Browse files
aploiumashb
authored andcommitted
Make sure Interval can be deepcopy-ed, fix #850
1 parent d40ab96 commit 8cc6392

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

src/pendulum/interval.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
from __future__ import annotations
22

3+
import copy
34
import operator
45

56
from datetime import date
67
from datetime import datetime
78
from datetime import timedelta
89
from typing import TYPE_CHECKING
10+
from typing import Any
911
from typing import Generic
1012
from typing import TypeVar
1113
from typing import cast
@@ -409,3 +411,10 @@ def __eq__(self, other: object) -> bool:
409411

410412
def __ne__(self, other: object) -> bool:
411413
return not self.__eq__(other)
414+
415+
def __deepcopy__(self, memo: dict[int, Any]) -> Self:
416+
return self.__class__(
417+
copy.deepcopy(self.start, memo),
418+
copy.deepcopy(self.end, memo),
419+
self._absolute,
420+
)

tests/interval/test_behavior.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import copy
34
import pickle
45

56
from datetime import timedelta
@@ -65,3 +66,18 @@ def test_inequality():
6566

6667
assert interval1 != interval2
6768
assert interval1 != interval3
69+
70+
71+
def test_deepcopy():
72+
dt1 = pendulum.datetime(2016, 11, 18)
73+
dt2 = pendulum.datetime(2016, 11, 20)
74+
75+
interval = dt2 - dt1
76+
77+
interval2 = copy.deepcopy(interval)
78+
79+
assert interval == interval2
80+
# make sure it's a deep copy
81+
assert interval is not interval2
82+
assert interval.start is not interval2.start
83+
assert interval.end is not interval2.end

0 commit comments

Comments
 (0)