Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit fd26293

Browse files
authored
tests: use zoneinfo instead of pytz (#1304)
1 parent 5228721 commit fd26293

File tree

5 files changed

+29
-22
lines changed

5 files changed

+29
-22
lines changed

tests/emscripten_runner.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ async function main() {
8686
FS.mkdir('/test_dir');
8787
FS.mount(FS.filesystems.NODEFS, {root: path.join(root_dir, 'tests')}, '/test_dir');
8888
FS.chdir('/test_dir');
89-
await pyodide.loadPackage(['micropip', 'pytest', 'pytz']);
89+
await pyodide.loadPackage(['micropip', 'pytest']);
9090
// language=python
9191
errcode = await pyodide.runPythonAsync(`
9292
import micropip
@@ -101,6 +101,7 @@ await micropip.install([
101101
'hypothesis',
102102
'pytest-speed',
103103
'pytest-mock',
104+
'tzdata',
104105
'file:${wheel_path}',
105106
'typing-extensions',
106107
])

tests/requirements.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
backports.zoneinfo==0.2.1;python_version<"3.9"
12
coverage==7.5.0
23
dirty-equals==0.7.1.post0
34
hypothesis==6.100.2
@@ -16,7 +17,7 @@ pytest-speed==0.3.5
1617
pytest-mock==3.14.0
1718
pytest-pretty==1.2.0
1819
pytest-timeout==2.3.1
19-
pytz==2024.1
2020
# numpy doesn't offer prebuilt wheels for all versions and platforms we test in CI e.g. aarch64 musllinux
2121
numpy==1.26.2; python_version >= "3.9" and python_version < "3.13" and implementation_name == "cpython" and platform_machine == 'x86_64'
2222
exceptiongroup==1.1; python_version < "3.11"
23+
tzdata==2024.1

tests/validators/test_datetime.py

+23-18
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,12 @@
77
from typing import Dict
88

99
import pytest
10-
import pytz
10+
11+
try:
12+
import zoneinfo
13+
except ImportError:
14+
# TODO: can remove this once we drop support for python 3.8
15+
from backports import zoneinfo
1116

1217
from pydantic_core import SchemaError, SchemaValidator, ValidationError, core_schema, validate_core_schema
1318

@@ -81,8 +86,8 @@ def test_datetime_strict(input_value, expected):
8186

8287

8388
def test_keep_tz():
84-
tz = pytz.timezone('Europe/London')
85-
dt = tz.localize(datetime(2022, 6, 14, 12, 13, 14))
89+
tz = zoneinfo.ZoneInfo('Europe/London')
90+
dt = datetime(2022, 6, 14, 12, 13, 14, tzinfo=tz)
8691
v = SchemaValidator({'type': 'datetime'})
8792

8893
output = v.validate_python(dt)
@@ -94,8 +99,8 @@ def test_keep_tz():
9499

95100

96101
def test_keep_tz_bound():
97-
tz = pytz.timezone('Europe/London')
98-
dt = tz.localize(datetime(2022, 6, 14, 12, 13, 14))
102+
tz = zoneinfo.ZoneInfo('Europe/London')
103+
dt = datetime(2022, 6, 14, 12, 13, 14, tzinfo=tz)
99104
v = SchemaValidator({'type': 'datetime', 'gt': datetime(2022, 1, 1)})
100105

101106
output = v.validate_python(dt)
@@ -106,7 +111,7 @@ def test_keep_tz_bound():
106111
assert output.tzinfo.dst(datetime(2022, 1, 1)) == timedelta(0)
107112

108113
with pytest.raises(ValidationError, match=r'Input should be greater than 2022-01-01T00:00:00 \[type=greater_than'):
109-
v.validate_python(tz.localize(datetime(2021, 6, 14)))
114+
v.validate_python(datetime(2021, 6, 14, tzinfo=tz))
110115

111116

112117
@pytest.mark.parametrize(
@@ -186,8 +191,8 @@ def test_custom_timezone_utc_repr():
186191

187192

188193
def test_tz_comparison():
189-
tz = pytz.timezone('Europe/London')
190-
uk_3pm = tz.localize(datetime(2022, 1, 1, 15, 0, 0))
194+
tz = zoneinfo.ZoneInfo('Europe/London')
195+
uk_3pm = datetime(2022, 1, 1, 15, 0, 0, tzinfo=tz)
191196

192197
# two times are the same instant, therefore le and ge are both ok
193198
v = SchemaValidator({'type': 'datetime', 'le': uk_3pm}).validate_python('2022-01-01T16:00:00+01:00')
@@ -322,22 +327,22 @@ def test_datetime_past_timezone():
322327
now_utc = datetime.now(timezone.utc) - timedelta(seconds=1)
323328
assert v.isinstance_python(now_utc)
324329
# "later" in the day
325-
assert v.isinstance_python(now_utc.astimezone(pytz.timezone('Europe/Istanbul')))
330+
assert v.isinstance_python(now_utc.astimezone(zoneinfo.ZoneInfo('Europe/Istanbul')))
326331
# "earlier" in the day
327-
assert v.isinstance_python(now_utc.astimezone(pytz.timezone('America/Los_Angeles')))
332+
assert v.isinstance_python(now_utc.astimezone(zoneinfo.ZoneInfo('America/Los_Angeles')))
328333

329334
soon_utc = now_utc + timedelta(minutes=1)
330335
assert not v.isinstance_python(soon_utc)
331336

332337
# "later" in the day
333-
assert not v.isinstance_python(soon_utc.astimezone(pytz.timezone('Europe/Istanbul')))
338+
assert not v.isinstance_python(soon_utc.astimezone(zoneinfo.ZoneInfo('Europe/Istanbul')))
334339
# "earlier" in the day
335-
assert not v.isinstance_python(soon_utc.astimezone(pytz.timezone('America/Los_Angeles')))
340+
assert not v.isinstance_python(soon_utc.astimezone(zoneinfo.ZoneInfo('America/Los_Angeles')))
336341

337342
# input value is timezone naive, so we do a dumb comparison in these terms the istanbul time is later so fails
338343
# wile the LA time is earlier so passes
339-
assert not v.isinstance_python(soon_utc.astimezone(pytz.timezone('Europe/Istanbul')).replace(tzinfo=None))
340-
assert v.isinstance_python(soon_utc.astimezone(pytz.timezone('America/Los_Angeles')).replace(tzinfo=None))
344+
assert not v.isinstance_python(soon_utc.astimezone(zoneinfo.ZoneInfo('Europe/Istanbul')).replace(tzinfo=None))
345+
assert v.isinstance_python(soon_utc.astimezone(zoneinfo.ZoneInfo('America/Los_Angeles')).replace(tzinfo=None))
341346

342347

343348
@pytest.mark.parametrize(
@@ -368,17 +373,17 @@ def test_datetime_future_timezone():
368373
assert v.isinstance_python(soon_utc)
369374

370375
# "later" in the day
371-
assert v.isinstance_python(soon_utc.astimezone(pytz.timezone('Europe/Istanbul')))
376+
assert v.isinstance_python(soon_utc.astimezone(zoneinfo.ZoneInfo('Europe/Istanbul')))
372377
# "earlier" in the day
373-
assert v.isinstance_python(soon_utc.astimezone(pytz.timezone('America/Los_Angeles')))
378+
assert v.isinstance_python(soon_utc.astimezone(zoneinfo.ZoneInfo('America/Los_Angeles')))
374379

375380
past_utc = now_utc - timedelta(minutes=1)
376381
assert not v.isinstance_python(past_utc)
377382

378383
# "later" in the day
379-
assert not v.isinstance_python(past_utc.astimezone(pytz.timezone('Europe/Istanbul')))
384+
assert not v.isinstance_python(past_utc.astimezone(zoneinfo.ZoneInfo('Europe/Istanbul')))
380385
# "earlier" in the day
381-
assert not v.isinstance_python(past_utc.astimezone(pytz.timezone('America/Los_Angeles')))
386+
assert not v.isinstance_python(past_utc.astimezone(zoneinfo.ZoneInfo('America/Los_Angeles')))
382387

383388

384389
def test_mock_utc_offset_8_hours(mocker):

wasm-preview/run_tests.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ async def main(tests_zip: str, tag_name: str):
3737

3838
print(f'Mounted {count} test files, installing dependencies...')
3939

40-
await micropip.install(['dirty-equals', 'hypothesis', 'pytest-speed', 'pytest-mock', pydantic_core_wheel])
40+
await micropip.install(['dirty-equals', 'hypothesis', 'pytest-speed', 'pytest-mock', pydantic_core_wheel, 'tzdata'])
4141
importlib.invalidate_caches()
4242

4343
# print('installed packages:')

wasm-preview/worker.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ async function main() {
9797
setupStreams(FS, pyodide._module.TTY);
9898
FS.mkdir('/test_dir');
9999
FS.chdir('/test_dir');
100-
await pyodide.loadPackage(['micropip', 'pytest', 'pytz', 'numpy']);
100+
await pyodide.loadPackage(['micropip', 'pytest', 'numpy']);
101101
if (pydantic_core_version < '2.0.0') await pyodide.loadPackage(['typing-extensions']);
102102
await pyodide.runPythonAsync(python_code, {globals: pyodide.toPy({pydantic_core_version, tests_zip})});
103103
post();

0 commit comments

Comments
 (0)