comparison venv/lib/python2.7/site-packages/setuptools/command/install_lib.py @ 0:d67268158946 draft

planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
author bcclaywell
date Mon, 12 Oct 2015 17:43:33 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:d67268158946
1 import os
2 import imp
3 from itertools import product, starmap
4 import distutils.command.install_lib as orig
5
6 class install_lib(orig.install_lib):
7 """Don't add compiled flags to filenames of non-Python files"""
8
9 def run(self):
10 self.build()
11 outfiles = self.install()
12 if outfiles is not None:
13 # always compile, in case we have any extension stubs to deal with
14 self.byte_compile(outfiles)
15
16 def get_exclusions(self):
17 """
18 Return a collections.Sized collections.Container of paths to be
19 excluded for single_version_externally_managed installations.
20 """
21 all_packages = (
22 pkg
23 for ns_pkg in self._get_SVEM_NSPs()
24 for pkg in self._all_packages(ns_pkg)
25 )
26
27 excl_specs = product(all_packages, self._gen_exclusion_paths())
28 return set(starmap(self._exclude_pkg_path, excl_specs))
29
30 def _exclude_pkg_path(self, pkg, exclusion_path):
31 """
32 Given a package name and exclusion path within that package,
33 compute the full exclusion path.
34 """
35 parts = pkg.split('.') + [exclusion_path]
36 return os.path.join(self.install_dir, *parts)
37
38 @staticmethod
39 def _all_packages(pkg_name):
40 """
41 >>> list(install_lib._all_packages('foo.bar.baz'))
42 ['foo.bar.baz', 'foo.bar', 'foo']
43 """
44 while pkg_name:
45 yield pkg_name
46 pkg_name, sep, child = pkg_name.rpartition('.')
47
48 def _get_SVEM_NSPs(self):
49 """
50 Get namespace packages (list) but only for
51 single_version_externally_managed installations and empty otherwise.
52 """
53 # TODO: is it necessary to short-circuit here? i.e. what's the cost
54 # if get_finalized_command is called even when namespace_packages is
55 # False?
56 if not self.distribution.namespace_packages:
57 return []
58
59 install_cmd = self.get_finalized_command('install')
60 svem = install_cmd.single_version_externally_managed
61
62 return self.distribution.namespace_packages if svem else []
63
64 @staticmethod
65 def _gen_exclusion_paths():
66 """
67 Generate file paths to be excluded for namespace packages (bytecode
68 cache files).
69 """
70 # always exclude the package module itself
71 yield '__init__.py'
72
73 yield '__init__.pyc'
74 yield '__init__.pyo'
75
76 if not hasattr(imp, 'get_tag'):
77 return
78
79 base = os.path.join('__pycache__', '__init__.' + imp.get_tag())
80 yield base + '.pyc'
81 yield base + '.pyo'
82
83 def copy_tree(
84 self, infile, outfile,
85 preserve_mode=1, preserve_times=1, preserve_symlinks=0, level=1
86 ):
87 assert preserve_mode and preserve_times and not preserve_symlinks
88 exclude = self.get_exclusions()
89
90 if not exclude:
91 return orig.install_lib.copy_tree(self, infile, outfile)
92
93 # Exclude namespace package __init__.py* files from the output
94
95 from setuptools.archive_util import unpack_directory
96 from distutils import log
97
98 outfiles = []
99
100 def pf(src, dst):
101 if dst in exclude:
102 log.warn("Skipping installation of %s (namespace package)",
103 dst)
104 return False
105
106 log.info("copying %s -> %s", src, os.path.dirname(dst))
107 outfiles.append(dst)
108 return dst
109
110 unpack_directory(infile, outfile, pf)
111 return outfiles
112
113 def get_outputs(self):
114 outputs = orig.install_lib.get_outputs(self)
115 exclude = self.get_exclusions()
116 if exclude:
117 return [f for f in outputs if f not in exclude]
118 return outputs