Browse Source

when importing via alias, make sure the alias gets added to sys.modules

so that when a future item imports by the alias, it gets the same module
instead of rerunning the module/code again..
main
John-Mark Gurney 5 years ago
parent
commit
eefdac6279
1 changed files with 42 additions and 24 deletions
  1. +42
    -24
      casimport/__init__.py

+ 42
- 24
casimport/__init__.py View File

@@ -310,6 +310,7 @@ class CASFinder(MetaPathFinder, Loader):

# MetaPathFinder methods
def find_spec(self, fullname, path, target=None):
aliases_to_add = ()
if path is None:
ms = ModuleSpec(fullname, self, is_package=True)
else:
@@ -335,10 +336,11 @@ class CASFinder(MetaPathFinder, Loader):
raise ValueError('unable to find base hash url for alias %s' % repr(arg))

# fix up the full name:
aliases_to_add = (fullname,)
fullname = 'cas.v1_f_%s' % hashurl.path[1:]

ms = ModuleSpec(fullname, self, is_package=False,
loader_state=(hashurl,))
loader_state=(hashurl,) + aliases_to_add)

return ms

@@ -348,34 +350,38 @@ class CASFinder(MetaPathFinder, Loader):
# Loader methods
def exec_module(self, module):
if module.__name__ == 'cas':
pass
return

(url, *aliases) = module.__spec__.loader_state
for load in self._loaders:
try:
data = load.fetch_data(url)
break
except Exception:
pass

else:
(url,) = module.__spec__.loader_state
for load in self._loaders:
try:
data = load.fetch_data(url)
break
except Exception:
pass
for url in self._aliases[
self._makebasichashurl(url)]:
url = urllib.parse.urlparse(url)
for load in self._loaders:
try:
data = load.fetch_data(url)
break
except Exception:
pass
else:
continue

break
else:
for url in self._aliases[
self._makebasichashurl(url)]:
url = urllib.parse.urlparse(url)
for load in self._loaders:
try:
data = load.fetch_data(url)
break
except Exception:
pass
else:
continue
raise ValueError('unable to find loader for url %s' % repr(urllib.parse.urlunparse(url)))

break
else:
raise ValueError('unable to find loader for url %s' % repr(urllib.parse.urlunparse(url)))
exec(data, module.__dict__)

exec(data, module.__dict__)
# we were successful, add the aliases
for i in aliases:
sys.modules[i] = module

_supportedmodules = {
'https': HTTPSCAS.fromconfig,
@@ -641,6 +647,18 @@ class Test(unittest.TestCase):
# they are the same
self.assertIs(hello_alias, hello_hash)

# that when we reimport the alias
from cas.v1_a_hello import hello as hello_alias

# it is still the same
self.assertIs(hello_alias, hello_hash)

# and when we reimport the hash
from cas.v1_f_330884aa2febb5e19fb7194ec6a69ed11dd3d77122f1a5175ee93e73cf0161c3 import hello as hello_hash

# it is still the same
self.assertIs(hello_alias, hello_hash)

def test_aliasimports(self):
# setup the cache
cachedir = self.tempdir / 'cache'


Loading…
Cancel
Save