zopefoundation / zope.interface

Interfaces for Python
http://zopeinterface.readthedocs.io/
Other
325 stars 71 forks source link

Tests in Sphinx documentation fail with `ZOPE_INTERFACE_STRICT_IRO=1` #241

Closed icemac closed 3 years ago

icemac commented 3 years ago

What I did:

In tox.ini I changed the setenv parameter of [testenv:docs] from ZOPE_INTERFACE_STRICT_IRO=0 to ZOPE_INTERFACE_STRICT_IRO=1

What I expect to happen:

tox -edocs runs fine without any failures.

What actually happened:

$ tox -edocs
docs develop-inst-noop: .../zope.interface
docs installed: alabaster==0.7.12,Babel==2.9.0,certifi==2020.12.5,chardet==4.0.0,coverage==5.5,docutils==0.16,idna==2.10,imagesize==1.2.0,Jinja2==2.11.3,MarkupSafe==1.1.1,packaging==20.9,Pygments==2.8.1,pyparsing==2.4.7,pytz==2021.1,repoze.sphinx.autointerface==0.8,requests==2.25.1,snowballstemmer==2.1.0,Sphinx==3.5.4,sphinxcontrib-applehelp==1.0.2,sphinxcontrib-devhelp==1.0.2,sphinxcontrib-htmlhelp==1.0.3,sphinxcontrib-jsmath==1.0.1,sphinxcontrib-qthelp==1.0.3,sphinxcontrib-serializinghtml==1.1.4,urllib3==1.26.4,zope.event==4.5.0,-e git+https://github.com/zopefoundation/zope.interface@7928bb337425c4a905eabf8697001abc634ff788#egg=zope.interface,zope.testing==4.9
docs run-test-pre: PYTHONHASHSEED='3058271445'
docs run-test: commands[0] | sphinx-build -b html -d docs/_build/doctrees docs docs/_build/html
Sphinx v3.5.4 in Verwendung
loading pickled environment... erledigt
building [mo]: targets for 0 po files that are out of date
building [html]: targets for 0 source files that are out of date
updating environment: 0 added, 0 changed, 0 removed
looking for now-outdated files... none found
no targets are out of date.
build abgeschlossen.

The HTML pages are in docs/_build/html.
docs run-test: commands[1] | coverage run -p -m sphinx -b doctest -d docs/_build/doctrees docs docs/_build/doctest
Sphinx v3.5.4 in Verwendung
loading pickled environment... erledigt
building [mo]: targets for 0 po files that are out of date
building [doctest]: targets for 18 source files that are out of date
updating environment: 0 added, 0 changed, 0 removed
looking for now-outdated files... none found
running tests...

Document: verify
----------------
**********************************************************************
File "verify.rst", line 89, in default
Failed example:
    classImplements(Foo, IFoo)
Exception raised:
    Traceback (most recent call last):
      File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/doctest.py", line 1337, in __run
        compileflags, 1), test.globs)
      File "<doctest default[1]>", line 1, in <module>
        classImplements(Foo, IFoo)
      File ".../zope.interface/src/zope/interface/declarations.py", line 569, in classImplements
        _classImplements_ordered(spec, tuple(before), tuple(after))
      File ".../zope.interface/src/zope/interface/declarations.py", line 624, in _classImplements_ordered
        spec.__bases__ = tuple(bases)
      File ".../zope.interface/src/zope/interface/interface.py", line 409, in __setBases
        self.changed(self)
      File ".../zope.interface/src/zope/interface/declarations.py", line 338, in changed
        return super(Implements, self).changed(originally_changed)
      File ".../zope.interface/src/zope/interface/interface.py", line 505, in changed
        dependent.changed(originally_changed)
      File ".../zope.interface/src/zope/interface/interface.py", line 492, in changed
        ancestors = self._calculate_sro()
      File ".../zope.interface/src/zope/interface/interface.py", line 460, in _calculate_sro
        for b in self.__bases__
      File ".../zope.interface/src/zope/interface/ro.py", line 624, in ro
        mro = resolver.mro()
      File ".../zope.interface/src/zope/interface/ro.py", line 440, in mro
        self.__mro = tuple(self._merge())
      File ".../zope.interface/src/zope/interface/ro.py", line 431, in _merge
        base = self._choose_next_base(base_tree_remaining)
      File ".../zope.interface/src/zope/interface/ro.py", line 353, in _choose_next_base
        return self._guess_next_base(base_tree_remaining)
      File ".../zope.interface/src/zope/interface/ro.py", line 447, in _guess_next_base
        raise InconsistentResolutionOrderError(self, base_tree_remaining)
    zope.interface.ro.InconsistentResolutionOrderError: InconsistentResolutionOrderError: For object directlyProvides(Foo, IFoo, classImplements(Foo, IFoo)).
    Base ROs:
    {<InterfaceClass module.IFoo>: [<InterfaceClass module.IFoo>,
                                    <InterfaceClass base.IBase>,
                                    <InterfaceClass zope.interface.Interface>],
     classImplements(Foo, IFoo): [classImplements(Foo, IFoo),
                                  <InterfaceClass module.IFoo>,
                                  <InterfaceClass base.IBase>,
                                  classImplements(object),
                                  <InterfaceClass zope.interface.Interface>]}
    Conflict Location:
    [[<InterfaceClass module.IFoo>,
      <InterfaceClass base.IBase>,
      <InterfaceClass zope.interface.Interface>],
     [classImplements(Foo, IFoo),
      <InterfaceClass module.IFoo>,
      <InterfaceClass base.IBase>,
      classImplements(object),
      <InterfaceClass zope.interface.Interface>],
     [<InterfaceClass module.IFoo>, classImplements(Foo, IFoo)]]
**********************************************************************
1 items had failures:
   1 of  74 in default
74 tests in 1 items.
73 passed and 1 failed.
***Test Failed*** 1 failures.

Document: README
----------------
1 items passed all tests:
 218 tests in default
218 tests in 1 items.
218 passed and 0 failed.
Test passed.

Document: foodforthought
------------------------
1 items passed all tests:
  25 tests in default
25 tests in 1 items.
25 passed and 0 failed.
Test passed.

Document: human
---------------
1 items passed all tests:
  18 tests in default
18 tests in 1 items.
18 passed and 0 failed.
Test passed.

Document: api/declarations
--------------------------
**********************************************************************
File "api/declarations.rst", line 745, in default
Failed example:
    spec -= Declaration(I1, I2)
Exception raised:
    Traceback (most recent call last):
      File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/doctest.py", line 1337, in __run
        compileflags, 1), test.globs)
      File "<doctest default[9]>", line 1, in <module>
        spec -= Declaration(I1, I2)
      File ".../zope.interface/src/zope/interface/declarations.py", line 87, in __init__
        Specification.__init__(self, _normalizeargs(bases))
      File ".../zope.interface/src/zope/interface/interface.py", line 376, in __init__
        self.__bases__ = tuple(bases)
      File ".../zope.interface/src/zope/interface/interface.py", line 409, in __setBases
        self.changed(self)
      File ".../zope.interface/src/zope/interface/interface.py", line 492, in changed
        ancestors = self._calculate_sro()
      File ".../zope.interface/src/zope/interface/interface.py", line 460, in _calculate_sro
        for b in self.__bases__
      File ".../zope.interface/src/zope/interface/ro.py", line 624, in ro
        mro = resolver.mro()
      File ".../zope.interface/src/zope/interface/ro.py", line 440, in mro
        self.__mro = tuple(self._merge())
      File ".../zope.interface/src/zope/interface/ro.py", line 431, in _merge
        base = self._choose_next_base(base_tree_remaining)
      File ".../zope.interface/src/zope/interface/ro.py", line 353, in _choose_next_base
        return self._guess_next_base(base_tree_remaining)
      File ".../zope.interface/src/zope/interface/ro.py", line 447, in _guess_next_base
        raise InconsistentResolutionOrderError(self, base_tree_remaining)
    zope.interface.ro.InconsistentResolutionOrderError: InconsistentResolutionOrderError: For object <zope.interface.declarations.Declaration object at 0x112b41980>.
    Base ROs:
    {<InterfaceClass builtins.I1>: [<InterfaceClass builtins.I1>,
                                    <InterfaceClass zope.interface.Interface>],
     <InterfaceClass builtins.I2>: [<InterfaceClass builtins.I2>,
                                    <InterfaceClass builtins.I1>,
                                    <InterfaceClass zope.interface.Interface>]}
    Conflict Location:
    [[<InterfaceClass builtins.I1>, <InterfaceClass zope.interface.Interface>],
     [<InterfaceClass builtins.I2>,
      <InterfaceClass builtins.I1>,
      <InterfaceClass zope.interface.Interface>],
     [<InterfaceClass builtins.I1>, <InterfaceClass builtins.I2>]]
**********************************************************************
File "api/declarations.rst", line 755, in default
Failed example:
    [iface.getName() for iface
     in spec - Declaration(I3, I4)]
Exception raised:
    Traceback (most recent call last):
      File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/doctest.py", line 1337, in __run
        compileflags, 1), test.globs)
      File "<doctest default[15]>", line 2, in <module>
        in spec - Declaration(I3, I4)]
      File ".../zope.interface/src/zope/interface/declarations.py", line 87, in __init__
        Specification.__init__(self, _normalizeargs(bases))
      File ".../zope.interface/src/zope/interface/interface.py", line 376, in __init__
        self.__bases__ = tuple(bases)
      File ".../zope.interface/src/zope/interface/interface.py", line 409, in __setBases
        self.changed(self)
      File ".../zope.interface/src/zope/interface/interface.py", line 492, in changed
        ancestors = self._calculate_sro()
      File ".../zope.interface/src/zope/interface/interface.py", line 460, in _calculate_sro
        for b in self.__bases__
      File ".../zope.interface/src/zope/interface/ro.py", line 624, in ro
        mro = resolver.mro()
      File ".../zope.interface/src/zope/interface/ro.py", line 440, in mro
        self.__mro = tuple(self._merge())
      File ".../zope.interface/src/zope/interface/ro.py", line 431, in _merge
        base = self._choose_next_base(base_tree_remaining)
      File ".../zope.interface/src/zope/interface/ro.py", line 353, in _choose_next_base
        return self._guess_next_base(base_tree_remaining)
      File ".../zope.interface/src/zope/interface/ro.py", line 447, in _guess_next_base
        raise InconsistentResolutionOrderError(self, base_tree_remaining)
    zope.interface.ro.InconsistentResolutionOrderError: InconsistentResolutionOrderError: For object <zope.interface.declarations.Declaration object at 0x1129b99f0>.
    Base ROs:
    {<InterfaceClass builtins.I3>: [<InterfaceClass builtins.I3>,
                                    <InterfaceClass zope.interface.Interface>],
     <InterfaceClass builtins.I4>: [<InterfaceClass builtins.I4>,
                                    <InterfaceClass builtins.I3>,
                                    <InterfaceClass zope.interface.Interface>]}
    Conflict Location:
    [[<InterfaceClass builtins.I3>, <InterfaceClass zope.interface.Interface>],
     [<InterfaceClass builtins.I4>,
      <InterfaceClass builtins.I3>,
      <InterfaceClass zope.interface.Interface>],
     [<InterfaceClass builtins.I3>, <InterfaceClass builtins.I4>]]
**********************************************************************
File "api/declarations.rst", line 785, in default
Failed example:
    spec2 += Declaration(IRoot2, IDerived2)
Exception raised:
    Traceback (most recent call last):
      File "/opt/local/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/doctest.py", line 1337, in __run
        compileflags, 1), test.globs)
      File "<doctest default[13]>", line 1, in <module>
        spec2 += Declaration(IRoot2, IDerived2)
      File ".../zope.interface/src/zope/interface/declarations.py", line 87, in __init__
        Specification.__init__(self, _normalizeargs(bases))
      File ".../zope.interface/src/zope/interface/interface.py", line 376, in __init__
        self.__bases__ = tuple(bases)
      File ".../zope.interface/src/zope/interface/interface.py", line 409, in __setBases
        self.changed(self)
      File ".../zope.interface/src/zope/interface/interface.py", line 492, in changed
        ancestors = self._calculate_sro()
      File ".../zope.interface/src/zope/interface/interface.py", line 460, in _calculate_sro
        for b in self.__bases__
      File ".../zope.interface/src/zope/interface/ro.py", line 624, in ro
        mro = resolver.mro()
      File ".../zope.interface/src/zope/interface/ro.py", line 440, in mro
        self.__mro = tuple(self._merge())
      File ".../zope.interface/src/zope/interface/ro.py", line 431, in _merge
        base = self._choose_next_base(base_tree_remaining)
      File ".../zope.interface/src/zope/interface/ro.py", line 353, in _choose_next_base
        return self._guess_next_base(base_tree_remaining)
      File ".../zope.interface/src/zope/interface/ro.py", line 447, in _guess_next_base
        raise InconsistentResolutionOrderError(self, base_tree_remaining)
    zope.interface.ro.InconsistentResolutionOrderError: InconsistentResolutionOrderError: For object <zope.interface.declarations.Declaration object at 0x1129b9b40>.
    Base ROs:
    {<InterfaceClass builtins.IDerived2>: [<InterfaceClass builtins.IDerived2>,
                                           <InterfaceClass builtins.IRoot2>,
                                           <InterfaceClass zope.interface.Interface>],
     <InterfaceClass builtins.IRoot2>: [<InterfaceClass builtins.IRoot2>,
                                        <InterfaceClass zope.interface.Interface>]}
    Conflict Location:
    [[<InterfaceClass builtins.IRoot2>, <InterfaceClass zope.interface.Interface>],
     [<InterfaceClass builtins.IDerived2>,
      <InterfaceClass builtins.IRoot2>,
      <InterfaceClass zope.interface.Interface>],
     [<InterfaceClass builtins.IRoot2>, <InterfaceClass builtins.IDerived2>]]
**********************************************************************
File "api/declarations.rst", line 786, in default
Failed example:
    [iface.getName() for iface in spec2]
Expected:
    ['IDerived2', 'IRoot2']
Got:
    []
**********************************************************************
File "api/declarations.rst", line 788, in default
Failed example:
    [iface.getName() for iface in spec+spec2]
Expected:
    ['IRoot1', 'IDerived2', 'IRoot2']
Got:
    ['IRoot1']
**********************************************************************
File "api/declarations.rst", line 790, in default
Failed example:
    [iface.getName() for iface in spec2+spec]
Expected:
    ['IDerived2', 'IRoot2', 'IRoot1']
Got:
    ['IRoot1']
**********************************************************************
File "api/declarations.rst", line 792, in default
Failed example:
    [iface.getName() for iface in (spec+spec2).__bases__]
Expected:
    ['IRoot1', 'IDerived2', 'IRoot2']
Got:
    ['IRoot1']
**********************************************************************
File "api/declarations.rst", line 794, in default
Failed example:
    [iface.getName() for iface in (spec2+spec).__bases__]
Expected:
    ['IDerived2', 'IRoot2', 'IRoot1']
Got:
    ['IRoot1']
**********************************************************************
1 items had failures:
   8 of 302 in default
302 tests in 1 items.
294 passed and 8 failed.
***Test Failed*** 8 failures.

Document: adapter
-----------------
1 items passed all tests:
 164 tests in default
164 tests in 1 items.
164 passed and 0 failed.
Test passed.

Document: api/specifications
----------------------------
1 items passed all tests:
 109 tests in default
109 tests in 1 items.
109 passed and 0 failed.
Test passed.

Doctest summary
===============
  910 tests
    9 failures in tests
    0 failures in setup code
    0 failures in cleanup code
build mit Problemen beendet.
ERROR: InvocationError for command .../zope.interface/.tox/docs/bin/coverage run -p -m sphinx -b doctest -d docs/_build/doctrees docs docs/_build/doctest (exited with code 1)
_________________________________________________________________________ summary __________________________________________________________________________
ERROR:   docs: commands failed

What version of Python and Zope/Addons I am using: