[Python-checkins] python/nondist/sandbox/setuptools/setuptools/command egg_info.py, 1.10, 1.11
pje@users.sourceforge.net
pje at users.sourceforge.net
Sat Aug 6 23:17:52 CEST 2005
Update of /cvsroot/python/python/nondist/sandbox/setuptools/setuptools/command
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32399/setuptools/command
Modified Files:
egg_info.py
Log Message:
Allow distutils extensions to define new kinds of metadata that can be
written to EGG-INFO. Extensible applications and frameworks can thus make
it possible for plugin projects to supply setup() metadata that can then
be used by the application or framework.
Index: egg_info.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/setuptools/setuptools/command/egg_info.py,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- egg_info.py 6 Aug 2005 18:46:28 -0000 1.10
+++ egg_info.py 6 Aug 2005 21:17:50 -0000 1.11
@@ -8,7 +8,7 @@
from distutils.errors import *
from distutils import log
from pkg_resources import parse_requirements, safe_name, \
- safe_version, yield_lines, EntryPoint
+ safe_version, yield_lines, EntryPoint, iter_entry_points
class egg_info(Command):
@@ -80,47 +80,55 @@
- def run(self):
- # Make the .egg-info directory, then write PKG-INFO and requires.txt
- self.mkpath(self.egg_info)
- log.info("writing %s" % os.path.join(self.egg_info,'PKG-INFO'))
-
- if not self.dry_run:
- metadata = self.distribution.metadata
- metadata.version, oldver = self.egg_version, metadata.version
- metadata.name, oldname = self.egg_name, metadata.name
- try:
- # write unescaped data to PKG-INFO, so older pkg_resources
- # can still parse it
- metadata.write_pkg_info(self.egg_info)
- finally:
- metadata.name, metadata.version = oldname, oldver
- self.write_entry_points()
- self.write_requirements()
- self.write_toplevel_names()
- self.write_or_delete_dist_arg('namespace_packages')
- self.write_or_delete_dist_arg('eager_resources')
- if os.path.exists(os.path.join(self.egg_info,'depends.txt')):
- log.warn(
- "WARNING: 'depends.txt' is not used by setuptools 0.6!\n"
- "Use the install_requires/extras_require setup() args instead."
- )
+ def write_or_delete_file(self, what, filename, data):
+ """Write `data` to `filename` or delete if empty
- def write_requirements(self):
- dist = self.distribution
- if not getattr(dist,'install_requires',None) and \
- not getattr(dist,'extras_require',None): return
+ If `data` is non-empty, this routine is the same as ``write_file()``.
+ If `data` is empty but not ``None``, this is the same as calling
+ ``delete_file(filename)`. If `data` is ``None``, then this is a no-op
+ unless `filename` exists, in which case a warning is issued about the
+ orphaned file.
+ """
+ if data:
+ self.write_file(what, filename, data)
+ elif os.path.exists(filename):
+ if data is None:
+ log.warn(
+ "%s not set in setup(), but %s exists", what, filename
+ )
+ return
+ else:
+ self.delete_file(filename)
- requires = os.path.join(self.egg_info,"requires.txt")
- log.info("writing %s", requires)
+ def write_file(self, what, filename, data):
+ """Write `data` to `filename` (if not a dry run) after announcing it
+ `what` is used in a log message to identify what is being written
+ to the file.
+ """
+ log.info("writing %s to %s", what, filename)
if not self.dry_run:
- f = open(requires, 'wt')
- f.write('\n'.join(yield_lines(dist.install_requires)))
- for extra,reqs in dist.extras_require.items():
- f.write('\n\n[%s]\n%s' % (extra, '\n'.join(yield_lines(reqs))))
+ f = open(filename, 'wb')
+ f.write(data)
f.close()
+ def delete_file(self, filename):
+ """Delete `filename` (if not a dry run) after announcing it"""
+ log.info("deleting %s", filename)
+ if not self.dry_run:
+ os.unlink(filename)
+
+
+
+
+ def run(self):
+ # Make the .egg-info directory, then write PKG-INFO and requires.txt
+ self.mkpath(self.egg_info)
+ installer = self.distribution.fetch_build_egg
+ for ep in iter_entry_points('egg_info.writers'):
+ writer = ep.load(installer=installer)
+ writer(self, ep.name, os.path.join(self.egg_info,ep.name))
+
def tagged_version(self):
version = self.distribution.get_version()
if self.tag_build:
@@ -132,7 +140,6 @@
version += time.strftime("-%Y%m%d")
return safe_version(version)
-
def get_svn_revision(self):
stdin, stdout = os.popen4("svn info -R"); stdin.close()
result = stdout.read(); stdout.close()
@@ -146,60 +153,94 @@
return str(max(revisions))
- def write_toplevel_names(self):
- pkgs = dict.fromkeys(
- [k.split('.',1)[0]
- for k in self.distribution.iter_distribution_names()
- ]
+
+
+
+
+
+
+
+
+
+def write_pkg_info(cmd, basename, filename):
+ log.info("writing %s", filename)
+ if not cmd.dry_run:
+ metadata = cmd.distribution.metadata
+ metadata.version, oldver = cmd.egg_version, metadata.version
+ metadata.name, oldname = cmd.egg_name, metadata.name
+ try:
+ # write unescaped data to PKG-INFO, so older pkg_resources
+ # can still parse it
+ metadata.write_pkg_info(cmd.egg_info)
+ finally:
+ metadata.name, metadata.version = oldname, oldver
+
+def warn_depends_obsolete(cmd, basename, filename):
+ if os.path.exists(filename):
+ log.warn(
+ "WARNING: 'depends.txt' is not used by setuptools 0.6!\n"
+ "Use the install_requires/extras_require setup() args instead."
)
- toplevel = os.path.join(self.egg_info, "top_level.txt")
- log.info("writing list of top-level names to %s" % toplevel)
- if not self.dry_run:
- f = open(toplevel, 'wt')
- f.write('\n'.join(pkgs))
- f.write('\n')
- f.close()
+
+
+def write_requirements(cmd, basename, filename):
+ dist = cmd.distribution
+ data = ['\n'.join(yield_lines(dist.install_requires or ()))]
+ for extra,reqs in (dist.extras_require or {}).items():
+ data.append('\n\n[%s]\n%s' % (extra, '\n'.join(yield_lines(reqs))))
+ cmd.write_or_delete_file("requirements", filename, ''.join(data))
+
+def write_toplevel_names(cmd, basename, filename):
+ pkgs = dict.fromkeys(
+ [k.split('.',1)[0]
+ for k in cmd.distribution.iter_distribution_names()
+ ]
+ )
+ cmd.write_file("top-level names", filename, '\n'.join(pkgs)+'\n')
+
+
+
+
+
+
+def write_arg(cmd, basename, filename):
+ argname = os.path.splitext(basename)[0]
+ value = getattr(cmd.distribution, argname, None)
+ if value is not None:
+ value = '\n'.join(value)+'\n'
+ cmd.write_or_delete_file(argname, filename, value)
+
+def write_entries(cmd, basename, filename):
+ ep = cmd.distribution.entry_points
+
+ if isinstance(ep,basestring) or ep is None:
+ data = ep
+ elif ep is not None:
+ data = []
+ for section, contents in ep.items():
+ if not isinstance(contents,basestring):
+ contents = EntryPoint.parse_list(section, contents)
+ contents = '\n'.join(map(str,contents.values()))
+ data.append('[%s]\n%s\n\n' % (section,contents))
+ data = ''.join(data)
+
+ cmd.write_or_delete_file('entry points', filename, data)
+
+
+
+
+
+
+
+
+
+
+
+
- def write_or_delete_dist_arg(self, argname, filename=None):
- value = getattr(self.distribution, argname, None)
- filename = filename or argname+'.txt'
- filename = os.path.join(self.egg_info,filename)
- if value:
- log.info("writing %s", filename)
- if not self.dry_run:
- f = open(filename, 'wt')
- f.write('\n'.join(value))
- f.write('\n')
- f.close()
- elif os.path.exists(filename):
- if value is None:
- log.warn(
- "%s not set in setup(), but %s exists", argname, filename
- )
- return
- log.info("deleting %s", filename)
- if not self.dry_run:
- os.unlink(filename)
- def write_entry_points(self):
- ep = getattr(self.distribution,'entry_points',None)
- if ep is None:
- return
- epname = os.path.join(self.egg_info,"entry_points.txt")
- log.info("writing %s", epname)
- if not self.dry_run:
- f = open(epname, 'wt')
- if isinstance(ep,basestring):
- f.write(ep)
- else:
- for section, contents in ep.items():
- if not isinstance(contents,basestring):
- contents = EntryPoint.parse_list(section, contents)
- contents = '\n'.join(map(str,contents.values()))
- f.write('[%s]\n%s\n\n' % (section,contents))
- f.close()
More information about the Python-checkins
mailing list