1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
From 907459c6f632a87fce5729f6eebd2adf5b94e577 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= <mgorny@gentoo.org>
Date: Tue, 3 Apr 2018 22:03:32 +0200
Subject: [PATCH] zoneinfo: Get timezone data from system tzdata
---
dateutil/test/test_imports.py | 3 +--
dateutil/zoneinfo/__init__.py | 25 ++++++++++++++-----------
2 files changed, 15 insertions(+), 13 deletions(-)
diff --git a/dateutil/test/test_imports.py b/dateutil/test/test_imports.py
index 60b8600..b9f517c 100644
--- a/dateutil/test/test_imports.py
+++ b/dateutil/test/test_imports.py
@@ -168,9 +168,8 @@ def test_import_zone_info_from():
def test_import_zone_info_star():
from dateutil.zoneinfo import gettz
from dateutil.zoneinfo import gettz_db_metadata
- from dateutil.zoneinfo import rebuild
- zi_all = (gettz, gettz_db_metadata, rebuild)
+ zi_all = (gettz, gettz_db_metadata)
for var in zi_all:
assert var is not None
diff --git a/dateutil/zoneinfo/__init__.py b/dateutil/zoneinfo/__init__.py
index 34f11ad..e3f0f94 100644
--- a/dateutil/zoneinfo/__init__.py
+++ b/dateutil/zoneinfo/__init__.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import warnings
import json
+import os
from tarfile import TarFile
from pkgutil import get_data
@@ -10,7 +11,7 @@ from dateutil.tz import tzfile as _tzfile
__all__ = ["get_zonefile_instance", "gettz", "gettz_db_metadata"]
-ZONEFILENAME = "dateutil-zoneinfo.tar.gz"
+ZONEDIRECTORY = "/usr/share/zoneinfo"
METADATA_FN = 'METADATA'
@@ -19,12 +20,14 @@ class tzfile(_tzfile):
return (gettz, (self._filename,))
-def getzoneinfofile_stream():
- try:
- return BytesIO(get_data(__name__, ZONEFILENAME))
- except IOError as e: # TODO switch to FileNotFoundError?
- warnings.warn("I/O error({0}): {1}".format(e.errno, e.strerror))
- return None
+def iter_zones(topdir):
+ for dirpath, dirnames, filenames in os.walk(topdir):
+ for f in filenames:
+ if f.endswith(('.list', '.tab', '.zi', 'leapseconds')):
+ continue
+ fpath = os.path.join(dirpath, f)
+ relpath = os.path.relpath(fpath, topdir)
+ yield (relpath, tzfile(fpath, filename=relpath))
class ZoneInfoFile(object):
@@ -48,7 +51,7 @@ class ZoneInfoFile(object):
# no metadata in tar file
self.metadata = None
else:
- self.zones = {}
+ self.zones = dict(iter_zones(ZONEDIRECTORY))
self.metadata = None
def get(self, name, default=None):
@@ -99,7 +102,7 @@ def get_zonefile_instance(new_instance=False):
zif = getattr(get_zonefile_instance, '_cached_instance', None)
if zif is None:
- zif = ZoneInfoFile(getzoneinfofile_stream())
+ zif = ZoneInfoFile()
get_zonefile_instance._cached_instance = zif
@@ -140,7 +143,7 @@ def gettz(name):
DeprecationWarning)
if len(_CLASS_ZONE_INSTANCE) == 0:
- _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream()))
+ _CLASS_ZONE_INSTANCE.append(ZoneInfoFile())
return _CLASS_ZONE_INSTANCE[0].zones.get(name)
@@ -163,5 +166,5 @@ def gettz_db_metadata():
DeprecationWarning)
if len(_CLASS_ZONE_INSTANCE) == 0:
- _CLASS_ZONE_INSTANCE.append(ZoneInfoFile(getzoneinfofile_stream()))
+ _CLASS_ZONE_INSTANCE.append(ZoneInfoFile())
return _CLASS_ZONE_INSTANCE[0].metadata
--
2.32.0
|