Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 1 | """distutils.command.install_egg_info |
| 2 | |
| 3 | Implements the Distutils 'install_egg_info' command, for installing |
| 4 | a package's PKG-INFO metadata.""" |
| 5 | |
| 6 | |
| 7 | from distutils.cmd import Command |
| 8 | from distutils import log, dir_util |
| 9 | import os, sys, re |
| 10 | |
| 11 | class install_egg_info(Command): |
| 12 | """Install an .egg-info file for the package""" |
| 13 | |
| 14 | description = "Install package's PKG-INFO metadata as an .egg-info file" |
| 15 | user_options = [ |
| 16 | ('install-dir=', 'd', "directory to install to"), |
| 17 | ] |
| 18 | |
| 19 | def initialize_options(self): |
| 20 | self.install_dir = None |
| 21 | |
| 22 | def finalize_options(self): |
| 23 | self.set_undefined_options('install_lib',('install_dir','install_dir')) |
| 24 | basename = "%s-%s-py%s.egg-info" % ( |
| 25 | to_filename(safe_name(self.distribution.get_name())), |
| 26 | to_filename(safe_version(self.distribution.get_version())), |
| 27 | sys.version[:3] |
| 28 | ) |
| 29 | self.target = os.path.join(self.install_dir, basename) |
| 30 | self.outputs = [self.target] |
| 31 | |
| 32 | def run(self): |
| 33 | target = self.target |
| 34 | if os.path.isdir(target) and not os.path.islink(target): |
| 35 | dir_util.remove_tree(target, dry_run=self.dry_run) |
| 36 | elif os.path.exists(target): |
| 37 | self.execute(os.unlink,(self.target,),"Removing "+target) |
Thomas Wouters | 89f507f | 2006-12-13 04:49:30 +0000 | [diff] [blame^] | 38 | elif not os.path.isdir(self.install_dir): |
| 39 | self.execute(os.makedirs, (self.install_dir,), |
| 40 | "Creating "+self.install_dir) |
Thomas Wouters | 49fd7fa | 2006-04-21 10:40:58 +0000 | [diff] [blame] | 41 | log.info("Writing %s", target) |
| 42 | if not self.dry_run: |
| 43 | f = open(target, 'w') |
| 44 | self.distribution.metadata.write_pkg_file(f) |
| 45 | f.close() |
| 46 | |
| 47 | def get_outputs(self): |
| 48 | return self.outputs |
| 49 | |
| 50 | |
| 51 | # The following routines are taken from setuptools' pkg_resources module and |
| 52 | # can be replaced by importing them from pkg_resources once it is included |
| 53 | # in the stdlib. |
| 54 | |
| 55 | def safe_name(name): |
| 56 | """Convert an arbitrary string to a standard distribution name |
| 57 | |
| 58 | Any runs of non-alphanumeric/. characters are replaced with a single '-'. |
| 59 | """ |
| 60 | return re.sub('[^A-Za-z0-9.]+', '-', name) |
| 61 | |
| 62 | |
| 63 | def safe_version(version): |
| 64 | """Convert an arbitrary string to a standard version string |
| 65 | |
| 66 | Spaces become dots, and all other non-alphanumeric characters become |
| 67 | dashes, with runs of multiple dashes condensed to a single dash. |
| 68 | """ |
| 69 | version = version.replace(' ','.') |
| 70 | return re.sub('[^A-Za-z0-9.]+', '-', version) |
| 71 | |
| 72 | |
| 73 | def to_filename(name): |
| 74 | """Convert a project or version name to its filename-escaped form |
| 75 | |
| 76 | Any '-' characters are currently replaced with '_'. |
| 77 | """ |
| 78 | return name.replace('-','_') |