import os, sys
-class FileLocator:
+class FileLocator(object):
"""Understand how filenames work."""
def __init__(self):
@@ -18,23 +18,23 @@ class FileLocator:
def relative_filename(self, filename):
"""Return the relative form of `filename`.
-
+
The filename will be relative to the current directory when the
FileLocator was constructed.
-
+
"""
return filename.replace(self.relative_dir, "")
def canonical_filename(self, filename):
"""Return a canonical filename for `filename`.
-
+
An absolute path with no redundant components and normalized case.
-
+
"""
- if not self.canonical_filename_cache.has_key(filename):
+ if filename not in self.canonical_filename_cache:
f = filename
if os.path.isabs(f) and not os.path.exists(f):
- if not self.get_zip_data(f):
+ if self.get_zip_data(f) is None:
f = os.path.basename(f)
if not os.path.isabs(f):
for path in [os.curdir] + sys.path:
@@ -48,10 +48,11 @@ class FileLocator:
def get_zip_data(self, filename):
"""Get data from `filename` if it is a zip file path.
-
- Returns the data read from the zip file, or None if no zip file could
- be found or `filename` isn't in it.
-
+
+ Returns the string data read from the zip file, or None if no zip file
+ could be found or `filename` isn't in it. The data returned will be
+ an empty string if the file is empty.
+
"""
import zipimport
markers = ['.zip'+os.sep, '.egg'+os.sep]
@@ -66,5 +67,7 @@ class FileLocator:
data = zi.get_data(parts[1])
except IOError:
continue
+ if sys.hexversion > 0x03000000:
+ data = data.decode('utf8') # TODO: How to do this properly?
return data
return None