"""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) | |
elif not os.path.isdir(self.install_dir): | |
self.execute(os.makedirs, (self.install_dir,), | |
"Creating "+self.install_dir) | |
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('-','_') |