From 471ae3465a5fe8e1cd2e15ee989e7a91c163acf0 Mon Sep 17 00:00:00 2001 From: PJ Eby Date: Sun, 14 Aug 2005 21:17:45 +0000 Subject: 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(). --HG-- branch : setuptools extra : convert_revision : svn%3A6015fed2-1504-0410-9fe1-9d1591cc4771/sandbox/trunk/setuptools%4041204 --- setuptools/command/bdist_egg.py | 54 ++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 27 deletions(-) (limited to 'setuptools/command') 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""" -- cgit v1.2.1