summaryrefslogtreecommitdiff
path: root/coverage/python.py
diff options
context:
space:
mode:
authorNed Batchelder <nedbat@gmail.com>2015-04-24 21:06:26 -0400
committerNed Batchelder <nedbat@gmail.com>2015-04-24 21:06:26 -0400
commit4cac18d36cd53c85f43ab79816b71cd2d4a3e6db (patch)
tree5741c738325d92c1a417b2c943f9b3f98f3417ba /coverage/python.py
parent3d88444cd3659fb93f17cbf4288c23bc82f33ead (diff)
parentc3a98ff12933710d751ec28b984edb7936d457d3 (diff)
downloadpython-coveragepy-4cac18d36cd53c85f43ab79816b71cd2d4a3e6db.tar.gz
Merged in lep/coverage.py (pull request #48)
Fix #363: crash when annotating non-ascii characters in python 2.
Diffstat (limited to 'coverage/python.py')
-rw-r--r--coverage/python.py41
1 files changed, 28 insertions, 13 deletions
diff --git a/coverage/python.py b/coverage/python.py
index 53da561..19212a5 100644
--- a/coverage/python.py
+++ b/coverage/python.py
@@ -7,10 +7,11 @@ import zipimport
from coverage import env
from coverage.backward import unicode_class
-from coverage.codeunit import CodeUnit
+from coverage.files import FileLocator
from coverage.misc import NoSource, join_regex
from coverage.parser import PythonParser
from coverage.phystokens import source_token_lines, source_encoding
+from coverage.plugin import FileReporter
def read_python_source(filename):
@@ -86,13 +87,35 @@ def get_zip_bytes(filename):
return None
-class PythonCodeUnit(CodeUnit):
- """Represents a Python file."""
+class PythonFileReporter(FileReporter):
+ """Report support for a Python file."""
def __init__(self, morf, coverage=None):
self.coverage = coverage
- file_locator = coverage.file_locator if coverage else None
- super(PythonCodeUnit, self).__init__(morf, file_locator)
+ file_locator = coverage.file_locator if coverage else FileLocator()
+
+ if hasattr(morf, '__file__'):
+ filename = morf.__file__
+ else:
+ filename = morf
+
+ # .pyc files should always refer to a .py instead.
+ if filename.endswith(('.pyc', '.pyo')):
+ filename = filename[:-1]
+ elif filename.endswith('$py.class'): # Jython
+ filename = filename[:-9] + ".py"
+
+ super(PythonFileReporter, self).__init__(
+ file_locator.canonical_filename(filename)
+ )
+
+ if hasattr(morf, '__name__'):
+ name = morf.__name__
+ name = name.replace(".", os.sep) + ".py"
+ else:
+ name = file_locator.relative_filename(filename)
+ self.name = name
+
self._source = None
self._parser = None
self._statements = None
@@ -138,14 +161,6 @@ class PythonCodeUnit(CodeUnit):
def exit_counts(self):
return self.parser.exit_counts()
- def _adjust_filename(self, fname):
- # .pyc files should always refer to a .py instead.
- if fname.endswith(('.pyc', '.pyo')):
- fname = fname[:-1]
- elif fname.endswith('$py.class'): # Jython
- fname = fname[:-9] + ".py"
- return fname
-
def source(self):
if self._source is None:
self._source = get_python_source(self.filename)