Skip to content

Commit

Permalink
Merge pull request dateutil#1024 from ffe4/issue_926
Browse files Browse the repository at this point in the history
Fix tz.gettz() not returning local time for empty string
  • Loading branch information
pganssle committed Apr 24, 2020
2 parents 4a50ff7 + 1fb2ea9 commit 0905e27
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 1 deletion.
2 changes: 2 additions & 0 deletions changelog.d/1024.misc.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fixed tz.gettz() not returning local time when passed an empty string.
Reported by @labrys (gh issues #925, #926). Fixed by @ffe4 (gh pr #1024)
35 changes: 35 additions & 0 deletions dateutil/test/property/test_tz_prop.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
from datetime import datetime, timedelta

import pytest
import six
from hypothesis import assume, given
from hypothesis import strategies as st

from dateutil import tz as tz

EPOCHALYPSE = datetime.fromtimestamp(2147483647)
NEGATIVE_EPOCHALYPSE = datetime.fromtimestamp(0) - timedelta(seconds=2147483648)


@pytest.mark.gettz
@pytest.mark.parametrize("gettz_arg", [None, ""])
# TODO: Remove bounds when GH #590 is resolved
@given(
dt=st.datetimes(
min_value=NEGATIVE_EPOCHALYPSE, max_value=EPOCHALYPSE, timezones=st.just(tz.UTC),
)
)
def test_gettz_returns_local(gettz_arg, dt):
act_tz = tz.gettz(gettz_arg)
if isinstance(act_tz, tz.tzlocal):
return

dt_act = dt.astimezone(tz.gettz(gettz_arg))
if six.PY2:
dt_exp = dt.astimezone(tz.tzlocal())
else:
dt_exp = dt.astimezone()

assert dt_act == dt_exp
assert dt_act.tzname() == dt_exp.tzname()
assert dt_act.utcoffset() == dt_exp.utcoffset()
9 changes: 9 additions & 0 deletions dateutil/test/test_tz.py
Original file line number Diff line number Diff line change
Expand Up @@ -1079,6 +1079,15 @@ def testGettzCacheTzLocal(self):
assert local1 is not local2


@pytest.mark.gettz
def test_gettz_same_result_for_none_and_empty_string():
local_from_none = tz.gettz()
local_from_empty_string = tz.gettz("")
assert local_from_none is not None
assert local_from_empty_string is not None
assert local_from_none == local_from_empty_string


@pytest.mark.gettz
@pytest.mark.parametrize('badzone', [
'Fake.Region/Abcdefghijklmnop', # Violates several tz project name rules
Expand Down
2 changes: 1 addition & 1 deletion dateutil/tz/tz.py
Original file line number Diff line number Diff line change
Expand Up @@ -1596,7 +1596,7 @@ def nocache(name=None):
name = os.environ["TZ"]
except KeyError:
pass
if name is None or name == ":":
if name is None or name in ("", ":"):
for filepath in TZFILES:
if not os.path.isabs(filepath):
filename = filepath
Expand Down

0 comments on commit 0905e27

Please sign in to comment.