Mercurial > repos > guerler > hhblits
comparison lib/python3.8/site-packages/pip/_internal/cli/req_command.py @ 0:9e54283cc701 draft
"planemo upload commit d12c32a45bcd441307e632fca6d9af7d60289d44"
author | guerler |
---|---|
date | Mon, 27 Jul 2020 03:47:31 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:9e54283cc701 |
---|---|
1 """Contains the Command base classes that depend on PipSession. | |
2 | |
3 The classes in this module are in a separate module so the commands not | |
4 needing download / PackageFinder capability don't unnecessarily import the | |
5 PackageFinder machinery and all its vendored dependencies, etc. | |
6 """ | |
7 | |
8 import logging | |
9 import os | |
10 from functools import partial | |
11 | |
12 from pip._internal.cli.base_command import Command | |
13 from pip._internal.cli.command_context import CommandContextMixIn | |
14 from pip._internal.exceptions import CommandError | |
15 from pip._internal.index.package_finder import PackageFinder | |
16 from pip._internal.legacy_resolve import Resolver | |
17 from pip._internal.models.selection_prefs import SelectionPreferences | |
18 from pip._internal.network.download import Downloader | |
19 from pip._internal.network.session import PipSession | |
20 from pip._internal.operations.prepare import RequirementPreparer | |
21 from pip._internal.req.constructors import ( | |
22 install_req_from_editable, | |
23 install_req_from_line, | |
24 install_req_from_req_string, | |
25 ) | |
26 from pip._internal.req.req_file import parse_requirements | |
27 from pip._internal.self_outdated_check import ( | |
28 make_link_collector, | |
29 pip_self_version_check, | |
30 ) | |
31 from pip._internal.utils.typing import MYPY_CHECK_RUNNING | |
32 | |
33 if MYPY_CHECK_RUNNING: | |
34 from optparse import Values | |
35 from typing import List, Optional, Tuple | |
36 from pip._internal.cache import WheelCache | |
37 from pip._internal.models.target_python import TargetPython | |
38 from pip._internal.req.req_set import RequirementSet | |
39 from pip._internal.req.req_tracker import RequirementTracker | |
40 from pip._internal.utils.temp_dir import TempDirectory | |
41 | |
42 logger = logging.getLogger(__name__) | |
43 | |
44 | |
45 class SessionCommandMixin(CommandContextMixIn): | |
46 | |
47 """ | |
48 A class mixin for command classes needing _build_session(). | |
49 """ | |
50 def __init__(self): | |
51 # type: () -> None | |
52 super(SessionCommandMixin, self).__init__() | |
53 self._session = None # Optional[PipSession] | |
54 | |
55 @classmethod | |
56 def _get_index_urls(cls, options): | |
57 # type: (Values) -> Optional[List[str]] | |
58 """Return a list of index urls from user-provided options.""" | |
59 index_urls = [] | |
60 if not getattr(options, "no_index", False): | |
61 url = getattr(options, "index_url", None) | |
62 if url: | |
63 index_urls.append(url) | |
64 urls = getattr(options, "extra_index_urls", None) | |
65 if urls: | |
66 index_urls.extend(urls) | |
67 # Return None rather than an empty list | |
68 return index_urls or None | |
69 | |
70 def get_default_session(self, options): | |
71 # type: (Values) -> PipSession | |
72 """Get a default-managed session.""" | |
73 if self._session is None: | |
74 self._session = self.enter_context(self._build_session(options)) | |
75 # there's no type annotation on requests.Session, so it's | |
76 # automatically ContextManager[Any] and self._session becomes Any, | |
77 # then https://github.com/python/mypy/issues/7696 kicks in | |
78 assert self._session is not None | |
79 return self._session | |
80 | |
81 def _build_session(self, options, retries=None, timeout=None): | |
82 # type: (Values, Optional[int], Optional[int]) -> PipSession | |
83 assert not options.cache_dir or os.path.isabs(options.cache_dir) | |
84 session = PipSession( | |
85 cache=( | |
86 os.path.join(options.cache_dir, "http") | |
87 if options.cache_dir else None | |
88 ), | |
89 retries=retries if retries is not None else options.retries, | |
90 trusted_hosts=options.trusted_hosts, | |
91 index_urls=self._get_index_urls(options), | |
92 ) | |
93 | |
94 # Handle custom ca-bundles from the user | |
95 if options.cert: | |
96 session.verify = options.cert | |
97 | |
98 # Handle SSL client certificate | |
99 if options.client_cert: | |
100 session.cert = options.client_cert | |
101 | |
102 # Handle timeouts | |
103 if options.timeout or timeout: | |
104 session.timeout = ( | |
105 timeout if timeout is not None else options.timeout | |
106 ) | |
107 | |
108 # Handle configured proxies | |
109 if options.proxy: | |
110 session.proxies = { | |
111 "http": options.proxy, | |
112 "https": options.proxy, | |
113 } | |
114 | |
115 # Determine if we can prompt the user for authentication or not | |
116 session.auth.prompting = not options.no_input | |
117 | |
118 return session | |
119 | |
120 | |
121 class IndexGroupCommand(Command, SessionCommandMixin): | |
122 | |
123 """ | |
124 Abstract base class for commands with the index_group options. | |
125 | |
126 This also corresponds to the commands that permit the pip version check. | |
127 """ | |
128 | |
129 def handle_pip_version_check(self, options): | |
130 # type: (Values) -> None | |
131 """ | |
132 Do the pip version check if not disabled. | |
133 | |
134 This overrides the default behavior of not doing the check. | |
135 """ | |
136 # Make sure the index_group options are present. | |
137 assert hasattr(options, 'no_index') | |
138 | |
139 if options.disable_pip_version_check or options.no_index: | |
140 return | |
141 | |
142 # Otherwise, check if we're using the latest version of pip available. | |
143 session = self._build_session( | |
144 options, | |
145 retries=0, | |
146 timeout=min(5, options.timeout) | |
147 ) | |
148 with session: | |
149 pip_self_version_check(session, options) | |
150 | |
151 | |
152 class RequirementCommand(IndexGroupCommand): | |
153 | |
154 @staticmethod | |
155 def make_requirement_preparer( | |
156 temp_build_dir, # type: TempDirectory | |
157 options, # type: Values | |
158 req_tracker, # type: RequirementTracker | |
159 session, # type: PipSession | |
160 finder, # type: PackageFinder | |
161 use_user_site, # type: bool | |
162 download_dir=None, # type: str | |
163 wheel_download_dir=None, # type: str | |
164 ): | |
165 # type: (...) -> RequirementPreparer | |
166 """ | |
167 Create a RequirementPreparer instance for the given parameters. | |
168 """ | |
169 downloader = Downloader(session, progress_bar=options.progress_bar) | |
170 | |
171 temp_build_dir_path = temp_build_dir.path | |
172 assert temp_build_dir_path is not None | |
173 | |
174 return RequirementPreparer( | |
175 build_dir=temp_build_dir_path, | |
176 src_dir=options.src_dir, | |
177 download_dir=download_dir, | |
178 wheel_download_dir=wheel_download_dir, | |
179 build_isolation=options.build_isolation, | |
180 req_tracker=req_tracker, | |
181 downloader=downloader, | |
182 finder=finder, | |
183 require_hashes=options.require_hashes, | |
184 use_user_site=use_user_site, | |
185 ) | |
186 | |
187 @staticmethod | |
188 def make_resolver( | |
189 preparer, # type: RequirementPreparer | |
190 finder, # type: PackageFinder | |
191 options, # type: Values | |
192 wheel_cache=None, # type: Optional[WheelCache] | |
193 use_user_site=False, # type: bool | |
194 ignore_installed=True, # type: bool | |
195 ignore_requires_python=False, # type: bool | |
196 force_reinstall=False, # type: bool | |
197 upgrade_strategy="to-satisfy-only", # type: str | |
198 use_pep517=None, # type: Optional[bool] | |
199 py_version_info=None # type: Optional[Tuple[int, ...]] | |
200 ): | |
201 # type: (...) -> Resolver | |
202 """ | |
203 Create a Resolver instance for the given parameters. | |
204 """ | |
205 make_install_req = partial( | |
206 install_req_from_req_string, | |
207 isolated=options.isolated_mode, | |
208 wheel_cache=wheel_cache, | |
209 use_pep517=use_pep517, | |
210 ) | |
211 return Resolver( | |
212 preparer=preparer, | |
213 finder=finder, | |
214 make_install_req=make_install_req, | |
215 use_user_site=use_user_site, | |
216 ignore_dependencies=options.ignore_dependencies, | |
217 ignore_installed=ignore_installed, | |
218 ignore_requires_python=ignore_requires_python, | |
219 force_reinstall=force_reinstall, | |
220 upgrade_strategy=upgrade_strategy, | |
221 py_version_info=py_version_info, | |
222 ) | |
223 | |
224 def populate_requirement_set( | |
225 self, | |
226 requirement_set, # type: RequirementSet | |
227 args, # type: List[str] | |
228 options, # type: Values | |
229 finder, # type: PackageFinder | |
230 session, # type: PipSession | |
231 wheel_cache, # type: Optional[WheelCache] | |
232 ): | |
233 # type: (...) -> None | |
234 """ | |
235 Marshal cmd line args into a requirement set. | |
236 """ | |
237 for filename in options.constraints: | |
238 for req_to_add in parse_requirements( | |
239 filename, | |
240 constraint=True, finder=finder, options=options, | |
241 session=session, wheel_cache=wheel_cache): | |
242 req_to_add.is_direct = True | |
243 requirement_set.add_requirement(req_to_add) | |
244 | |
245 for req in args: | |
246 req_to_add = install_req_from_line( | |
247 req, None, isolated=options.isolated_mode, | |
248 use_pep517=options.use_pep517, | |
249 wheel_cache=wheel_cache | |
250 ) | |
251 req_to_add.is_direct = True | |
252 requirement_set.add_requirement(req_to_add) | |
253 | |
254 for req in options.editables: | |
255 req_to_add = install_req_from_editable( | |
256 req, | |
257 isolated=options.isolated_mode, | |
258 use_pep517=options.use_pep517, | |
259 wheel_cache=wheel_cache | |
260 ) | |
261 req_to_add.is_direct = True | |
262 requirement_set.add_requirement(req_to_add) | |
263 | |
264 # NOTE: options.require_hashes may be set if --require-hashes is True | |
265 for filename in options.requirements: | |
266 for req_to_add in parse_requirements( | |
267 filename, | |
268 finder=finder, options=options, session=session, | |
269 wheel_cache=wheel_cache, | |
270 use_pep517=options.use_pep517): | |
271 req_to_add.is_direct = True | |
272 requirement_set.add_requirement(req_to_add) | |
273 | |
274 # If any requirement has hash options, enable hash checking. | |
275 requirements = ( | |
276 requirement_set.unnamed_requirements + | |
277 list(requirement_set.requirements.values()) | |
278 ) | |
279 if any(req.has_hash_options for req in requirements): | |
280 options.require_hashes = True | |
281 | |
282 if not (args or options.editables or options.requirements): | |
283 opts = {'name': self.name} | |
284 if options.find_links: | |
285 raise CommandError( | |
286 'You must give at least one requirement to %(name)s ' | |
287 '(maybe you meant "pip %(name)s %(links)s"?)' % | |
288 dict(opts, links=' '.join(options.find_links))) | |
289 else: | |
290 raise CommandError( | |
291 'You must give at least one requirement to %(name)s ' | |
292 '(see "pip help %(name)s")' % opts) | |
293 | |
294 @staticmethod | |
295 def trace_basic_info(finder): | |
296 # type: (PackageFinder) -> None | |
297 """ | |
298 Trace basic information about the provided objects. | |
299 """ | |
300 # Display where finder is looking for packages | |
301 search_scope = finder.search_scope | |
302 locations = search_scope.get_formatted_locations() | |
303 if locations: | |
304 logger.info(locations) | |
305 | |
306 def _build_package_finder( | |
307 self, | |
308 options, # type: Values | |
309 session, # type: PipSession | |
310 target_python=None, # type: Optional[TargetPython] | |
311 ignore_requires_python=None, # type: Optional[bool] | |
312 ): | |
313 # type: (...) -> PackageFinder | |
314 """ | |
315 Create a package finder appropriate to this requirement command. | |
316 | |
317 :param ignore_requires_python: Whether to ignore incompatible | |
318 "Requires-Python" values in links. Defaults to False. | |
319 """ | |
320 link_collector = make_link_collector(session, options=options) | |
321 selection_prefs = SelectionPreferences( | |
322 allow_yanked=True, | |
323 format_control=options.format_control, | |
324 allow_all_prereleases=options.pre, | |
325 prefer_binary=options.prefer_binary, | |
326 ignore_requires_python=ignore_requires_python, | |
327 ) | |
328 | |
329 return PackageFinder.create( | |
330 link_collector=link_collector, | |
331 selection_prefs=selection_prefs, | |
332 target_python=target_python, | |
333 ) |