summaryrefslogtreecommitdiff
blob: a937e6600a29b9cb6fdeb512232c09704ef9e3cb (plain)
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 f48e70ae846c161dfbfe6ddb36e4bcad4427ac8c 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 2a19b62..97d07e4 100644
--- a/dateutil/test/test_imports.py
+++ b/dateutil/test/test_imports.py
@@ -158,9 +158,8 @@ class ImportZoneInfoTest(unittest.TestCase):
     def testZoneinfoStar(self):
         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:
             self.assertIsNot(var, None)
diff --git a/dateutil/zoneinfo/__init__.py b/dateutil/zoneinfo/__init__.py
index 34f11ad..e9870ca 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') or f.endswith('.tab'):
+                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.17.0