|
|
@@ -215,12 +215,15 @@ class CASFinder(MetaPathFinder, Loader): |
|
|
|
def __exit__(self, exc_type, exc_value, traceback): |
|
|
|
self.disconnect() |
|
|
|
|
|
|
|
def load_aliases(self, data): |
|
|
|
self._aliases.update(self._parsealiases(data)) |
|
|
|
|
|
|
|
def load_mod_aliases(self, name): |
|
|
|
'''Load the aliases from the module with the passed in name.''' |
|
|
|
|
|
|
|
aliases = importlib.resources.read_text(sys.modules[name], |
|
|
|
'cas_aliases.txt') |
|
|
|
self._aliases.update(self._parsealiases(aliases)) |
|
|
|
self.load_aliases(aliases) |
|
|
|
|
|
|
|
@staticmethod |
|
|
|
def _makebasichashurl(url): |
|
|
@@ -302,6 +305,9 @@ class CASFinder(MetaPathFinder, Loader): |
|
|
|
else: |
|
|
|
raise ValueError('unable to find base hash url for alias %s' % repr(arg)) |
|
|
|
|
|
|
|
# fix up the full name: |
|
|
|
fullname = 'cas.v1_f_%s' % hashurl.path[1:] |
|
|
|
|
|
|
|
ms = ModuleSpec(fullname, self, is_package=False, |
|
|
|
loader_state=(hashurl,)) |
|
|
|
|
|
|
@@ -532,39 +538,63 @@ class Test(unittest.TestCase): |
|
|
|
], |
|
|
|
}) |
|
|
|
|
|
|
|
def test_aliasmulti(self): |
|
|
|
# setup the cache |
|
|
|
cachedir = self.tempdir / 'cache' |
|
|
|
cachedir.mkdir() |
|
|
|
|
|
|
|
with CASFinder() as f, \ |
|
|
|
tempattrset(sys.modules[__name__], |
|
|
|
'load_mod_aliases', f.load_mod_aliases): |
|
|
|
f.register(FileDirCAS(cachedir)) |
|
|
|
|
|
|
|
# and that hello.py is in the cache |
|
|
|
shutil.copy(self.fixtures / 'hello.py', |
|
|
|
cachedir) |
|
|
|
|
|
|
|
# and that the aliases are loaded |
|
|
|
with open(self.fixtures / 'randpkg' / 'cas_aliases.txt') as fp: |
|
|
|
f.load_aliases(fp.read()) |
|
|
|
|
|
|
|
# that when we load the alias first |
|
|
|
from cas.v1_a_hello import hello as hello_alias |
|
|
|
|
|
|
|
# and then load the same module via hash |
|
|
|
from cas.v1_f_330884aa2febb5e19fb7194ec6a69ed11dd3d77122f1a5175ee93e73cf0161c3 import hello as hello_hash |
|
|
|
|
|
|
|
# they are the same |
|
|
|
self.assertIs(hello_alias, hello_hash) |
|
|
|
|
|
|
|
def test_aliasimports(self): |
|
|
|
# setup the cache |
|
|
|
temphome = self.tempdir / 'home' |
|
|
|
temphome.mkdir() |
|
|
|
cachedir = temphome / '.casimport' / 'cache' |
|
|
|
cachedir.mkdir(parents=True) |
|
|
|
cachedir = self.tempdir / 'cache' |
|
|
|
cachedir.mkdir() |
|
|
|
|
|
|
|
# add the test module's path |
|
|
|
fixdir = str(self.fixtures) |
|
|
|
sys.path.append(fixdir) |
|
|
|
|
|
|
|
with tempset(os.environ, 'HOME', str(temphome)): |
|
|
|
try: |
|
|
|
with CASFinder() as f, \ |
|
|
|
tempattrset(sys.modules[__name__], |
|
|
|
'load_mod_aliases', f.load_mod_aliases): |
|
|
|
f.register(FileDirCAS(cachedir)) |
|
|
|
try: |
|
|
|
with CASFinder() as f, \ |
|
|
|
tempattrset(sys.modules[__name__], |
|
|
|
'load_mod_aliases', f.load_mod_aliases): |
|
|
|
f.register(FileDirCAS(cachedir)) |
|
|
|
|
|
|
|
# and that hello.py is in the cache |
|
|
|
shutil.copy(self.fixtures / 'hello.py', |
|
|
|
cachedir) |
|
|
|
# and that hello.py is in the cache |
|
|
|
shutil.copy(self.fixtures / 'hello.py', |
|
|
|
cachedir) |
|
|
|
|
|
|
|
self.assertNotIn('randpkg', sys.modules) |
|
|
|
self.assertNotIn('randpkg', sys.modules) |
|
|
|
|
|
|
|
# that the import is successful |
|
|
|
import randpkg |
|
|
|
# that the import is successful |
|
|
|
import randpkg |
|
|
|
|
|
|
|
# and pulled in the method |
|
|
|
self.assertTrue(hasattr(randpkg, 'hello')) |
|
|
|
# and pulled in the method |
|
|
|
self.assertTrue(hasattr(randpkg, 'hello')) |
|
|
|
|
|
|
|
del sys.modules['randpkg'] |
|
|
|
finally: |
|
|
|
sys.path.remove(fixdir) |
|
|
|
del sys.modules['randpkg'] |
|
|
|
finally: |
|
|
|
sys.path.remove(fixdir) |
|
|
|
|
|
|
|
def test_aliasipfsimports(self): |
|
|
|
# add the test module's path |
|
|
@@ -679,6 +709,7 @@ class Test(unittest.TestCase): |
|
|
|
with self.assertRaises(RuntimeError): |
|
|
|
httpsldr.fetch_data(hashurl) |
|
|
|
|
|
|
|
@unittest.skip('todo') |
|
|
|
def test_overlappingaliases(self): |
|
|
|
# make sure that an aliases file is consistent and does not |
|
|
|
# override other urls. That is that any hashes are |
|
|
@@ -690,6 +721,7 @@ class Test(unittest.TestCase): |
|
|
|
# this case, BOTH hashse have to be checked. |
|
|
|
pass |
|
|
|
|
|
|
|
@unittest.skip('todo') |
|
|
|
def test_loaderpriority(self): |
|
|
|
# XXX - write test to allow you to specify the priority of |
|
|
|
# a loader, to ensure that cache stays at top. |
|
|
|