summaryrefslogtreecommitdiff
path: root/coverage/python.py
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2016-05-08 08:25:46 -0400
committerNed Batchelder <ned@nedbatchelder.com>2016-05-08 08:25:46 -0400
commit7f4997330596325f3ee8a8f26880d45ee7049e67 (patch)
tree92d63796b4bd0e5f729fbf6c656fbacaabd861de /coverage/python.py
parent4356eab1c258c30b54a55042e872d41e1efec127 (diff)
downloadpython-coveragepy-7f4997330596325f3ee8a8f26880d45ee7049e67.tar.gz
Don't get confused by namespace packages #456
Diffstat (limited to 'coverage/python.py')
-rw-r--r--coverage/python.py9
1 files changed, 8 insertions, 1 deletions
diff --git a/coverage/python.py b/coverage/python.py
index 0cd2181..8e98bea 100644
--- a/coverage/python.py
+++ b/coverage/python.py
@@ -4,10 +4,13 @@
"""Python source expertise for coverage.py"""
import os.path
+import types
import zipimport
from coverage import env, files
-from coverage.misc import contract, expensive, NoSource, join_regex, isolate_module
+from coverage.misc import (
+ contract, CoverageException, expensive, NoSource, join_regex, isolate_module,
+)
from coverage.parser import PythonParser
from coverage.phystokens import source_token_lines, source_encoding
from coverage.plugin import FileReporter
@@ -94,6 +97,10 @@ class PythonFileReporter(FileReporter):
if hasattr(morf, '__file__'):
filename = morf.__file__
+ elif isinstance(morf, types.ModuleType):
+ # A module should have had .__file__, otherwise we can't use it.
+ # This could be a PEP-420 namespace package.
+ raise CoverageException("Module {0} has no file".format(morf))
else:
filename = morf