[FIX] setup.py: copying pytz timezone data into the library.zip.
authorVo Minh Thu <vmt@openerp.com>
Wed, 30 Mar 2011 15:33:16 +0000 (17:33 +0200)
committerVo Minh Thu <vmt@openerp.com>
Wed, 30 Mar 2011 15:33:16 +0000 (17:33 +0200)
- This copy-pasted from the 5.0 setup.py.

lp bug: https://launchpad.net/bugs/701407 fixed

bzr revid: vmt@openerp.com-20110330153316-zh440p3nrur0qbad

setup.py

index 4aed74a..51c1b88 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -248,3 +248,31 @@ setup(name             = name,
       **py2exe_keywords
 )
 
+if has_py2exe:
+    # Sometime between pytz-2008a and pytz-2008i common_timezones started to
+    # include only names of zones with a corresponding data file in zoneinfo.
+    # pytz installs the zoneinfo directory tree in the same directory
+    # as the pytz/__init__.py file. These data files are loaded using
+    # pkg_resources.resource_stream. py2exe does not copy this to library.zip so
+    # resource_stream can't find the files and common_timezones is empty when
+    # read in the py2exe executable.
+    # This manually copies zoneinfo into the zip. See also
+    # http://code.google.com/p/googletransitdatafeed/issues/detail?id=121
+    import pytz
+    import zipfile
+    # Make sure the layout of pytz hasn't changed
+    assert (pytz.__file__.endswith('__init__.pyc') or
+            pytz.__file__.endswith('__init__.py')), pytz.__file__
+    zoneinfo_dir = os.path.join(os.path.dirname(pytz.__file__), 'zoneinfo')
+    # '..\\Lib\\pytz\\__init__.py' -> '..\\Lib'
+    disk_basedir = os.path.dirname(os.path.dirname(pytz.__file__))
+    zipfile_path = os.path.join(complementary_arguments['options']['py2exe']['dist_dir'], 'library.zip')
+    z = zipfile.ZipFile(zipfile_path, 'a')
+
+    for absdir, directories, filenames in os.walk(zoneinfo_dir):
+        assert absdir.startswith(disk_basedir), (absdir, disk_basedir)
+        zip_dir = absdir[len(disk_basedir):]
+        for f in filenames:
+            z.write(os.path.join(absdir, f), os.path.join(zip_dir, f))
+
+    z.close()