summaryrefslogtreecommitdiff
path: root/coverage/misc.py
diff options
context:
space:
mode:
Diffstat (limited to 'coverage/misc.py')
-rw-r--r--coverage/misc.py61
1 files changed, 29 insertions, 32 deletions
diff --git a/coverage/misc.py b/coverage/misc.py
index d5197ea3..d11ebccb 100644
--- a/coverage/misc.py
+++ b/coverage/misc.py
@@ -1,4 +1,7 @@
-"""Miscellaneous stuff for Coverage."""
+# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
+# For details: https://bitbucket.org/ned/coveragepy/src/default/NOTICE.txt
+
+"""Miscellaneous stuff for coverage.py."""
import errno
import hashlib
@@ -6,7 +9,30 @@ import inspect
import os
from coverage import env
-from coverage.backward import string_class, to_bytes
+from coverage.backward import string_class, to_bytes, unicode_class
+
+
+# Use PyContracts for assertion testing on parameters and returns, but only if
+# we are running our own test suite.
+if env.TESTING:
+ from contracts import contract # pylint: disable=unused-import
+ from contracts import new_contract
+
+ try:
+ # Define contract words that PyContract doesn't have.
+ new_contract('bytes', lambda v: isinstance(v, bytes))
+ if env.PY3:
+ new_contract('unicode', lambda v: isinstance(v, unicode_class))
+ except ValueError:
+ # During meta-coverage, this module is imported twice, and PyContracts
+ # doesn't like redefining contracts. It's OK.
+ pass
+else: # pragma: not covered
+ # We aren't using real PyContracts, so just define a no-op decorator as a
+ # stunt double.
+ def contract(**unused):
+ """Dummy no-op implementation of `contract`."""
+ return lambda func: func
def nice_pair(pair):
@@ -56,12 +82,6 @@ def format_lines(statements, lines):
return ret
-def short_stack(): # pragma: debugging
- """Return a string summarizing the call stack."""
- stack = inspect.stack()[:0:-1]
- return "\n".join("%30s : %s @%d" % (t[3], t[1], t[2]) for t in stack)
-
-
def expensive(fn):
"""A decorator to cache the result of an expensive operation.
@@ -139,29 +159,6 @@ class Hasher(object):
return self.md5.hexdigest()
-def overrides(obj, method_name, base_class):
- """Does `obj` override the `method_name` it got from `base_class`?
-
- Determine if `obj` implements the method called `method_name`, which it
- inherited from `base_class`.
-
- Returns a boolean.
-
- """
- klass = obj.__class__
- klass_func = getattr(klass, method_name)
- base_func = getattr(base_class, method_name)
-
- # Python 2/3 compatibility: Python 2 returns an instancemethod object, the
- # function is the .im_func attribute. Python 3 returns a plain function
- # object already.
- if env.PY2:
- klass_func = klass_func.im_func
- base_func = base_func.im_func
-
- return klass_func is not base_func
-
-
# TODO: abc?
def _needs_to_implement(that, func_name):
"""Helper to raise NotImplementedError in interface stubs."""
@@ -181,7 +178,7 @@ def _needs_to_implement(that, func_name):
class CoverageException(Exception):
- """An exception specific to Coverage."""
+ """An exception specific to coverage.py."""
pass