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