From 8cc6392274b240ff1fee10667574efdf2de06e2a Mon Sep 17 00:00:00 2001 From: Meow Date: Sun, 13 Oct 2024 16:41:27 +0800 Subject: [PATCH] Make sure Interval can be deepcopy-ed, fix #850 --- src/pendulum/interval.py | 9 +++++++++ tests/interval/test_behavior.py | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/pendulum/interval.py b/src/pendulum/interval.py index 747367c1..c5e0713a 100644 --- a/src/pendulum/interval.py +++ b/src/pendulum/interval.py @@ -1,11 +1,13 @@ from __future__ import annotations +import copy import operator from datetime import date from datetime import datetime from datetime import timedelta from typing import TYPE_CHECKING +from typing import Any from typing import Generic from typing import TypeVar from typing import cast @@ -409,3 +411,10 @@ def __eq__(self, other: object) -> bool: def __ne__(self, other: object) -> bool: return not self.__eq__(other) + + def __deepcopy__(self, memo: dict[int, Any]) -> Self: + return self.__class__( + copy.deepcopy(self.start, memo), + copy.deepcopy(self.end, memo), + self._absolute, + ) diff --git a/tests/interval/test_behavior.py b/tests/interval/test_behavior.py index 96a1f426..d2ee0c9b 100644 --- a/tests/interval/test_behavior.py +++ b/tests/interval/test_behavior.py @@ -1,5 +1,6 @@ from __future__ import annotations +import copy import pickle from datetime import timedelta @@ -65,3 +66,18 @@ def test_inequality(): assert interval1 != interval2 assert interval1 != interval3 + + +def test_deepcopy(): + dt1 = pendulum.datetime(2016, 11, 18) + dt2 = pendulum.datetime(2016, 11, 20) + + interval = dt2 - dt1 + + interval2 = copy.deepcopy(interval) + + assert interval == interval2 + # make sure it's a deep copy + assert interval is not interval2 + assert interval.start is not interval2.start + assert interval.end is not interval2.end