Skip to content

Commit

Permalink
Consolidate pytz/zoneinfo logic in compat
Browse files Browse the repository at this point in the history
Also, switch the default choices over to use zoneinfo.available_timezones()
when running with use_ptyz=False
  • Loading branch information
mfogel committed Jul 16, 2023
1 parent eece22f commit 6c6c7ed
Show file tree
Hide file tree
Showing 14 changed files with 188 additions and 224 deletions.
2 changes: 1 addition & 1 deletion poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ pytest-cov = "^3.0.0"
black = "^23.3.0"
isort = "^5.11.5"
pylint = "^2.13.9"
tzdata = "^2023.3"

[tool.pylint.'MESSAGES CONTROL']
max-line-length = 120
Expand Down
37 changes: 26 additions & 11 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@
from django import forms
from django.db import models

try:
import zoneinfo
except ImportError:
from backports import zoneinfo

try:
import pytz
except ImportError:
pytz = None

from timezone_field import TimeZoneField
from timezone_field.compat import ZoneInfo
from timezone_field import TimeZoneField, compat

USA_TZS = [
"US/Alaska",
Expand Down Expand Up @@ -76,12 +80,12 @@ class _TZModelOldChoiceFormat(models.Model):

class _ZIModelOldChoiceFormat(models.Model):
tz_superset = TimeZoneField(
choices=[(ZoneInfo(tz), tz) for tz in getattr(pytz, "all_timezones", [])],
choices=[(zoneinfo.ZoneInfo(tz), tz) for tz in getattr(pytz, "all_timezones", [])],
blank=True,
use_pytz=False,
)
tz_subset = TimeZoneField(
choices=[(ZoneInfo(tz), tz) for tz in USA_TZS],
choices=[(zoneinfo.ZoneInfo(tz), tz) for tz in USA_TZS],
blank=True,
use_pytz=False,
)
Expand All @@ -105,8 +109,18 @@ def use_pytz(request):


@pytest.fixture
def tz_func(use_pytz):
yield pytz.timezone if use_pytz else ZoneInfo
def to_tzobj(use_pytz):
yield lambda value: compat.to_tzobj(value, use_pytz)


@pytest.fixture
def utc_tzobj(use_pytz):
yield compat.get_utc_tzobj(use_pytz)


@pytest.fixture
def base_tzstrs(use_pytz):
yield compat.get_base_tzstrs(use_pytz)


@pytest.fixture
Expand Down Expand Up @@ -136,7 +150,7 @@ def pst():

@pytest.fixture
def pst_tz(use_pytz, pst):
yield (pytz.timezone(pst) if use_pytz else ZoneInfo(pst)) # pytz.tzinfo.DstTzInfo
yield (pytz.timezone(pst) if use_pytz else zoneinfo.ZoneInfo(pst)) # pytz.tzinfo.DstTzInfo


@pytest.fixture
Expand All @@ -146,7 +160,7 @@ def gmt():

@pytest.fixture
def gmt_tz(use_pytz, gmt):
yield (pytz.timezone(gmt) if use_pytz else ZoneInfo(gmt)) # pytz.tzinfo.StaticTzInfo
yield (pytz.timezone(gmt) if use_pytz else zoneinfo.ZoneInfo(gmt)) # pytz.tzinfo.StaticTzInfo


@pytest.fixture
Expand All @@ -156,12 +170,13 @@ def utc():

@pytest.fixture
def utc_tz(use_pytz, utc):
yield (pytz.timezone(utc) if use_pytz else ZoneInfo(utc)) # pytz.utc singleton
yield (pytz.timezone(utc) if use_pytz else zoneinfo.ZoneInfo(utc)) # pytz.utc singleton


@pytest.fixture
def uncommon_tz():
yield "Singapore"
def uncommon_tz(use_pytz):
# there are no Zoneinfo "uncommon" tzs
yield "Singapore" if use_pytz else "foobar"


@pytest.fixture
Expand Down
16 changes: 8 additions & 8 deletions tests/test_choices.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,16 +56,16 @@ def test_with_gmt_offset_using_timezone_names(tzs1, use_pytz):
]


def test_with_gmt_offset_using_timezone_objects(tzs1, use_pytz, tz_func):
tz_objects = [tz_func(name) for name in tzs1]
def test_with_gmt_offset_using_timezone_objects(tzs1, use_pytz, to_tzobj):
tz_objects = [to_tzobj(name) for name in tzs1]
assert with_gmt_offset(tz_objects, use_pytz=use_pytz) == [
(
tz_func("America/Argentina/Buenos_Aires"),
to_tzobj("America/Argentina/Buenos_Aires"),
"GMT-03:00 America/Argentina/Buenos Aires",
),
(tz_func("Asia/Qatar"), "GMT+03:00 Asia/Qatar"),
(tz_func("Asia/Kolkata"), "GMT+05:30 Asia/Kolkata"),
(tz_func("Asia/Kathmandu"), "GMT+05:45 Asia/Kathmandu"),
(to_tzobj("Asia/Qatar"), "GMT+03:00 Asia/Qatar"),
(to_tzobj("Asia/Kolkata"), "GMT+05:30 Asia/Kolkata"),
(to_tzobj("Asia/Kathmandu"), "GMT+05:45 Asia/Kathmandu"),
]


Expand Down Expand Up @@ -109,6 +109,6 @@ def test_standard_using_timezone_names(tzs3_names, tzs3_standard_displays):
assert standard(tzs3_names) == list(zip(tzs3_names, tzs3_standard_displays))


def test_standard_using_timezone_objects(tzs3_names, tzs3_standard_displays, tz_func):
tzs3_objects = [tz_func(tz) for tz in tzs3_names]
def test_standard_using_timezone_objects(tzs3_names, tzs3_standard_displays, to_tzobj):
tzs3_objects = [to_tzobj(tz) for tz in tzs3_names]
assert standard(tzs3_objects) == list(zip(tzs3_objects, tzs3_standard_displays))
65 changes: 31 additions & 34 deletions tests/test_choices_display_option.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,13 @@
import pytest
import pytz
from django import forms
from django.db import models

from timezone_field import TimeZoneField, TimeZoneFormField

common_tz_names = tuple(tz for tz in pytz.common_timezones)


@pytest.fixture
def common_tz_objects(tz_func):
yield tuple(tz_func(tz) for tz in pytz.common_timezones)
def base_tzobjs(to_tzobj, base_tzstrs):
yield [to_tzobj(tz) for tz in base_tzstrs]


class _ZIChoicesDisplayForm(forms.Form):
Expand Down Expand Up @@ -143,10 +140,10 @@ def test_form_field_invalid_choices_display(use_pytz):
TimeZoneFormField(choices_display="invalid", use_pytz=use_pytz)


def test_form_field_none(ChoicesDisplayForm):
def test_form_field_none(ChoicesDisplayForm, base_tzstrs):
form = ChoicesDisplayForm()
values, displays = zip(*form.fields["tz_none"].choices)
assert values == common_tz_names
assert values == tuple(base_tzstrs)
assert displays[values.index("America/Los_Angeles")] == "America/Los Angeles"
assert displays[values.index("Asia/Kolkata")] == "Asia/Kolkata"

Expand All @@ -156,11 +153,11 @@ def test_form_field_standard(ChoicesDisplayForm):
assert form.fields["tz_standard"].choices == form.fields["tz_none"].choices


def test_form_field_with_gmt_offset(ChoicesDisplayForm):
def test_form_field_with_gmt_offset(ChoicesDisplayForm, base_tzstrs):
form = ChoicesDisplayForm()
values, displays = zip(*form.fields["tz_with_gmt_offset"].choices)
assert values != common_tz_names
assert sorted(values) == sorted(common_tz_names)
assert values != tuple(base_tzstrs)
assert sorted(values) == sorted(base_tzstrs)
assert displays[values.index("America/Argentina/Buenos_Aires")] == "GMT-03:00 America/Argentina/Buenos Aires"
assert displays[values.index("Europe/Moscow")] == "GMT+03:00 Europe/Moscow"

Expand Down Expand Up @@ -195,61 +192,61 @@ def test_form_field_limited_with_gmt_offset(ChoicesDisplayForm):
]


def test_model_form_field_none(ChoicesDisplayModelForm, tz_func, common_tz_objects):
def test_model_form_field_none(ChoicesDisplayModelForm, to_tzobj, base_tzobjs):
form = ChoicesDisplayModelForm()
values, displays = zip(*form.fields["tz_none"].choices)
assert values == ("",) + common_tz_objects
assert displays[values.index(tz_func("America/Los_Angeles"))] == "America/Los Angeles"
assert displays[values.index(tz_func("Asia/Kolkata"))] == "Asia/Kolkata"
assert values == ("",) + tuple(base_tzobjs)
assert displays[values.index(to_tzobj("America/Los_Angeles"))] == "America/Los Angeles"
assert displays[values.index(to_tzobj("Asia/Kolkata"))] == "Asia/Kolkata"


def test_model_form_field_standard(ChoicesDisplayModelForm):
form = ChoicesDisplayModelForm()
assert form.fields["tz_standard"].choices == form.fields["tz_none"].choices


def test_model_form_field_with_gmt_offset(ChoicesDisplayModelForm, tz_func, common_tz_objects):
def test_model_form_field_with_gmt_offset(ChoicesDisplayModelForm, to_tzobj, base_tzobjs):
form = ChoicesDisplayModelForm()
values, displays = zip(*form.fields["tz_with_gmt_offset"].choices)
assert values != common_tz_objects
assert sorted(str(v) for v in values) == sorted([""] + [str(tz) for tz in common_tz_objects])
assert values != tuple(base_tzobjs)
assert sorted(str(v) for v in values) == sorted([""] + [str(tz) for tz in base_tzobjs])
assert (
displays[values.index(tz_func("America/Argentina/Buenos_Aires"))] == "GMT-03:00 America/Argentina/Buenos Aires"
displays[values.index(to_tzobj("America/Argentina/Buenos_Aires"))] == "GMT-03:00 America/Argentina/Buenos Aires"
)
assert displays[values.index(tz_func("Europe/Moscow"))] == "GMT+03:00 Europe/Moscow"
assert displays[values.index(to_tzobj("Europe/Moscow"))] == "GMT+03:00 Europe/Moscow"


def test_model_form_field_limited_none(ChoicesDisplayModelForm, tz_func):
def test_model_form_field_limited_none(ChoicesDisplayModelForm, to_tzobj):
form = ChoicesDisplayModelForm()
assert form.fields["tz_limited_none"].choices == [
("", "---------"),
(tz_func("Asia/Tokyo"), "Asia/Tokyo"),
(tz_func("Asia/Dubai"), "Asia/Dubai"),
(tz_func("America/Argentina/Buenos_Aires"), "America/Argentina/Buenos_Aires"),
(tz_func("Africa/Nairobi"), "Africa/Nairobi"),
(to_tzobj("Asia/Tokyo"), "Asia/Tokyo"),
(to_tzobj("Asia/Dubai"), "Asia/Dubai"),
(to_tzobj("America/Argentina/Buenos_Aires"), "America/Argentina/Buenos_Aires"),
(to_tzobj("Africa/Nairobi"), "Africa/Nairobi"),
]


def test_moel_form_field_limited_standard(ChoicesDisplayModelForm, tz_func):
def test_moel_form_field_limited_standard(ChoicesDisplayModelForm, to_tzobj):
form = ChoicesDisplayModelForm()
assert form.fields["tz_limited_standard"].choices == [
("", "---------"),
(tz_func("Asia/Tokyo"), "Asia/Tokyo"),
(tz_func("Asia/Dubai"), "Asia/Dubai"),
(tz_func("America/Argentina/Buenos_Aires"), "America/Argentina/Buenos Aires"),
(tz_func("Africa/Nairobi"), "Africa/Nairobi"),
(to_tzobj("Asia/Tokyo"), "Asia/Tokyo"),
(to_tzobj("Asia/Dubai"), "Asia/Dubai"),
(to_tzobj("America/Argentina/Buenos_Aires"), "America/Argentina/Buenos Aires"),
(to_tzobj("Africa/Nairobi"), "Africa/Nairobi"),
]


def test_model_form_field_limited_with_gmt_offset(ChoicesDisplayModelForm, tz_func):
def test_model_form_field_limited_with_gmt_offset(ChoicesDisplayModelForm, to_tzobj):
form = ChoicesDisplayModelForm()
assert form.fields["tz_limited_with_gmt_offset"].choices == [
("", "---------"),
(
tz_func("America/Argentina/Buenos_Aires"),
to_tzobj("America/Argentina/Buenos_Aires"),
"GMT-03:00 America/Argentina/Buenos Aires",
),
(tz_func("Africa/Nairobi"), "GMT+03:00 Africa/Nairobi"),
(tz_func("Asia/Dubai"), "GMT+04:00 Asia/Dubai"),
(tz_func("Asia/Tokyo"), "GMT+09:00 Asia/Tokyo"),
(to_tzobj("Africa/Nairobi"), "GMT+03:00 Africa/Nairobi"),
(to_tzobj("Asia/Dubai"), "GMT+04:00 Asia/Dubai"),
(to_tzobj("Asia/Tokyo"), "GMT+09:00 Asia/Tokyo"),
]
Loading

0 comments on commit 6c6c7ed

Please sign in to comment.