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 setUp(self): self.parser = EggParser()
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
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'))