def _run_mypy(self, py3_interpreter, mypy_args, **kwargs): pex_info = PexInfo.default() pex_info.entry_point = 'mypy' mypy_version = self.get_options().mypy_version mypy_requirement_pex = self.resolve_requirement_strings( py3_interpreter, ['mypy=={}'.format(mypy_version)]) path = os.path.realpath(os.path.join(self.workdir, str(py3_interpreter.identity), mypy_version)) if not os.path.isdir(path): self.merge_pexes(path, pex_info, py3_interpreter, [mypy_requirement_pex]) pex = WrappedPEX(PEX(path, py3_interpreter), py3_interpreter) return pex.run(mypy_args, **kwargs)
def bootstrap_conan(self): pex_info = PexInfo.default() pex_info.entry_point = 'conans.conan' conan_bootstrap_dir = os.path.join(get_pants_cachedir(), 'conan_support') conan_pex_path = os.path.join(conan_bootstrap_dir, 'conan_binary') interpreter = PythonInterpreter.get() if os.path.exists(conan_pex_path): conan_binary = WrappedPEX(PEX(conan_pex_path, interpreter)) return self.ConanBinary(pex=conan_binary) else: with safe_concurrent_creation(conan_pex_path) as safe_path: builder = PEXBuilder(safe_path, interpreter, pex_info=pex_info) reqs = [ PythonRequirement(req) for req in self.get_options().conan_requirements ] dump_requirements(builder, interpreter, reqs, logger) builder.freeze() conan_binary = WrappedPEX(PEX(conan_pex_path, interpreter)) return self.ConanBinary(pex=conan_binary)
def create_pex(self, pex_info=None): """Returns a wrapped pex that "merges" the other pexes via PEX_PATH.""" relevant_targets = self.context.targets(lambda tgt: isinstance( tgt, (PythonDistribution, PythonRequirementLibrary, PythonTarget, Files))) with self.invalidated(relevant_targets) as invalidation_check: # If there are no relevant targets, we still go through the motions of resolving # an empty set of requirements, to prevent downstream tasks from having to check # for this special case. if invalidation_check.all_vts: target_set_id = VersionedTargetSet.from_versioned_targets( invalidation_check.all_vts).cache_key.hash else: target_set_id = 'no_targets' interpreter = self.context.products.get_data(PythonInterpreter) path = os.path.realpath( os.path.join(self.workdir, str(interpreter.identity), target_set_id)) # Note that we check for the existence of the directory, instead of for invalid_vts, # to cover the empty case. if not os.path.isdir(path): pexes = [ self.context.products.get_data( ResolveRequirements.REQUIREMENTS_PEX), self.context.products.get_data( GatherSources.PYTHON_SOURCES) ] if self.extra_requirements(): extra_requirements_pex = self.resolve_requirement_strings( interpreter, self.extra_requirements()) # Add the extra requirements first, so they take precedence over any colliding version # in the target set's dependency closure. pexes = [extra_requirements_pex] + pexes constraints = { constraint for rt in relevant_targets if is_python_target(rt) for constraint in rt.compatibility } with self.merged_pex(path, pex_info, interpreter, pexes, constraints) as builder: for extra_file in self.extra_files(): extra_file.add_to(builder) builder.freeze() return WrappedPEX(PEX(path, interpreter), interpreter)