From c5a66fa937a9556e417efc8346152edfaea0837b Mon Sep 17 00:00:00 2001 From: brettlangdon Date: Fri, 24 Aug 2018 08:29:06 -0400 Subject: [PATCH] Fix minor issues with finder and meta paths --- importhook/finder.py | 11 ++++++++++- importhook/meta_paths.py | 7 +++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/importhook/finder.py b/importhook/finder.py index d6dd93a..7b2244b 100644 --- a/importhook/finder.py +++ b/importhook/finder.py @@ -12,6 +12,11 @@ def hook_finder(finder): This function replaces the `Finder.find_spec` function to ensure that any ModuleSpecs will use an `importmod.HookLoader` """ + # If this finder has already been 'hooked', then return as-is + if hasattr(finder, '__hooked__'): + return finder; + + # Determine if we were given an instance or a class if isinstance(finder, type): finder_cls = finder else: @@ -30,7 +35,7 @@ def hook_finder(finder): return spec return wrapper - def wrap_fid_loader(find_loader): + def wrap_find_loader(find_loader): @functools.wraps(find_loader) def wrapper(fullname, path): logger.debug(f'{finder_name}.find_loader(fullname={fullname}, path={path})') @@ -38,8 +43,12 @@ def hook_finder(finder): return HookLoader(loader) return wrapper + # Override the functions we care about if hasattr(finder, 'find_spec'): setattr(finder, 'find_spec', wrap_find_spec(finder.find_spec)) if hasattr(finder, 'find_loader'): setattr(finder, 'find_loader', wrap_find_loader(finder.find_loader)) + + # Make this finder as being 'hooked' + setattr(finder, '__hooked__', True) return finder diff --git a/importhook/meta_paths.py b/importhook/meta_paths.py index e50a71b..6fb35fc 100644 --- a/importhook/meta_paths.py +++ b/importhook/meta_paths.py @@ -1,5 +1,3 @@ -from importlib.abc import MetaPathFinder - from .finder import hook_finder @@ -15,3 +13,8 @@ class HookMetaPaths(list): def __setitem__(self, key, val): super(HookMetaPaths, self).__setitem__(hook_finder(val)) + + def __add__(self, other): + if not isinstance(other, HookMetaPaths): + other = HookMetaPaths(other) + super(HookMetaPaths, self).__add__(other)