1
# Copyright 2014 Pants project contributors (see CONTRIBUTORS.md).
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
8
__all__ = ('bootstrap_pex',)
11
def pex_info_name(entry_point):
12
"""Return the PEX-INFO for an entry_point"""
13
return os.path.join(entry_point, 'PEX-INFO')
16
def is_compressed(entry_point):
17
return os.path.exists(entry_point) and not os.path.exists(pex_info_name(entry_point))
20
def read_pexinfo_from_directory(entry_point):
21
with open(pex_info_name(entry_point), 'rb') as fp:
25
def read_pexinfo_from_zip(entry_point):
26
with contextlib.closing(zipfile.ZipFile(entry_point)) as zf:
27
return zf.read('PEX-INFO')
30
def read_pex_info_content(entry_point):
31
"""Return the raw content of a PEX-INFO."""
32
if is_compressed(entry_point):
33
return read_pexinfo_from_zip(entry_point)
35
return read_pexinfo_from_directory(entry_point)
38
def get_pex_info(entry_point):
39
"""Return the PexInfo object for an entry point."""
40
from . import pex_info
42
pex_info_content = read_pex_info_content(entry_point)
44
return pex_info.PexInfo.from_json(pex_info_content)
45
raise ValueError('Invalid entry_point: %s' % entry_point)
48
# TODO(wickman) Remove once resolved:
49
# https://bitbucket.org/pypa/setuptools/issue/154/build_zipmanifest-results-should-be
50
def monkeypatch_build_zipmanifest():
52
if not hasattr(pkg_resources, 'build_zipmanifest'):
54
old_build_zipmanifest = pkg_resources.build_zipmanifest
55
def memoized_build_zipmanifest(archive, memo={}):
56
if archive not in memo:
57
memo[archive] = old_build_zipmanifest(archive)
59
pkg_resources.build_zipmanifest = memoized_build_zipmanifest
62
def bootstrap_pex(entry_point):
63
from .finders import register_finders
64
monkeypatch_build_zipmanifest()
68
pex.PEX(entry_point).execute()
71
def bootstrap_pex_env(entry_point):
72
"""Bootstrap the current runtime environment using a given pex."""
73
from .environment import PEXEnvironment
74
from .finders import register_finders
75
from .pex_info import PexInfo
77
monkeypatch_build_zipmanifest()
80
PEXEnvironment(entry_point, PexInfo.from_pex(entry_point)).activate()