diff options
-rw-r--r-- | coverage/execfile.py | 16 | ||||
-rw-r--r-- | tests/try_execfile.py | 2 |
2 files changed, 16 insertions, 2 deletions
diff --git a/coverage/execfile.py b/coverage/execfile.py index 82cc2217..f03713ec 100644 --- a/coverage/execfile.py +++ b/coverage/execfile.py @@ -7,6 +7,15 @@ from coverage.backward import PYC_MAGIC_NUMBER, imp, importlib_util_find_spec from coverage.misc import ExceptionDuringRun, NoCode, NoSource +class DummyLoader(object): + """A shim for the pep302 __loader__, emulating pkgutil.ImpLoader. + + Currently only implements the .fullname attribute + """ + def __init__(self, fullname, *args): + self.fullname = fullname + + if importlib_util_find_spec: def find_module(modulename): """Find the module named `modulename`. @@ -92,10 +101,10 @@ def run_python_module(modulename, args): pathname = os.path.abspath(pathname) args[0] = pathname - run_python_file(pathname, args, package=packagename) + run_python_file(pathname, args, package=packagename, modulename=modulename) -def run_python_file(filename, args, package=None): +def run_python_file(filename, args, package=None, modulename=None): """Run a python file as if it were the main program on the command line. `filename` is the path to the file to execute, it need not be a .py file. @@ -111,6 +120,9 @@ def run_python_file(filename, args, package=None): main_mod.__file__ = filename if package: main_mod.__package__ = package + if modulename: + main_mod.__loader__ = DummyLoader(modulename) + main_mod.__builtins__ = BUILTINS # Set sys.argv properly. diff --git a/tests/try_execfile.py b/tests/try_execfile.py index 314ffae0..fd430e6b 100644 --- a/tests/try_execfile.py +++ b/tests/try_execfile.py @@ -60,6 +60,8 @@ globals_to_check = { '__doc__': __doc__, '__builtins__.has_open': hasattr(__builtins__, 'open'), '__builtins__.dir': dir(__builtins__), + '__loader__ exists': '__loader__' in globals(), + '__loader__.fullname': getattr(globals().get('__loader__', None), 'fullname', None), '__package__': __package__, 'DATA': DATA, 'FN_VAL': FN_VAL, |