~ubuntu-branches/ubuntu/vivid/python-pex/vivid

« back to all changes in this revision

Viewing changes to pex/pex_bootstrapper.py

  • Committer: Package Import Robot
  • Author(s): Barry Warsaw
  • Date: 2015-02-19 14:13:25 UTC
  • Revision ID: package-import@ubuntu.com-20150219141325-w62bie95l6rawuuv
Tags: upstream-0.8.6
ImportĀ upstreamĀ versionĀ 0.8.6

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright 2014 Pants project contributors (see CONTRIBUTORS.md).
 
2
# Licensed under the Apache License, Version 2.0 (see LICENSE).
 
3
 
 
4
import contextlib
 
5
import os
 
6
import zipfile
 
7
 
 
8
__all__ = ('bootstrap_pex',)
 
9
 
 
10
 
 
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')
 
14
 
 
15
 
 
16
def is_compressed(entry_point):
 
17
  return os.path.exists(entry_point) and not os.path.exists(pex_info_name(entry_point))
 
18
 
 
19
 
 
20
def read_pexinfo_from_directory(entry_point):
 
21
  with open(pex_info_name(entry_point), 'rb') as fp:
 
22
    return fp.read()
 
23
 
 
24
 
 
25
def read_pexinfo_from_zip(entry_point):
 
26
  with contextlib.closing(zipfile.ZipFile(entry_point)) as zf:
 
27
    return zf.read('PEX-INFO')
 
28
 
 
29
 
 
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)
 
34
  else:
 
35
    return read_pexinfo_from_directory(entry_point)
 
36
 
 
37
 
 
38
def get_pex_info(entry_point):
 
39
  """Return the PexInfo object for an entry point."""
 
40
  from . import pex_info
 
41
 
 
42
  pex_info_content = read_pex_info_content(entry_point)
 
43
  if pex_info_content:
 
44
    return pex_info.PexInfo.from_json(pex_info_content)
 
45
  raise ValueError('Invalid entry_point: %s' % entry_point)
 
46
 
 
47
 
 
48
# TODO(wickman) Remove once resolved:
 
49
#   https://bitbucket.org/pypa/setuptools/issue/154/build_zipmanifest-results-should-be
 
50
def monkeypatch_build_zipmanifest():
 
51
  import pkg_resources
 
52
  if not hasattr(pkg_resources, 'build_zipmanifest'):
 
53
    return
 
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)
 
58
    return memo[archive]
 
59
  pkg_resources.build_zipmanifest = memoized_build_zipmanifest
 
60
 
 
61
 
 
62
def bootstrap_pex(entry_point):
 
63
  from .finders import register_finders
 
64
  monkeypatch_build_zipmanifest()
 
65
  register_finders()
 
66
 
 
67
  from . import pex
 
68
  pex.PEX(entry_point).execute()
 
69
 
 
70
 
 
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
 
76
 
 
77
  monkeypatch_build_zipmanifest()
 
78
  register_finders()
 
79
 
 
80
  PEXEnvironment(entry_point, PexInfo.from_pex(entry_point)).activate()