def _hydrate_pex_file(self, hydrated_pex_file): # We extract source files into a temporary directory before creating the pex. td = tempfile.mkdtemp() with open_zip(self) as zf: # Populate the pex with the pinned requirements and distribution names & hashes. bootstrap_info = PexInfo.from_json(zf.read("BOOTSTRAP-PEX-INFO")) bootstrap_builder = PEXBuilder(pex_info=bootstrap_info, interpreter=PythonInterpreter.get()) # Populate the pex with the needed code. try: ipex_info = json.loads(zf.read("IPEX-INFO").decode("utf-8")) for path in ipex_info["code"]: unzipped_source = zf.extract(path, td) bootstrap_builder.add_source( unzipped_source, env_filename=_strip_app_code_prefix(path)) except Exception as e: raise ValueError( "Error: {e}. The IPEX-INFO for this .ipex file was:\n{info}". format(e=e, info=json.dumps(ipex_info, indent=4))) # Perform a fully pinned intransitive resolve to hydrate the install cache. resolver_settings = ipex_info["resolver_settings"] sanitized_requirements = _sanitize_requirements( bootstrap_info.requirements) bootstrap_info = modify_pex_info(bootstrap_info, requirements=sanitized_requirements) bootstrap_builder.info = bootstrap_info resolved_distributions = resolver.resolve( requirements=bootstrap_info.requirements, cache=bootstrap_info.pex_root, platform="current", transitive=False, interpreter=bootstrap_builder.interpreter, **resolver_settings) # TODO: this shouldn't be necessary, as we should be able to use the same 'distributions' from # BOOTSTRAP-PEX-INFO. When the .ipex is executed, the normal pex bootstrap fails to see these # requirements or recognize that they should be pulled from the cache for some reason. for resolved_dist in resolved_distributions: bootstrap_builder.add_distribution(resolved_dist.distribution) bootstrap_builder.build(hydrated_pex_file, bytecode_compile=False)
def modify_pex_info(pex_info, **kwargs): new_info = json.loads(pex_info.dump()) new_info.update(kwargs) return PexInfo.from_json(json.dumps(new_info))
def pex_info(inherit_path): # type: (Union[str, bool]) -> PexInfo return PexInfo.from_json(json.dumps({"inherit_path": inherit_path}))