summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Madden <jamadden@gmail.com>2017-06-14 09:45:49 -0500
committerJason Madden <jamadden@gmail.com>2017-06-14 09:45:49 -0500
commit3a1a264e6dc116c620153d2b691d5668dfaee9a4 (patch)
tree2e6d6c39cc32b8aacf5e47252723a15f2e55e37b
parentbf0565350d8973f8ba260d0824678248d053de11 (diff)
downloadzope-interface-combined-coverage.tar.gz
Enable combined coverage reports under tox and branch coveragecombined-coverage
Fixes #91 Remove many (or most) now-redundant 'pragma: no cover'. A few minor test changes to get full branch coverage.
-rw-r--r--.coveragerc2
-rw-r--r--.gitignore1
-rw-r--r--src/zope/interface/_compat.py8
-rw-r--r--src/zope/interface/adapter.py4
-rw-r--r--src/zope/interface/advice.py4
-rw-r--r--src/zope/interface/declarations.py19
-rw-r--r--src/zope/interface/interface.py6
-rw-r--r--src/zope/interface/tests/advisory_testing.py2
-rw-r--r--src/zope/interface/tests/odd.py2
-rw-r--r--src/zope/interface/tests/test_adapter.py6
-rw-r--r--src/zope/interface/tests/test_declarations.py33
-rw-r--r--src/zope/interface/tests/test_exceptions.py11
-rw-r--r--src/zope/interface/tests/test_interface.py23
-rw-r--r--src/zope/interface/tests/test_odd_declarations.py2
-rw-r--r--src/zope/interface/verify.py6
-rw-r--r--tox.ini23
16 files changed, 80 insertions, 72 deletions
diff --git a/.coveragerc b/.coveragerc
index bc0afe5..29bc9de 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -1,4 +1,5 @@
[run]
+branch = True
source = zope.interface
[report]
@@ -8,4 +9,3 @@ exclude_lines =
class I[A-Z]\w+\((Interface|I[A-Z].*)\):
raise NotImplementedError
self\.fail
- @_skip_under_py2
diff --git a/.gitignore b/.gitignore
index f261c9d..35946f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@
*.so
__pycache__
.coverage
+.coverage.*
.installed.cfg
nosetests.xml
coverage.xml
diff --git a/src/zope/interface/_compat.py b/src/zope/interface/_compat.py
index b9c19dc..fb61e13 100644
--- a/src/zope/interface/_compat.py
+++ b/src/zope/interface/_compat.py
@@ -16,7 +16,7 @@
import sys
import types
-if sys.version_info[0] < 3: #pragma NO COVER
+if sys.version_info[0] < 3:
def _normalize_name(name):
if isinstance(name, basestring):
@@ -31,7 +31,7 @@ if sys.version_info[0] < 3: #pragma NO COVER
PYTHON3 = False
PYTHON2 = True
-else: # pragma: no cover
+else:
def _normalize_name(name):
if isinstance(name, bytes):
@@ -48,11 +48,11 @@ else: # pragma: no cover
PYTHON3 = True
PYTHON2 = False
-def _skip_under_py3k(test_method): # pragma: no cover
+def _skip_under_py3k(test_method):
import unittest
return unittest.skipIf(sys.version_info[0] >= 3, "Only on Python 2")(test_method)
-def _skip_under_py2(test_method): # pragma: no cover
+def _skip_under_py2(test_method):
import unittest
return unittest.skipIf(sys.version_info[0] < 3, "Only on Python 3")(test_method)
diff --git a/src/zope/interface/adapter.py b/src/zope/interface/adapter.py
index b39ceba..d4825b2 100644
--- a/src/zope/interface/adapter.py
+++ b/src/zope/interface/adapter.py
@@ -410,7 +410,7 @@ LookupBasePy = LookupBaseFallback # BBB
try:
from zope.interface._zope_interface_coptimizations import LookupBase
-except ImportError: # pragma: no cover
+except ImportError:
LookupBase = LookupBaseFallback
@@ -446,7 +446,7 @@ VerifyingBasePy = VerifyingBaseFallback #BBB
try:
from zope.interface._zope_interface_coptimizations import VerifyingBase
-except ImportError: # pragma: no cover
+except ImportError:
VerifyingBase = VerifyingBaseFallback
diff --git a/src/zope/interface/advice.py b/src/zope/interface/advice.py
index 6bf4815..e55930d 100644
--- a/src/zope/interface/advice.py
+++ b/src/zope/interface/advice.py
@@ -28,9 +28,9 @@ Visit the PEAK home page at http://peak.telecommunity.com for more information.
from types import FunctionType
try:
from types import ClassType
-except ImportError: # pragma: no cover Python > 3.x
+except ImportError:
__python3 = True
-else: # pragma: no cover Python < 3.x
+else:
__python3 = False
import sys
diff --git a/src/zope/interface/declarations.py b/src/zope/interface/declarations.py
index 13433bd..aaf196b 100644
--- a/src/zope/interface/declarations.py
+++ b/src/zope/interface/declarations.py
@@ -436,8 +436,7 @@ class implementer_only:
def _implements(name, interfaces, classImplements):
# This entire approach is invalid under Py3K. Don't even try to fix
# the coverage for this block there. :(
- if PYTHON3: # pragma: no cover
- raise TypeError('Class advice impossible in Python3')
+ assert not PYTHON3, "Class advice impossible in Python 3"
frame = sys._getframe(2)
locals = frame.f_locals
@@ -481,7 +480,7 @@ def implements(*interfaces):
"""
# This entire approach is invalid under Py3K. Don't even try to fix
# the coverage for this block there. :(
- if PYTHON3: # pragma: no cover
+ if PYTHON3:
raise TypeError(_ADVICE_ERROR % 'implementer')
_implements("implements", interfaces, classImplements)
@@ -509,7 +508,7 @@ def implementsOnly(*interfaces):
"""
# This entire approach is invalid under Py3K. Don't even try to fix
# the coverage for this block there. :(
- if PYTHON3: # pragma: no cover
+ if PYTHON3:
raise TypeError(_ADVICE_ERROR % 'implementer_only')
_implements("implementsOnly", interfaces, classImplementsOnly)
@@ -581,7 +580,7 @@ def directlyProvides(object, *interfaces):
# Note that we can't get here from Py3k tests: there is no normal
# class which isn't descriptor aware.
if not isinstance(object,
- DescriptorAwareMetaClasses): # pragma: no cover Py3k
+ DescriptorAwareMetaClasses):
raise TypeError("Attempt to make an interface declaration on a "
"non-descriptor-aware class")
@@ -641,9 +640,9 @@ ClassProvidesBase = ClassProvidesBaseFallback
# Try to get C base:
try:
import zope.interface._zope_interface_coptimizations
-except ImportError: # pragma: no cover
+except ImportError:
pass
-else: # pragma: no cover
+else:
from zope.interface._zope_interface_coptimizations import ClassProvidesBase
@@ -715,7 +714,7 @@ def classProvides(*interfaces):
# This entire approach is invalid under Py3K. Don't even try to fix
# the coverage for this block there. :(
- if PYTHON3: # pragma: no cover
+ if PYTHON3:
raise TypeError(_ADVICE_ERROR % 'provider')
frame = sys._getframe(1)
@@ -918,9 +917,9 @@ _empty = Declaration()
try:
import zope.interface._zope_interface_coptimizations
-except ImportError: # pragma: no cover
+except ImportError:
pass
-else: # pragma: no cover PyPy
+else:
from zope.interface._zope_interface_coptimizations import implementedBy
from zope.interface._zope_interface_coptimizations import providedBy
from zope.interface._zope_interface_coptimizations import (
diff --git a/src/zope/interface/interface.py b/src/zope/interface/interface.py
index 382f14c..e44f93f 100644
--- a/src/zope/interface/interface.py
+++ b/src/zope/interface/interface.py
@@ -115,7 +115,7 @@ class SpecificationBasePy(object):
SpecificationBase = SpecificationBasePy
try:
from zope.interface._zope_interface_coptimizations import SpecificationBase
-except ImportError: # pragma: no cover
+except ImportError:
pass
_marker = object()
@@ -156,14 +156,14 @@ class InterfaceBasePy(object):
InterfaceBase = InterfaceBasePy
try:
from zope.interface._zope_interface_coptimizations import InterfaceBase
-except ImportError: # pragma: no cover
+except ImportError:
pass
adapter_hooks = []
try:
from zope.interface._zope_interface_coptimizations import adapter_hooks
-except ImportError: # pragma: no cover
+except ImportError:
pass
diff --git a/src/zope/interface/tests/advisory_testing.py b/src/zope/interface/tests/advisory_testing.py
index 30dadc5..b159e93 100644
--- a/src/zope/interface/tests/advisory_testing.py
+++ b/src/zope/interface/tests/advisory_testing.py
@@ -32,7 +32,7 @@ try:
class ClassicClass:
__metaclass__ = ClassType
classLevelFrameInfo = getFrameInfo(sys._getframe())
-except ImportError: # pragma: no cover (Py3, this module may not even be imported)
+except ImportError:
ClassicClass = None
class NewStyleClass:
diff --git a/src/zope/interface/tests/odd.py b/src/zope/interface/tests/odd.py
index 7789a76..74c6158 100644
--- a/src/zope/interface/tests/odd.py
+++ b/src/zope/interface/tests/odd.py
@@ -72,7 +72,7 @@ class MetaMetaClass(type):
if name == '__class__':
return cls
# Under Python 3.6, __prepare__ gets requested
- return type.__getattribute__(cls, name) # pragma: no cover
+ return type.__getattribute__(cls, name)
class MetaClass(object):
diff --git a/src/zope/interface/tests/test_adapter.py b/src/zope/interface/tests/test_adapter.py
index 24c3334..7420e1c 100644
--- a/src/zope/interface/tests/test_adapter.py
+++ b/src/zope/interface/tests/test_adapter.py
@@ -558,7 +558,7 @@ class LookupBaseTests(LookupBaseFallbackTests):
from zope.interface.adapter import LookupBaseFallback
try:
import zope.interface._zope_interface_coptimizations
- except ImportError: # pragma: no cover (pypy)
+ except ImportError:
self.assertIs(self._getTargetClass(), LookupBaseFallback)
else:
self.assertIsNot(self._getTargetClass(), LookupBaseFallback)
@@ -729,7 +729,7 @@ class VerifyingBaseTests(VerifyingBaseFallbackTests):
from zope.interface.adapter import VerifyingBaseFallback
try:
import zope.interface._zope_interface_coptimizations
- except ImportError: # pragma: no cover (pypy)
+ except ImportError:
self.assertIs(self._getTargetClass(), VerifyingBaseFallback)
else:
self.assertIsNot(self._getTargetClass(), VerifyingBaseFallback)
@@ -1390,7 +1390,7 @@ class Test_utils(unittest.TestCase):
STR = b'str'
if sys.version_info[0] < 3:
self.assertEqual(_normalize_name(STR), unicode(STR))
- else: # pragma: no cover (tox runs coverage on Python 2)
+ else:
self.assertEqual(_normalize_name(STR), str(STR, 'ascii'))
def test__normalize_name_unicode(self):
diff --git a/src/zope/interface/tests/test_declarations.py b/src/zope/interface/tests/test_declarations.py
index 05b09a5..43f95c8 100644
--- a/src/zope/interface/tests/test_declarations.py
+++ b/src/zope/interface/tests/test_declarations.py
@@ -31,7 +31,7 @@ class _Py3ClassAdvice(object):
exec(code, globs, locs)
self.assertEqual(len(log), 0) # no longer warn
return True
- else: # pragma: no cover (tox runs coverage on Python 2)
+ else:
try:
exec(code, globs, locs)
except TypeError:
@@ -339,10 +339,14 @@ class Test_implementedByFallback(unittest.TestCase):
def test_dictless_wo_existing_Implements_cant_assign___implemented__(self):
class Foo(object):
- def _get_impl(self): return None
- def _set_impl(self, val): raise TypeError
+ def _get_impl(self):
+ raise NotImplementedError()
+ def _set_impl(self, val):
+ raise TypeError
__implemented__ = property(_get_impl, _set_impl)
- def __call__(self): pass #act like a factory
+ def __call__(self):
+ # act like a factory
+ raise NotImplementedError()
foo = Foo()
self.assertRaises(TypeError, self._callFUT, foo)
@@ -479,7 +483,7 @@ class Test_implementedBy(Test_implementedByFallback):
from zope.interface.declarations import implementedBy
try:
import zope.interface._zope_interface_coptimizations
- except ImportError: # pragma: no cover (pypy)
+ except ImportError:
self.assertIs(implementedBy, implementedByFallback)
else:
self.assertIsNot(implementedBy, implementedByFallback)
@@ -685,7 +689,8 @@ class Test_implementer_only(unittest.TestCase):
from zope.interface.interface import InterfaceClass
IFoo = InterfaceClass('IFoo')
decorator = self._makeOne(IFoo)
- def _function(): pass
+ def _function():
+ raise NotImplementedError()
self.assertRaises(ValueError, decorator, _function)
def test_method(self):
@@ -693,7 +698,8 @@ class Test_implementer_only(unittest.TestCase):
IFoo = InterfaceClass('IFoo')
decorator = self._makeOne(IFoo)
class Bar:
- def _method(): pass
+ def _method():
+ raise NotImplementedError()
self.assertRaises(ValueError, decorator, Bar._method)
def test_oldstyle_class(self):
@@ -752,9 +758,8 @@ class Test_implementsOnly(unittest.TestCase, _Py3ClassAdvice):
warnings.resetwarnings()
try:
exec(CODE, globs, locs)
- except TypeError: # pragma: no cover (tox runs coverage on Python 2)
- if not PYTHON3:
- raise
+ except TypeError:
+ self.assertTrue(PYTHON3, "Must be Python 3")
else:
if PYTHON3:
self.fail("Didn't raise TypeError")
@@ -1130,7 +1135,7 @@ class ClassProvidesBaseTests(ClassProvidesBaseFallbackTests):
from zope.interface.declarations import ClassProvidesBaseFallback
try:
import zope.interface._zope_interface_coptimizations
- except ImportError: # pragma: no cover (pypy)
+ except ImportError:
self.assertIs(self._getTargetClass(), ClassProvidesBaseFallback)
else:
self.assertIsNot(self._getTargetClass(), ClassProvidesBaseFallback)
@@ -1441,7 +1446,7 @@ class Test_getObjectSpecification(Test_getObjectSpecificationFallback):
from zope.interface.declarations import getObjectSpecification
try:
import zope.interface._zope_interface_coptimizations
- except ImportError: # pragma: no cover (pypy)
+ except ImportError:
self.assertIs(getObjectSpecification,
getObjectSpecificationFallback)
else:
@@ -1538,7 +1543,7 @@ class Test_providedBy(Test_providedByFallback):
from zope.interface.declarations import providedBy
try:
import zope.interface._zope_interface_coptimizations
- except ImportError: # pragma: no cover (pypy)
+ except ImportError:
self.assertIs(providedBy, providedByFallback)
else:
self.assertIsNot(providedBy, providedByFallback)
@@ -1609,7 +1614,7 @@ class ObjectSpecificationDescriptorTests(
ObjectSpecificationDescriptorFallback)
try:
import zope.interface._zope_interface_coptimizations
- except ImportError: # pragma: no cover (pypy)
+ except ImportError:
self.assertIs(self._getTargetClass(),
ObjectSpecificationDescriptorFallback)
else:
diff --git a/src/zope/interface/tests/test_exceptions.py b/src/zope/interface/tests/test_exceptions.py
index 94009f6..ae73f9c 100644
--- a/src/zope/interface/tests/test_exceptions.py
+++ b/src/zope/interface/tests/test_exceptions.py
@@ -27,9 +27,8 @@ class DoesNotImplementTests(unittest.TestCase):
from zope.interface.exceptions import DoesNotImplement
return DoesNotImplement
- def _makeOne(self, iface=None):
- if iface is None:
- iface = _makeIface()
+ def _makeOne(self):
+ iface = _makeIface()
return self._getTargetClass()(iface)
def test___str__(self):
@@ -45,9 +44,8 @@ class BrokenImplementationTests(unittest.TestCase):
from zope.interface.exceptions import BrokenImplementation
return BrokenImplementation
- def _makeOne(self, iface=None, name='missing'):
- if iface is None:
- iface = _makeIface()
+ def _makeOne(self, name='missing'):
+ iface = _makeIface()
return self._getTargetClass()(iface, name)
def test___str__(self):
@@ -72,4 +70,3 @@ class BrokenMethodImplementationTests(unittest.TestCase):
self.assertEqual(str(dni),
'The implementation of aMethod violates its contract\n'
' because I said so.\n ')
-
diff --git a/src/zope/interface/tests/test_interface.py b/src/zope/interface/tests/test_interface.py
index f14c76f..58ed808 100644
--- a/src/zope/interface/tests/test_interface.py
+++ b/src/zope/interface/tests/test_interface.py
@@ -16,6 +16,8 @@
# pylint:disable=protected-access
import unittest
+from zope.interface._compat import _skip_under_py3k
+
_marker = object()
@@ -214,7 +216,7 @@ class SpecificationBaseTests(unittest.TestCase):
from zope.interface.interface import SpecificationBasePy
try:
import zope.interface._zope_interface_coptimizations
- except ImportError: # pragma: no cover (pypy)
+ except ImportError:
self.assertIs(self._getTargetClass(), SpecificationBasePy)
else:
self.assertIsNot(self._getTargetClass(), SpecificationBasePy)
@@ -291,7 +293,7 @@ class InterfaceBaseTests(unittest.TestCase):
from zope.interface.interface import InterfaceBasePy
try:
import zope.interface._zope_interface_coptimizations
- except ImportError: # pragma: no cover (pypy)
+ except ImportError:
self.assertIs(self._getTargetClass(), InterfaceBasePy)
else:
self.assertIsNot(self._getTargetClass(), InterfaceBasePy)
@@ -1677,21 +1679,22 @@ class InterfaceTests(unittest.TestCase):
self.assertEqual(I.__doc__, "")
self.assertEqual(list(I), ['__doc__'])
+ @_skip_under_py3k
def testIssue228(self):
# Test for http://collector.zope.org/Zope3-dev/228
# Old style classes don't have a '__class__' attribute
+ # No old style classes in Python 3, so the test becomes moot.
import sys
- if sys.version[0] < '3':
- # No old style classes in Python 3, so the test becomes moot.
- from zope.interface import Interface
- class I(Interface):
- "xxx"
+ from zope.interface import Interface
+
+ class I(Interface):
+ "xxx"
- class OldStyle:
- __providedBy__ = None
+ class OldStyle:
+ __providedBy__ = None
- self.assertRaises(AttributeError, I.providedBy, OldStyle)
+ self.assertRaises(AttributeError, I.providedBy, OldStyle)
def test_invariant_as_decorator(self):
from zope.interface import Interface
diff --git a/src/zope/interface/tests/test_odd_declarations.py b/src/zope/interface/tests/test_odd_declarations.py
index 5480730..01fa6c6 100644
--- a/src/zope/interface/tests/test_odd_declarations.py
+++ b/src/zope/interface/tests/test_odd_declarations.py
@@ -258,7 +258,7 @@ class Test(unittest.TestCase):
c.c
import sys
- if sys.version[0] == '2': # This test only makes sense under Python 2.x
+ if sys.version_info[0] < 3: # This test only makes sense under Python 2.x
from types import ClassType
assert not isinstance(C, (type, ClassType))
diff --git a/src/zope/interface/verify.py b/src/zope/interface/verify.py
index 5a0e684..098b484 100644
--- a/src/zope/interface/verify.py
+++ b/src/zope/interface/verify.py
@@ -66,10 +66,10 @@ def _verify(iface, candidate, tentative=0, vtype=None):
continue
if isinstance(attr, FunctionType):
- if sys.version[0] == '3' and isinstance(candidate, type):
+ if sys.version_info[0] >= 3 and isinstance(candidate, type):
# This is an "unbound method" in Python 3.
meth = fromFunction(attr, iface, name=name,
- imlevel=1) # pragma: no cover
+ imlevel=1)
else:
# Nope, just a normal function
meth = fromFunction(attr, iface, name=name)
@@ -85,7 +85,7 @@ def _verify(iface, candidate, tentative=0, vtype=None):
raise BrokenMethodImplementation(name, "Not a method")
# sigh, it's callable, but we don't know how to introspect it, so
# we have to give it a pass.
- continue # pragma: no cover
+ continue
# Make sure that the required and implemented method signatures are
# the same.
diff --git a/tox.ini b/tox.ini
index 608fa00..3ed2be4 100644
--- a/tox.ini
+++ b/tox.ini
@@ -4,9 +4,12 @@ envlist =
[testenv]
commands =
- python setup.py -q test -q {posargs}
+ coverage run setup.py -q test -q {posargs}
deps =
- zope.event
+ .[test]
+ coverage
+setenv =
+ COVERAGE_FILE=.coverage.{envname}
[testenv:py27-pure]
setenv =
@@ -24,15 +27,15 @@ commands =
{[testenv]commands}
[testenv:coverage]
-usedevelop = true
-basepython =
- python2.7
+setenv =
+ COVERAGE_FILE=.coverage
+skip_install = true
commands =
- coverage run setup.py -q test -q {posargs}
- coverage report --skip-covered
-deps =
- {[testenv]deps}
- coverage
+ coverage erase
+ coverage combine
+ coverage report
+ coverage html
+ coverage xml
[testenv:docs]
basepython =