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
commitb918987030fadd52f47cb8b2067e54c59a73d794 (patch)
tree8c0a85e120b165218bdc90398f92612ec49ad9c5 /coverage/python.py
parent36d94fb250dcc838a0fd8f83bb8a6ad53665cb37 (diff)
downloadpython-coveragepy-git-b918987030fadd52f47cb8b2067e54c59a73d794.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 0cd2181c..8e98bea8 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