Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/setuptools/__init__.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
author | shellac |
---|---|
date | Mon, 01 Jun 2020 08:59:25 -0400 |
parents | 79f47841a781 |
children |
comparison
equal
deleted
inserted
replaced
4:79f47841a781 | 5:9b1c78e6ba9c |
---|---|
1 """Extensions to the 'distutils' for large or complex distributions""" | |
2 | |
3 import os | |
4 import sys | |
5 import functools | |
6 import distutils.core | |
7 import distutils.filelist | |
8 import re | |
9 from distutils.errors import DistutilsOptionError | |
10 from distutils.util import convert_path | |
11 from fnmatch import fnmatchcase | |
12 | |
13 from ._deprecation_warning import SetuptoolsDeprecationWarning | |
14 | |
15 from setuptools.extern.six import PY3, string_types | |
16 from setuptools.extern.six.moves import filter, map | |
17 | |
18 import setuptools.version | |
19 from setuptools.extension import Extension | |
20 from setuptools.dist import Distribution, Feature | |
21 from setuptools.depends import Require | |
22 from . import monkey | |
23 | |
24 __metaclass__ = type | |
25 | |
26 | |
27 __all__ = [ | |
28 'setup', 'Distribution', 'Feature', 'Command', 'Extension', 'Require', | |
29 'SetuptoolsDeprecationWarning', | |
30 'find_packages' | |
31 ] | |
32 | |
33 if PY3: | |
34 __all__.append('find_namespace_packages') | |
35 | |
36 __version__ = setuptools.version.__version__ | |
37 | |
38 bootstrap_install_from = None | |
39 | |
40 # If we run 2to3 on .py files, should we also convert docstrings? | |
41 # Default: yes; assume that we can detect doctests reliably | |
42 run_2to3_on_doctests = True | |
43 # Standard package names for fixer packages | |
44 lib2to3_fixer_packages = ['lib2to3.fixes'] | |
45 | |
46 | |
47 class PackageFinder: | |
48 """ | |
49 Generate a list of all Python packages found within a directory | |
50 """ | |
51 | |
52 @classmethod | |
53 def find(cls, where='.', exclude=(), include=('*',)): | |
54 """Return a list all Python packages found within directory 'where' | |
55 | |
56 'where' is the root directory which will be searched for packages. It | |
57 should be supplied as a "cross-platform" (i.e. URL-style) path; it will | |
58 be converted to the appropriate local path syntax. | |
59 | |
60 'exclude' is a sequence of package names to exclude; '*' can be used | |
61 as a wildcard in the names, such that 'foo.*' will exclude all | |
62 subpackages of 'foo' (but not 'foo' itself). | |
63 | |
64 'include' is a sequence of package names to include. If it's | |
65 specified, only the named packages will be included. If it's not | |
66 specified, all found packages will be included. 'include' can contain | |
67 shell style wildcard patterns just like 'exclude'. | |
68 """ | |
69 | |
70 return list(cls._find_packages_iter( | |
71 convert_path(where), | |
72 cls._build_filter('ez_setup', '*__pycache__', *exclude), | |
73 cls._build_filter(*include))) | |
74 | |
75 @classmethod | |
76 def _find_packages_iter(cls, where, exclude, include): | |
77 """ | |
78 All the packages found in 'where' that pass the 'include' filter, but | |
79 not the 'exclude' filter. | |
80 """ | |
81 for root, dirs, files in os.walk(where, followlinks=True): | |
82 # Copy dirs to iterate over it, then empty dirs. | |
83 all_dirs = dirs[:] | |
84 dirs[:] = [] | |
85 | |
86 for dir in all_dirs: | |
87 full_path = os.path.join(root, dir) | |
88 rel_path = os.path.relpath(full_path, where) | |
89 package = rel_path.replace(os.path.sep, '.') | |
90 | |
91 # Skip directory trees that are not valid packages | |
92 if ('.' in dir or not cls._looks_like_package(full_path)): | |
93 continue | |
94 | |
95 # Should this package be included? | |
96 if include(package) and not exclude(package): | |
97 yield package | |
98 | |
99 # Keep searching subdirectories, as there may be more packages | |
100 # down there, even if the parent was excluded. | |
101 dirs.append(dir) | |
102 | |
103 @staticmethod | |
104 def _looks_like_package(path): | |
105 """Does a directory look like a package?""" | |
106 return os.path.isfile(os.path.join(path, '__init__.py')) | |
107 | |
108 @staticmethod | |
109 def _build_filter(*patterns): | |
110 """ | |
111 Given a list of patterns, return a callable that will be true only if | |
112 the input matches at least one of the patterns. | |
113 """ | |
114 return lambda name: any(fnmatchcase(name, pat=pat) for pat in patterns) | |
115 | |
116 | |
117 class PEP420PackageFinder(PackageFinder): | |
118 @staticmethod | |
119 def _looks_like_package(path): | |
120 return True | |
121 | |
122 | |
123 find_packages = PackageFinder.find | |
124 | |
125 if PY3: | |
126 find_namespace_packages = PEP420PackageFinder.find | |
127 | |
128 | |
129 def _install_setup_requires(attrs): | |
130 # Note: do not use `setuptools.Distribution` directly, as | |
131 # our PEP 517 backend patch `distutils.core.Distribution`. | |
132 dist = distutils.core.Distribution(dict( | |
133 (k, v) for k, v in attrs.items() | |
134 if k in ('dependency_links', 'setup_requires') | |
135 )) | |
136 # Honor setup.cfg's options. | |
137 dist.parse_config_files(ignore_option_errors=True) | |
138 if dist.setup_requires: | |
139 dist.fetch_build_eggs(dist.setup_requires) | |
140 | |
141 | |
142 def setup(**attrs): | |
143 # Make sure we have any requirements needed to interpret 'attrs'. | |
144 _install_setup_requires(attrs) | |
145 return distutils.core.setup(**attrs) | |
146 | |
147 setup.__doc__ = distutils.core.setup.__doc__ | |
148 | |
149 | |
150 _Command = monkey.get_unpatched(distutils.core.Command) | |
151 | |
152 | |
153 class Command(_Command): | |
154 __doc__ = _Command.__doc__ | |
155 | |
156 command_consumes_arguments = False | |
157 | |
158 def __init__(self, dist, **kw): | |
159 """ | |
160 Construct the command for dist, updating | |
161 vars(self) with any keyword parameters. | |
162 """ | |
163 _Command.__init__(self, dist) | |
164 vars(self).update(kw) | |
165 | |
166 def _ensure_stringlike(self, option, what, default=None): | |
167 val = getattr(self, option) | |
168 if val is None: | |
169 setattr(self, option, default) | |
170 return default | |
171 elif not isinstance(val, string_types): | |
172 raise DistutilsOptionError("'%s' must be a %s (got `%s`)" | |
173 % (option, what, val)) | |
174 return val | |
175 | |
176 def ensure_string_list(self, option): | |
177 r"""Ensure that 'option' is a list of strings. If 'option' is | |
178 currently a string, we split it either on /,\s*/ or /\s+/, so | |
179 "foo bar baz", "foo,bar,baz", and "foo, bar baz" all become | |
180 ["foo", "bar", "baz"]. | |
181 """ | |
182 val = getattr(self, option) | |
183 if val is None: | |
184 return | |
185 elif isinstance(val, string_types): | |
186 setattr(self, option, re.split(r',\s*|\s+', val)) | |
187 else: | |
188 if isinstance(val, list): | |
189 ok = all(isinstance(v, string_types) for v in val) | |
190 else: | |
191 ok = False | |
192 if not ok: | |
193 raise DistutilsOptionError( | |
194 "'%s' must be a list of strings (got %r)" | |
195 % (option, val)) | |
196 | |
197 def reinitialize_command(self, command, reinit_subcommands=0, **kw): | |
198 cmd = _Command.reinitialize_command(self, command, reinit_subcommands) | |
199 vars(cmd).update(kw) | |
200 return cmd | |
201 | |
202 | |
203 def _find_all_simple(path): | |
204 """ | |
205 Find all files under 'path' | |
206 """ | |
207 results = ( | |
208 os.path.join(base, file) | |
209 for base, dirs, files in os.walk(path, followlinks=True) | |
210 for file in files | |
211 ) | |
212 return filter(os.path.isfile, results) | |
213 | |
214 | |
215 def findall(dir=os.curdir): | |
216 """ | |
217 Find all files under 'dir' and return the list of full filenames. | |
218 Unless dir is '.', return full filenames with dir prepended. | |
219 """ | |
220 files = _find_all_simple(dir) | |
221 if dir == os.curdir: | |
222 make_rel = functools.partial(os.path.relpath, start=dir) | |
223 files = map(make_rel, files) | |
224 return list(files) | |
225 | |
226 | |
227 # Apply monkey patches | |
228 monkey.patch_all() |