Пример #1
0
 def __init__(self, pexfile, basepath=None):
   self._pex = pexfile
   self._name = os.path.basename(self._pex.path())
   if self._pex.is_condensed():
     self._cache_path = basepath if basepath is not None else EggCache.DEFAULT_PATH
     self._cache_path = os.path.join(self._cache_path, EggCache.PATH_FORMAT) % {
       'user': getpass.getuser(),
       'name': self._name,
       'crc': hashlib.md5(open(self._pex.path(), 'rb').read()).hexdigest()
     }
   else:
     self._cache_path = self._pex.path()
   self._eggparser = EggParser()
   self._registry = set()
   self._populate_registry()
Пример #2
0
 def setUp(self):
   self.parser = EggParser()
Пример #3
0
class EggCache(object):
  DEFAULT_PATH = "/var/tmp/%(user)s"
  PATH_FORMAT = "%(name)s.%(crc)s"

  def __init__(self, pexfile, basepath=None):
    self._pex = pexfile
    self._name = os.path.basename(self._pex.path())
    if self._pex.is_condensed():
      self._cache_path = basepath if basepath is not None else EggCache.DEFAULT_PATH
      self._cache_path = os.path.join(self._cache_path, EggCache.PATH_FORMAT) % {
        'user': getpass.getuser(),
        'name': self._name,
        'crc': hashlib.md5(open(self._pex.path(), 'rb').read()).hexdigest()
      }
    else:
      self._cache_path = self._pex.path()
    self._eggparser = EggParser()
    self._registry = set()
    self._populate_registry()

  def _populate_registry(self):
    def extract_usable_egg(filename):
      if not filename.startswith('.deps/'):
        return None
      spath = filename.split('/')
      if len(spath) >= 2:
        if self._eggparser.is_compatible(spath[1]):
          return '/'.join(spath[0:2])
      return None

    for name in self._pex.listdir():
      extracted = extract_usable_egg(name)
      if extracted:
        self._registry.add(extracted)

  def paths(self):
    """
      Return valid sys.path components for this egg, dumping them to a local
      cache if necessary.
    """
    def same(filename, contents):
      if not os.path.exists(filename):
        return False
      # Hmm...for directories we should probably recursively verify
      if not os.path.isfile(filename):
        return True
      with open(filename, 'rb') as fp:
        file_contents = fp.read()
      return hashlib.md5(file_contents).digest() == hashlib.md5(contents).digest()

    def populate_cache():
      safe_mkdir(self._cache_path)

      for fn in self._pex.listdir():
        egg_prefix = '/'.join(fn.split('/')[0:2])
        if egg_prefix in self._registry:
          fn_contents = self._pex.read(fn)
          dest = os.path.join(self._cache_path, fn)
          if same(dest, fn_contents):
            continue
          with safe_open(dest, 'wb') as fn_out:
            fn_out.write(fn_contents)

    if self._pex.is_condensed():
      populate_cache()

    path_adjuncts = []
    for egg in self._registry:
      path_adjuncts.append(os.path.join(self._cache_path, egg))

    return path_adjuncts
Пример #4
0
class EggParserTest(unittest.TestCase):
  GOOD_EGGS = [
   "Mako-0.4.0-py2.6.egg",
   "Thrift-0.7.0_dev-py2.6.egg",
   "ZooKeeper-0.4-py2.6-linux-x86_64.egg",
   "ZooKeeper-0.4-py2.6-macosx-10.6-x86_64.egg",
   "antlr_python_runtime-3.1.3-py2.6.egg",
   "setuptools-0.6c11-py2.6.egg",
   "endpoint-dev-py2.6.egg",
   "endpoint.egg"
  ]

  BAD_EGGS = [
   "Mako-0.py2.6.egg",
   "py2.6.egg",
   ".egg",
   "",
   None,
   "ZooKeeper-py2.6-linux-x86_64.egg",
   "ZooKeeper-macosx-10.6-x86_64.egg",
   "elfowl-pyver-py2.6.egg",
  ]

  ARCH_INSPECIFIC = [
   "Mako-0.4.0-py2.6.egg",
   "Thrift-0.7.0_dev-py2.6.egg",
   "antlr_python_runtime-3.1.3-py2.6.egg",
   "setuptools-0.6c11-py2.6.egg",
   "endpoint-dev-py2.6.egg",
  ]

  DARWIN_SPECIFIC = [
   "ZooKeeper-0.4-py2.6-macosx-10.6-x86_64.egg",
  ]

  LINUX_SPECIFIC = [
   "ZooKeeper-0.4-py2.6-linux-x86_64.egg",
  ]

  def setUp(self):
    self.parser = EggParser()

  def test_parser(self):
    for egg in EggParserTest.GOOD_EGGS + EggParserTest.BAD_EGGS:
      try:
        self.parser.parse(egg)
      except:
        self.fail("Failed to parse valid Egg: %s" % egg)

  def test_darwin_arch(self):
    parser = EggParserTestHelper.get_darwin_platform()
    arch = parser.get_architecture()
    self.assertEquals(arch[0], 'macosx')

  def test_darwin_compatibility(self):
    parser = EggParserTestHelper.get_darwin_platform()
    for egg in EggParserTest.DARWIN_SPECIFIC + EggParserTest.ARCH_INSPECIFIC:
      self.assertTrue(parser.is_compatible(egg))
    for egg in EggParserTest.LINUX_SPECIFIC:
      self.assertFalse(parser.is_compatible(egg))

  def test_linux_arch(self):
    parser = EggParserTestHelper.get_linux_platform()
    arch = parser.get_architecture()
    self.assertEquals(arch[0], 'linux')

  def test_linux_compatibility(self):
    parser = EggParserTestHelper.get_linux_platform()
    for egg in EggParserTest.LINUX_SPECIFIC + EggParserTest.ARCH_INSPECIFIC:
      self.assertTrue(parser.is_compatible(egg))
    for egg in EggParserTest.DARWIN_SPECIFIC:
      self.assertFalse(parser.is_compatible(egg))

  def test_name_extraction(self):
    name, _, _, _ = self.parser.parse("Mako.egg")
    self.assertEquals(name, "Mako")
    name, _, _, _ = self.parser.parse("Thrift-0.7.0_dev.egg")
    self.assertEquals(name, "Thrift")
    name, _, _, _ = self.parser.parse("Bonkers-0.7.0-py2.6.egg")
    self.assertEquals(name, "Bonkers")
    name, _, _, _ = self.parser.parse("ZooKeeper-0.4-py2.6-linux-x86_64.egg")
    self.assertEquals(name, "ZooKeeper")

  def test_version_extraction(self):
    _, version, _, _ = self.parser.parse("Mako.egg")
    self.assertEquals(version, None)
    _, version, _, _ = self.parser.parse("Thrift-0.7.0_dev.egg")
    self.assertEquals(version, "0.7.0_dev")
    _, version, _, _ = self.parser.parse("Bonkers-0.7.0-py2.6.egg")
    self.assertEquals(version, "0.7.0")
    _, version, _, _ = self.parser.parse("ZooKeeper-0.4-py2.6-linux-x86_64.egg")
    self.assertEquals(version, "0.4")

  def test_py_version_extraction(self):
    _, _, py_version, _ = self.parser.parse("Mako.egg")
    self.assertEquals(py_version, ())
    _, _, py_version, _ = self.parser.parse("Thrift-0.7.0_dev.egg")
    self.assertEquals(py_version, ())
    _, _, py_version, _ = self.parser.parse("Bonkers-0.7.0-py2.6.egg")
    self.assertEquals(py_version, (2,6))
    _, _, py_version, _ = self.parser.parse("ZooKeeper-0.4-py2.6-linux-x86_64.egg")
    self.assertEquals(py_version, (2,6))

  def test_platform_extraction(self):
    _, _, _, platform = self.parser.parse("Mako.egg")
    self.assertEquals(platform, ())
    _, _, _, platform = self.parser.parse("Thrift-0.7.0_dev.egg")
    self.assertEquals(platform, ())
    _, _, _, platform = self.parser.parse("Bonkers-0.7.0-py2.6.egg")
    self.assertEquals(platform, ())
    _, _, _, platform = self.parser.parse("ZooKeeper-0.4-py2.6-linux-x86_64.egg")
    self.assertEquals(platform, ('linux', 'x86_64'))
    _, _, _, platform = self.parser.parse("ZooKeeper-0.4-py2.6-linux-1-2-3-x86_64.egg")
    self.assertEquals(platform, ('linux', '1', '2', '3', 'x86_64'))
    _, _, _, platform = self.parser.parse("ZooKeeper-0.4-py2.6-macosx-10.6-i386.egg")
    self.assertEquals(platform, ('macosx', '10.6', 'i386'))