From bc3f7b1459cc19fea21d3ddada477cc5fe30efe4 Mon Sep 17 00:00:00 2001 From: Chris Brown <30196510+systemcatch@users.noreply.github.com> Date: Mon, 26 Apr 2021 22:54:20 +0100 Subject: [PATCH 1/3] Rough draft of arrow.zone() --- arrow/__init__.py | 3 ++- arrow/api.py | 8 +++++++- arrow/factory.py | 7 +++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/arrow/__init__.py b/arrow/__init__.py index bc5970970..d70706834 100644 --- a/arrow/__init__.py +++ b/arrow/__init__.py @@ -1,5 +1,5 @@ from ._version import __version__ -from .api import get, now, utcnow +from .api import get, now, utcnow, zone from .arrow import Arrow from .factory import ArrowFactory from .formatter import ( @@ -23,6 +23,7 @@ "get", "now", "utcnow", + "zone", "Arrow", "ArrowFactory", "FORMAT_ATOM", diff --git a/arrow/api.py b/arrow/api.py index d8ed24b97..058fee9b5 100644 --- a/arrow/api.py +++ b/arrow/api.py @@ -9,6 +9,8 @@ from time import struct_time from typing import Any, List, Optional, Tuple, Type, Union, overload +from dateutil import tz as dateutil_tz + from arrow.arrow import TZ_EXPR, Arrow from arrow.constants import DEFAULT_LOCALE from arrow.factory import ArrowFactory @@ -112,6 +114,10 @@ def now(tz: Optional[TZ_EXPR] = None) -> Arrow: now.__doc__ = _factory.now.__doc__ +def zone(zone_name: str) -> dateutil_tz: + return _factory.zone(zone_name) + + def factory(type: Type[Arrow]) -> ArrowFactory: """Returns an :class:`.ArrowFactory` for the specified :class:`Arrow ` or derived type. @@ -123,4 +129,4 @@ def factory(type: Type[Arrow]) -> ArrowFactory: return ArrowFactory(type) -__all__ = ["get", "utcnow", "now", "factory"] +__all__ = ["get", "utcnow", "now", "factory", "zone"] diff --git a/arrow/factory.py b/arrow/factory.py index aad4af8bd..31f8fc466 100644 --- a/arrow/factory.py +++ b/arrow/factory.py @@ -346,3 +346,10 @@ def now(self, tz: Optional[TZ_EXPR] = None) -> Arrow: tz = parser.TzinfoParser.parse(tz) return self.type.now(tz) + + @staticmethod + def zone(zone_name: str) -> dateutil_tz: + """docstring here""" + zone = parser.TzinfoParser.parse(zone_name) + + return zone From 6a21daf4dd3e17d8a37e83a529b6b72f358f3167 Mon Sep 17 00:00:00 2001 From: Chris Brown <30196510+systemcatch@users.noreply.github.com> Date: Sun, 2 May 2021 21:32:10 +0100 Subject: [PATCH 2/3] Rename to timezone instead of zone --- arrow/__init__.py | 4 ++-- arrow/api.py | 8 +++----- arrow/factory.py | 2 +- tests/test_factory.py | 12 ++++++++++++ 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/arrow/__init__.py b/arrow/__init__.py index d70706834..3bda87eb4 100644 --- a/arrow/__init__.py +++ b/arrow/__init__.py @@ -1,5 +1,5 @@ from ._version import __version__ -from .api import get, now, utcnow, zone +from .api import get, now, timezone, utcnow from .arrow import Arrow from .factory import ArrowFactory from .formatter import ( @@ -23,7 +23,7 @@ "get", "now", "utcnow", - "zone", + "timezone", "Arrow", "ArrowFactory", "FORMAT_ATOM", diff --git a/arrow/api.py b/arrow/api.py index 058fee9b5..07e12cd8c 100644 --- a/arrow/api.py +++ b/arrow/api.py @@ -9,8 +9,6 @@ from time import struct_time from typing import Any, List, Optional, Tuple, Type, Union, overload -from dateutil import tz as dateutil_tz - from arrow.arrow import TZ_EXPR, Arrow from arrow.constants import DEFAULT_LOCALE from arrow.factory import ArrowFactory @@ -114,8 +112,8 @@ def now(tz: Optional[TZ_EXPR] = None) -> Arrow: now.__doc__ = _factory.now.__doc__ -def zone(zone_name: str) -> dateutil_tz: - return _factory.zone(zone_name) +def timezone(zone_name: str) -> dt_tzinfo: + return _factory.timezone(zone_name) def factory(type: Type[Arrow]) -> ArrowFactory: @@ -129,4 +127,4 @@ def factory(type: Type[Arrow]) -> ArrowFactory: return ArrowFactory(type) -__all__ = ["get", "utcnow", "now", "factory", "zone"] +__all__ = ["get", "utcnow", "now", "factory", "timezone"] diff --git a/arrow/factory.py b/arrow/factory.py index 31f8fc466..0727850d6 100644 --- a/arrow/factory.py +++ b/arrow/factory.py @@ -348,7 +348,7 @@ def now(self, tz: Optional[TZ_EXPR] = None) -> Arrow: return self.type.now(tz) @staticmethod - def zone(zone_name: str) -> dateutil_tz: + def timezone(zone_name: str) -> dt_tzinfo: """docstring here""" zone = parser.TzinfoParser.parse(zone_name) diff --git a/tests/test_factory.py b/tests/test_factory.py index 53bba20d3..d1cd86e77 100644 --- a/tests/test_factory.py +++ b/tests/test_factory.py @@ -434,3 +434,15 @@ def test_tzinfo(self): def test_tz_str(self): assert_datetime_equality(self.factory.now("EST"), datetime.now(tz.gettz("EST"))) + + +@pytest.mark.usefixtures("arrow_factory") +class TestTimezone: + def test_timezone(self): + + assert self.factory.timezone("Australia/Darwin") == tz.gettz("Australia/Darwin") + + def test_bad_input(self): + + with pytest.raises(ParserError): + self.factory.timezone("absolute garbage#!?") From db9e4afe65341ea1fdc0e77768172f66a3a8e360 Mon Sep 17 00:00:00 2001 From: Chris Brown <30196510+systemcatch@users.noreply.github.com> Date: Wed, 10 Nov 2021 20:44:02 +0000 Subject: [PATCH 3/3] Add api test --- tests/test_api.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_api.py b/tests/test_api.py index 5576aaf84..bc0ea107b 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -25,3 +25,12 @@ class MockCustomArrowClass(arrow.Arrow): assert isinstance(result, arrow.factory.ArrowFactory) assert isinstance(result.utcnow(), MockCustomArrowClass) + + def test_timezone(self, mocker): + mocker.patch( + "arrow.api._factory.timezone", + zone_name="zone_name", + return_value="timezone", + ) + + assert arrow.api.timezone("zone_name") == "timezone"