diff options
author | PJ Eby <distutils-sig@python.org> | 2005-08-14 21:17:45 +0000 |
---|---|---|
committer | PJ Eby <distutils-sig@python.org> | 2005-08-14 21:17:45 +0000 |
commit | aea9a3b77afa90ca2b46d8da52778e41555ca7a4 (patch) | |
tree | 3f2189f40b9dc51d70592a2f15898ab16811afc3 | |
parent | abaed7ef6a53cdd6e5d6a90252bb110440d04df5 (diff) | |
download | python-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.py | 54 |
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""" |