summaryrefslogtreecommitdiff
path: root/coverage/plugin.py
diff options
context:
space:
mode:
Diffstat (limited to 'coverage/plugin.py')
-rw-r--r--coverage/plugin.py79
1 files changed, 30 insertions, 49 deletions
diff --git a/coverage/plugin.py b/coverage/plugin.py
index 6648d7a6..5b0479c3 100644
--- a/coverage/plugin.py
+++ b/coverage/plugin.py
@@ -1,10 +1,15 @@
+# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
+# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
+
"""Plugin interfaces for coverage.py"""
import os
import re
+from coverage import files
from coverage.misc import _needs_to_implement
+
# TODO: document that the plugin objects may be decorated with attributes with
# named "_coverage_*".
@@ -25,19 +30,6 @@ class CoveragePlugin(object):
"""
- def __init__(self, options):
- """
- When the plugin is constructed, it will be passed a dictionary of
- plugin-specific options read from the .coveragerc configuration file.
- The base class stores these on the `self.options` attribute.
-
- Arguments:
- options (dict): The plugin-specific options read from the
- .coveragerc configuration file.
-
- """
- self.options = options
-
def file_tracer(self, filename): # pylint: disable=unused-argument
"""Return a FileTracer object for a file.
@@ -50,14 +42,12 @@ class CoveragePlugin(object):
trace the file or not. Be prepared for `filename` to refer to all
kinds of files that have nothing to do with your plugin.
- Arguments:
- filename (str): The path to the file being considered. This is the
- absolute real path to the file. If you are comparing to other
- paths, be sure to take this into account.
+ `filename` is a string, the path to the file being considered. This is
+ the absolute real path to the file. If you are comparing to other
+ paths, be sure to take this into account.
- Returns:
- FileTracer: the :class:`FileTracer` object to use to trace
- `filename`, or None if this plugin cannot trace this file.
+ Returns a :class:`FileTracer` object to use to trace `filename`, or
+ None if this plugin cannot trace this file.
"""
return None
@@ -99,8 +89,7 @@ class FileTracer(object):
to own the mapping from Python execution back to whatever source
filename was originally the source of the code.
- Returns:
- The filename to credit with this execution.
+ Returns the filename to credit with this execution.
"""
_needs_to_implement(self, "source_filename")
@@ -110,13 +99,12 @@ class FileTracer(object):
FileTracers can provide dynamically determined filenames by
implementing dynamic_source_filename. Invoking that function is
- expensive. To determine whether to invoke it, coverage.py uses
- the result of this function to know if it needs to bother invoking
+ expensive. To determine whether to invoke it, coverage.py uses the
+ result of this function to know if it needs to bother invoking
:meth:`dynamic_source_filename`.
- Returns:
- boolean: True if :meth:`dynamic_source_filename` should be called
- to get dynamic source filenames.
+ Returns true if :meth:`dynamic_source_filename` should be called to get
+ dynamic source filenames.
"""
return False
@@ -130,9 +118,8 @@ class FileTracer(object):
This function will not be invoked if
:meth:`has_dynamic_source_filename` returns False.
- Returns:
- The source filename for this frame, or None if this frame shouldn't
- be measured.
+ Returns the source filename for this frame, or None if this frame
+ shouldn't be measured.
"""
return None
@@ -150,13 +137,6 @@ class FileTracer(object):
from the source file were executed. Return (-1, -1) in this case to
tell coverage.py that no lines should be recorded for this frame.
- Arguments:
- frame: the call frame to examine.
-
- Returns:
- int, int: a pair of line numbers, the start and end lines
- executed in the source, inclusive.
-
"""
lineno = frame.f_lineno
return lineno, lineno
@@ -169,27 +149,26 @@ class FileReporter(object):
self.filename = filename
def __repr__(self):
- return (
- # pylint: disable=redundant-keyword-arg
- "<{self.__class__.__name__}"
- " filename={self.filename!r}>".format(self=self)
- )
+ return "<{0.__class__.__name__} filename={0.filename!r}>".format(self)
+
+ def relative_filename(self):
+ return files.relative_filename(self.filename)
# Annoying comparison operators. Py3k wants __lt__ etc, and Py2k needs all
# of them defined.
+ def __eq__(self, other):
+ return isinstance(other, FileReporter) and self.filename == other.filename
+
+ def __ne__(self, other):
+ return not (self == other)
+
def __lt__(self, other):
return self.filename < other.filename
def __le__(self, other):
return self.filename <= other.filename
- def __eq__(self, other):
- return self.filename == other.filename
-
- def __ne__(self, other):
- return self.filename != other.filename
-
def __gt__(self, other):
return self.filename > other.filename
@@ -247,6 +226,8 @@ class FileReporter(object):
For example, the file a/b/c.py will return 'a_b_c_py'
+ You should not need to override this method.
+
"""
- name = os.path.splitdrive(self.name)[1]
+ name = os.path.splitdrive(self.relative_filename())[1]
return re.sub(r"[\\/.:]", "_", name)