[Python-checkins] r43363 - python/trunk/Lib/distutils/command/install.py python/trunk/Lib/distutils/command/install_egg_info.py

phillip.eby python-checkins at python.org
Mon Mar 27 23:55:21 CEST 2006


Author: phillip.eby
Date: Mon Mar 27 23:55:21 2006
New Revision: 43363

Added:
   python/trunk/Lib/distutils/command/install_egg_info.py   (contents, props changed)
Modified:
   python/trunk/Lib/distutils/command/install.py
Log:
Patch #1459476: install PKG-INFO metadata alongside distutils-installed packages.


Modified: python/trunk/Lib/distutils/command/install.py
==============================================================================
--- python/trunk/Lib/distutils/command/install.py	(original)
+++ python/trunk/Lib/distutils/command/install.py	Mon Mar 27 23:55:21 2006
@@ -601,6 +601,7 @@
                     ('install_headers', has_headers),
                     ('install_scripts', has_scripts),
                     ('install_data',    has_data),
+                    ('install_egg_info', lambda self:True),
                    ]
 
 # class install

Added: python/trunk/Lib/distutils/command/install_egg_info.py
==============================================================================
--- (empty file)
+++ python/trunk/Lib/distutils/command/install_egg_info.py	Mon Mar 27 23:55:21 2006
@@ -0,0 +1,75 @@
+"""distutils.command.install_egg_info
+
+Implements the Distutils 'install_egg_info' command, for installing
+a package's PKG-INFO metadata."""
+
+
+from distutils.cmd import Command
+from distutils import log, dir_util
+import os, sys, re
+
+class install_egg_info(Command):
+    """Install an .egg-info file for the package"""
+
+    description = "Install package's PKG-INFO metadata as an .egg-info file"
+    user_options = [
+        ('install-dir=', 'd', "directory to install to"),
+    ]
+
+    def initialize_options(self):
+        self.install_dir = None
+
+    def finalize_options(self):
+        self.set_undefined_options('install_lib',('install_dir','install_dir'))
+        basename = "%s-%s-py%s.egg-info" % (
+            to_filename(safe_name(self.distribution.get_name())),
+            to_filename(safe_version(self.distribution.get_version())),
+            sys.version[:3]
+        )
+        self.target = os.path.join(self.install_dir, basename) 
+        self.outputs = [self.target]
+
+    def run(self):
+        target = self.target
+        if os.path.isdir(target) and not os.path.islink(target):
+            dir_util.remove_tree(target, dry_run=self.dry_run)
+        elif os.path.exists(target):
+            self.execute(os.unlink,(self.target,),"Removing "+target)
+        log.info("Writing %s", target)
+        if not self.dry_run:
+            f = open(target, 'w')
+            self.distribution.metadata.write_pkg_file(f)
+            f.close()
+            
+    def get_outputs(self):
+        return self.outputs
+
+
+# The following routines are taken from setuptools' pkg_resources module and
+# can be replaced by importing them from pkg_resources once it is included
+# in the stdlib.
+
+def safe_name(name):
+    """Convert an arbitrary string to a standard distribution name
+
+    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
+    """
+    return re.sub('[^A-Za-z0-9.]+', '-', name)
+
+
+def safe_version(version):
+    """Convert an arbitrary string to a standard version string
+
+    Spaces become dots, and all other non-alphanumeric characters become
+    dashes, with runs of multiple dashes condensed to a single dash.
+    """
+    version = version.replace(' ','.')
+    return re.sub('[^A-Za-z0-9.]+', '-', version)
+
+
+def to_filename(name):
+    """Convert a project or version name to its filename-escaped form
+
+    Any '-' characters are currently replaced with '_'.
+    """
+    return name.replace('-','_')


More information about the Python-checkins mailing list