summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPJ Eby <distutils-sig@python.org>2005-08-14 21:17:45 +0000
committerPJ Eby <distutils-sig@python.org>2005-08-14 21:17:45 +0000
commitaea9a3b77afa90ca2b46d8da52778e41555ca7a4 (patch)
tree3f2189f40b9dc51d70592a2f15898ab16811afc3
parentabaed7ef6a53cdd6e5d6a90252bb110440d04df5 (diff)
downloadpython-setuptools-bitbucket-aea9a3b77afa90ca2b46d8da52778e41555ca7a4.tar.gz
Auto-generate namespace __init__.py files for packages without them. This
is a workaround for packages like 'll-color', which are distributed without 'll/__init__.py', to avoid overwriting ll-core's copy of ll/__init__.py. This allows existing packages that use this sort of kludging to be treated as a crude namespace package, as long as the "real" __init__.py also calls declare_namespace().
-rw-r--r--setuptools/command/bdist_egg.py54
1 files changed, 27 insertions, 27 deletions
diff --git a/setuptools/command/bdist_egg.py b/setuptools/command/bdist_egg.py
index 0a9d9a0c..eb92bd24 100644
--- a/setuptools/command/bdist_egg.py
+++ b/setuptools/command/bdist_egg.py
@@ -26,8 +26,8 @@ def write_stub(resource, pyfile):
]))
f.close()
-
-
+# stub __init__.py for packages distributed without one
+NS_PKG_STUB = '__import__("pkg_resources").declare_namespace(__name__)'
@@ -186,7 +186,7 @@ class bdist_egg(Command):
write_stub(os.path.basename(ext_name), pyfile)
to_compile.append(pyfile)
ext_outputs[p] = ext_name.replace(os.sep,'/')
-
+ to_compile.extend(self.make_init_files())
if to_compile:
cmd.byte_compile(to_compile)
@@ -260,30 +260,30 @@ class bdist_egg(Command):
log.warn("zip_safe flag not set; analyzing archive contents...")
return analyze_egg(self.bdist_dir, self.stubs)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ def make_init_files(self):
+ """Create missing package __init__ files"""
+ init_files = []
+ for base,dirs,files in walk_egg(self.bdist_dir):
+ if base==self.bdist_dir:
+ # don't put an __init__ in the root
+ continue
+ for name in files:
+ if name.endswith('.py'):
+ if '__init__.py' not in files:
+ pkg = base[len(self.bdist_dir)+1:].replace(os.sep,'.')
+ if self.distribution.has_contents_for(pkg):
+ log.warn("Creating missing __init__.py for %s",pkg)
+ filename = os.path.join(base,'__init__.py')
+ if not self.dry_run:
+ f = open(filename,'w'); f.write(NS_PKG_STUB)
+ f.close()
+ init_files.append(filename)
+ break
+ else:
+ # not a package, don't traverse to subdirectories
+ dirs[:] = []
+
+ return init_files
def walk_egg(egg_dir):
"""Walk an unpacked egg's contents, skipping the metadata directory"""