Skip to content

Commit 87a2e4b

Browse files
committed
Correctly handle monkeypatching of datetime in PyPy
1 parent d9538a7 commit 87a2e4b

File tree

3 files changed

+67
-29
lines changed

3 files changed

+67
-29
lines changed

coincidence/utils.py

Lines changed: 57 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141

4242
# 3rd party
4343
import pytest
44+
from domdf_python_tools.compat import PYPY
4445
from domdf_python_tools.iterative import Len
4546
from domdf_python_tools.paths import PathPlus
4647

@@ -97,42 +98,69 @@ def with_fixed_datetime(fixed_datetime: datetime.datetime):
9798
Using ``from datetime import datetime`` won't work.
9899
"""
99100

100-
class D(datetime.date):
101-
102-
@classmethod
103-
def today(cls):
104-
return datetime.date(
105-
fixed_datetime.year,
106-
fixed_datetime.month,
107-
fixed_datetime.day,
101+
if PYPY: # pragma: no cover (!PyPy)
102+
103+
with pytest.MonkeyPatch.context() as monkeypatch:
104+
monkeypatch.setattr(
105+
datetime.date,
106+
"today",
107+
lambda *args: datetime.date(
108+
fixed_datetime.year,
109+
fixed_datetime.month,
110+
fixed_datetime.day,
111+
)
112+
)
113+
monkeypatch.setattr(
114+
datetime.datetime,
115+
"today",
116+
lambda *args: datetime.datetime(
117+
fixed_datetime.year,
118+
fixed_datetime.month,
119+
fixed_datetime.day,
120+
)
108121
)
122+
monkeypatch.setattr(datetime.datetime, "now", lambda *args: fixed_datetime)
109123

110-
class DT(datetime.datetime):
124+
yield
111125

112-
@classmethod
113-
def today(cls):
114-
return datetime.datetime(
115-
fixed_datetime.year,
116-
fixed_datetime.month,
117-
fixed_datetime.day,
118-
)
126+
else: # pragma: no cover (PyPy)
127+
128+
class D(datetime.date):
129+
130+
@classmethod
131+
def today(cls):
132+
return datetime.date(
133+
fixed_datetime.year,
134+
fixed_datetime.month,
135+
fixed_datetime.day,
136+
)
137+
138+
class DT(datetime.datetime):
139+
140+
@classmethod
141+
def today(cls):
142+
return datetime.datetime(
143+
fixed_datetime.year,
144+
fixed_datetime.month,
145+
fixed_datetime.day,
146+
)
119147

120-
@classmethod
121-
def now(cls, tz: Optional[datetime.tzinfo] = None):
122-
return datetime.datetime.fromtimestamp(fixed_datetime.timestamp())
148+
@classmethod
149+
def now(cls, tz: Optional[datetime.tzinfo] = None):
150+
return datetime.datetime.fromtimestamp(fixed_datetime.timestamp())
123151

124-
D.__name__ = "date"
125-
D.__qualname__ = "date"
126-
DT.__qualname__ = "datetime"
127-
DT.__name__ = "datetime"
128-
D.__module__ = "datetime"
129-
DT.__module__ = "datetime"
152+
D.__name__ = "date"
153+
D.__qualname__ = "date"
154+
DT.__qualname__ = "datetime"
155+
DT.__name__ = "datetime"
156+
D.__module__ = "datetime"
157+
DT.__module__ = "datetime"
130158

131-
with pytest.MonkeyPatch.context() as monkeypatch:
132-
monkeypatch.setattr(datetime, "date", D)
133-
monkeypatch.setattr(datetime, "datetime", DT)
159+
with pytest.MonkeyPatch.context() as monkeypatch:
160+
monkeypatch.setattr(datetime, "date", D)
161+
monkeypatch.setattr(datetime, "datetime", DT)
134162

135-
yield
163+
yield
136164

137165

138166
def generate_truthy_values(

tests/test_fixtures.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
# 3rd party
55
from domdf_python_tools.paths import PathPlus
66

7+
original_datetime = datetime.datetime
8+
79

810
def test_tmp_pathplus(tmp_pathplus: PathPlus):
911
assert isinstance(tmp_pathplus, PathPlus)
@@ -24,6 +26,9 @@ def test_fixed_datetime(fixed_datetime):
2426
assert datetime.date.__qualname__ == "date"
2527
assert datetime.date.__module__ == "datetime"
2628

29+
assert datetime.datetime.now() - datetime.datetime(2019, 10, 13, 2, 20) == datetime.timedelta(days=366)
30+
assert datetime.datetime.now() - original_datetime(2019, 10, 13, 2, 20) == datetime.timedelta(days=366)
31+
2732

2833
def test_path_separator(path_separator: str):
2934
assert isinstance(path_separator, str)

tests/test_utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
import coincidence
1111
from coincidence.utils import generate_falsy_values, generate_truthy_values, with_fixed_datetime
1212

13+
original_datetime = datetime.datetime
14+
1315

1416
def test_generate_truthy_values():
1517
random.seed(1234)
@@ -117,6 +119,9 @@ def test_with_fixed_datetime(fake_datetime, expected_date: datetime.datetime):
117119
assert datetime.date.__qualname__ == "date"
118120
assert datetime.date.__module__ == "datetime"
119121

122+
datetime.datetime.now() - datetime.datetime(2019, 10, 13, 2, 20)
123+
datetime.datetime.now() - original_datetime(2019, 10, 13, 2, 20)
124+
120125

121126
def test_is_docker(monkeypatch, tmp_pathplus: PathPlus):
122127
cgroup = tmp_pathplus / "cgroup"

0 commit comments

Comments
 (0)