diff --git a/casimport/__init__.py b/casimport/__init__.py index c290e92..6a5da89 100644 --- a/casimport/__init__.py +++ b/casimport/__init__.py @@ -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.