Log message for revision 40096: Rethink strategy for dealing with top-level modules: We don't put them in Dependencies/<depname>, but we put them in a Modules/ directory that is top-level to the distribution and a sibling to Dependencies. Distutils likes to have all top-level modules (py_modules parameter) to be in one directory, which is incidentally the one specified by package_dir['']. zpkgsetup now satisfies distutils in both of those ways. Now, when dealing with a ModuleComponent, zpkg doesn't create a setup.py, setup.cfg under Dependencies/<depname> anymore. Instead it creates a MODULE.cfg, a very simple configuration file telling zpkgsetup the name of the module. It will then try to find it under Modules/ where zpkgtools will have put it. This approach works well so far; it's only that I'm getting a weird error now ("error: Is a directory") when running python install.py build; in particular it occurs in the build_scripts subcommand. Unfortunately the error doesn't occur in python (otherwise I'd have a nice traceback). I'm further investigating.
Changed: A zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/module.xml U zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/package.py U zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/setup.py U zpkgtools/branches/philikon-toplevel-modules/zpkgtools/app.py -=- Added: zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/module.xml =================================================================== --- zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/module.xml 2005-11-14 17:13:42 UTC (rev 40095) +++ zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/module.xml 2005-11-14 17:25:33 UTC (rev 40096) @@ -0,0 +1,3 @@ +<schema prefix="zpkgsetup"> + <key name="module" datatype=".package.path_ref"/> +</schema> Property changes on: zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/module.xml ___________________________________________________________________ Name: svn:eol-style + native Modified: zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/package.py =================================================================== --- zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/package.py 2005-11-14 17:13:42 UTC (rev 40095) +++ zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/package.py 2005-11-14 17:25:33 UTC (rev 40096) @@ -67,6 +67,7 @@ PACKAGE_CONF = "SETUP.cfg" +MODULE_CONF = "MODULE.cfg" get_schema = cfgparser.cachedSchemaLoader("package.xml") @@ -124,6 +125,14 @@ for path in pkginfo.header] return pkginfo +def read_module_info(directory): + module_schema = cfgparser.cachedSchemaLoader("module.xml") + module_cfg = os.path.join(directory, MODULE_CONF) + f = file(module_cfg) + url = urlutils.file_url(urllib.pathname2url(module_cfg)) + pkginfo, _ = cfgparser.loadConfigFile(module_schema(), f, url) + f.close() + return pkginfo def read_package_info(directory, reldir=None): """Read the package information file from a specified directory. Modified: zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/setup.py =================================================================== --- zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/setup.py 2005-11-14 17:13:42 UTC (rev 40095) +++ zpkgtools/branches/philikon-toplevel-modules/zpkgsetup/setup.py 2005-11-14 17:25:33 UTC (rev 40096) @@ -67,6 +67,7 @@ self.package_data = {} self.package_dir = {} self.package_headers = [] + self.py_modules = [] self.ext_modules = [] self.scripts = [] self.platforms = None @@ -82,6 +83,10 @@ pkgdir = os.path.join(self._working_dir, self._pkgname) self.scan(self._pkgname, pkgdir, self._pkgname) depsdir = os.path.join(self._working_dir, "Dependencies") + modsdir = os.path.join(self._working_dir, "Modules") + if os.path.isdir(modsdir): + # we do the following so that top-level modules can be installed + self.package_dir[""] = 'Modules' if os.path.isdir(depsdir): depnames = os.listdir(depsdir) suffix = "-%s-%s" % (self._pkgname, self.version) @@ -97,9 +102,22 @@ print >>sys.stderr, \ "unexpected file in Dependencies/: %r" % name continue + depname = name[:-len(suffix)] + reldir = posixpath.join("Dependencies", name, depname) pkgdir = os.path.join(depdir, depname) - reldir = posixpath.join("Dependencies", name, depname) + + # quick hack to see if we're dealing with a top-level + # module or not. If we are, slightly adjust the + # dependency name etc. according to the value supplied + # in SETUP.cfg. + if os.path.exists(os.path.join(depdir, package.MODULE_CONF)): + pkginfo = package.read_module_info(depdir) + if pkginfo.module: + depname = pkginfo.module[:-3] + reldir = "Modules" + pkgdir = os.path.join(modsdir, depname) + self.scan(depname, pkgdir, reldir) def setup(self): @@ -163,7 +181,6 @@ # parts = root.split("/") local_root = os.path.join(*parts) - self.package_dir[""] = root if os.path.isfile(os.path.join(local_root, package.PACKAGE_CONF)): # There's a SETUP.cfg at the top level; load it: pkginfo = package.loadCollectionInfo( @@ -186,12 +203,18 @@ self.scan_package(pkgname, local_full_path, relative_path) def scan(self, name, directory, reldir): + module_py = directory + '.py' init_py = os.path.join(directory, "__init__.py") - if os.path.isfile(init_py): + if os.path.isfile(module_py): + self.scan_module(name, module_py, reldir) + elif os.path.isfile(init_py): self.scan_package(name, directory, reldir) else: self.scan_collection(name, directory, reldir) + def scan_module(self, name, filename, reldir): + self.py_modules.append(name) + def scan_collection(self, name, directory, reldir): # load the collection metadata pkginfo = package.loadCollectionInfo(directory, reldir) Modified: zpkgtools/branches/philikon-toplevel-modules/zpkgtools/app.py =================================================================== --- zpkgtools/branches/philikon-toplevel-modules/zpkgtools/app.py 2005-11-14 17:13:42 UTC (rev 40095) +++ zpkgtools/branches/philikon-toplevel-modules/zpkgtools/app.py 2005-11-14 17:25:33 UTC (rev 40096) @@ -617,43 +617,25 @@ if not os.path.exists(destination): os.mkdir(destination) self.ip.addIncludes(destination, self.distribution) - self.ip.copy_file(self.source, destination) + self.write_module_cfg() + module_dest = os.path.join(destination, '..', '..', 'Modules') + if not os.path.exists(module_dest): + os.mkdir(module_dest) + self.ip.copy_file(self.source, module_dest) - def write_setup_cfg(self): - setup_cfg = os.path.join(self.destination, "setup.cfg") - self.ip.add_output(setup_cfg) - f = open(setup_cfg, "w") - f.write("# THIS IS A GENERATED FILE.\n") - f.write("\n") - f.write("[install_lib]\n") - # generate .pyc files - f.write("compile = 1\n") - # generate .pyo files using "python -O" - f.write("optimize = 1\n") + def write_module_cfg(self): + module_cfg = os.path.join(self.destination, 'MODULE.cfg') + self.ip.add_output(module_cfg) + f = file(module_cfg, 'w') + print >>f, "module %s" % self.filename f.close() + def write_setup_cfg(self): + pass + def write_setup_py(self, filename="setup.py", version=None, pathparts=[], distclass=None): - # simply assume that the filename ends in '.py' - module_name = self.filename[:-3] - setup_py = os.path.join(self.destination, filename) - self.ip.add_output(setup_py) - f = open(setup_py, "w") - if pathparts: - extrapath = ", ".join([""] + [repr(pp) for pp in pathparts]) - else: - extrapath = "" - print >>f, SETUP_HEADER % extrapath - print >>f, "context = zpkgsetup.setup.SetupContext(" - if distclass: - print >>f, " %r, %r, __file__," % (module_name, version) - print >>f, " %r)" % distclass - else: - print >>f, " %r, %r, __file__)" % (module_name, version) - print >>f - print >>f, "context.initialize()" - print >>f, "context.setup()" - f.close() + pass SETUP_HEADER = """\ _______________________________________________ zpkg mailing list -- [EMAIL PROTECTED] http://mail.zope.org/mailman/listinfo/zpkg