Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: bdr...@debian.org

Please unblock package python-tz

[ Reason ]

python-tz contains a hard-coded list of timezones. This causes problems
on updates to tzdata. Last example: tzdata 2021a-1+deb11u9 added
America/Ciudad_Juarez but due to the hard-coded list, this timezone is
not selectable. Following code will fail with `UnknownTimeZoneError`:

```
#!/usr/bin/python3
import pytz
pytz.timezone("America/Ciudad_Juarez")
```

See also https://github.com/stub42/pytz/issues/91

[ Impact ]
Newly added timezones from tzdata will be availble to python3-tz.

[ Tests ]
I added autopkgtest cases to ensure that updates to tzdata do not
introduce regressions.

[ Risks ]

Several Python projects use python3-tz. The autopkgtest should reduce
the risk of regressions of dynamically determine the list of timezones.
python3-tz can fail in case they system has problems or tzdata is not
properly set-up. Python 3.9 ships the zoneinfo module which can be used
as replacement.

[ Checklist ]
  [x] all changes are documented in the d/changelog (except the
      formatting change by wrap-and-sort)
  [x] I reviewed all changes and I approve them
  [x] attach debdiff against the package in testing

unblock python-tz/2022.7.1-3
diff -Nru python-tz-2022.7.1/debian/changelog 
python-tz-2022.7.1/debian/changelog
--- python-tz-2022.7.1/debian/changelog 2023-01-15 11:24:50.000000000 +0100
+++ python-tz-2022.7.1/debian/changelog 2023-03-27 17:17:53.000000000 +0200
@@ -1,3 +1,21 @@
+python-tz (2022.7.1-3) unstable; urgency=medium
+
+  * Team upload.
+  * Fix testVersion to not complain about the now dynamic Olson version
+
+ -- Benjamin Drung <bdr...@debian.org>  Mon, 27 Mar 2023 17:17:53 +0200
+
+python-tz (2022.7.1-2) unstable; urgency=medium
+
+  * Team upload.
+  * Dynamically determine list of available and common timezones (LP: #207604)
+  * Determine IANA (nee Olson) database version dynamically
+  * Add autopkgtests to run unittest and own regression tests
+  * Update homepage URL
+  * Bump Standards-Version to 4.6.2
+
+ -- Benjamin Drung <bdr...@debian.org>  Tue, 21 Mar 2023 11:21:11 +0100
+
 python-tz (2022.7.1-1) unstable; urgency=medium
 
   * New upstream release
diff -Nru python-tz-2022.7.1/debian/control python-tz-2022.7.1/debian/control
--- python-tz-2022.7.1/debian/control   2023-01-15 11:24:50.000000000 +0100
+++ python-tz-2022.7.1/debian/control   2023-03-27 17:12:30.000000000 +0200
@@ -6,19 +6,19 @@
            Debian/Ubuntu Zope Team 
<pkg-zope-develop...@lists.alioth.debian.org>,
            Fabio Tranchitella <kob...@debian.org>
 Build-Depends: debhelper-compat (= 13),
-              dh-sequence-python3,
+               dh-sequence-python3,
                python3-all,
-               python3-setuptools,
                python3-pytest,
-               tzdata,
-Standards-Version: 4.6.1
-Homepage: https://pypi.python.org/pypi/pytz/
+               python3-setuptools,
+               tzdata
+Standards-Version: 4.6.2
+Homepage: https://pythonhosted.org/pytz/
 Vcs-Browser: https://salsa.debian.org/python-team/packages/python-tz
 Vcs-Git: https://salsa.debian.org/python-team/packages/python-tz.git -b 
debian/latest
 
 Package: python3-tz
 Architecture: all
-Depends: tzdata, ${python3:Depends}, ${misc:Depends}
+Depends: tzdata, ${misc:Depends}, ${python3:Depends}
 Description: Python3 version of the Olson timezone database
  python-tz brings the Olson tz database into Python. This library allows
  accurate and cross platform timezone calculations using Python 2.3 or higher.
diff -Nru 
python-tz-2022.7.1/debian/patches/Determine-IANA-nee-Olson-database-version-dynamically.patch
 
python-tz-2022.7.1/debian/patches/Determine-IANA-nee-Olson-database-version-dynamically.patch
--- 
python-tz-2022.7.1/debian/patches/Determine-IANA-nee-Olson-database-version-dynamically.patch
       1970-01-01 01:00:00.000000000 +0100
+++ 
python-tz-2022.7.1/debian/patches/Determine-IANA-nee-Olson-database-version-dynamically.patch
       2023-03-27 17:14:42.000000000 +0200
@@ -0,0 +1,69 @@
+From: Benjamin Drung <benjamin.dr...@canonical.com>
+Date: Mon, 27 Mar 2023 17:14:22 +0200
+Subject: Determine IANA (nee Olson) database version dynamically
+
+Forwarded: not-needed
+Signed-off-by: Benjamin Drung <benjamin.dr...@canonical.com>
+---
+ pytz/__init__.py          | 13 ++++++++++++-
+ pytz/tests/test_tzinfo.py |  8 --------
+ 2 files changed, 12 insertions(+), 9 deletions(-)
+
+diff --git a/pytz/__init__.py b/pytz/__init__.py
+index 8b2fa1b..da2f206 100644
+--- a/pytz/__init__.py
++++ b/pytz/__init__.py
+@@ -12,6 +12,7 @@ import sys
+ import datetime
+ import os.path
+ import pathlib
++import re
+ import zoneinfo
+ 
+ from pytz.exceptions import AmbiguousTimeError
+@@ -23,8 +24,18 @@ from pytz.tzinfo import unpickler, BaseTzInfo
+ from pytz.tzfile import build_tzinfo
+ 
+ 
++def _read_olson_version() -> str:
++    tzdata_zi = pathlib.Path("/usr/share/zoneinfo/tzdata.zi")
++    with tzdata_zi.open(encoding="utf-8") as tzdata_zi_file:
++        line = tzdata_zi_file.readline()
++    match = re.match("^#\s*version\s*([0-9a-z]*)\s*$", line)
++    if match:
++        return match.group(1)
++    return "unknown"
++
++
+ # The IANA (nee Olson) database is updated several times a year.
+-OLSON_VERSION = '2022g'
++OLSON_VERSION = _read_olson_version()
+ VERSION = '2022.7.1'  # pip compatible version number.
+ __version__ = VERSION
+ 
+diff --git a/pytz/tests/test_tzinfo.py b/pytz/tests/test_tzinfo.py
+index 48f51b1..7db8a57 100644
+--- a/pytz/tests/test_tzinfo.py
++++ b/pytz/tests/test_tzinfo.py
+@@ -28,7 +28,6 @@ from pytz.tzinfo import DstTzInfo, StaticTzInfo  # noqa
+ # I test for expected version to ensure the correct version of pytz is
+ # actually being tested.
+ EXPECTED_VERSION = '2022.7.1'
+-EXPECTED_OLSON_VERSION = '2022g'
+ 
+ fmt = '%Y-%m-%d %H:%M:%S %Z%z'
+ 
+@@ -74,13 +73,6 @@ class BasicTest(unittest.TestCase):
+             % (EXPECTED_VERSION, pytz.__version__)
+         )
+ 
+-        self.assertEqual(
+-            EXPECTED_OLSON_VERSION, pytz.OLSON_VERSION,
+-            'Incorrect pytz version loaded. Import path is stuffed '
+-            'or this test needs updating. (Wanted %s, got %s)'
+-            % (EXPECTED_OLSON_VERSION, pytz.OLSON_VERSION)
+-        )
+-
+     def testGMT(self):
+         now = datetime.now(tz=GMT)
+         self.assertEqual(now.utcoffset(), NOTIME)
diff -Nru 
python-tz-2022.7.1/debian/patches/Dynamically-determine-list-of-available-and-common-timezo.patch
 
python-tz-2022.7.1/debian/patches/Dynamically-determine-list-of-available-and-common-timezo.patch
--- 
python-tz-2022.7.1/debian/patches/Dynamically-determine-list-of-available-and-common-timezo.patch
   1970-01-01 01:00:00.000000000 +0100
+++ 
python-tz-2022.7.1/debian/patches/Dynamically-determine-list-of-available-and-common-timezo.patch
   2023-03-27 17:14:42.000000000 +0200
@@ -0,0 +1,1109 @@
+From: Benjamin Drung <benjamin.dr...@canonical.com>
+Date: Mon, 20 Mar 2023 17:49:11 +0100
+Subject: Dynamically determine list of available and common timezones
+
+The Debian/Ubuntu packages of pytz include a patch to not install pytz's
+zoneinfo database and instead load data from the system zoneinfo
+database. This keeps pytz up to date when system timezone updates are
+installed which is generally a good idea.
+
+The `pytz/__init__.py` includes `common_timezones` and `all_timezones`
+lists, which enumerate the time zones in the database pytz was released
+with. If pytz is instead using the system database, these lists may not
+be correct (e.g. missing newly added time zones).
+
+Dynamically determine `all_timezones` and `common_timezones`. For
+`all_timezones` use `zoneinfo` from Python 3.9 and for
+`common_timezones` parse `/usr/share/zoneinfo/zone1970.tab`.
+
+Bug: https://launchpad.net/bugs/207604
+Signed-off-by: Benjamin Drung <benjamin.dr...@canonical.com>
+---
+ pytz/__init__.py | 942 ++-----------------------------------------------------
+ 1 file changed, 22 insertions(+), 920 deletions(-)
+
+diff --git a/pytz/__init__.py b/pytz/__init__.py
+index 99bf1e4..8b2fa1b 100644
+--- a/pytz/__init__.py
++++ b/pytz/__init__.py
+@@ -11,6 +11,8 @@ on how to use these modules.
+ import sys
+ import datetime
+ import os.path
++import pathlib
++import zoneinfo
+ 
+ from pytz.exceptions import AmbiguousTimeError
+ from pytz.exceptions import InvalidTimeError
+@@ -202,7 +204,7 @@ def _case_insensitive_zone_lookup(zone):
+     """case-insensitively matching timezone, else return zone unchanged"""
+     global _all_timezones_lower_to_standard
+     if _all_timezones_lower_to_standard is None:
+-        _all_timezones_lower_to_standard = dict((tz.lower(), tz) for tz in 
_all_timezones_unchecked)  # noqa
++        _all_timezones_lower_to_standard = dict((tz.lower(), tz) for tz in 
all_timezones)  # noqa
+     return _all_timezones_lower_to_standard.get(zone.lower()) or zone  # noqa
+ 
+ 
+@@ -512,922 +514,91 @@ def _test():
+     return doctest.testmod(pytz)
+ 
+ 
++def _read_timezones_from_zone_tab() -> set[str]:
++    timezones = set()
++    zone_tab = pathlib.Path("/usr/share/zoneinfo/zone1970.tab")
++    for line in zone_tab.read_text(encoding="utf-8").splitlines():
++        if line.startswith("#"):
++            continue
++        timezones.add(line.split("\t")[2])
++    return timezones
++
++
+ if __name__ == '__main__':
+     _test()
+-_all_timezones_unchecked = \
+-['Africa/Abidjan',
+- 'Africa/Accra',
+- 'Africa/Addis_Ababa',
+- 'Africa/Algiers',
+- 'Africa/Asmara',
+- 'Africa/Asmera',
+- 'Africa/Bamako',
+- 'Africa/Bangui',
+- 'Africa/Banjul',
+- 'Africa/Bissau',
+- 'Africa/Blantyre',
+- 'Africa/Brazzaville',
+- 'Africa/Bujumbura',
+- 'Africa/Cairo',
+- 'Africa/Casablanca',
+- 'Africa/Ceuta',
+- 'Africa/Conakry',
+- 'Africa/Dakar',
+- 'Africa/Dar_es_Salaam',
+- 'Africa/Djibouti',
+- 'Africa/Douala',
+- 'Africa/El_Aaiun',
+- 'Africa/Freetown',
+- 'Africa/Gaborone',
+- 'Africa/Harare',
+- 'Africa/Johannesburg',
+- 'Africa/Juba',
+- 'Africa/Kampala',
+- 'Africa/Khartoum',
+- 'Africa/Kigali',
+- 'Africa/Kinshasa',
+- 'Africa/Lagos',
+- 'Africa/Libreville',
+- 'Africa/Lome',
+- 'Africa/Luanda',
+- 'Africa/Lubumbashi',
+- 'Africa/Lusaka',
+- 'Africa/Malabo',
+- 'Africa/Maputo',
+- 'Africa/Maseru',
+- 'Africa/Mbabane',
+- 'Africa/Mogadishu',
+- 'Africa/Monrovia',
+- 'Africa/Nairobi',
+- 'Africa/Ndjamena',
+- 'Africa/Niamey',
+- 'Africa/Nouakchott',
+- 'Africa/Ouagadougou',
+- 'Africa/Porto-Novo',
+- 'Africa/Sao_Tome',
+- 'Africa/Timbuktu',
+- 'Africa/Tripoli',
+- 'Africa/Tunis',
+- 'Africa/Windhoek',
+- 'America/Adak',
+- 'America/Anchorage',
+- 'America/Anguilla',
+- 'America/Antigua',
+- 'America/Araguaina',
+- 'America/Argentina/Buenos_Aires',
+- 'America/Argentina/Catamarca',
+- 'America/Argentina/ComodRivadavia',
+- 'America/Argentina/Cordoba',
+- 'America/Argentina/Jujuy',
+- 'America/Argentina/La_Rioja',
+- 'America/Argentina/Mendoza',
+- 'America/Argentina/Rio_Gallegos',
+- 'America/Argentina/Salta',
+- 'America/Argentina/San_Juan',
+- 'America/Argentina/San_Luis',
+- 'America/Argentina/Tucuman',
+- 'America/Argentina/Ushuaia',
+- 'America/Aruba',
+- 'America/Asuncion',
+- 'America/Atikokan',
+- 'America/Atka',
+- 'America/Bahia',
+- 'America/Bahia_Banderas',
+- 'America/Barbados',
+- 'America/Belem',
+- 'America/Belize',
+- 'America/Blanc-Sablon',
+- 'America/Boa_Vista',
+- 'America/Bogota',
+- 'America/Boise',
+- 'America/Buenos_Aires',
+- 'America/Cambridge_Bay',
+- 'America/Campo_Grande',
+- 'America/Cancun',
+- 'America/Caracas',
+- 'America/Catamarca',
+- 'America/Cayenne',
+- 'America/Cayman',
+- 'America/Chicago',
+- 'America/Chihuahua',
+- 'America/Ciudad_Juarez',
+- 'America/Coral_Harbour',
+- 'America/Cordoba',
+- 'America/Costa_Rica',
+- 'America/Creston',
+- 'America/Cuiaba',
+- 'America/Curacao',
+- 'America/Danmarkshavn',
+- 'America/Dawson',
+- 'America/Dawson_Creek',
+- 'America/Denver',
+- 'America/Detroit',
+- 'America/Dominica',
+- 'America/Edmonton',
+- 'America/Eirunepe',
+- 'America/El_Salvador',
+- 'America/Ensenada',
+- 'America/Fort_Nelson',
+- 'America/Fort_Wayne',
+- 'America/Fortaleza',
+- 'America/Glace_Bay',
+- 'America/Godthab',
+- 'America/Goose_Bay',
+- 'America/Grand_Turk',
+- 'America/Grenada',
+- 'America/Guadeloupe',
+- 'America/Guatemala',
+- 'America/Guayaquil',
+- 'America/Guyana',
+- 'America/Halifax',
+- 'America/Havana',
+- 'America/Hermosillo',
+- 'America/Indiana/Indianapolis',
+- 'America/Indiana/Knox',
+- 'America/Indiana/Marengo',
+- 'America/Indiana/Petersburg',
+- 'America/Indiana/Tell_City',
+- 'America/Indiana/Vevay',
+- 'America/Indiana/Vincennes',
+- 'America/Indiana/Winamac',
+- 'America/Indianapolis',
+- 'America/Inuvik',
+- 'America/Iqaluit',
+- 'America/Jamaica',
+- 'America/Jujuy',
+- 'America/Juneau',
+- 'America/Kentucky/Louisville',
+- 'America/Kentucky/Monticello',
+- 'America/Knox_IN',
+- 'America/Kralendijk',
+- 'America/La_Paz',
+- 'America/Lima',
+- 'America/Los_Angeles',
+- 'America/Louisville',
+- 'America/Lower_Princes',
+- 'America/Maceio',
+- 'America/Managua',
+- 'America/Manaus',
+- 'America/Marigot',
+- 'America/Martinique',
+- 'America/Matamoros',
+- 'America/Mazatlan',
+- 'America/Mendoza',
+- 'America/Menominee',
+- 'America/Merida',
+- 'America/Metlakatla',
+- 'America/Mexico_City',
+- 'America/Miquelon',
+- 'America/Moncton',
+- 'America/Monterrey',
+- 'America/Montevideo',
+- 'America/Montreal',
+- 'America/Montserrat',
+- 'America/Nassau',
+- 'America/New_York',
+- 'America/Nipigon',
+- 'America/Nome',
+- 'America/Noronha',
+- 'America/North_Dakota/Beulah',
+- 'America/North_Dakota/Center',
+- 'America/North_Dakota/New_Salem',
+- 'America/Nuuk',
+- 'America/Ojinaga',
+- 'America/Panama',
+- 'America/Pangnirtung',
+- 'America/Paramaribo',
+- 'America/Phoenix',
+- 'America/Port-au-Prince',
+- 'America/Port_of_Spain',
+- 'America/Porto_Acre',
+- 'America/Porto_Velho',
+- 'America/Puerto_Rico',
+- 'America/Punta_Arenas',
+- 'America/Rainy_River',
+- 'America/Rankin_Inlet',
+- 'America/Recife',
+- 'America/Regina',
+- 'America/Resolute',
+- 'America/Rio_Branco',
+- 'America/Rosario',
+- 'America/Santa_Isabel',
+- 'America/Santarem',
+- 'America/Santiago',
+- 'America/Santo_Domingo',
+- 'America/Sao_Paulo',
+- 'America/Scoresbysund',
+- 'America/Shiprock',
+- 'America/Sitka',
+- 'America/St_Barthelemy',
+- 'America/St_Johns',
+- 'America/St_Kitts',
+- 'America/St_Lucia',
+- 'America/St_Thomas',
+- 'America/St_Vincent',
+- 'America/Swift_Current',
+- 'America/Tegucigalpa',
+- 'America/Thule',
+- 'America/Thunder_Bay',
+- 'America/Tijuana',
+- 'America/Toronto',
+- 'America/Tortola',
+- 'America/Vancouver',
+- 'America/Virgin',
+- 'America/Whitehorse',
+- 'America/Winnipeg',
+- 'America/Yakutat',
+- 'America/Yellowknife',
+- 'Antarctica/Casey',
+- 'Antarctica/Davis',
+- 'Antarctica/DumontDUrville',
+- 'Antarctica/Macquarie',
+- 'Antarctica/Mawson',
+- 'Antarctica/McMurdo',
+- 'Antarctica/Palmer',
+- 'Antarctica/Rothera',
+- 'Antarctica/South_Pole',
+- 'Antarctica/Syowa',
+- 'Antarctica/Troll',
+- 'Antarctica/Vostok',
+- 'Arctic/Longyearbyen',
+- 'Asia/Aden',
+- 'Asia/Almaty',
+- 'Asia/Amman',
+- 'Asia/Anadyr',
+- 'Asia/Aqtau',
+- 'Asia/Aqtobe',
+- 'Asia/Ashgabat',
+- 'Asia/Ashkhabad',
+- 'Asia/Atyrau',
+- 'Asia/Baghdad',
+- 'Asia/Bahrain',
+- 'Asia/Baku',
+- 'Asia/Bangkok',
+- 'Asia/Barnaul',
+- 'Asia/Beirut',
+- 'Asia/Bishkek',
+- 'Asia/Brunei',
+- 'Asia/Calcutta',
+- 'Asia/Chita',
+- 'Asia/Choibalsan',
+- 'Asia/Chongqing',
+- 'Asia/Chungking',
+- 'Asia/Colombo',
+- 'Asia/Dacca',
+- 'Asia/Damascus',
+- 'Asia/Dhaka',
+- 'Asia/Dili',
+- 'Asia/Dubai',
+- 'Asia/Dushanbe',
+- 'Asia/Famagusta',
+- 'Asia/Gaza',
+- 'Asia/Harbin',
+- 'Asia/Hebron',
+- 'Asia/Ho_Chi_Minh',
+- 'Asia/Hong_Kong',
+- 'Asia/Hovd',
+- 'Asia/Irkutsk',
+- 'Asia/Istanbul',
+- 'Asia/Jakarta',
+- 'Asia/Jayapura',
+- 'Asia/Jerusalem',
+- 'Asia/Kabul',
+- 'Asia/Kamchatka',
+- 'Asia/Karachi',
+- 'Asia/Kashgar',
+- 'Asia/Kathmandu',
+- 'Asia/Katmandu',
+- 'Asia/Khandyga',
+- 'Asia/Kolkata',
+- 'Asia/Krasnoyarsk',
+- 'Asia/Kuala_Lumpur',
+- 'Asia/Kuching',
+- 'Asia/Kuwait',
+- 'Asia/Macao',
+- 'Asia/Macau',
+- 'Asia/Magadan',
+- 'Asia/Makassar',
+- 'Asia/Manila',
+- 'Asia/Muscat',
+- 'Asia/Nicosia',
+- 'Asia/Novokuznetsk',
+- 'Asia/Novosibirsk',
+- 'Asia/Omsk',
+- 'Asia/Oral',
+- 'Asia/Phnom_Penh',
+- 'Asia/Pontianak',
+- 'Asia/Pyongyang',
+- 'Asia/Qatar',
+- 'Asia/Qostanay',
+- 'Asia/Qyzylorda',
+- 'Asia/Rangoon',
+- 'Asia/Riyadh',
+- 'Asia/Saigon',
+- 'Asia/Sakhalin',
+- 'Asia/Samarkand',
+- 'Asia/Seoul',
+- 'Asia/Shanghai',
+- 'Asia/Singapore',
+- 'Asia/Srednekolymsk',
+- 'Asia/Taipei',
+- 'Asia/Tashkent',
+- 'Asia/Tbilisi',
+- 'Asia/Tehran',
+- 'Asia/Tel_Aviv',
+- 'Asia/Thimbu',
+- 'Asia/Thimphu',
+- 'Asia/Tokyo',
+- 'Asia/Tomsk',
+- 'Asia/Ujung_Pandang',
+- 'Asia/Ulaanbaatar',
+- 'Asia/Ulan_Bator',
+- 'Asia/Urumqi',
+- 'Asia/Ust-Nera',
+- 'Asia/Vientiane',
+- 'Asia/Vladivostok',
+- 'Asia/Yakutsk',
+- 'Asia/Yangon',
+- 'Asia/Yekaterinburg',
+- 'Asia/Yerevan',
+- 'Atlantic/Azores',
+- 'Atlantic/Bermuda',
+- 'Atlantic/Canary',
+- 'Atlantic/Cape_Verde',
+- 'Atlantic/Faeroe',
+- 'Atlantic/Faroe',
+- 'Atlantic/Jan_Mayen',
+- 'Atlantic/Madeira',
+- 'Atlantic/Reykjavik',
+- 'Atlantic/South_Georgia',
+- 'Atlantic/St_Helena',
+- 'Atlantic/Stanley',
+- 'Australia/ACT',
+- 'Australia/Adelaide',
+- 'Australia/Brisbane',
+- 'Australia/Broken_Hill',
+- 'Australia/Canberra',
+- 'Australia/Currie',
+- 'Australia/Darwin',
+- 'Australia/Eucla',
+- 'Australia/Hobart',
+- 'Australia/LHI',
+- 'Australia/Lindeman',
+- 'Australia/Lord_Howe',
+- 'Australia/Melbourne',
+- 'Australia/NSW',
+- 'Australia/North',
+- 'Australia/Perth',
+- 'Australia/Queensland',
+- 'Australia/South',
+- 'Australia/Sydney',
+- 'Australia/Tasmania',
+- 'Australia/Victoria',
+- 'Australia/West',
+- 'Australia/Yancowinna',
+- 'Brazil/Acre',
+- 'Brazil/DeNoronha',
+- 'Brazil/East',
+- 'Brazil/West',
+- 'CET',
+- 'CST6CDT',
+- 'Canada/Atlantic',
+- 'Canada/Central',
+- 'Canada/Eastern',
+- 'Canada/Mountain',
+- 'Canada/Newfoundland',
+- 'Canada/Pacific',
+- 'Canada/Saskatchewan',
+- 'Canada/Yukon',
+- 'Chile/Continental',
+- 'Chile/EasterIsland',
+- 'Cuba',
+- 'EET',
+- 'EST',
+- 'EST5EDT',
+- 'Egypt',
+- 'Eire',
+- 'Etc/GMT',
+- 'Etc/GMT+0',
+- 'Etc/GMT+1',
+- 'Etc/GMT+10',
+- 'Etc/GMT+11',
+- 'Etc/GMT+12',
+- 'Etc/GMT+2',
+- 'Etc/GMT+3',
+- 'Etc/GMT+4',
+- 'Etc/GMT+5',
+- 'Etc/GMT+6',
+- 'Etc/GMT+7',
+- 'Etc/GMT+8',
+- 'Etc/GMT+9',
+- 'Etc/GMT-0',
+- 'Etc/GMT-1',
+- 'Etc/GMT-10',
+- 'Etc/GMT-11',
+- 'Etc/GMT-12',
+- 'Etc/GMT-13',
+- 'Etc/GMT-14',
+- 'Etc/GMT-2',
+- 'Etc/GMT-3',
+- 'Etc/GMT-4',
+- 'Etc/GMT-5',
+- 'Etc/GMT-6',
+- 'Etc/GMT-7',
+- 'Etc/GMT-8',
+- 'Etc/GMT-9',
+- 'Etc/GMT0',
+- 'Etc/Greenwich',
+- 'Etc/UCT',
+- 'Etc/UTC',
+- 'Etc/Universal',
+- 'Etc/Zulu',
+- 'Europe/Amsterdam',
+- 'Europe/Andorra',
+- 'Europe/Astrakhan',
+- 'Europe/Athens',
+- 'Europe/Belfast',
+- 'Europe/Belgrade',
+- 'Europe/Berlin',
+- 'Europe/Bratislava',
+- 'Europe/Brussels',
+- 'Europe/Bucharest',
+- 'Europe/Budapest',
+- 'Europe/Busingen',
+- 'Europe/Chisinau',
+- 'Europe/Copenhagen',
+- 'Europe/Dublin',
+- 'Europe/Gibraltar',
+- 'Europe/Guernsey',
+- 'Europe/Helsinki',
+- 'Europe/Isle_of_Man',
+- 'Europe/Istanbul',
+- 'Europe/Jersey',
+- 'Europe/Kaliningrad',
+- 'Europe/Kiev',
+- 'Europe/Kirov',
+- 'Europe/Kyiv',
+- 'Europe/Lisbon',
+- 'Europe/Ljubljana',
+- 'Europe/London',
+- 'Europe/Luxembourg',
+- 'Europe/Madrid',
+- 'Europe/Malta',
+- 'Europe/Mariehamn',
+- 'Europe/Minsk',
+- 'Europe/Monaco',
+- 'Europe/Moscow',
+- 'Europe/Nicosia',
+- 'Europe/Oslo',
+- 'Europe/Paris',
+- 'Europe/Podgorica',
+- 'Europe/Prague',
+- 'Europe/Riga',
+- 'Europe/Rome',
+- 'Europe/Samara',
+- 'Europe/San_Marino',
+- 'Europe/Sarajevo',
+- 'Europe/Saratov',
+- 'Europe/Simferopol',
+- 'Europe/Skopje',
+- 'Europe/Sofia',
+- 'Europe/Stockholm',
+- 'Europe/Tallinn',
+- 'Europe/Tirane',
+- 'Europe/Tiraspol',
+- 'Europe/Ulyanovsk',
+- 'Europe/Uzhgorod',
+- 'Europe/Vaduz',
+- 'Europe/Vatican',
+- 'Europe/Vienna',
+- 'Europe/Vilnius',
+- 'Europe/Volgograd',
+- 'Europe/Warsaw',
+- 'Europe/Zagreb',
+- 'Europe/Zaporozhye',
+- 'Europe/Zurich',
+- 'GB',
+- 'GB-Eire',
+- 'GMT',
+- 'GMT+0',
+- 'GMT-0',
+- 'GMT0',
+- 'Greenwich',
+- 'HST',
+- 'Hongkong',
+- 'Iceland',
+- 'Indian/Antananarivo',
+- 'Indian/Chagos',
+- 'Indian/Christmas',
+- 'Indian/Cocos',
+- 'Indian/Comoro',
+- 'Indian/Kerguelen',
+- 'Indian/Mahe',
+- 'Indian/Maldives',
+- 'Indian/Mauritius',
+- 'Indian/Mayotte',
+- 'Indian/Reunion',
+- 'Iran',
+- 'Israel',
+- 'Jamaica',
+- 'Japan',
+- 'Kwajalein',
+- 'Libya',
+- 'MET',
+- 'MST',
+- 'MST7MDT',
+- 'Mexico/BajaNorte',
+- 'Mexico/BajaSur',
+- 'Mexico/General',
+- 'NZ',
+- 'NZ-CHAT',
+- 'Navajo',
+- 'PRC',
+- 'PST8PDT',
+- 'Pacific/Apia',
+- 'Pacific/Auckland',
+- 'Pacific/Bougainville',
+- 'Pacific/Chatham',
+- 'Pacific/Chuuk',
+- 'Pacific/Easter',
+- 'Pacific/Efate',
+- 'Pacific/Enderbury',
+- 'Pacific/Fakaofo',
+- 'Pacific/Fiji',
+- 'Pacific/Funafuti',
+- 'Pacific/Galapagos',
+- 'Pacific/Gambier',
+- 'Pacific/Guadalcanal',
+- 'Pacific/Guam',
+- 'Pacific/Honolulu',
+- 'Pacific/Johnston',
+- 'Pacific/Kanton',
+- 'Pacific/Kiritimati',
+- 'Pacific/Kosrae',
+- 'Pacific/Kwajalein',
+- 'Pacific/Majuro',
+- 'Pacific/Marquesas',
+- 'Pacific/Midway',
+- 'Pacific/Nauru',
+- 'Pacific/Niue',
+- 'Pacific/Norfolk',
+- 'Pacific/Noumea',
+- 'Pacific/Pago_Pago',
+- 'Pacific/Palau',
+- 'Pacific/Pitcairn',
+- 'Pacific/Pohnpei',
+- 'Pacific/Ponape',
+- 'Pacific/Port_Moresby',
+- 'Pacific/Rarotonga',
+- 'Pacific/Saipan',
+- 'Pacific/Samoa',
+- 'Pacific/Tahiti',
+- 'Pacific/Tarawa',
+- 'Pacific/Tongatapu',
+- 'Pacific/Truk',
+- 'Pacific/Wake',
+- 'Pacific/Wallis',
+- 'Pacific/Yap',
+- 'Poland',
+- 'Portugal',
+- 'ROC',
+- 'ROK',
+- 'Singapore',
+- 'Turkey',
+- 'UCT',
+- 'US/Alaska',
+- 'US/Aleutian',
+- 'US/Arizona',
+- 'US/Central',
+- 'US/East-Indiana',
+- 'US/Eastern',
+- 'US/Hawaii',
+- 'US/Indiana-Starke',
+- 'US/Michigan',
+- 'US/Mountain',
+- 'US/Pacific',
+- 'US/Samoa',
+- 'UTC',
+- 'Universal',
+- 'W-SU',
+- 'WET',
+- 'Zulu']
+-all_timezones = LazyList(
+-        tz for tz in _all_timezones_unchecked if resource_exists(tz))
+-        
+-all_timezones_set = LazySet(all_timezones)
+-common_timezones = \
+-['Africa/Abidjan',
++
++_extra_common_timezones_set = {
+  'Africa/Accra',
+  'Africa/Addis_Ababa',
+- 'Africa/Algiers',
+  'Africa/Asmara',
+  'Africa/Bamako',
+  'Africa/Bangui',
+  'Africa/Banjul',
+- 'Africa/Bissau',
+  'Africa/Blantyre',
+  'Africa/Brazzaville',
+  'Africa/Bujumbura',
+- 'Africa/Cairo',
+- 'Africa/Casablanca',
+- 'Africa/Ceuta',
+  'Africa/Conakry',
+  'Africa/Dakar',
+  'Africa/Dar_es_Salaam',
+  'Africa/Djibouti',
+  'Africa/Douala',
+- 'Africa/El_Aaiun',
+  'Africa/Freetown',
+  'Africa/Gaborone',
+  'Africa/Harare',
+- 'Africa/Johannesburg',
+- 'Africa/Juba',
+  'Africa/Kampala',
+- 'Africa/Khartoum',
+  'Africa/Kigali',
+  'Africa/Kinshasa',
+- 'Africa/Lagos',
+  'Africa/Libreville',
+  'Africa/Lome',
+  'Africa/Luanda',
+  'Africa/Lubumbashi',
+  'Africa/Lusaka',
+  'Africa/Malabo',
+- 'Africa/Maputo',
+  'Africa/Maseru',
+  'Africa/Mbabane',
+  'Africa/Mogadishu',
+- 'Africa/Monrovia',
+- 'Africa/Nairobi',
+- 'Africa/Ndjamena',
+  'Africa/Niamey',
+  'Africa/Nouakchott',
+  'Africa/Ouagadougou',
+  'Africa/Porto-Novo',
+- 'Africa/Sao_Tome',
+- 'Africa/Tripoli',
+- 'Africa/Tunis',
+- 'Africa/Windhoek',
+- 'America/Adak',
+- 'America/Anchorage',
+  'America/Anguilla',
+  'America/Antigua',
+- 'America/Araguaina',
+- 'America/Argentina/Buenos_Aires',
+- 'America/Argentina/Catamarca',
+- 'America/Argentina/Cordoba',
+- 'America/Argentina/Jujuy',
+- 'America/Argentina/La_Rioja',
+- 'America/Argentina/Mendoza',
+- 'America/Argentina/Rio_Gallegos',
+- 'America/Argentina/Salta',
+- 'America/Argentina/San_Juan',
+- 'America/Argentina/San_Luis',
+- 'America/Argentina/Tucuman',
+- 'America/Argentina/Ushuaia',
+  'America/Aruba',
+- 'America/Asuncion',
+  'America/Atikokan',
+- 'America/Bahia',
+- 'America/Bahia_Banderas',
+- 'America/Barbados',
+- 'America/Belem',
+- 'America/Belize',
+  'America/Blanc-Sablon',
+- 'America/Boa_Vista',
+- 'America/Bogota',
+- 'America/Boise',
+- 'America/Cambridge_Bay',
+- 'America/Campo_Grande',
+- 'America/Cancun',
+- 'America/Caracas',
+- 'America/Cayenne',
+  'America/Cayman',
+- 'America/Chicago',
+- 'America/Chihuahua',
+- 'America/Ciudad_Juarez',
+- 'America/Costa_Rica',
+  'America/Creston',
+- 'America/Cuiaba',
+  'America/Curacao',
+- 'America/Danmarkshavn',
+- 'America/Dawson',
+- 'America/Dawson_Creek',
+- 'America/Denver',
+- 'America/Detroit',
+  'America/Dominica',
+- 'America/Edmonton',
+- 'America/Eirunepe',
+- 'America/El_Salvador',
+- 'America/Fort_Nelson',
+- 'America/Fortaleza',
+- 'America/Glace_Bay',
+- 'America/Goose_Bay',
+- 'America/Grand_Turk',
+  'America/Grenada',
+  'America/Guadeloupe',
+- 'America/Guatemala',
+- 'America/Guayaquil',
+- 'America/Guyana',
+- 'America/Halifax',
+- 'America/Havana',
+- 'America/Hermosillo',
+- 'America/Indiana/Indianapolis',
+- 'America/Indiana/Knox',
+- 'America/Indiana/Marengo',
+- 'America/Indiana/Petersburg',
+- 'America/Indiana/Tell_City',
+- 'America/Indiana/Vevay',
+- 'America/Indiana/Vincennes',
+- 'America/Indiana/Winamac',
+- 'America/Inuvik',
+- 'America/Iqaluit',
+- 'America/Jamaica',
+- 'America/Juneau',
+- 'America/Kentucky/Louisville',
+- 'America/Kentucky/Monticello',
+  'America/Kralendijk',
+- 'America/La_Paz',
+- 'America/Lima',
+- 'America/Los_Angeles',
+  'America/Lower_Princes',
+- 'America/Maceio',
+- 'America/Managua',
+- 'America/Manaus',
+  'America/Marigot',
+- 'America/Martinique',
+- 'America/Matamoros',
+- 'America/Mazatlan',
+- 'America/Menominee',
+- 'America/Merida',
+- 'America/Metlakatla',
+- 'America/Mexico_City',
+- 'America/Miquelon',
+- 'America/Moncton',
+- 'America/Monterrey',
+- 'America/Montevideo',
+  'America/Montserrat',
+  'America/Nassau',
+- 'America/New_York',
+- 'America/Nome',
+- 'America/Noronha',
+- 'America/North_Dakota/Beulah',
+- 'America/North_Dakota/Center',
+- 'America/North_Dakota/New_Salem',
+- 'America/Nuuk',
+- 'America/Ojinaga',
+- 'America/Panama',
+- 'America/Paramaribo',
+- 'America/Phoenix',
+- 'America/Port-au-Prince',
+  'America/Port_of_Spain',
+- 'America/Porto_Velho',
+- 'America/Puerto_Rico',
+- 'America/Punta_Arenas',
+- 'America/Rankin_Inlet',
+- 'America/Recife',
+- 'America/Regina',
+- 'America/Resolute',
+- 'America/Rio_Branco',
+- 'America/Santarem',
+- 'America/Santiago',
+- 'America/Santo_Domingo',
+- 'America/Sao_Paulo',
+- 'America/Scoresbysund',
+- 'America/Sitka',
+  'America/St_Barthelemy',
+- 'America/St_Johns',
+  'America/St_Kitts',
+  'America/St_Lucia',
+  'America/St_Thomas',
+  'America/St_Vincent',
+- 'America/Swift_Current',
+- 'America/Tegucigalpa',
+- 'America/Thule',
+- 'America/Tijuana',
+- 'America/Toronto',
+  'America/Tortola',
+- 'America/Vancouver',
+- 'America/Whitehorse',
+- 'America/Winnipeg',
+- 'America/Yakutat',
+- 'America/Yellowknife',
+- 'Antarctica/Casey',
+- 'Antarctica/Davis',
+  'Antarctica/DumontDUrville',
+- 'Antarctica/Macquarie',
+- 'Antarctica/Mawson',
+  'Antarctica/McMurdo',
+- 'Antarctica/Palmer',
+- 'Antarctica/Rothera',
+  'Antarctica/Syowa',
+- 'Antarctica/Troll',
+  'Antarctica/Vostok',
+  'Arctic/Longyearbyen',
+  'Asia/Aden',
+- 'Asia/Almaty',
+- 'Asia/Amman',
+- 'Asia/Anadyr',
+- 'Asia/Aqtau',
+- 'Asia/Aqtobe',
+- 'Asia/Ashgabat',
+- 'Asia/Atyrau',
+- 'Asia/Baghdad',
+  'Asia/Bahrain',
+- 'Asia/Baku',
+- 'Asia/Bangkok',
+- 'Asia/Barnaul',
+- 'Asia/Beirut',
+- 'Asia/Bishkek',
+  'Asia/Brunei',
+- 'Asia/Chita',
+- 'Asia/Choibalsan',
+- 'Asia/Colombo',
+- 'Asia/Damascus',
+- 'Asia/Dhaka',
+- 'Asia/Dili',
+- 'Asia/Dubai',
+- 'Asia/Dushanbe',
+- 'Asia/Famagusta',
+- 'Asia/Gaza',
+- 'Asia/Hebron',
+- 'Asia/Ho_Chi_Minh',
+- 'Asia/Hong_Kong',
+- 'Asia/Hovd',
+- 'Asia/Irkutsk',
+- 'Asia/Jakarta',
+- 'Asia/Jayapura',
+- 'Asia/Jerusalem',
+- 'Asia/Kabul',
+- 'Asia/Kamchatka',
+- 'Asia/Karachi',
+- 'Asia/Kathmandu',
+- 'Asia/Khandyga',
+- 'Asia/Kolkata',
+- 'Asia/Krasnoyarsk',
+  'Asia/Kuala_Lumpur',
+- 'Asia/Kuching',
+  'Asia/Kuwait',
+- 'Asia/Macau',
+- 'Asia/Magadan',
+- 'Asia/Makassar',
+- 'Asia/Manila',
+  'Asia/Muscat',
+- 'Asia/Nicosia',
+- 'Asia/Novokuznetsk',
+- 'Asia/Novosibirsk',
+- 'Asia/Omsk',
+- 'Asia/Oral',
+  'Asia/Phnom_Penh',
+- 'Asia/Pontianak',
+- 'Asia/Pyongyang',
+- 'Asia/Qatar',
+- 'Asia/Qostanay',
+- 'Asia/Qyzylorda',
+- 'Asia/Riyadh',
+- 'Asia/Sakhalin',
+- 'Asia/Samarkand',
+- 'Asia/Seoul',
+- 'Asia/Shanghai',
+- 'Asia/Singapore',
+- 'Asia/Srednekolymsk',
+- 'Asia/Taipei',
+- 'Asia/Tashkent',
+- 'Asia/Tbilisi',
+- 'Asia/Tehran',
+- 'Asia/Thimphu',
+- 'Asia/Tokyo',
+- 'Asia/Tomsk',
+- 'Asia/Ulaanbaatar',
+- 'Asia/Urumqi',
+- 'Asia/Ust-Nera',
+  'Asia/Vientiane',
+- 'Asia/Vladivostok',
+- 'Asia/Yakutsk',
+- 'Asia/Yangon',
+- 'Asia/Yekaterinburg',
+- 'Asia/Yerevan',
+- 'Atlantic/Azores',
+- 'Atlantic/Bermuda',
+- 'Atlantic/Canary',
+- 'Atlantic/Cape_Verde',
+- 'Atlantic/Faroe',
+- 'Atlantic/Madeira',
+  'Atlantic/Reykjavik',
+- 'Atlantic/South_Georgia',
+  'Atlantic/St_Helena',
+- 'Atlantic/Stanley',
+- 'Australia/Adelaide',
+- 'Australia/Brisbane',
+- 'Australia/Broken_Hill',
+- 'Australia/Darwin',
+- 'Australia/Eucla',
+- 'Australia/Hobart',
+- 'Australia/Lindeman',
+- 'Australia/Lord_Howe',
+- 'Australia/Melbourne',
+- 'Australia/Perth',
+- 'Australia/Sydney',
+  'Canada/Atlantic',
+  'Canada/Central',
+  'Canada/Eastern',
+@@ -1435,111 +606,40 @@ common_timezones = \
+  'Canada/Newfoundland',
+  'Canada/Pacific',
+  'Europe/Amsterdam',
+- 'Europe/Andorra',
+- 'Europe/Astrakhan',
+- 'Europe/Athens',
+- 'Europe/Belgrade',
+- 'Europe/Berlin',
+  'Europe/Bratislava',
+- 'Europe/Brussels',
+- 'Europe/Bucharest',
+- 'Europe/Budapest',
+  'Europe/Busingen',
+- 'Europe/Chisinau',
+  'Europe/Copenhagen',
+- 'Europe/Dublin',
+- 'Europe/Gibraltar',
+  'Europe/Guernsey',
+- 'Europe/Helsinki',
+  'Europe/Isle_of_Man',
+- 'Europe/Istanbul',
+  'Europe/Jersey',
+- 'Europe/Kaliningrad',
+- 'Europe/Kirov',
+- 'Europe/Kyiv',
+- 'Europe/Lisbon',
+  'Europe/Ljubljana',
+- 'Europe/London',
+  'Europe/Luxembourg',
+- 'Europe/Madrid',
+- 'Europe/Malta',
+  'Europe/Mariehamn',
+- 'Europe/Minsk',
+  'Europe/Monaco',
+- 'Europe/Moscow',
+  'Europe/Oslo',
+- 'Europe/Paris',
+  'Europe/Podgorica',
+- 'Europe/Prague',
+- 'Europe/Riga',
+- 'Europe/Rome',
+- 'Europe/Samara',
+  'Europe/San_Marino',
+  'Europe/Sarajevo',
+- 'Europe/Saratov',
+- 'Europe/Simferopol',
+  'Europe/Skopje',
+- 'Europe/Sofia',
+  'Europe/Stockholm',
+- 'Europe/Tallinn',
+- 'Europe/Tirane',
+- 'Europe/Ulyanovsk',
+  'Europe/Vaduz',
+  'Europe/Vatican',
+- 'Europe/Vienna',
+- 'Europe/Vilnius',
+- 'Europe/Volgograd',
+- 'Europe/Warsaw',
+  'Europe/Zagreb',
+- 'Europe/Zurich',
+  'GMT',
+  'Indian/Antananarivo',
+- 'Indian/Chagos',
+  'Indian/Christmas',
+  'Indian/Cocos',
+  'Indian/Comoro',
+  'Indian/Kerguelen',
+  'Indian/Mahe',
+- 'Indian/Maldives',
+- 'Indian/Mauritius',
+  'Indian/Mayotte',
+  'Indian/Reunion',
+- 'Pacific/Apia',
+- 'Pacific/Auckland',
+- 'Pacific/Bougainville',
+- 'Pacific/Chatham',
+  'Pacific/Chuuk',
+- 'Pacific/Easter',
+- 'Pacific/Efate',
+- 'Pacific/Fakaofo',
+- 'Pacific/Fiji',
+  'Pacific/Funafuti',
+- 'Pacific/Galapagos',
+- 'Pacific/Gambier',
+- 'Pacific/Guadalcanal',
+- 'Pacific/Guam',
+- 'Pacific/Honolulu',
+- 'Pacific/Kanton',
+- 'Pacific/Kiritimati',
+- 'Pacific/Kosrae',
+- 'Pacific/Kwajalein',
+  'Pacific/Majuro',
+- 'Pacific/Marquesas',
+  'Pacific/Midway',
+- 'Pacific/Nauru',
+- 'Pacific/Niue',
+- 'Pacific/Norfolk',
+- 'Pacific/Noumea',
+- 'Pacific/Pago_Pago',
+- 'Pacific/Palau',
+- 'Pacific/Pitcairn',
+  'Pacific/Pohnpei',
+- 'Pacific/Port_Moresby',
+- 'Pacific/Rarotonga',
+  'Pacific/Saipan',
+- 'Pacific/Tahiti',
+- 'Pacific/Tarawa',
+- 'Pacific/Tongatapu',
+  'Pacific/Wake',
+  'Pacific/Wallis',
+  'US/Alaska',
+@@ -1549,8 +649,10 @@ common_timezones = \
+  'US/Hawaii',
+  'US/Mountain',
+  'US/Pacific',
+- 'UTC']
+-common_timezones = LazyList(
+-            tz for tz in common_timezones if tz in all_timezones)
+-        
+-common_timezones_set = LazySet(common_timezones)
++ 'UTC'}
++
++all_timezones_set = zoneinfo.available_timezones() - {"Factory", "localtime"}
++common_timezones_set = (_read_timezones_from_zone_tab() | 
_extra_common_timezones_set) & all_timezones_set
++
++all_timezones = sorted(all_timezones_set)
++common_timezones = sorted(common_timezones_set)
diff -Nru python-tz-2022.7.1/debian/patches/series 
python-tz-2022.7.1/debian/patches/series
--- python-tz-2022.7.1/debian/patches/series    2023-01-15 11:24:50.000000000 
+0100
+++ python-tz-2022.7.1/debian/patches/series    2023-03-27 17:14:42.000000000 
+0200
@@ -1 +1,3 @@
 tzdata
+Dynamically-determine-list-of-available-and-common-timezo.patch
+Determine-IANA-nee-Olson-database-version-dynamically.patch
diff -Nru python-tz-2022.7.1/debian/tests/control 
python-tz-2022.7.1/debian/tests/control
--- python-tz-2022.7.1/debian/tests/control     1970-01-01 01:00:00.000000000 
+0100
+++ python-tz-2022.7.1/debian/tests/control     2023-03-27 17:12:30.000000000 
+0200
@@ -0,0 +1,8 @@
+Test-Command: cp -r pytz/tests "$AUTOPKGTEST_TMP" && cd "$AUTOPKGTEST_TMP" && 
rm -f tests/test_docs.py && touch tests/__init__.py && python3 -m unittest 
discover -v
+Depends: python3, python3-tz
+Restrictions: allow-stderr
+Features: test-name=unittest
+
+Tests: regression
+Depends: python3, python3-tz
+Restrictions: allow-stderr
diff -Nru python-tz-2022.7.1/debian/tests/regression 
python-tz-2022.7.1/debian/tests/regression
--- python-tz-2022.7.1/debian/tests/regression  1970-01-01 01:00:00.000000000 
+0100
+++ python-tz-2022.7.1/debian/tests/regression  2023-03-27 17:12:30.000000000 
+0200
@@ -0,0 +1,122 @@
+#!/usr/bin/python3
+
+# Copyright (C) 2012-2023 Canonical Ltd.
+# Author: Benjamin Drung <benjamin.dr...@canonical.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 3,
+# as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Parts taken from
+# https://git.launchpad.net/qa-regression-testing/tree/scripts/test-tzdata.py
+
+"""Regression tests for python3-tz."""
+
+import sys
+import unittest
+from datetime import datetime, timedelta
+
+import pytz
+
+
+class TZDataTest(unittest.TestCase):
+    """Regression tests for python3-tz."""
+
+    def test_lp1965791_gaza(self) -> None:
+        """Test Gaza 2022 DST change"""
+        timezone = pytz.timezone("Asia/Gaza")
+        offset_before = timezone.localize(datetime(2022, 3, 22))
+        updated_before = timezone.localize(datetime(2022, 3, 27))
+        offset_after = timezone.localize(datetime(2022, 3, 29))
+
+        with self.subTest(testcase=offset_before):
+            self.assertEqual(offset_before.utcoffset(), 
updated_before.utcoffset())
+        with self.subTest(testcase=updated_before):
+            utc_offset_difference = offset_after.utcoffset() - 
offset_before.utcoffset()
+            self.assertEqual(utc_offset_difference, timedelta(seconds=3600))
+
+    def test_lp1986984_chile(self) -> None:
+        """Test Chile 2022 DST date"""
+        # chile dst changed from 2022/09/04 to 2022/09/11
+        timezone = pytz.timezone("America/Santiago")
+        always_before = timezone.localize(datetime(2022, 9, 1))
+        now_before = timezone.localize(datetime(2022, 9, 8))
+        always_after = timezone.localize(datetime(2022, 9, 12))
+        with self.subTest(testcase=always_before):
+            self.assertEqual(always_before.utcoffset(), now_before.utcoffset())
+        with self.subTest(testcase=now_before):
+            utc_offset_difference = always_after.utcoffset() - 
now_before.utcoffset()
+            self.assertEqual(utc_offset_difference, timedelta(seconds=3600))
+
+    def test_lp1992692_gaza(self) -> None:
+        """Test Gaza October 2022 DST date"""
+        # gaza dst changed from 2022/10/28 to 2022/10/29
+        timezone = pytz.timezone("Asia/Gaza")
+        offset_before = timezone.localize(datetime(2022, 10, 1))
+        updated_before = timezone.localize(datetime(2022, 10, 29))
+        offset_after = timezone.localize(datetime(2022, 11, 1))
+        # time falls back with this change
+        offset_change = -3600
+
+        with self.subTest(testcase=offset_before):
+            self.assertEqual(offset_before.utcoffset(), 
updated_before.utcoffset())
+        with self.subTest(testcase=updated_before):
+            utc_offset_difference = offset_after.utcoffset() - 
offset_before.utcoffset()
+            self.assertEqual(utc_offset_difference, 
timedelta(seconds=offset_change))
+
+    def test_all_timezones_count(self) -> None:
+        """Test all_timezones count to be reasonable."""
+        zones = len(pytz.all_timezones)
+        self.assertGreaterEqual(zones, 597, "less zones than 2022g-3")
+        self.assertLess(zones, round(597 * 1.1), ">10% more zones than 
2022g-3")
+        self.assertEqual(len(pytz.all_timezones_set), zones)
+
+    def test_common_timezones_count(self) -> None:
+        """Test common_timezones count to be reasonable."""
+        self.assertEqual(pytz.common_timezones_set - pytz.all_timezones_set, 
set())
+
+    def _test_timezone(self, zone: str) -> None:
+        """Test zone to load, have a name, and have a reasonable offset."""
+        timezone = pytz.timezone(zone)
+        self.assertEqual(str(timezone), zone)
+        date = timezone.localize(datetime(2020, 10, 31, 12))
+
+        tzname = date.tzname()
+        assert tzname is not None
+        self.assertGreaterEqual(len(tzname), 3, tzname)
+        self.assertLessEqual(len(tzname), 5, tzname)
+
+        utc_offset = date.utcoffset()
+        assert utc_offset is not None
+        self.assertEqual(int(utc_offset.total_seconds()) % 900, 0)
+        self.assertLessEqual(utc_offset, timedelta(hours=14))
+
+    def test_timezones(self) -> None:
+        """Test all zones to load, have a name, and have a reasonable 
offset."""
+        for zone in pytz.all_timezones:
+            with self.subTest(zone=zone):
+                self._test_timezone(zone)
+
+    def test_olson_version(self) -> None:
+        """Test IANA (nee Olson) database version was successful determined."""
+        self.assertNotEqual(pytz.OLSON_VERSION, "unknown")
+        self.assertTrue(pytz.OLSON_VERSION[0].isdigit(), pytz.OLSON_VERSION)
+
+
+def main() -> None:
+    """Run unit tests in verbose mode."""
+    argv = sys.argv.copy()
+    argv.insert(1, "-v")
+    unittest.main(argv=argv)
+
+
+if __name__ == "__main__":
+    main()

Reply via email to