[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#1033939: marked as done (unblock: python-tz/2022.7.1-3)



Your message dated Tue, 04 Apr 2023 21:52:35 +0000
with message-id <E1pjoZv-004nh8-7j@respighi.debian.org>
and subject line unblock python-tz
has caused the Debian Bug report #1033939,
regarding unblock: python-tz/2022.7.1-3
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
1033939: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1033939
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: bdrung@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 <bdrung@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 <bdrung@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-developers@lists.alioth.debian.org>,
            Fabio Tranchitella <kobold@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.drung@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.drung@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.drung@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.drung@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.drung@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()

--- End Message ---
--- Begin Message ---
Unblocked.

--- End Message ---

Reply to: