Skip to content

Commit 687583c

Browse files
committed
Replace pytz with zoneinfo / datetime.timezone
1 parent f1eeaa0 commit 687583c

File tree

5 files changed

+70
-74
lines changed

5 files changed

+70
-74
lines changed

examples/zoo_app/requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ Jinja2==2.11.3
88
jsonschema==3.2.0
99
MarkupSafe==2.0.1
1010
pyrsistent==0.17.3
11-
pytz==2021.1
1211
six==1.16.0
1312
Werkzeug==2.2.3
1413

flask_restx/inputs.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,15 @@ def my_type(value):
1919
import re
2020
import socket
2121

22-
from datetime import datetime, time, timedelta
22+
from datetime import datetime, time, timedelta, timezone
2323
from email.utils import parsedate_tz, mktime_tz
2424
from urllib.parse import urlparse
2525

2626
import aniso8601
27-
import pytz
2827

2928
# Constants for upgrading date-based intervals to full datetimes.
30-
START_OF_DAY = time(0, 0, 0, tzinfo=pytz.UTC)
31-
END_OF_DAY = time(23, 59, 59, 999999, tzinfo=pytz.UTC)
29+
START_OF_DAY = time(0, 0, 0, tzinfo=timezone.utc)
30+
END_OF_DAY = time(23, 59, 59, 999999, tzinfo=timezone.utc)
3231

3332

3433
netloc_regex = re.compile(
@@ -338,11 +337,11 @@ def _normalize_interval(start, end, value):
338337
end = datetime.combine(end, START_OF_DAY)
339338

340339
if start.tzinfo is None:
341-
start = pytz.UTC.localize(start)
342-
end = pytz.UTC.localize(end)
340+
start = start.replace(tzinfo=timezone.utc)
341+
end = end.replace(tzinfo=timezone.utc)
343342
else:
344-
start = start.astimezone(pytz.UTC)
345-
end = end.astimezone(pytz.UTC)
343+
start = start.astimezone(timezone.utc)
344+
end = end.astimezone(timezone.utc)
346345

347346
return start, end
348347

@@ -424,11 +423,11 @@ def iso8601interval(value, argument="argument"):
424423

425424
start, end = _normalize_interval(start, end, value)
426425

427-
except ValueError:
426+
except ValueError as e:
428427
msg = (
429428
"Invalid {arg}: {value}. {arg} must be a valid ISO8601 date/time interval."
430429
)
431-
raise ValueError(msg.format(arg=argument, value=value))
430+
raise ValueError(msg.format(arg=argument, value=value)) from e
432431

433432
return start, end
434433

@@ -559,9 +558,9 @@ def datetime_from_rfc822(value):
559558
timetuple = parsedate_tz(value)
560559
timestamp = mktime_tz(timetuple)
561560
if timetuple[-1] is None:
562-
return datetime.fromtimestamp(timestamp).replace(tzinfo=pytz.utc)
561+
return datetime.fromtimestamp(timestamp).replace(tzinfo=timezone.utc)
563562
else:
564-
return datetime.fromtimestamp(timestamp, pytz.utc)
563+
return datetime.fromtimestamp(timestamp, timezone.utc)
565564
except Exception:
566565
raise ValueError('Invalid date literal "{0}"'.format(raw))
567566

requirements/install.pip

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,4 @@ aniso8601>=0.82
22
jsonschema
33
Flask>=0.8, !=2.0.0
44
werkzeug!=2.0.0
5-
pytz
65
importlib_resources

tests/test_fields.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1+
import zoneinfo
12
from collections import OrderedDict
2-
from datetime import date, datetime
3+
from datetime import date, datetime, timezone
34
from decimal import Decimal
45
from functools import partial
56

6-
import pytz
77
import pytest
88

99
from flask import Blueprint
@@ -538,11 +538,11 @@ def test_max_exclusive(self):
538538
(datetime(2011, 1, 1), "Sat, 01 Jan 2011 00:00:00 -0000"),
539539
(datetime(2011, 1, 1, 23, 59, 59), "Sat, 01 Jan 2011 23:59:59 -0000"),
540540
(
541-
datetime(2011, 1, 1, 23, 59, 59, tzinfo=pytz.utc),
541+
datetime(2011, 1, 1, 23, 59, 59, tzinfo=timezone.utc),
542542
"Sat, 01 Jan 2011 23:59:59 -0000",
543543
),
544544
(
545-
datetime(2011, 1, 1, 23, 59, 59, tzinfo=pytz.timezone("CET")),
545+
datetime(2011, 1, 1, 23, 59, 59, tzinfo=zoneinfo.ZoneInfo("CET")),
546546
"Sat, 01 Jan 2011 22:59:59 -0000",
547547
),
548548
],
@@ -558,15 +558,15 @@ def test_rfc822_value(self, value, expected):
558558
(datetime(2011, 1, 1, 23, 59, 59), "2011-01-01T23:59:59"),
559559
(datetime(2011, 1, 1, 23, 59, 59, 1000), "2011-01-01T23:59:59.001000"),
560560
(
561-
datetime(2011, 1, 1, 23, 59, 59, tzinfo=pytz.utc),
561+
datetime(2011, 1, 1, 23, 59, 59, tzinfo=timezone.utc),
562562
"2011-01-01T23:59:59+00:00",
563563
),
564564
(
565-
datetime(2011, 1, 1, 23, 59, 59, 1000, tzinfo=pytz.utc),
565+
datetime(2011, 1, 1, 23, 59, 59, 1000, tzinfo=timezone.utc),
566566
"2011-01-01T23:59:59.001000+00:00",
567567
),
568568
(
569-
datetime(2011, 1, 1, 23, 59, 59, tzinfo=pytz.timezone("CET")),
569+
datetime(2011, 1, 1, 23, 59, 59, tzinfo=zoneinfo.ZoneInfo("CET")),
570570
"2011-01-01T23:59:59+01:00",
571571
),
572572
],
@@ -673,10 +673,10 @@ def test_max_exclusive(self):
673673
(datetime(2011, 1, 1), "2011-01-01"),
674674
(datetime(2011, 1, 1, 23, 59, 59), "2011-01-01"),
675675
(datetime(2011, 1, 1, 23, 59, 59, 1000), "2011-01-01"),
676-
(datetime(2011, 1, 1, 23, 59, 59, tzinfo=pytz.utc), "2011-01-01"),
677-
(datetime(2011, 1, 1, 23, 59, 59, 1000, tzinfo=pytz.utc), "2011-01-01"),
676+
(datetime(2011, 1, 1, 23, 59, 59, tzinfo=timezone.utc), "2011-01-01"),
677+
(datetime(2011, 1, 1, 23, 59, 59, 1000, tzinfo=timezone.utc), "2011-01-01"),
678678
(
679-
datetime(2011, 1, 1, 23, 59, 59, tzinfo=pytz.timezone("CET")),
679+
datetime(2011, 1, 1, 23, 59, 59, tzinfo=zoneinfo.ZoneInfo("CET")),
680680
"2011-01-01",
681681
),
682682
],

tests/test_inputs.py

Lines changed: 49 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import re
2-
import pytz
32
import pytest
43

5-
from datetime import date, datetime
4+
from datetime import date, datetime, timezone
65

76
from flask_restx import inputs
87

@@ -37,18 +36,18 @@ class Iso8601DatetimeTest(object):
3736
"value,expected",
3837
[
3938
("2011-01-01", datetime(2011, 1, 1)),
40-
("2011-01-01T00:00:00+00:00", datetime(2011, 1, 1, tzinfo=pytz.utc)),
39+
("2011-01-01T00:00:00+00:00", datetime(2011, 1, 1, tzinfo=timezone.utc)),
4140
(
4241
"2011-01-01T23:59:59+00:00",
43-
datetime(2011, 1, 1, 23, 59, 59, tzinfo=pytz.utc),
42+
datetime(2011, 1, 1, 23, 59, 59, tzinfo=timezone.utc),
4443
),
4544
(
4645
"2011-01-01T23:59:59.001000+00:00",
47-
datetime(2011, 1, 1, 23, 59, 59, 1000, tzinfo=pytz.utc),
46+
datetime(2011, 1, 1, 23, 59, 59, 1000, tzinfo=timezone.utc),
4847
),
4948
(
5049
"2011-01-01T23:59:59+02:00",
51-
datetime(2011, 1, 1, 21, 59, 59, tzinfo=pytz.utc),
50+
datetime(2011, 1, 1, 21, 59, 59, tzinfo=timezone.utc),
5251
),
5352
],
5453
)
@@ -70,22 +69,22 @@ class Rfc822DatetimeTest(object):
7069
@pytest.mark.parametrize(
7170
"value,expected",
7271
[
73-
("Sat, 01 Jan 2011", datetime(2011, 1, 1, tzinfo=pytz.utc)),
74-
("Sat, 01 Jan 2011 00:00", datetime(2011, 1, 1, tzinfo=pytz.utc)),
75-
("Sat, 01 Jan 2011 00:00:00", datetime(2011, 1, 1, tzinfo=pytz.utc)),
76-
("Sat, 01 Jan 2011 00:00:00 +0000", datetime(2011, 1, 1, tzinfo=pytz.utc)),
77-
("Sat, 01 Jan 2011 00:00:00 -0000", datetime(2011, 1, 1, tzinfo=pytz.utc)),
72+
("Sat, 01 Jan 2011", datetime(2011, 1, 1, tzinfo=timezone.utc)),
73+
("Sat, 01 Jan 2011 00:00", datetime(2011, 1, 1, tzinfo=timezone.utc)),
74+
("Sat, 01 Jan 2011 00:00:00", datetime(2011, 1, 1, tzinfo=timezone.utc)),
75+
("Sat, 01 Jan 2011 00:00:00 +0000", datetime(2011, 1, 1, tzinfo=timezone.utc)),
76+
("Sat, 01 Jan 2011 00:00:00 -0000", datetime(2011, 1, 1, tzinfo=timezone.utc)),
7877
(
7978
"Sat, 01 Jan 2011 23:59:59 -0000",
80-
datetime(2011, 1, 1, 23, 59, 59, tzinfo=pytz.utc),
79+
datetime(2011, 1, 1, 23, 59, 59, tzinfo=timezone.utc),
8180
),
8281
(
8382
"Sat, 01 Jan 2011 21:00:00 +0200",
84-
datetime(2011, 1, 1, 19, 0, 0, tzinfo=pytz.utc),
83+
datetime(2011, 1, 1, 19, 0, 0, tzinfo=timezone.utc),
8584
),
8685
(
8786
"Sat, 01 Jan 2011 21:00:00 -0200",
88-
datetime(2011, 1, 1, 23, 0, 0, tzinfo=pytz.utc),
87+
datetime(2011, 1, 1, 23, 0, 0, tzinfo=timezone.utc),
8988
),
9089
],
9190
)
@@ -985,145 +984,145 @@ def test_schema(self):
985984
# Full precision with explicit UTC.
986985
"2013-01-01T12:30:00Z/P1Y2M3DT4H5M6S",
987986
(
988-
datetime(2013, 1, 1, 12, 30, 0, tzinfo=pytz.utc),
989-
datetime(2014, 3, 5, 16, 35, 6, tzinfo=pytz.utc),
987+
datetime(2013, 1, 1, 12, 30, 0, tzinfo=timezone.utc),
988+
datetime(2014, 3, 5, 16, 35, 6, tzinfo=timezone.utc),
990989
),
991990
),
992991
(
993992
# Full precision with alternate UTC indication
994993
"2013-01-01T12:30+00:00/P2D",
995994
(
996-
datetime(2013, 1, 1, 12, 30, 0, tzinfo=pytz.utc),
997-
datetime(2013, 1, 3, 12, 30, 0, tzinfo=pytz.utc),
995+
datetime(2013, 1, 1, 12, 30, 0, tzinfo=timezone.utc),
996+
datetime(2013, 1, 3, 12, 30, 0, tzinfo=timezone.utc),
998997
),
999998
),
1000999
(
10011000
# Implicit UTC with time
10021001
"2013-01-01T15:00/P1M",
10031002
(
1004-
datetime(2013, 1, 1, 15, 0, 0, tzinfo=pytz.utc),
1005-
datetime(2013, 1, 31, 15, 0, 0, tzinfo=pytz.utc),
1003+
datetime(2013, 1, 1, 15, 0, 0, tzinfo=timezone.utc),
1004+
datetime(2013, 1, 31, 15, 0, 0, tzinfo=timezone.utc),
10061005
),
10071006
),
10081007
(
10091008
# TZ conversion
10101009
"2013-01-01T17:00-05:00/P2W",
10111010
(
1012-
datetime(2013, 1, 1, 22, 0, 0, tzinfo=pytz.utc),
1013-
datetime(2013, 1, 15, 22, 0, 0, tzinfo=pytz.utc),
1011+
datetime(2013, 1, 1, 22, 0, 0, tzinfo=timezone.utc),
1012+
datetime(2013, 1, 15, 22, 0, 0, tzinfo=timezone.utc),
10141013
),
10151014
),
10161015
(
10171016
# Date upgrade to midnight-midnight period
10181017
"2013-01-01/P3D",
10191018
(
1020-
datetime(2013, 1, 1, 0, 0, 0, tzinfo=pytz.utc),
1021-
datetime(2013, 1, 4, 0, 0, 0, 0, tzinfo=pytz.utc),
1019+
datetime(2013, 1, 1, 0, 0, 0, tzinfo=timezone.utc),
1020+
datetime(2013, 1, 4, 0, 0, 0, 0, tzinfo=timezone.utc),
10221021
),
10231022
),
10241023
(
10251024
# Start/end with UTC
10261025
"2013-01-01T12:00:00Z/2013-02-01T12:00:00Z",
10271026
(
1028-
datetime(2013, 1, 1, 12, 0, 0, tzinfo=pytz.utc),
1029-
datetime(2013, 2, 1, 12, 0, 0, tzinfo=pytz.utc),
1027+
datetime(2013, 1, 1, 12, 0, 0, tzinfo=timezone.utc),
1028+
datetime(2013, 2, 1, 12, 0, 0, tzinfo=timezone.utc),
10301029
),
10311030
),
10321031
(
10331032
# Start/end with time upgrade
10341033
"2013-01-01/2013-06-30",
10351034
(
1036-
datetime(2013, 1, 1, tzinfo=pytz.utc),
1037-
datetime(2013, 6, 30, tzinfo=pytz.utc),
1035+
datetime(2013, 1, 1, tzinfo=timezone.utc),
1036+
datetime(2013, 6, 30, tzinfo=timezone.utc),
10381037
),
10391038
),
10401039
(
10411040
# Start/end with TZ conversion
10421041
"2013-02-17T12:00:00-07:00/2013-02-28T15:00:00-07:00",
10431042
(
1044-
datetime(2013, 2, 17, 19, 0, 0, tzinfo=pytz.utc),
1045-
datetime(2013, 2, 28, 22, 0, 0, tzinfo=pytz.utc),
1043+
datetime(2013, 2, 17, 19, 0, 0, tzinfo=timezone.utc),
1044+
datetime(2013, 2, 28, 22, 0, 0, tzinfo=timezone.utc),
10461045
),
10471046
),
10481047
( # Resolution expansion for single date(time)
10491048
# Second with UTC
10501049
"2013-01-01T12:30:45Z",
10511050
(
1052-
datetime(2013, 1, 1, 12, 30, 45, tzinfo=pytz.utc),
1053-
datetime(2013, 1, 1, 12, 30, 46, tzinfo=pytz.utc),
1051+
datetime(2013, 1, 1, 12, 30, 45, tzinfo=timezone.utc),
1052+
datetime(2013, 1, 1, 12, 30, 46, tzinfo=timezone.utc),
10541053
),
10551054
),
10561055
(
10571056
# Second with tz conversion
10581057
"2013-01-01T12:30:45+02:00",
10591058
(
1060-
datetime(2013, 1, 1, 10, 30, 45, tzinfo=pytz.utc),
1061-
datetime(2013, 1, 1, 10, 30, 46, tzinfo=pytz.utc),
1059+
datetime(2013, 1, 1, 10, 30, 45, tzinfo=timezone.utc),
1060+
datetime(2013, 1, 1, 10, 30, 46, tzinfo=timezone.utc),
10621061
),
10631062
),
10641063
(
10651064
# Second with implicit UTC
10661065
"2013-01-01T12:30:45",
10671066
(
1068-
datetime(2013, 1, 1, 12, 30, 45, tzinfo=pytz.utc),
1069-
datetime(2013, 1, 1, 12, 30, 46, tzinfo=pytz.utc),
1067+
datetime(2013, 1, 1, 12, 30, 45, tzinfo=timezone.utc),
1068+
datetime(2013, 1, 1, 12, 30, 46, tzinfo=timezone.utc),
10701069
),
10711070
),
10721071
(
10731072
# Minute with UTC
10741073
"2013-01-01T12:30+00:00",
10751074
(
1076-
datetime(2013, 1, 1, 12, 30, tzinfo=pytz.utc),
1077-
datetime(2013, 1, 1, 12, 31, tzinfo=pytz.utc),
1075+
datetime(2013, 1, 1, 12, 30, tzinfo=timezone.utc),
1076+
datetime(2013, 1, 1, 12, 31, tzinfo=timezone.utc),
10781077
),
10791078
),
10801079
(
10811080
# Minute with conversion
10821081
"2013-01-01T12:30+04:00",
10831082
(
1084-
datetime(2013, 1, 1, 8, 30, tzinfo=pytz.utc),
1085-
datetime(2013, 1, 1, 8, 31, tzinfo=pytz.utc),
1083+
datetime(2013, 1, 1, 8, 30, tzinfo=timezone.utc),
1084+
datetime(2013, 1, 1, 8, 31, tzinfo=timezone.utc),
10861085
),
10871086
),
10881087
(
10891088
# Minute with implicit UTC
10901089
"2013-01-01T12:30",
10911090
(
1092-
datetime(2013, 1, 1, 12, 30, tzinfo=pytz.utc),
1093-
datetime(2013, 1, 1, 12, 31, tzinfo=pytz.utc),
1091+
datetime(2013, 1, 1, 12, 30, tzinfo=timezone.utc),
1092+
datetime(2013, 1, 1, 12, 31, tzinfo=timezone.utc),
10941093
),
10951094
),
10961095
(
10971096
# Hour, explicit UTC
10981097
"2013-01-01T12Z",
10991098
(
1100-
datetime(2013, 1, 1, 12, tzinfo=pytz.utc),
1101-
datetime(2013, 1, 1, 13, tzinfo=pytz.utc),
1099+
datetime(2013, 1, 1, 12, tzinfo=timezone.utc),
1100+
datetime(2013, 1, 1, 13, tzinfo=timezone.utc),
11021101
),
11031102
),
11041103
(
11051104
# Hour with offset
11061105
"2013-01-01T12-07:00",
11071106
(
1108-
datetime(2013, 1, 1, 19, tzinfo=pytz.utc),
1109-
datetime(2013, 1, 1, 20, tzinfo=pytz.utc),
1107+
datetime(2013, 1, 1, 19, tzinfo=timezone.utc),
1108+
datetime(2013, 1, 1, 20, tzinfo=timezone.utc),
11101109
),
11111110
),
11121111
(
11131112
# Hour with implicit UTC
11141113
"2013-01-01T12",
11151114
(
1116-
datetime(2013, 1, 1, 12, tzinfo=pytz.utc),
1117-
datetime(2013, 1, 1, 13, tzinfo=pytz.utc),
1115+
datetime(2013, 1, 1, 12, tzinfo=timezone.utc),
1116+
datetime(2013, 1, 1, 13, tzinfo=timezone.utc),
11181117
),
11191118
),
11201119
(
11211120
# Interval with trailing zero fractional seconds should
11221121
# be accepted.
11231122
"2013-01-01T12:00:00.0/2013-01-01T12:30:00.000000",
11241123
(
1125-
datetime(2013, 1, 1, 12, tzinfo=pytz.utc),
1126-
datetime(2013, 1, 1, 12, 30, tzinfo=pytz.utc),
1124+
datetime(2013, 1, 1, 12, tzinfo=timezone.utc),
1125+
datetime(2013, 1, 1, 12, 30, tzinfo=timezone.utc),
11271126
),
11281127
),
11291128
]

0 commit comments

Comments
 (0)