diff --git a/requirements.txt b/requirements.txt index 71730f9278..a931dbd88a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ pygments>=2.7.4 # not directly required, pinned by Snyk to avoid a vulnerability -pytz requests>=2.0.0 PyJWT>=2.0.0, <3.0.0 aiohttp>=3.8.4 diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 index 9051f4b622..ebcdc9983e --- a/setup.py +++ b/setup.py @@ -21,7 +21,6 @@ keywords=["twilio", "twiml"], python_requires=">=3.7.0", install_requires=[ - "pytz", "requests >= 2.0.0", "PyJWT >= 2.0.0, < 3.0.0", "aiohttp>=3.8.4", diff --git a/tests/unit/base/test_deserialize.py b/tests/unit/base/test_deserialize.py index 9953772471..33f627e838 100644 --- a/tests/unit/base/test_deserialize.py +++ b/tests/unit/base/test_deserialize.py @@ -2,8 +2,6 @@ import unittest from decimal import Decimal -import pytz - from twilio.base import deserialize @@ -21,7 +19,7 @@ def test_not_parsable(self): class Iso8601DateTimeTestCase(unittest.TestCase): def test_parsable(self): actual = deserialize.iso8601_datetime("2015-01-02T03:04:05Z") - expected = datetime.datetime(2015, 1, 2, 3, 4, 5, 0, pytz.utc) + expected = datetime.datetime(2015, 1, 2, 3, 4, 5, 0, datetime.timezone.utc) self.assertEqual(expected, actual) def test_not_parsable(self): diff --git a/twilio/base/deserialize.py b/twilio/base/deserialize.py index e70ac57390..71226c08f8 100644 --- a/twilio/base/deserialize.py +++ b/twilio/base/deserialize.py @@ -3,13 +3,11 @@ from email.utils import parsedate from typing import Optional, Union -import pytz - ISO8601_DATE_FORMAT = "%Y-%m-%d" ISO8601_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%SZ" -def iso8601_date(s: str) -> Optional[Union[datetime.date, str]]: +def iso8601_date(s: str) -> Union[datetime.date, str]: """ Parses an ISO 8601 date string and returns a UTC date object or the string if the parsing failed. @@ -19,7 +17,7 @@ def iso8601_date(s: str) -> Optional[Union[datetime.date, str]]: try: return ( datetime.datetime.strptime(s, ISO8601_DATE_FORMAT) - .replace(tzinfo=pytz.utc) + .replace(tzinfo=datetime.timezone.utc) .date() ) except (TypeError, ValueError): @@ -28,7 +26,7 @@ def iso8601_date(s: str) -> Optional[Union[datetime.date, str]]: def iso8601_datetime( s: str, -) -> Optional[Union[datetime.datetime, str]]: +) -> Union[datetime.datetime, str]: """ Parses an ISO 8601 datetime string and returns a UTC datetime object, or the string if parsing failed. @@ -36,7 +34,7 @@ def iso8601_datetime( """ try: return datetime.datetime.strptime(s, ISO8601_DATETIME_FORMAT).replace( - tzinfo=pytz.utc + tzinfo=datetime.timezone.utc ) except (TypeError, ValueError): return s @@ -52,10 +50,10 @@ def rfc2822_datetime(s: str) -> Optional[datetime.datetime]: date_tuple = parsedate(s) if date_tuple is None: return None - return datetime.datetime(*date_tuple[:6]).replace(tzinfo=pytz.utc) + return datetime.datetime(*date_tuple[:6]).replace(tzinfo=datetime.timezone.utc) -def decimal(d: Optional[str]) -> Optional[Union[Decimal, str]]: +def decimal(d: Optional[str]) -> Union[Decimal, str]: """ Parses a decimal string into a Decimal :param d: decimal string @@ -65,7 +63,7 @@ def decimal(d: Optional[str]) -> Optional[Union[Decimal, str]]: return Decimal(d, BasicContext) -def integer(i: str) -> Optional[Union[int, str]]: +def integer(i: str) -> Union[int, str]: """ Parses an integer string into an int :param i: integer string