Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

3.9.1: pytest is failing #348

Closed
kloczek opened this issue Mar 10, 2022 · 16 comments
Closed

3.9.1: pytest is failing #348

kloczek opened this issue Mar 10, 2022 · 16 comments

Comments

@kloczek
Copy link
Contributor

kloczek commented Mar 10, 2022

I'm trying to package your module as an rpm package. So I'm using the typical PEP517 based build, install and test cycle used on building packages from non-root account.

  • python3 -sBm build -w --no-isolation
  • because I'm calling build with --no-isolation I'm using during all processes only locally installed modules
  • install .whl file in </install/prefix>
  • run pytest with PYTHONPATH pointing to sitearch and sitelib inside </install/prefix>

Here is pytest output:

+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/python-chameleon-3.9.1-5.fc35.x86_64/usr/lib64/python3.8/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/python-chameleon-3.9.1-5.fc35.x86_64/usr/lib/python3.8/site-packages
+ /usr/bin/pytest -ra
=========================================================================== test session starts ============================================================================
platform linux -- Python 3.8.12, pytest-6.2.5, py-1.11.0, pluggy-1.0.0
rootdir: /home/tkloczko/rpmbuild/BUILD/chameleon-3.9.1
collected 71 items

src/chameleon/tests/test_astutil.py .                                                                                                                                [  1%]
src/chameleon/tests/test_doctests.py EEEEE                                                                                                                           [  8%]
src/chameleon/tests/test_exc.py .                                                                                                                                    [  9%]
src/chameleon/tests/test_loader.py ........                                                                                                                          [ 21%]
src/chameleon/tests/test_parser.py ..                                                                                                                                [ 23%]
src/chameleon/tests/test_sniffing.py ....                                                                                                                            [ 29%]
src/chameleon/tests/test_templates.py ................................................                                                                               [ 97%]
src/chameleon/tests/test_tokenizer.py ..                                                                                                                             [100%]

================================================================================== ERRORS ==================================================================================
_______________________________________________________________ ERROR at setup of DoctestCase.test_compiler ________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7ff580f1e3a0>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:311:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:255: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:265: in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:80: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:150: in pytest_runtest_setup
    item.session._setupstate.prepare(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:452: in prepare
    raise e
/usr/lib/python3.8/site-packages/_pytest/runner.py:449: in prepare
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_compiler>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_compiler'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:195: AttributeError
__________________________________________________________________ ERROR at setup of DoctestCase.test_exc __________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7ff580313af0>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:311:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:255: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:265: in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:80: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:150: in pytest_runtest_setup
    item.session._setupstate.prepare(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:452: in prepare
    raise e
/usr/lib/python3.8/site-packages/_pytest/runner.py:449: in prepare
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_exc>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_exc'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:195: AttributeError
__________________________________________________________________ ERROR at setup of DoctestCase.test_tal __________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7ff5801ebd30>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:311:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:255: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:265: in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:80: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:150: in pytest_runtest_setup
    item.session._setupstate.prepare(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:452: in prepare
    raise e
/usr/lib/python3.8/site-packages/_pytest/runner.py:449: in prepare
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_tal>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_tal'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:195: AttributeError
_________________________________________________________________ ERROR at setup of DoctestCase.test_tales _________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7ff580fd3790>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:311:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:255: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:265: in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:80: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:150: in pytest_runtest_setup
    item.session._setupstate.prepare(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:452: in prepare
    raise e
/usr/lib/python3.8/site-packages/_pytest/runner.py:449: in prepare
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_tales>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_tales'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:195: AttributeError
_________________________________________________________________ ERROR at setup of DoctestCase.test_utils _________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7ff58038ef70>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:311:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:255: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:265: in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:80: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:150: in pytest_runtest_setup
    item.session._setupstate.prepare(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:452: in prepare
    raise e
/usr/lib/python3.8/site-packages/_pytest/runner.py:449: in prepare
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_utils>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_utils'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:195: AttributeError
========================================================================= short test summary info ==========================================================================
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_compiler - AttributeError: '_DocTestSuite' object has no attribute 'test_compiler'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_exc - AttributeError: '_DocTestSuite' object has no attribute 'test_exc'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_tal - AttributeError: '_DocTestSuite' object has no attribute 'test_tal'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_tales - AttributeError: '_DocTestSuite' object has no attribute 'test_tales'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_utils - AttributeError: '_DocTestSuite' object has no attribute 'test_utils'
======================================================================= 66 passed, 5 errors in 2.97s =======================================================================
@icemac
Copy link
Contributor

icemac commented Mar 11, 2022

@kloczek You have hit another project those tests do not run using pytest, see

coverage run -m zope.testrunner -m chameleon --path={toxinidir}/src []
how to run the tests for this project.

@kloczek
Copy link
Contributor Author

kloczek commented Apr 22, 2022

It is one very good reason to support pytest. That framework provides way better flexilibily of testing by just install pytest extension. zope.testrunner is more and more behind what pytest can do.
Just one stat from my library of rpm spec files used to build python modules

[tkloczko@devel-g2v SPECS]$ grep ^%pytest python-* | wc -l; ls -1 python-* | wc -l
802
904

With that I'm able to asses quality of all those modules just by performe mass test build with added exact pytest extension to build env.
I'm not asking to move away from zope.testrunner. I'm only asking to have quick look on what needs to be done to be able use chameleon with pytest .. only this and nothing more 😃
Maybe necessary adaptations are really easy/simple 🙂

@kloczek
Copy link
Contributor Author

kloczek commented Sep 19, 2022

Just FTR: retested 3.10.1 and lookd like pytest still is failing the same way.

@kloczek
Copy link
Contributor Author

kloczek commented Jul 1, 2023

Just tested 4.0.1 and here is pytest output:

+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/python-chameleon-4.0.1-3.fc35.x86_64/usr/lib64/python3.8/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/python-chameleon-4.0.1-3.fc35.x86_64/usr/lib/python3.8/site-packages
+ /usr/bin/pytest -ra -m 'not network'
==================================================================================== test session starts ====================================================================================
platform linux -- Python 3.8.17, pytest-7.4.0, pluggy-1.0.0
rootdir: /home/tkloczko/rpmbuild/BUILD/chameleon-4.0.1
collected 72 items

src/chameleon/tests/test_astutil.py .                                                                                                                                                 [  1%]
src/chameleon/tests/test_doctests.py EEEEE                                                                                                                                            [  8%]
src/chameleon/tests/test_exc.py ..                                                                                                                                                    [ 11%]
src/chameleon/tests/test_loader.py ........                                                                                                                                           [ 22%]
src/chameleon/tests/test_parser.py ..                                                                                                                                                 [ 25%]
src/chameleon/tests/test_sniffing.py ....                                                                                                                                             [ 30%]
src/chameleon/tests/test_templates.py ................................................                                                                                                [ 97%]
src/chameleon/tests/test_tokenizer.py ..                                                                                                                                              [100%]

========================================================================================== ERRORS ===========================================================================================
________________________________________________________________________ ERROR at setup of DoctestCase.test_compiler ________________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7fe5f86e2280>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:265: in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:80: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_compiler>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_compiler'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
__________________________________________________________________________ ERROR at setup of DoctestCase.test_exc ___________________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7fe5f8174550>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:265: in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:80: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_exc>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_exc'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
__________________________________________________________________________ ERROR at setup of DoctestCase.test_tal ___________________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7fe5f813f820>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:265: in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:80: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_tal>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_tal'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
_________________________________________________________________________ ERROR at setup of DoctestCase.test_tales __________________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7fe5f813fd30>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:265: in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:80: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_tales>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_tales'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
_________________________________________________________________________ ERROR at setup of DoctestCase.test_utils __________________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7fe5f818fd30>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:265: in __call__
    return self._hookexec(self.name, self.get_hookimpls(), kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:80: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_utils>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_utils'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
===================================================================================== warnings summary ======================================================================================
src/chameleon/loader.py:12
  /home/tkloczko/rpmbuild/BUILD/chameleon-4.0.1/src/chameleon/loader.py:12: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html
    import pkg_resources

../../../../../usr/lib/python3.8/site-packages/pkg_resources/__init__.py:2871
../../../../../usr/lib/python3.8/site-packages/pkg_resources/__init__.py:2871
  /usr/lib/python3.8/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('zope')`.
  Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages
    declare_namespace(pkg)

../../../../../usr/lib/python3.8/site-packages/pkg_resources/__init__.py:2871
../../../../../usr/lib/python3.8/site-packages/pkg_resources/__init__.py:2871
../../../../../usr/lib/python3.8/site-packages/pkg_resources/__init__.py:2871
../../../../../usr/lib/python3.8/site-packages/pkg_resources/__init__.py:2871
../../../../../usr/lib/python3.8/site-packages/pkg_resources/__init__.py:2871
  /usr/lib/python3.8/site-packages/pkg_resources/__init__.py:2871: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('sphinxcontrib')`.
  Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages
    declare_namespace(pkg)

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
================================================================================== short test summary info ==================================================================================
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_compiler - AttributeError: '_DocTestSuite' object has no attribute 'test_compiler'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_exc - AttributeError: '_DocTestSuite' object has no attribute 'test_exc'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_tal - AttributeError: '_DocTestSuite' object has no attribute 'test_tal'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_tales - AttributeError: '_DocTestSuite' object has no attribute 'test_tales'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_utils - AttributeError: '_DocTestSuite' object has no attribute 'test_utils'
========================================================================= 67 passed, 8 warnings, 5 errors in 3.01s ==========================================================================

@icemac
Copy link
Contributor

icemac commented Jul 3, 2023

And version 4.1, 5.0, … will fail running the tests using pytest.
Just please accept the decisions of the developers and maintainers of this project.

@kloczek
Copy link
Contributor Author

kloczek commented Jul 3, 2023

There are as well some deprecation warnings ..

@kloczek
Copy link
Contributor Author

kloczek commented Dec 4, 2023

And version 4.1, 5.0, … will fail running the tests using pytest.

Currently test suite uses unittest.
pytest can handle correctly written unittest based test suite.

Just tested 4.3.0 and now test suite fails with more errors.

Here is pytest output:
+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/python-chameleon-4.3.0-2.fc35.x86_64/usr/lib64/python3.8/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/python-chameleon-4.3.0-2.fc35.x86_64/usr/lib/python3.8/site-packages
+ /usr/bin/pytest -ra -m 'not network'
============================= test session starts ==============================
platform linux -- Python 3.8.18, pytest-7.4.3, pluggy-1.3.0
rootdir: /home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0
collected 107 items

src/chameleon/tests/test_astutil.py .                                    [  0%]
src/chameleon/tests/test_bools_plus_sniffing.py ........................ [ 23%]
......                                                                   [ 28%]
src/chameleon/tests/test_doctests.py EEEEE                               [ 33%]
src/chameleon/tests/test_exc.py ..                                       [ 35%]
src/chameleon/tests/test_loader.py EEEEEEEEEE                            [ 44%]
src/chameleon/tests/test_parser.py ..                                    [ 46%]
src/chameleon/tests/test_sniffing.py ....                                [ 50%]
src/chameleon/tests/test_templates.py .................................. [ 82%]
............F.                                                           [ 95%]
src/chameleon/tests/test_tokenizer.py ..                                 [ 97%]
src/chameleon/tests/test_utils.py ...                                    [100%]

==================================== ERRORS ====================================
_________________ ERROR at setup of DoctestCase.test_compiler __________________

cls = <class '_pytest.runner.CallInfo'>
func = <function call_runtest_hook.<locals>.<lambda> at 0x7fe4e8751e50>
when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_compiler>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_compiler'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
____________________ ERROR at setup of DoctestCase.test_exc ____________________

cls = <class '_pytest.runner.CallInfo'>
func = <function call_runtest_hook.<locals>.<lambda> at 0x7fe4e8746c10>
when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_exc>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_exc'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
____________________ ERROR at setup of DoctestCase.test_tal ____________________

cls = <class '_pytest.runner.CallInfo'>
func = <function call_runtest_hook.<locals>.<lambda> at 0x7fe4e993f820>
when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_tal>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_tal'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
___________________ ERROR at setup of DoctestCase.test_tales ___________________

cls = <class '_pytest.runner.CallInfo'>
func = <function call_runtest_hook.<locals>.<lambda> at 0x7fe4e993f8b0>
when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_tales>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_tales'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
___________________ ERROR at setup of DoctestCase.test_utils ___________________

cls = <class '_pytest.runner.CallInfo'>
func = <function call_runtest_hook.<locals>.<lambda> at 0x7fe4e993f670>
when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_utils>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_utils'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
____________ ERROR at setup of LoadPageTests.test_consecutive_loads ____________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e846fc40>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e84d5d60>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e84d5d60>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e846fc40>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e84d5d60>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e84d5d60>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
________________ ERROR at setup of LoadPageTests.test_load_abs _________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e84eafa0>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e84ac160>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e84ac160>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e84eafa0>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e84ac160>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e84ac160>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
________________ ERROR at setup of LoadPageTests.test_load_egg _________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e8568820>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e8716fd0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e8716fd0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e8568820>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e8716fd0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e8716fd0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
______________ ERROR at setup of LoadPageTests.test_load_relative ______________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e860a2e0>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e84963a0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e84963a0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e860a2e0>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e84963a0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e84963a0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
___ ERROR at setup of LoadPageTests.test_load_relative_badpath_in_searchpath ___

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e843d820>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e872f6a0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e872f6a0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e843d820>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e872f6a0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e872f6a0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
_______________ ERROR at setup of LoadPageTests.test_load_wheel ________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e869f190>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e8bca610>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e8bca610>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e869f190>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e8bca610>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e8bca610>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
_________________ ERROR at setup of ModuleLoadTests.test_build _________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e842e940>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e864d790>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e864d790>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e842e940>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e864d790>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e864d790>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
________ ERROR at setup of ZPTLoadTests.test_load_getitem_gets_xml_file ________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e84d5ee0>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e840a3a0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e840a3a0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e84d5ee0>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e840a3a0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e840a3a0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
________________ ERROR at setup of ZPTLoadTests.test_load_text _________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e8502e50>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e869f7c0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e869f7c0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e8502e50>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e869f7c0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e869f7c0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
_________________ ERROR at setup of ZPTLoadTests.test_load_xml _________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e859a2e0>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e84eabe0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e84eabe0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7fe4e859a2e0>
args = ['-ra', '-m', 'not network']
object = <setuptools.dist.Distribution object at 0x7fe4e84eabe0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}
klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7fe4e84eabe0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
=================================== FAILURES ===================================
_____________________ ZopeTemplatesTestSuite.test_pt_files _____________________

self = <PageTemplateFile '/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/tests/inputs/081-load-spec.pt'>
_BaseTemplate__kw = {'__decode': <method 'decode' of 'bytes' objects>, '__on_error_handler': None, '__translate': <function ZopeTemplatesTestSuite.execute.<locals>.translate at 0x7fe4e993f790>, 'content': '<div>Hello world!</div>', ...}
econtext = {'literal': <chameleon.tests.test_templates.ZopeTemplatesTestSuite.test_pt_files.<locals>.Literal object at 0x7fe4e839..._on_error_handler': None, 'repeat': <chameleon.tal.RepeatDict object at 0x7fe4e8496e20>, 'macroname': 'hello_world.pt'}
rcontext = {'__error__': [('load: chameleon:tests/inputs/hello_world.pt', 1, 23, '/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/tests/inputs/081-load-spec.pt', AttributeError("module 'importlib.resources' has no attribute 'files'"))]}
stream = [], target_language = None, cls = <class 'AttributeError'>

    def render(self, **__kw):
        econtext = Scope(__kw)
        rcontext = {}
        self.cook_check()
        stream = self.output_stream_factory()
        target_language = __kw.get("target_language")
        try:
>           self._render(
                stream,
                econtext,
                rcontext,
                target_language=target_language
            )

src/chameleon/template.py:204:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
081_load_spec_9dbece6e0bae00c05035c431eb1f2d78.py:102: in render
    ???
src/chameleon/zpt/template.py:330: in include
    self.cook_check()
src/chameleon/template.py:376: in cook_check
    body = self.read()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <PageTemplateFile 'chameleon:tests/inputs/hello_world.pt'>

    def read(self):
        if self.spec.pname is not None:
>           files = importlib_resources.files(self.spec.pname)
E           AttributeError: module 'importlib.resources' has no attribute 'files'

src/chameleon/template.py:391: AttributeError

During handling of the above exception, another exception occurred:

self = <chameleon.tests.test_templates.ZopeTemplatesTestSuite testMethod=test_pt_files>
ext = '.pt', factory = <class 'chameleon.zpt.template.PageTemplateFile'>
kwargs = {'content': '<div>Hello world!</div>', 'literal': <chameleon.tests.test_templates.ZopeTemplatesTestSuite.test_pt_files...ameleon.zpt.template.PageTemplateFile'>), 'message': <chameleon.tests.test_templates.Message object at 0x7fe4e83936a0>}
translate = <function ZopeTemplatesTestSuite.execute.<locals>.translate at 0x7fe4e993f790>
output_path = '/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/tests/outputs/081.pt'
language = None, implicit_i18n = False, implicit_i18n_attrs = ()
enable_data_attributes = False
template = <PageTemplateFile '/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/tests/inputs/081-load-spec.pt'>

    def execute(self, ext, factory, **kwargs):
        def translate(msgid, domain=None, mapping=None, context=None,
                      target_language=None, default=None):
            if default is None:
                default = str(msgid)

            if isinstance(msgid, Message):
                default = "Message"

            if mapping:
                default = re.sub(r'\${([a-z_]+)}', r'%(\1)s', default) % \
                    mapping

            if target_language is None:
                return default

            if domain is None:
                with_domain = ""
            else:
                with_domain = " with domain '%s'" % domain

            if context is None:
                with_context = ""
            else:
                with_context = ", context '%s'" % context

            stripped = default.rstrip('\n ')
            return "{} ('{}' translation into '{}'{}{}){}".format(
                stripped, msgid, target_language, with_domain, with_context,
                default[len(stripped):]
            )

        for input_path, output_path, language in self.find_files(ext):
            # Make friendly title so we can locate the generated
            # source when debugging
            self.shortDescription = lambda: input_path

            # When input path contains the string 'implicit-i18n', we
            # enable "implicit translation".
            implicit_i18n = 'implicit-i18n' in input_path
            implicit_i18n_attrs = ("alt", "title") if implicit_i18n else ()

            enable_data_attributes = 'data-attributes' in input_path

            template = factory(
                input_path,
                keep_source=True,
                strict=False,
                implicit_i18n_translate=implicit_i18n,
                implicit_i18n_attributes=implicit_i18n_attrs,
                enable_data_attributes=enable_data_attributes,
            )

            params = kwargs.copy()
            params.update({
                'translate': translate,
                'target_language': language,
            })

            template.cook_check()

            try:
>               got = template.render(**params)

src/chameleon/tests/test_templates.py:780:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
src/chameleon/zpt/template.py:327: in render
    return super().render(**_kw)
src/chameleon/template.py:233: in render
    raise_with_traceback(exc, tb)
src/chameleon/utils.py:20: in raise_with_traceback
    raise exc
src/chameleon/template.py:204: in render
    self._render(
081_load_spec_9dbece6e0bae00c05035c431eb1f2d78.py:102: in render
    ???
src/chameleon/zpt/template.py:330: in include
    self.cook_check()
src/chameleon/template.py:376: in cook_check
    body = self.read()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <PageTemplateFile 'chameleon:tests/inputs/hello_world.pt'>

    def read(self):
        if self.spec.pname is not None:
>           files = importlib_resources.files(self.spec.pname)
E           AttributeError: module 'importlib.resources' has no attribute 'files'
E
E            - Expression: "load: chameleon:tests/inputs/hello_world.pt"
E            - Filename:   ... meleon-4.3.0/src/chameleon/tests/inputs/081-load-spec.pt
E            - Location:   (line 1: col 23)
E            - Source:     ... :use-macro="load: chameleon:tests/inputs/hello_world.pt" />
E                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E            - Arguments:  literal: <Literal ('None',) at 0x7fe4e8393340>
E                          content: <div>Hello world!</div>
E                          message: <Message ('None',) at 0x7fe4e83936a0>
E                          load: <partial ('None',) at 0x7fe4e8b33b30>
E                          translate: <function ('translate',) at 0x7fe4e993f790>
E                          target_language: <NoneType ('None',) at 0x7fe4f813fab0>
E                          repeat: <RepeatDict ('None',) at 0x7fe4e8496e20>
E                          macroname: hello_world.pt

src/chameleon/template.py:391: AttributeError

During handling of the above exception, another exception occurred:

self = <chameleon.tests.test_templates.ZopeTemplatesTestSuite testMethod=test_pt_files>

    def test_pt_files(self):
        from ..zpt.template import PageTemplateFile

        class Literal:
            def __init__(self, s):
                self.s = s

            def __html__(self):
                return self.s

            def __str__(self):
                raise RuntimeError(
                    "%r is a literal." % self.s)

        from chameleon.loader import TemplateLoader
        loader = TemplateLoader(os.path.join(self.root, "inputs"))

>       self.execute(
            ".pt", PageTemplateFile,
            literal=Literal("<div>Hello world!</div>"),
            content="<div>Hello world!</div>",
            message=Message(),
            load=loader.bind(PageTemplateFile),
        )

src/chameleon/tests/test_templates.py:706:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
src/chameleon/tests/test_templates.py:784: in execute
    self.fail("{}\n\n    Example source:\n\n{}".format(
E   AssertionError: Traceback (most recent call last):
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/template.py", line 204, in render
E       self._render(
E     File "081_load_spec_9dbece6e0bae00c05035c431eb1f2d78.py", line 102, in render
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/zpt/template.py", line 330, in include
E       self.cook_check()
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/template.py", line 376, in cook_check
E       body = self.read()
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/template.py", line 391, in read
E       files = importlib_resources.files(self.spec.pname)
E   AttributeError: module 'importlib.resources' has no attribute 'files'
E
E   During handling of the above exception, another exception occurred:
E
E   Traceback (most recent call last):
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/tests/test_templates.py", line 780, in execute
E       got = template.render(**params)
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/zpt/template.py", line 327, in render
E       return super().render(**_kw)
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/template.py", line 233, in render
E       raise_with_traceback(exc, tb)
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/utils.py", line 20, in raise_with_traceback
E       raise exc
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/template.py", line 204, in render
E       self._render(
E     File "081_load_spec_9dbece6e0bae00c05035c431eb1f2d78.py", line 102, in render
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/zpt/template.py", line 330, in include
E       self.cook_check()
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/template.py", line 376, in cook_check
E       body = self.read()
E     File "/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/template.py", line 391, in read
E       files = importlib_resources.files(self.spec.pname)
E   AttributeError: module 'importlib.resources' has no attribute 'files'
E
E    - Expression: "load: chameleon:tests/inputs/hello_world.pt"
E    - Filename:   ... meleon-4.3.0/src/chameleon/tests/inputs/081-load-spec.pt
E    - Location:   (line 1: col 23)
E    - Source:     ... :use-macro="load: chameleon:tests/inputs/hello_world.pt" />
E                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
E    - Arguments:  literal: <Literal ('None',) at 0x7fe4e8393340>
E                  content: <div>Hello world!</div>
E                  message: <Message ('None',) at 0x7fe4e83936a0>
E                  load: <partial ('None',) at 0x7fe4e8b33b30>
E                  translate: <function ('translate',) at 0x7fe4e993f790>
E                  target_language: <NoneType ('None',) at 0x7fe4f813fab0>
E                  repeat: <RepeatDict ('None',) at 0x7fe4e8496e20>
E                  macroname: hello_world.pt
E
E
E       Example source:
E
E   001 __spec = '/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/src/chameleon/tests/inputs/081-load-spec.pt'
E   002
E   003 __tokens = {23: ('load: chameleon:tests/inputs/hello_world.pt', 1, 23), 23: ('load: chameleon:tests/inputs/hello_world.pt', 1, 23)}
E   004
E   005 from sys import exc_info as _exc_info
E   006
E   007 _static_140621126396416 = 'hello_world.pt'
E   008 _static_140621133873888 = {}
E   009
E   010 import re
E   011 import functools
E   012 from itertools import chain as __chain
E   013 from sys import intern
E   014 __default = intern('__default__')
E   015 __marker = object()
E   016 g_re_amp = re.compile('&(?!([A-Za-z]+|#[0-9]+);)')
E   017 g_re_needs_escape = re.compile('[&<>\\"\\\']').search
E   018 __re_whitespace = functools.partial(re.compile('\\s+').sub, ' ')
E   019
E   020 def initialize(__loader, macros, nothing, template):
E   021
E   022     def render(__stream, econtext, rcontext, __i18n_domain=None, __i18n_context=None, target_language=None):
E   023         __append = __stream.append
E   024         __re_amp = g_re_amp
E   025         __token = None
E   026         __re_needs_escape = g_re_needs_escape
E   027
E   028         def __convert(target):
E   029             if (target is None):
E   030                 return
E   031             __tt = type(target)
E   032             if (__tt is bytes):
E   033                 target = decode(target)
E   034             else:
E   035                 if (__tt is not str):
E   036                     if ((__tt is int) or (__tt is float) or (__tt is int)):
E   037                         target = str(target)
E   038                     else:
E   039                         render = getattr(target, '__html__', None)
E   040                         if (render is None):
E   041                             __converted = translate(target, domain=__i18n_domain, context=__i18n_context, target_language=target_language)
E   042                             target = (str(target) if (target is __converted) else __converted)
E   043                         else:
E   044                             target = render()
E   045             return target
E   046
E   047         def __quote(target, quote, quote_entity, default, default_marker):
E   048             if (target is None):
E   049                 return
E   050             if (target is default_marker):
E   051                 return default
E   052             __tt = type(target)
E   053             if (__tt is bytes):
E   054                 target = decode(target)
E   055             else:
E   056                 if (__tt is not str):
E   057                     if ((__tt is int) or (__tt is float) or (__tt is int)):
E   058                         return str(target)
E   059                     render = getattr(target, '__html__', None)
E   060                     if (render is None):
E   061                         __converted = translate(target, domain=__i18n_domain, context=__i18n_context, target_language=target_language)
E   062                         target = (str(target) if (target is __converted) else __converted)
E   063                     else:
E   064                         return render()
E   065             if (target is not None):
E   066                 try:
E   067                     escape = (__re_needs_escape(target) is not None)
E   068                 except TypeError:
E   069                     pass
E   070                 else:
E   071                     if escape:
E   072                         if ('&' in target):
E   073                             target = target.replace('&', '&amp;')
E   074                         if ('<' in target):
E   075                             target = target.replace('<', '&lt;')
E   076                         if ('>' in target):
E   077                             target = target.replace('>', '&gt;')
E   078                         if ((quote is not None) and (quote in target)):
E   079                             target = target.replace(quote, quote_entity)
E   080             return target
E   081         translate = econtext['__translate']
E   082         decode = econtext['__decode']
E   083         on_error_handler = econtext['__on_error_handler']
E   084         try:
E   085             getname = econtext.get_name
E   086             get = econtext.get
E   087
E   088             # <Static value=<_ast.Dict object at 0x7fe4e8bb82e0> name=None at 7fe4e896d640> -> __attrs_140621126118080
E   089             __attrs_140621126118080 = _static_140621133873888
E   090             __backup_macroname_140621125698688 = get('macroname', __marker)
E   091
E   092             # <Static value=<_ast.Constant object at 0x7fe4e8496a00> name=None at 7fe4e84967f0> -> __value
E   093             __value = _static_140621126396416
E   094             econtext['macroname'] = __value
E   095
E   096             # <Value 'load: chameleon:tests/inputs/hello_world.pt' (1:23)> -> __macro
E   097             __token = 23
E   098             __macro = ' chameleon:tests/inputs/hello_world.pt'
E   099             __macro = __loader(__macro)
E   100             __token = 23
E   101             __m = __macro.include
E   102             __m(__stream, econtext.copy(), rcontext, __i18n_domain, __i18n_context, target_language)
E   103             econtext.update(rcontext)
E   104             if (__backup_macroname_140621125698688 is __marker):
E   105                 del econtext['macroname']
E   106             else:
E   107                 econtext['macroname'] = __backup_macroname_140621125698688
E   108         except:
E   109             if (__token is not None):
E   110                 rcontext.setdefault('__error__', []).append((__tokens[__token] + (__spec, _exc_info()[1], )))
E   111             raise
E   112
E   113     return {'render': render, }
=========================== short test summary info ============================
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_compiler - Attr...
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_exc - Attribute...
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_tal - Attribute...
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_tales - Attribu...
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_utils - Attribu...
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_consecutive_loads
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_load_abs - Syst...
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_load_egg - Syst...
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_load_relative
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_load_relative_badpath_in_searchpath
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_load_wheel - Sy...
ERROR src/chameleon/tests/test_loader.py::ModuleLoadTests::test_build - Syste...
ERROR src/chameleon/tests/test_loader.py::ZPTLoadTests::test_load_getitem_gets_xml_file
ERROR src/chameleon/tests/test_loader.py::ZPTLoadTests::test_load_text - Syst...
ERROR src/chameleon/tests/test_loader.py::ZPTLoadTests::test_load_xml - Syste...
FAILED src/chameleon/tests/test_templates.py::ZopeTemplatesTestSuite::test_pt_files
=================== 1 failed, 91 passed, 15 errors in 3.77s ====================

@kloczek
Copy link
Contributor Author

kloczek commented Dec 4, 2023

BTW build shows some warnings as well

+ /usr/bin/python3 -sBm build -w --no-isolation
* Getting build dependencies for wheel...
running egg_info
creating src/Chameleon.egg-info
writing src/Chameleon.egg-info/PKG-INFO
writing dependency_links to src/Chameleon.egg-info/dependency_links.txt
writing requirements to src/Chameleon.egg-info/requires.txt
writing top-level names to src/Chameleon.egg-info/top_level.txt
writing manifest file 'src/Chameleon.egg-info/SOURCES.txt'
reading manifest file 'src/Chameleon.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching '*.md'
warning: no files found matching 'buildout.cfg'
warning: no files found matching 'Makefile' under directory 'docs'
adding license file 'LICENSE.txt'
writing manifest file 'src/Chameleon.egg-info/SOURCES.txt'
* Building wheel...
running bdist_wheel
running build
running build_py
creating build
creating build/lib
creating build/lib/chameleon
copying src/chameleon/__init__.py -> build/lib/chameleon
copying src/chameleon/astutil.py -> build/lib/chameleon
copying src/chameleon/benchmark.py -> build/lib/chameleon
copying src/chameleon/codegen.py -> build/lib/chameleon
copying src/chameleon/compiler.py -> build/lib/chameleon
copying src/chameleon/config.py -> build/lib/chameleon
copying src/chameleon/exc.py -> build/lib/chameleon
copying src/chameleon/i18n.py -> build/lib/chameleon
copying src/chameleon/interfaces.py -> build/lib/chameleon
copying src/chameleon/loader.py -> build/lib/chameleon
copying src/chameleon/metal.py -> build/lib/chameleon
copying src/chameleon/namespaces.py -> build/lib/chameleon
copying src/chameleon/nodes.py -> build/lib/chameleon
copying src/chameleon/parser.py -> build/lib/chameleon
copying src/chameleon/program.py -> build/lib/chameleon
copying src/chameleon/tal.py -> build/lib/chameleon
copying src/chameleon/tales.py -> build/lib/chameleon
copying src/chameleon/template.py -> build/lib/chameleon
copying src/chameleon/tokenize.py -> build/lib/chameleon
copying src/chameleon/utils.py -> build/lib/chameleon
creating build/lib/chameleon/tests
copying src/chameleon/tests/__init__.py -> build/lib/chameleon/tests
copying src/chameleon/tests/test_astutil.py -> build/lib/chameleon/tests
copying src/chameleon/tests/test_bools_plus_sniffing.py -> build/lib/chameleon/tests
copying src/chameleon/tests/test_doctests.py -> build/lib/chameleon/tests
copying src/chameleon/tests/test_exc.py -> build/lib/chameleon/tests
copying src/chameleon/tests/test_loader.py -> build/lib/chameleon/tests
copying src/chameleon/tests/test_parser.py -> build/lib/chameleon/tests
copying src/chameleon/tests/test_sniffing.py -> build/lib/chameleon/tests
copying src/chameleon/tests/test_templates.py -> build/lib/chameleon/tests
copying src/chameleon/tests/test_tokenizer.py -> build/lib/chameleon/tests
copying src/chameleon/tests/test_utils.py -> build/lib/chameleon/tests
creating build/lib/chameleon/zpt
copying src/chameleon/zpt/__init__.py -> build/lib/chameleon/zpt
copying src/chameleon/zpt/loader.py -> build/lib/chameleon/zpt
copying src/chameleon/zpt/program.py -> build/lib/chameleon/zpt
copying src/chameleon/zpt/template.py -> build/lib/chameleon/zpt
running egg_info
writing src/Chameleon.egg-info/PKG-INFO
writing dependency_links to src/Chameleon.egg-info/dependency_links.txt
writing requirements to src/Chameleon.egg-info/requires.txt
writing top-level names to src/Chameleon.egg-info/top_level.txt
reading manifest file 'src/Chameleon.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no files found matching '*.md'
warning: no files found matching 'buildout.cfg'
warning: no files found matching 'Makefile' under directory 'docs'
adding license file 'LICENSE.txt'
writing manifest file 'src/Chameleon.egg-info/SOURCES.txt'
creating build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/001-interpolation.txt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/001-variable-scope.html -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/001-variable-scope.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/001.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/002-repeat-scope.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/002.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/003-content.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/003.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/004-attributes.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/004.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/005-default.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/005.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/006-attribute-interpolation.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/006.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/007-content-interpolation.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/007.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/008-builtins.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/008.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/009-literals.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/009.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/010-structure.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/010.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/011-messages.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/011.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/012-translation.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/012.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/013-repeat-nested.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/013.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/014-repeat-nested-similar.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/014.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/015-translation-nested.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/015.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/016-explicit-translation.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/016.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/017-omit-tag.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/017.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/018-translation-nested-dynamic.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/018.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/019-replace.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/019.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/020-on-error.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/020.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/021-translation-domain.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/021.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/022-switch.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/022.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/023-condition.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/023.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/024-namespace-elements.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/024.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/025-repeat-whitespace.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/025.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/026-repeat-variable.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/026.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/027-attribute-replacement.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/027.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/028-attribute-toggle.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/028.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/029-attribute-ordering.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/029.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/030-repeat-tuples.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/030.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/031-namespace-with-tal.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/031.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/032-master-template.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/032.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/033-use-macro-trivial.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/033.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/034-use-template-as-macro.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/034.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/035-use-macro-with-fill-slot.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/035.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/036-use-macro-inherits-dynamic-scope.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/036.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/037-use-macro-local-variable-scope.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/037.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/038-use-macro-globals.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/038.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/039-globals.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/039.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/040-macro-using-template-symbol.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/040.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/041-translate-nested-names.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/041.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/042-use-macro-fill-footer.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/042.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/043-macro-nested-dynamic-vars.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/043.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/044-tuple-define.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/044.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/045-namespaces.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/045.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/046-extend-macro.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/046.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/047-use-extended-macro.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/047.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/048-use-extended-macro-fill-original.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/048.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/049-entities-in-attributes.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/049.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/050-define-macro-and-use-not-extend.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/050.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/051-use-non-extended-macro.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/051.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/052-i18n-domain-inside-filled-slot.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/052.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/053-special-characters-in-attributes.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/053.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/054-import-expression.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/054.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/055-attribute-fallback-to-dict-lookup.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/055.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/056-comment-attribute.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/056.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/057-order.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/057.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/058-script.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/058.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/059-embedded-javascript.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/059.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/060-macro-with-multiple-same-slots.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/060.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/061-fill-one-slot-but-two-defined.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/061.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/062-comments-and-expressions.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/062.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/063-continuation.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/063.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/064-tags-and-special-characters.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/064.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/065-use-macro-in-fill.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/065.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/066-load-expression.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/066.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/067-attribute-decode.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/067.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/068-less-than-greater-than-in-attributes.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/068.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/069-translation-domain-and-macro.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/069.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/070-translation-domain-and-use-macro.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/070.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/071-html-attribute-defaults.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/071.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/072-repeat-interpolation.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/072.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/073-utf8-encoded.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/073.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/074-encoded-template.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/074.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/075-nested-macros.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/075.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/076-nested-macro-override.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/076.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/077-i18n-attributes.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/077.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/078-tags-and-newlines.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/078.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/079-implicit-i18n.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/079.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/080-xmlns-namespace-on-tal.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/080.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/081-load-spec.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/081.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/082-load-spec-computed.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/082.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/083-template-dict-to-macro.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/083.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/084-interpolation-in-cdata.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/084.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/085-nested-translation.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/085.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/086-self-closing.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/086.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/087-code-blocks.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/087.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/088-python-newlines.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/088.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/089-load-fallback.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/089.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/090-tuple-expression.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/090.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/091-repeat-none.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/091.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/092.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/093.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/094.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/095.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/096.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/097.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/098.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/099.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/100.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/101-unclosed-tags.html -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/101.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/102-unquoted-attributes.html -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/102.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/103-simple-attribute.html -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/103.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/104.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/105.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/106.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/107.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/108.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/109.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/110.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/111.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/112.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/113.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/114.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/115.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/116.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/117.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/118.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/119.xml -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/120-translation-context.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/121-translation-comment.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/122-translation-ignore.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/123-html5-data-attributes.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/124-translation-target.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/125-macro-translation-ordering.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/126-define-escaping.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/127-tags-and-attributes-special-chars.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/237-double-define.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/238-macroname.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/greeting.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/hello_world.pt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/hello_world.txt -> build/lib/chameleon/tests/inputs
copying src/chameleon/tests/inputs/multinode-implicit-i18n.pt -> build/lib/chameleon/tests/inputs
creating build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/001.html -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/001.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/001.txt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/002.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/003.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/004.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/005.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/006.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/007.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/008.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/009.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/010.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/011-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/011.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/012-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/012.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/013.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/014.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/015-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/015.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/016-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/016.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/017.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/018-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/018.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/019.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/020.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/021-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/021.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/022.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/023.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/024.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/025.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/026.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/027.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/028.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/029.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/030.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/031.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/032.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/033.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/034.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/035.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/036.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/037.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/038.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/039.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/040.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/041.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/042.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/043.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/044.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/045.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/046.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/047.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/048.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/049.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/050.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/051.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/052.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/053.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/054.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/055.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/056.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/057.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/058.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/059.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/060.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/061.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/062.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/063.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/064.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/065.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/066.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/067.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/068.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/069-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/069.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/070-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/070.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/071.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/072.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/073.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/074.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/075.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/076.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/077-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/077.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/078.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/079-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/079.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/080.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/081.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/082.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/083.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/084.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/085-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/085.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/086.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/087.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/088.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/089.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/090.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/091.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/101.html -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/102.html -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/103.html -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/120-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/120.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/121.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/122.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/123.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/124-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/124.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/125.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/126.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/127.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/237.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/238.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/greeting.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/hello_world.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/hello_world.txt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/multinode-en.pt -> build/lib/chameleon/tests/outputs
copying src/chameleon/tests/outputs/multinode.pt -> build/lib/chameleon/tests/outputs
installing to build/bdist.linux-x86_64/wheel
running install
running install_lib
creating build/bdist.linux-x86_64
creating build/bdist.linux-x86_64/wheel
creating build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/__init__.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/astutil.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/benchmark.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/codegen.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/compiler.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/config.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/exc.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/i18n.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/interfaces.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/loader.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/metal.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/namespaces.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/nodes.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/parser.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/program.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/tal.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/tales.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/template.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/tokenize.py -> build/bdist.linux-x86_64/wheel/chameleon
copying build/lib/chameleon/utils.py -> build/bdist.linux-x86_64/wheel/chameleon
creating build/bdist.linux-x86_64/wheel/chameleon/tests
copying build/lib/chameleon/tests/__init__.py -> build/bdist.linux-x86_64/wheel/chameleon/tests
copying build/lib/chameleon/tests/test_astutil.py -> build/bdist.linux-x86_64/wheel/chameleon/tests
copying build/lib/chameleon/tests/test_bools_plus_sniffing.py -> build/bdist.linux-x86_64/wheel/chameleon/tests
copying build/lib/chameleon/tests/test_doctests.py -> build/bdist.linux-x86_64/wheel/chameleon/tests
copying build/lib/chameleon/tests/test_exc.py -> build/bdist.linux-x86_64/wheel/chameleon/tests
copying build/lib/chameleon/tests/test_loader.py -> build/bdist.linux-x86_64/wheel/chameleon/tests
copying build/lib/chameleon/tests/test_parser.py -> build/bdist.linux-x86_64/wheel/chameleon/tests
copying build/lib/chameleon/tests/test_sniffing.py -> build/bdist.linux-x86_64/wheel/chameleon/tests
copying build/lib/chameleon/tests/test_templates.py -> build/bdist.linux-x86_64/wheel/chameleon/tests
copying build/lib/chameleon/tests/test_tokenizer.py -> build/bdist.linux-x86_64/wheel/chameleon/tests
copying build/lib/chameleon/tests/test_utils.py -> build/bdist.linux-x86_64/wheel/chameleon/tests
creating build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/001-interpolation.txt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/001-variable-scope.html -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/001-variable-scope.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/001.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/002-repeat-scope.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/002.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/003-content.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/003.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/004-attributes.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/004.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/005-default.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/005.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/006-attribute-interpolation.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/006.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/007-content-interpolation.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/007.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/008-builtins.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/008.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/009-literals.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/009.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/010-structure.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/010.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/011-messages.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/011.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/012-translation.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/012.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/013-repeat-nested.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/013.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/014-repeat-nested-similar.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/014.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/015-translation-nested.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/015.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/016-explicit-translation.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/016.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/017-omit-tag.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/017.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/018-translation-nested-dynamic.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/018.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/019-replace.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/019.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/020-on-error.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/020.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/021-translation-domain.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/021.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/022-switch.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/022.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/023-condition.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/023.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/024-namespace-elements.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/024.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/025-repeat-whitespace.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/025.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/026-repeat-variable.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/026.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/027-attribute-replacement.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/027.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/028-attribute-toggle.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/028.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/029-attribute-ordering.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/029.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/030-repeat-tuples.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/030.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/031-namespace-with-tal.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/031.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/032-master-template.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/032.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/033-use-macro-trivial.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/033.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/034-use-template-as-macro.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/034.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/035-use-macro-with-fill-slot.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/035.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/036-use-macro-inherits-dynamic-scope.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/036.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/037-use-macro-local-variable-scope.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/037.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/038-use-macro-globals.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/038.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/039-globals.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/039.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/040-macro-using-template-symbol.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/040.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/041-translate-nested-names.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/041.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/042-use-macro-fill-footer.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/042.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/043-macro-nested-dynamic-vars.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/043.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/044-tuple-define.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/044.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/045-namespaces.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/045.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/046-extend-macro.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/046.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/047-use-extended-macro.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/047.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/048-use-extended-macro-fill-original.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/048.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/049-entities-in-attributes.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/049.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/050-define-macro-and-use-not-extend.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/050.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/051-use-non-extended-macro.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/051.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/052-i18n-domain-inside-filled-slot.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/052.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/053-special-characters-in-attributes.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/053.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/054-import-expression.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/054.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/055-attribute-fallback-to-dict-lookup.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/055.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/056-comment-attribute.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/056.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/057-order.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/057.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/058-script.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/058.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/059-embedded-javascript.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/059.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/060-macro-with-multiple-same-slots.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/060.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/061-fill-one-slot-but-two-defined.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/061.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/062-comments-and-expressions.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/062.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/063-continuation.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/063.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/064-tags-and-special-characters.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/064.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/065-use-macro-in-fill.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/065.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/066-load-expression.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/066.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/067-attribute-decode.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/067.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/068-less-than-greater-than-in-attributes.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/068.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/069-translation-domain-and-macro.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/069.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/070-translation-domain-and-use-macro.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/070.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/071-html-attribute-defaults.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/071.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/072-repeat-interpolation.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/072.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/073-utf8-encoded.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/073.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/074-encoded-template.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/074.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/075-nested-macros.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/075.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/076-nested-macro-override.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/076.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/077-i18n-attributes.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/077.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/078-tags-and-newlines.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/078.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/079-implicit-i18n.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/079.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/080-xmlns-namespace-on-tal.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/080.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/081-load-spec.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/081.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/082-load-spec-computed.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/082.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/083-template-dict-to-macro.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/083.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/084-interpolation-in-cdata.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/084.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/085-nested-translation.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/085.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/086-self-closing.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/086.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/087-code-blocks.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/087.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/088-python-newlines.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/088.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/089-load-fallback.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/089.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/090-tuple-expression.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/090.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/091-repeat-none.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/091.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/092.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/093.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/094.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/095.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/096.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/097.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/098.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/099.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/100.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/101-unclosed-tags.html -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/101.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/102-unquoted-attributes.html -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/102.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/103-simple-attribute.html -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/103.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/104.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/105.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/106.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/107.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/108.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/109.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/110.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/111.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/112.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/113.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/114.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/115.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/116.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/117.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/118.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/119.xml -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/120-translation-context.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/121-translation-comment.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/122-translation-ignore.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/123-html5-data-attributes.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/124-translation-target.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/125-macro-translation-ordering.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/126-define-escaping.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/127-tags-and-attributes-special-chars.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/237-double-define.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/238-macroname.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/greeting.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/hello_world.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/hello_world.txt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
copying build/lib/chameleon/tests/inputs/multinode-implicit-i18n.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/inputs
creating build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/001.html -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/001.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/001.txt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/002.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/003.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/004.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/005.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/006.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/007.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/008.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/009.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/010.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/011-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/011.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/012-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/012.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/013.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/014.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/015-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/015.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/016-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/016.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/017.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/018-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/018.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/019.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/020.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/021-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/021.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/022.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/023.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/024.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/025.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/026.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/027.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/028.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/029.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/030.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/031.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/032.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/033.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/034.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/035.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/036.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/037.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/038.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/039.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/040.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/041.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/042.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/043.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/044.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/045.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/046.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/047.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/048.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/049.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/050.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/051.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/052.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/053.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/054.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/055.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/056.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/057.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/058.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/059.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/060.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/061.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/062.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/063.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/064.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/065.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/066.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/067.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/068.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/069-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/069.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/070-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/070.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/071.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/072.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/073.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/074.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/075.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/076.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/077-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/077.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/078.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/079-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/079.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/080.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/081.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/082.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/083.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/084.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/085-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/085.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/086.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/087.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/088.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/089.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/090.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/091.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/101.html -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/102.html -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/103.html -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/120-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/120.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/121.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/122.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/123.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/124-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/124.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/125.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/126.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/127.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/237.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/238.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/greeting.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/hello_world.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/hello_world.txt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/multinode-en.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
copying build/lib/chameleon/tests/outputs/multinode.pt -> build/bdist.linux-x86_64/wheel/chameleon/tests/outputs
creating build/bdist.linux-x86_64/wheel/chameleon/zpt
copying build/lib/chameleon/zpt/__init__.py -> build/bdist.linux-x86_64/wheel/chameleon/zpt
copying build/lib/chameleon/zpt/loader.py -> build/bdist.linux-x86_64/wheel/chameleon/zpt
copying build/lib/chameleon/zpt/program.py -> build/bdist.linux-x86_64/wheel/chameleon/zpt
copying build/lib/chameleon/zpt/template.py -> build/bdist.linux-x86_64/wheel/chameleon/zpt
running install_egg_info
Copying src/Chameleon.egg-info to build/bdist.linux-x86_64/wheel/Chameleon-4.3.0-py3.8.egg-info
running install_scripts
creating build/bdist.linux-x86_64/wheel/Chameleon-4.3.0.dist-info/WHEEL
creating '/home/tkloczko/rpmbuild/BUILD/chameleon-4.3.0/dist/.tmp-wsgxwile/Chameleon-4.3.0-py3-none-any.whl' and adding 'build/bdist.linux-x86_64/wheel' to it
adding 'chameleon/__init__.py'
adding 'chameleon/astutil.py'
adding 'chameleon/benchmark.py'
adding 'chameleon/codegen.py'
adding 'chameleon/compiler.py'
adding 'chameleon/config.py'
adding 'chameleon/exc.py'
adding 'chameleon/i18n.py'
adding 'chameleon/interfaces.py'
adding 'chameleon/loader.py'
adding 'chameleon/metal.py'
adding 'chameleon/namespaces.py'
adding 'chameleon/nodes.py'
adding 'chameleon/parser.py'
adding 'chameleon/program.py'
adding 'chameleon/tal.py'
adding 'chameleon/tales.py'
adding 'chameleon/template.py'
adding 'chameleon/tokenize.py'
adding 'chameleon/utils.py'
adding 'chameleon/tests/__init__.py'
adding 'chameleon/tests/test_astutil.py'
adding 'chameleon/tests/test_bools_plus_sniffing.py'
adding 'chameleon/tests/test_doctests.py'
adding 'chameleon/tests/test_exc.py'
adding 'chameleon/tests/test_loader.py'
adding 'chameleon/tests/test_parser.py'
adding 'chameleon/tests/test_sniffing.py'
adding 'chameleon/tests/test_templates.py'
adding 'chameleon/tests/test_tokenizer.py'
adding 'chameleon/tests/test_utils.py'
adding 'chameleon/tests/inputs/001-interpolation.txt'
adding 'chameleon/tests/inputs/001-variable-scope.html'
adding 'chameleon/tests/inputs/001-variable-scope.pt'
adding 'chameleon/tests/inputs/001.xml'
adding 'chameleon/tests/inputs/002-repeat-scope.pt'
adding 'chameleon/tests/inputs/002.xml'
adding 'chameleon/tests/inputs/003-content.pt'
adding 'chameleon/tests/inputs/003.xml'
adding 'chameleon/tests/inputs/004-attributes.pt'
adding 'chameleon/tests/inputs/004.xml'
adding 'chameleon/tests/inputs/005-default.pt'
adding 'chameleon/tests/inputs/005.xml'
adding 'chameleon/tests/inputs/006-attribute-interpolation.pt'
adding 'chameleon/tests/inputs/006.xml'
adding 'chameleon/tests/inputs/007-content-interpolation.pt'
adding 'chameleon/tests/inputs/007.xml'
adding 'chameleon/tests/inputs/008-builtins.pt'
adding 'chameleon/tests/inputs/008.xml'
adding 'chameleon/tests/inputs/009-literals.pt'
adding 'chameleon/tests/inputs/009.xml'
adding 'chameleon/tests/inputs/010-structure.pt'
adding 'chameleon/tests/inputs/010.xml'
adding 'chameleon/tests/inputs/011-messages.pt'
adding 'chameleon/tests/inputs/011.xml'
adding 'chameleon/tests/inputs/012-translation.pt'
adding 'chameleon/tests/inputs/012.xml'
adding 'chameleon/tests/inputs/013-repeat-nested.pt'
adding 'chameleon/tests/inputs/013.xml'
adding 'chameleon/tests/inputs/014-repeat-nested-similar.pt'
adding 'chameleon/tests/inputs/014.xml'
adding 'chameleon/tests/inputs/015-translation-nested.pt'
adding 'chameleon/tests/inputs/015.xml'
adding 'chameleon/tests/inputs/016-explicit-translation.pt'
adding 'chameleon/tests/inputs/016.xml'
adding 'chameleon/tests/inputs/017-omit-tag.pt'
adding 'chameleon/tests/inputs/017.xml'
adding 'chameleon/tests/inputs/018-translation-nested-dynamic.pt'
adding 'chameleon/tests/inputs/018.xml'
adding 'chameleon/tests/inputs/019-replace.pt'
adding 'chameleon/tests/inputs/019.xml'
adding 'chameleon/tests/inputs/020-on-error.pt'
adding 'chameleon/tests/inputs/020.xml'
adding 'chameleon/tests/inputs/021-translation-domain.pt'
adding 'chameleon/tests/inputs/021.xml'
adding 'chameleon/tests/inputs/022-switch.pt'
adding 'chameleon/tests/inputs/022.xml'
adding 'chameleon/tests/inputs/023-condition.pt'
adding 'chameleon/tests/inputs/023.xml'
adding 'chameleon/tests/inputs/024-namespace-elements.pt'
adding 'chameleon/tests/inputs/024.xml'
adding 'chameleon/tests/inputs/025-repeat-whitespace.pt'
adding 'chameleon/tests/inputs/025.xml'
adding 'chameleon/tests/inputs/026-repeat-variable.pt'
adding 'chameleon/tests/inputs/026.xml'
adding 'chameleon/tests/inputs/027-attribute-replacement.pt'
adding 'chameleon/tests/inputs/027.xml'
adding 'chameleon/tests/inputs/028-attribute-toggle.pt'
adding 'chameleon/tests/inputs/028.xml'
adding 'chameleon/tests/inputs/029-attribute-ordering.pt'
adding 'chameleon/tests/inputs/029.xml'
adding 'chameleon/tests/inputs/030-repeat-tuples.pt'
adding 'chameleon/tests/inputs/030.xml'
adding 'chameleon/tests/inputs/031-namespace-with-tal.pt'
adding 'chameleon/tests/inputs/031.xml'
adding 'chameleon/tests/inputs/032-master-template.pt'
adding 'chameleon/tests/inputs/032.xml'
adding 'chameleon/tests/inputs/033-use-macro-trivial.pt'
adding 'chameleon/tests/inputs/033.xml'
adding 'chameleon/tests/inputs/034-use-template-as-macro.pt'
adding 'chameleon/tests/inputs/034.xml'
adding 'chameleon/tests/inputs/035-use-macro-with-fill-slot.pt'
adding 'chameleon/tests/inputs/035.xml'
adding 'chameleon/tests/inputs/036-use-macro-inherits-dynamic-scope.pt'
adding 'chameleon/tests/inputs/036.xml'
adding 'chameleon/tests/inputs/037-use-macro-local-variable-scope.pt'
adding 'chameleon/tests/inputs/037.xml'
adding 'chameleon/tests/inputs/038-use-macro-globals.pt'
adding 'chameleon/tests/inputs/038.xml'
adding 'chameleon/tests/inputs/039-globals.pt'
adding 'chameleon/tests/inputs/039.xml'
adding 'chameleon/tests/inputs/040-macro-using-template-symbol.pt'
adding 'chameleon/tests/inputs/040.xml'
adding 'chameleon/tests/inputs/041-translate-nested-names.pt'
adding 'chameleon/tests/inputs/041.xml'
adding 'chameleon/tests/inputs/042-use-macro-fill-footer.pt'
adding 'chameleon/tests/inputs/042.xml'
adding 'chameleon/tests/inputs/043-macro-nested-dynamic-vars.pt'
adding 'chameleon/tests/inputs/043.xml'
adding 'chameleon/tests/inputs/044-tuple-define.pt'
adding 'chameleon/tests/inputs/044.xml'
adding 'chameleon/tests/inputs/045-namespaces.pt'
adding 'chameleon/tests/inputs/045.xml'
adding 'chameleon/tests/inputs/046-extend-macro.pt'
adding 'chameleon/tests/inputs/046.xml'
adding 'chameleon/tests/inputs/047-use-extended-macro.pt'
adding 'chameleon/tests/inputs/047.xml'
adding 'chameleon/tests/inputs/048-use-extended-macro-fill-original.pt'
adding 'chameleon/tests/inputs/048.xml'
adding 'chameleon/tests/inputs/049-entities-in-attributes.pt'
adding 'chameleon/tests/inputs/049.xml'
adding 'chameleon/tests/inputs/050-define-macro-and-use-not-extend.pt'
adding 'chameleon/tests/inputs/050.xml'
adding 'chameleon/tests/inputs/051-use-non-extended-macro.pt'
adding 'chameleon/tests/inputs/051.xml'
adding 'chameleon/tests/inputs/052-i18n-domain-inside-filled-slot.pt'
adding 'chameleon/tests/inputs/052.xml'
adding 'chameleon/tests/inputs/053-special-characters-in-attributes.pt'
adding 'chameleon/tests/inputs/053.xml'
adding 'chameleon/tests/inputs/054-import-expression.pt'
adding 'chameleon/tests/inputs/054.xml'
adding 'chameleon/tests/inputs/055-attribute-fallback-to-dict-lookup.pt'
adding 'chameleon/tests/inputs/055.xml'
adding 'chameleon/tests/inputs/056-comment-attribute.pt'
adding 'chameleon/tests/inputs/056.xml'
adding 'chameleon/tests/inputs/057-order.pt'
adding 'chameleon/tests/inputs/057.xml'
adding 'chameleon/tests/inputs/058-script.pt'
adding 'chameleon/tests/inputs/058.xml'
adding 'chameleon/tests/inputs/059-embedded-javascript.pt'
adding 'chameleon/tests/inputs/059.xml'
adding 'chameleon/tests/inputs/060-macro-with-multiple-same-slots.pt'
adding 'chameleon/tests/inputs/060.xml'
adding 'chameleon/tests/inputs/061-fill-one-slot-but-two-defined.pt'
adding 'chameleon/tests/inputs/061.xml'
adding 'chameleon/tests/inputs/062-comments-and-expressions.pt'
adding 'chameleon/tests/inputs/062.xml'
adding 'chameleon/tests/inputs/063-continuation.pt'
adding 'chameleon/tests/inputs/063.xml'
adding 'chameleon/tests/inputs/064-tags-and-special-characters.pt'
adding 'chameleon/tests/inputs/064.xml'
adding 'chameleon/tests/inputs/065-use-macro-in-fill.pt'
adding 'chameleon/tests/inputs/065.xml'
adding 'chameleon/tests/inputs/066-load-expression.pt'
adding 'chameleon/tests/inputs/066.xml'
adding 'chameleon/tests/inputs/067-attribute-decode.pt'
adding 'chameleon/tests/inputs/067.xml'
adding 'chameleon/tests/inputs/068-less-than-greater-than-in-attributes.pt'
adding 'chameleon/tests/inputs/068.xml'
adding 'chameleon/tests/inputs/069-translation-domain-and-macro.pt'
adding 'chameleon/tests/inputs/069.xml'
adding 'chameleon/tests/inputs/070-translation-domain-and-use-macro.pt'
adding 'chameleon/tests/inputs/070.xml'
adding 'chameleon/tests/inputs/071-html-attribute-defaults.pt'
adding 'chameleon/tests/inputs/071.xml'
adding 'chameleon/tests/inputs/072-repeat-interpolation.pt'
adding 'chameleon/tests/inputs/072.xml'
adding 'chameleon/tests/inputs/073-utf8-encoded.pt'
adding 'chameleon/tests/inputs/073.xml'
adding 'chameleon/tests/inputs/074-encoded-template.pt'
adding 'chameleon/tests/inputs/074.xml'
adding 'chameleon/tests/inputs/075-nested-macros.pt'
adding 'chameleon/tests/inputs/075.xml'
adding 'chameleon/tests/inputs/076-nested-macro-override.pt'
adding 'chameleon/tests/inputs/076.xml'
adding 'chameleon/tests/inputs/077-i18n-attributes.pt'
adding 'chameleon/tests/inputs/077.xml'
adding 'chameleon/tests/inputs/078-tags-and-newlines.pt'
adding 'chameleon/tests/inputs/078.xml'
adding 'chameleon/tests/inputs/079-implicit-i18n.pt'
adding 'chameleon/tests/inputs/079.xml'
adding 'chameleon/tests/inputs/080-xmlns-namespace-on-tal.pt'
adding 'chameleon/tests/inputs/080.xml'
adding 'chameleon/tests/inputs/081-load-spec.pt'
adding 'chameleon/tests/inputs/081.xml'
adding 'chameleon/tests/inputs/082-load-spec-computed.pt'
adding 'chameleon/tests/inputs/082.xml'
adding 'chameleon/tests/inputs/083-template-dict-to-macro.pt'
adding 'chameleon/tests/inputs/083.xml'
adding 'chameleon/tests/inputs/084-interpolation-in-cdata.pt'
adding 'chameleon/tests/inputs/084.xml'
adding 'chameleon/tests/inputs/085-nested-translation.pt'
adding 'chameleon/tests/inputs/085.xml'
adding 'chameleon/tests/inputs/086-self-closing.pt'
adding 'chameleon/tests/inputs/086.xml'
adding 'chameleon/tests/inputs/087-code-blocks.pt'
adding 'chameleon/tests/inputs/087.xml'
adding 'chameleon/tests/inputs/088-python-newlines.pt'
adding 'chameleon/tests/inputs/088.xml'
adding 'chameleon/tests/inputs/089-load-fallback.pt'
adding 'chameleon/tests/inputs/089.xml'
adding 'chameleon/tests/inputs/090-tuple-expression.pt'
adding 'chameleon/tests/inputs/090.xml'
adding 'chameleon/tests/inputs/091-repeat-none.pt'
adding 'chameleon/tests/inputs/091.xml'
adding 'chameleon/tests/inputs/092.xml'
adding 'chameleon/tests/inputs/093.xml'
adding 'chameleon/tests/inputs/094.xml'
adding 'chameleon/tests/inputs/095.xml'
adding 'chameleon/tests/inputs/096.xml'
adding 'chameleon/tests/inputs/097.xml'
adding 'chameleon/tests/inputs/098.xml'
adding 'chameleon/tests/inputs/099.xml'
adding 'chameleon/tests/inputs/100.xml'
adding 'chameleon/tests/inputs/101-unclosed-tags.html'
adding 'chameleon/tests/inputs/101.xml'
adding 'chameleon/tests/inputs/102-unquoted-attributes.html'
adding 'chameleon/tests/inputs/102.xml'
adding 'chameleon/tests/inputs/103-simple-attribute.html'
adding 'chameleon/tests/inputs/103.xml'
adding 'chameleon/tests/inputs/104.xml'
adding 'chameleon/tests/inputs/105.xml'
adding 'chameleon/tests/inputs/106.xml'
adding 'chameleon/tests/inputs/107.xml'
adding 'chameleon/tests/inputs/108.xml'
adding 'chameleon/tests/inputs/109.xml'
adding 'chameleon/tests/inputs/110.xml'
adding 'chameleon/tests/inputs/111.xml'
adding 'chameleon/tests/inputs/112.xml'
adding 'chameleon/tests/inputs/113.xml'
adding 'chameleon/tests/inputs/114.xml'
adding 'chameleon/tests/inputs/115.xml'
adding 'chameleon/tests/inputs/116.xml'
adding 'chameleon/tests/inputs/117.xml'
adding 'chameleon/tests/inputs/118.xml'
adding 'chameleon/tests/inputs/119.xml'
adding 'chameleon/tests/inputs/120-translation-context.pt'
adding 'chameleon/tests/inputs/121-translation-comment.pt'
adding 'chameleon/tests/inputs/122-translation-ignore.pt'
adding 'chameleon/tests/inputs/123-html5-data-attributes.pt'
adding 'chameleon/tests/inputs/124-translation-target.pt'
adding 'chameleon/tests/inputs/125-macro-translation-ordering.pt'
adding 'chameleon/tests/inputs/126-define-escaping.pt'
adding 'chameleon/tests/inputs/127-tags-and-attributes-special-chars.pt'
adding 'chameleon/tests/inputs/237-double-define.pt'
adding 'chameleon/tests/inputs/238-macroname.pt'
adding 'chameleon/tests/inputs/greeting.pt'
adding 'chameleon/tests/inputs/hello_world.pt'
adding 'chameleon/tests/inputs/hello_world.txt'
adding 'chameleon/tests/inputs/multinode-implicit-i18n.pt'
adding 'chameleon/tests/outputs/001.html'
adding 'chameleon/tests/outputs/001.pt'
adding 'chameleon/tests/outputs/001.txt'
adding 'chameleon/tests/outputs/002.pt'
adding 'chameleon/tests/outputs/003.pt'
adding 'chameleon/tests/outputs/004.pt'
adding 'chameleon/tests/outputs/005.pt'
adding 'chameleon/tests/outputs/006.pt'
adding 'chameleon/tests/outputs/007.pt'
adding 'chameleon/tests/outputs/008.pt'
adding 'chameleon/tests/outputs/009.pt'
adding 'chameleon/tests/outputs/010.pt'
adding 'chameleon/tests/outputs/011-en.pt'
adding 'chameleon/tests/outputs/011.pt'
adding 'chameleon/tests/outputs/012-en.pt'
adding 'chameleon/tests/outputs/012.pt'
adding 'chameleon/tests/outputs/013.pt'
adding 'chameleon/tests/outputs/014.pt'
adding 'chameleon/tests/outputs/015-en.pt'
adding 'chameleon/tests/outputs/015.pt'
adding 'chameleon/tests/outputs/016-en.pt'
adding 'chameleon/tests/outputs/016.pt'
adding 'chameleon/tests/outputs/017.pt'
adding 'chameleon/tests/outputs/018-en.pt'
adding 'chameleon/tests/outputs/018.pt'
adding 'chameleon/tests/outputs/019.pt'
adding 'chameleon/tests/outputs/020.pt'
adding 'chameleon/tests/outputs/021-en.pt'
adding 'chameleon/tests/outputs/021.pt'
adding 'chameleon/tests/outputs/022.pt'
adding 'chameleon/tests/outputs/023.pt'
adding 'chameleon/tests/outputs/024.pt'
adding 'chameleon/tests/outputs/025.pt'
adding 'chameleon/tests/outputs/026.pt'
adding 'chameleon/tests/outputs/027.pt'
adding 'chameleon/tests/outputs/028.pt'
adding 'chameleon/tests/outputs/029.pt'
adding 'chameleon/tests/outputs/030.pt'
adding 'chameleon/tests/outputs/031.pt'
adding 'chameleon/tests/outputs/032.pt'
adding 'chameleon/tests/outputs/033.pt'
adding 'chameleon/tests/outputs/034.pt'
adding 'chameleon/tests/outputs/035.pt'
adding 'chameleon/tests/outputs/036.pt'
adding 'chameleon/tests/outputs/037.pt'
adding 'chameleon/tests/outputs/038.pt'
adding 'chameleon/tests/outputs/039.pt'
adding 'chameleon/tests/outputs/040.pt'
adding 'chameleon/tests/outputs/041.pt'
adding 'chameleon/tests/outputs/042.pt'
adding 'chameleon/tests/outputs/043.pt'
adding 'chameleon/tests/outputs/044.pt'
adding 'chameleon/tests/outputs/045.pt'
adding 'chameleon/tests/outputs/046.pt'
adding 'chameleon/tests/outputs/047.pt'
adding 'chameleon/tests/outputs/048.pt'
adding 'chameleon/tests/outputs/049.pt'
adding 'chameleon/tests/outputs/050.pt'
adding 'chameleon/tests/outputs/051.pt'
adding 'chameleon/tests/outputs/052.pt'
adding 'chameleon/tests/outputs/053.pt'
adding 'chameleon/tests/outputs/054.pt'
adding 'chameleon/tests/outputs/055.pt'
adding 'chameleon/tests/outputs/056.pt'
adding 'chameleon/tests/outputs/057.pt'
adding 'chameleon/tests/outputs/058.pt'
adding 'chameleon/tests/outputs/059.pt'
adding 'chameleon/tests/outputs/060.pt'
adding 'chameleon/tests/outputs/061.pt'
adding 'chameleon/tests/outputs/062.pt'
adding 'chameleon/tests/outputs/063.pt'
adding 'chameleon/tests/outputs/064.pt'
adding 'chameleon/tests/outputs/065.pt'
adding 'chameleon/tests/outputs/066.pt'
adding 'chameleon/tests/outputs/067.pt'
adding 'chameleon/tests/outputs/068.pt'
adding 'chameleon/tests/outputs/069-en.pt'
adding 'chameleon/tests/outputs/069.pt'
adding 'chameleon/tests/outputs/070-en.pt'
adding 'chameleon/tests/outputs/070.pt'
adding 'chameleon/tests/outputs/071.pt'
adding 'chameleon/tests/outputs/072.pt'
adding 'chameleon/tests/outputs/073.pt'
adding 'chameleon/tests/outputs/074.pt'
adding 'chameleon/tests/outputs/075.pt'
adding 'chameleon/tests/outputs/076.pt'
adding 'chameleon/tests/outputs/077-en.pt'
adding 'chameleon/tests/outputs/077.pt'
adding 'chameleon/tests/outputs/078.pt'
adding 'chameleon/tests/outputs/079-en.pt'
adding 'chameleon/tests/outputs/079.pt'
adding 'chameleon/tests/outputs/080.pt'
adding 'chameleon/tests/outputs/081.pt'
adding 'chameleon/tests/outputs/082.pt'
adding 'chameleon/tests/outputs/083.pt'
adding 'chameleon/tests/outputs/084.pt'
adding 'chameleon/tests/outputs/085-en.pt'
adding 'chameleon/tests/outputs/085.pt'
adding 'chameleon/tests/outputs/086.pt'
adding 'chameleon/tests/outputs/087.pt'
adding 'chameleon/tests/outputs/088.pt'
adding 'chameleon/tests/outputs/089.pt'
adding 'chameleon/tests/outputs/090.pt'
adding 'chameleon/tests/outputs/091.pt'
adding 'chameleon/tests/outputs/101.html'
adding 'chameleon/tests/outputs/102.html'
adding 'chameleon/tests/outputs/103.html'
adding 'chameleon/tests/outputs/120-en.pt'
adding 'chameleon/tests/outputs/120.pt'
adding 'chameleon/tests/outputs/121.pt'
adding 'chameleon/tests/outputs/122.pt'
adding 'chameleon/tests/outputs/123.pt'
adding 'chameleon/tests/outputs/124-en.pt'
adding 'chameleon/tests/outputs/124.pt'
adding 'chameleon/tests/outputs/125.pt'
adding 'chameleon/tests/outputs/126.pt'
adding 'chameleon/tests/outputs/127.pt'
adding 'chameleon/tests/outputs/237.pt'
adding 'chameleon/tests/outputs/238.pt'
adding 'chameleon/tests/outputs/greeting.pt'
adding 'chameleon/tests/outputs/hello_world.pt'
adding 'chameleon/tests/outputs/hello_world.txt'
adding 'chameleon/tests/outputs/multinode-en.pt'
adding 'chameleon/tests/outputs/multinode.pt'
adding 'chameleon/zpt/__init__.py'
adding 'chameleon/zpt/loader.py'
adding 'chameleon/zpt/program.py'
adding 'chameleon/zpt/template.py'
adding 'Chameleon-4.3.0.dist-info/LICENSE.txt'
adding 'Chameleon-4.3.0.dist-info/METADATA'
adding 'Chameleon-4.3.0.dist-info/WHEEL'
adding 'Chameleon-4.3.0.dist-info/top_level.txt'
adding 'Chameleon-4.3.0.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel
/usr/lib/python3.8/site-packages/setuptools/command/build_py.py:207: _Warning: Package 'chameleon.tests.inputs' is absent from the `packages` configuration.
!!

        ********************************************************************************
        ############################
        # Package would be ignored #
        ############################
        Python recognizes 'chameleon.tests.inputs' as an importable package[^1],
        but it is absent from setuptools' `packages` configuration.

        This leads to an ambiguous overall configuration. If you want to distribute this
        package, please make sure that 'chameleon.tests.inputs' is explicitly added
        to the `packages` configuration field.

        Alternatively, you can also rely on setuptools' discovery methods
        (for example by using `find_namespace_packages(...)`/`find_namespace:`
        instead of `find_packages(...)`/`find:`).

        You can read more about "package discovery" on setuptools documentation page:

        - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html

        If you don't want 'chameleon.tests.inputs' to be distributed and are
        already explicitly excluding 'chameleon.tests.inputs' via
        `find_namespace_packages(...)/find_namespace` or `find_packages(...)/find`,
        you can try to use `exclude_package_data`, or `include-package-data=False` in
        combination with a more fine grained `package-data` configuration.

        You can read more about "package data files" on setuptools documentation page:

        - https://setuptools.pypa.io/en/latest/userguide/datafiles.html


        [^1]: For Python, any directory (with suitable naming) can be imported,
              even if it does not contain any `.py` files.
              On the other hand, currently there is no concept of package data
              directory, all directories are treated like packages.
        ********************************************************************************

!!
  check.warn(importable)
/usr/lib/python3.8/site-packages/setuptools/command/build_py.py:207: _Warning: Package 'chameleon.tests.outputs' is absent from the `packages` configuration.
!!

        ********************************************************************************
        ############################
        # Package would be ignored #
        ############################
        Python recognizes 'chameleon.tests.outputs' as an importable package[^1],
        but it is absent from setuptools' `packages` configuration.

        This leads to an ambiguous overall configuration. If you want to distribute this
        package, please make sure that 'chameleon.tests.outputs' is explicitly added
        to the `packages` configuration field.

        Alternatively, you can also rely on setuptools' discovery methods
        (for example by using `find_namespace_packages(...)`/`find_namespace:`
        instead of `find_packages(...)`/`find:`).

        You can read more about "package discovery" on setuptools documentation page:

        - https://setuptools.pypa.io/en/latest/userguide/package_discovery.html

        If you don't want 'chameleon.tests.outputs' to be distributed and are
        already explicitly excluding 'chameleon.tests.outputs' via
        `find_namespace_packages(...)/find_namespace` or `find_packages(...)/find`,
        you can try to use `exclude_package_data`, or `include-package-data=False` in
        combination with a more fine grained `package-data` configuration.

        You can read more about "package data files" on setuptools documentation page:

        - https://setuptools.pypa.io/en/latest/userguide/datafiles.html


        [^1]: For Python, any directory (with suitable naming) can be imported,
              even if it does not contain any `.py` files.
              On the other hand, currently there is no concept of package data
              directory, all directories are treated like packages.
        ********************************************************************************

!!
  check.warn(importable)
Successfully built Chameleon-4.3.0-py3-none-any.whl

Other thing is that test suite is part of the installed resources however looks like this is result of use relative imports in src/chameleon/tests code which does not allow move around that code (for example move to tests/)

@malthe
Copy link
Owner

malthe commented Dec 4, 2023

@kloczek agreed that the tests could be updated (and in particular, moved out from the source code).

@kloczek
Copy link
Contributor Author

kloczek commented Dec 4, 2023

@kloczek agreed that the tests could be updated (and in particular, moved out from the source code).

To be able do that first needs to be replaced all relative imports.
Than test suite can be moved around without causing errors/fails.

Use relative imports is nothing more than than asking for troubles. Additionally each relative import causes additional syscall to obtain current directory.

@malthe
Copy link
Owner

malthe commented Dec 4, 2023

@kloczek I don't think Zope's test runner supports moving tests outside of the "package under test", or at least it needs to live inside a proper package.

To get any further here, we'd need to change to another test runner, e.g. pytest. PRs are welcome!

@kloczek
Copy link
Contributor Author

kloczek commented Dec 19, 2023

OK I made #400 which removes use relative imports.
Any progress on other issues? 🤔

Just FTR here is updated pytest output for 4.4.2
+ PYTHONPATH=/home/tkloczko/rpmbuild/BUILDROOT/python-chameleon-4.4.2-2.fc35.x86_64/usr/lib64/python3.8/site-packages:/home/tkloczko/rpmbuild/BUILDROOT/python-chameleon-4.4.2-2.fc35.x86_64/usr/lib/python3.8/site-packages
+ /usr/bin/pytest -ra -m 'not network'
==================================================================================== test session starts ====================================================================================
platform linux -- Python 3.8.18, pytest-7.4.3, pluggy-1.3.0
rootdir: /home/tkloczko/rpmbuild/BUILD/chameleon-4.4.2
collected 107 items

src/chameleon/tests/test_astutil.py .                                                                                                                                                 [  0%]
src/chameleon/tests/test_bools_plus_sniffing.py ..............................                                                                                                        [ 28%]
src/chameleon/tests/test_doctests.py EEEEE                                                                                                                                            [ 33%]
src/chameleon/tests/test_exc.py ..                                                                                                                                                    [ 35%]
src/chameleon/tests/test_loader.py EEEEEEEEEE                                                                                                                                         [ 44%]
src/chameleon/tests/test_parser.py ..                                                                                                                                                 [ 46%]
src/chameleon/tests/test_sniffing.py ....                                                                                                                                             [ 50%]
src/chameleon/tests/test_templates.py ................................................                                                                                                [ 95%]
src/chameleon/tests/test_tokenizer.py ..                                                                                                                                              [ 97%]
src/chameleon/tests/test_utils.py ...                                                                                                                                                 [100%]

========================================================================================== ERRORS ===========================================================================================
________________________________________________________________________ ERROR at setup of DoctestCase.test_compiler ________________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7f7dc205d8b0>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_compiler>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_compiler'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
__________________________________________________________________________ ERROR at setup of DoctestCase.test_exc ___________________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7f7dc19ca8b0>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_exc>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_exc'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
__________________________________________________________________________ ERROR at setup of DoctestCase.test_tal ___________________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7f7dc1fe1790>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_tal>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_tal'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
_________________________________________________________________________ ERROR at setup of DoctestCase.test_tales __________________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7f7dc2b79f70>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_tales>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_tales'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
_________________________________________________________________________ ERROR at setup of DoctestCase.test_utils __________________________________________________________________________

cls = <class '_pytest.runner.CallInfo'>, func = <function call_runtest_hook.<locals>.<lambda> at 0x7f7dc187a430>, when = 'setup'
reraise = (<class '_pytest.outcomes.Exit'>, <class 'KeyboardInterrupt'>)

    @classmethod
    def from_call(
        cls,
        func: "Callable[[], TResult]",
        when: "Literal['collect', 'setup', 'call', 'teardown']",
        reraise: Optional[
            Union[Type[BaseException], Tuple[Type[BaseException], ...]]
        ] = None,
    ) -> "CallInfo[TResult]":
        """Call func, wrapping the result in a CallInfo.

        :param func:
            The function to call. Called without arguments.
        :param when:
            The phase in which the function is called.
        :param reraise:
            Exception or exceptions that shall propagate if raised by the
            function, instead of being wrapped in the CallInfo.
        """
        excinfo = None
        start = timing.time()
        precise_start = timing.perf_counter()
        try:
>           result: Optional[TResult] = func()

/usr/lib/python3.8/site-packages/_pytest/runner.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/_pytest/runner.py:262: in <lambda>
    lambda: ihook(item=item, **kwds), when=when, reraise=reraise
/usr/lib/python3.8/site-packages/pluggy/_hooks.py:493: in __call__
    return self._hookexec(self.name, self._hookimpls, kwargs, firstresult)
/usr/lib/python3.8/site-packages/pluggy/_manager.py:115: in _hookexec
    return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
/usr/lib/python3.8/site-packages/_pytest/runner.py:157: in pytest_runtest_setup
    item.session._setupstate.setup(item)
/usr/lib/python3.8/site-packages/_pytest/runner.py:497: in setup
    raise exc
/usr/lib/python3.8/site-packages/_pytest/runner.py:494: in setup
    col.setup()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <TestCaseFunction test_utils>

    def setup(self) -> None:
        # A bound method to be called during teardown() if set (see 'runtest()').
        self._explicit_tearDown: Optional[Callable[[], None]] = None
        assert self.parent is not None
        self._testcase = self.parent.obj(self.name)  # type: ignore[attr-defined]
>       self._obj = getattr(self._testcase, self.name)
E       AttributeError: '_DocTestSuite' object has no attribute 'test_utils'

/usr/lib/python3.8/site-packages/_pytest/unittest.py:202: AttributeError
__________________________________________________________________ ERROR at setup of LoadPageTests.test_consecutive_loads ___________________________________________________________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc17af2e0>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc169f0a0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc169f0a0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc17af2e0>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc169f0a0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc169f0a0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
_______________________________________________________________________ ERROR at setup of LoadPageTests.test_load_abs _______________________________________________________________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc17ac640>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc198dac0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc198dac0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc17ac640>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc198dac0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc198dac0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
_______________________________________________________________________ ERROR at setup of LoadPageTests.test_load_egg _______________________________________________________________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc17dbeb0>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc16bc4c0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc16bc4c0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc17dbeb0>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc16bc4c0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc16bc4c0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
____________________________________________________________________ ERROR at setup of LoadPageTests.test_load_relative _____________________________________________________________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc15f4250>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc15eebe0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc15eebe0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc15f4250>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc15eebe0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc15eebe0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
_________________________________________________________ ERROR at setup of LoadPageTests.test_load_relative_badpath_in_searchpath __________________________________________________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc1592d00>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc19808e0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc19808e0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc1592d00>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc19808e0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc19808e0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
______________________________________________________________________ ERROR at setup of LoadPageTests.test_load_wheel ______________________________________________________________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc179f670>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc1612460>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc1612460>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc179f670>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc1612460>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc1612460>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
_______________________________________________________________________ ERROR at setup of ModuleLoadTests.test_build ________________________________________________________________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc1830190>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc1783b50>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc1783b50>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc1830190>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc1783b50>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc1783b50>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
______________________________________________________________ ERROR at setup of ZPTLoadTests.test_load_getitem_gets_xml_file _______________________________________________________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc15b47f0>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc1592340>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc1592340>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc15b47f0>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc1592340>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc1592340>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
_______________________________________________________________________ ERROR at setup of ZPTLoadTests.test_load_text _______________________________________________________________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc1707f70>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc1dce9d0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc1dce9d0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc1707f70>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc1dce9d0>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc1dce9d0>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
_______________________________________________________________________ ERROR at setup of ZPTLoadTests.test_load_xml ________________________________________________________________________

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc156d970>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc175cd30>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
>           opts, args = getopt.getopt(args, short_opts, self.long_opts)

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:246:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib64/python3.8/getopt.py:95: in getopt
    opts, args = do_shorts(opts, args[0][1:], shortopts, args[1:])
/usr/lib64/python3.8/getopt.py:195: in do_shorts
    if short_has_arg(opt, shortopts):
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

opt = 'r', shortopts = 'v q n h V'

    def short_has_arg(opt, shortopts):
        for i in range(len(shortopts)):
            if opt == shortopts[i] != ':':
                return shortopts.startswith(':', i+1)
>       raise GetoptError(_('option -%s not recognized') % opt, opt)
E       getopt.GetoptError: option -r not recognized

/usr/lib64/python3.8/getopt.py:211: GetoptError

During handling of the above exception, another exception occurred:

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc175cd30>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
>           ok = dist.parse_command_line()

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:172:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/usr/lib/python3.8/site-packages/setuptools/_distutils/dist.py:467: in parse_command_line
    args = parser.getopt(args=self.script_args, object=self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = <distutils.fancy_getopt.FancyGetopt object at 0x7f7dc156d970>, args = ['-ra', '-m', 'not network'], object = <setuptools.dist.Distribution object at 0x7f7dc175cd30>

    def getopt(self, args=None, object=None):  # noqa: C901
        """Parse command-line options in args. Store as attributes on object.

        If 'args' is None or not supplied, uses 'sys.argv[1:]'.  If
        'object' is None or not supplied, creates a new OptionDummy
        object, stores option values there, and returns a tuple (args,
        object).  If 'object' is supplied, it is modified in place and
        'getopt()' just returns 'args'; in both cases, the returned
        'args' is a modified copy of the passed-in 'args' list, which
        is left untouched.
        """
        if args is None:
            args = sys.argv[1:]
        if object is None:
            object = OptionDummy()
            created_object = True
        else:
            created_object = False

        self._grok_option_table()

        short_opts = ' '.join(self.short_opts)
        try:
            opts, args = getopt.getopt(args, short_opts, self.long_opts)
        except getopt.error as msg:
>           raise DistutilsArgError(msg)
E           distutils.errors.DistutilsArgError: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/fancy_getopt.py:248: DistutilsArgError

During handling of the above exception, another exception occurred:

attrs = {}

    def setup(**attrs):
        # Make sure we have any requirements needed to interpret 'attrs'.
        logging.configure()
        _install_setup_requires(attrs)
>       return distutils.core.setup(**attrs)

/usr/lib/python3.8/site-packages/setuptools/__init__.py:103:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

attrs = {'script_args': ['-ra', '-m', 'not network'], 'script_name': 'pytest'}, klass = <class 'setuptools.dist.Distribution'>
dist = <setuptools.dist.Distribution object at 0x7f7dc175cd30>

    def setup(**attrs):  # noqa: C901
        """The gateway to the Distutils: do everything your setup script needs
        to do, in a highly flexible and user-driven way.  Briefly: create a
        Distribution instance; find and parse config files; parse the command
        line; run each Distutils command found there, customized by the options
        supplied to 'setup()' (as keyword arguments), in config files, and on
        the command line.

        The Distribution instance might be an instance of a class supplied via
        the 'distclass' keyword argument to 'setup'; if no such class is
        supplied, then the Distribution class (in dist.py) is instantiated.
        All other arguments to 'setup' (except for 'cmdclass') are used to set
        attributes of the Distribution instance.

        The 'cmdclass' argument, if supplied, is a dictionary mapping command
        names to command classes.  Each command encountered on the command line
        will be turned into a command class, which is in turn instantiated; any
        class found in 'cmdclass' is used in place of the default, which is
        (for command 'foo_bar') class 'foo_bar' in module
        'distutils.command.foo_bar'.  The command class must provide a
        'user_options' attribute which is a list of option specifiers for
        'distutils.fancy_getopt'.  Any command-line options between the current
        and the next command are used to set attributes of the current command
        object.

        When the entire command-line has been successfully parsed, calls the
        'run()' method on each command object in turn.  This method will be
        driven entirely by the Distribution object (which each command object
        has a reference to, thanks to its constructor), and the
        command-specific options that became attributes of each command
        object.
        """

        global _setup_stop_after, _setup_distribution

        # Determine the distribution class -- either caller-supplied or
        # our Distribution (see below).
        klass = attrs.get('distclass')
        if klass:
            attrs.pop('distclass')
        else:
            klass = Distribution

        if 'script_name' not in attrs:
            attrs['script_name'] = os.path.basename(sys.argv[0])
        if 'script_args' not in attrs:
            attrs['script_args'] = sys.argv[1:]

        # Create the Distribution instance, using the remaining arguments
        # (ie. everything except distclass) to initialize it
        try:
            _setup_distribution = dist = klass(attrs)
        except DistutilsSetupError as msg:
            if 'name' not in attrs:
                raise SystemExit("error in setup command: %s" % msg)
            else:
                raise SystemExit("error in {} setup command: {}".format(attrs['name'], msg))

        if _setup_stop_after == "init":
            return dist

        # Find and parse the config file(s): they will override options from
        # the setup script, but be overridden by the command line.
        dist.parse_config_files()

        if DEBUG:
            print("options (after parsing config files):")
            dist.dump_option_dicts()

        if _setup_stop_after == "config":
            return dist

        # Parse the command line and override config files; any
        # command-line errors are the end user's fault, so turn them into
        # SystemExit to suppress tracebacks.
        try:
            ok = dist.parse_command_line()
        except DistutilsArgError as msg:
>           raise SystemExit(gen_usage(dist.script_name) + "\nerror: %s" % msg)
E           SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: pytest --help [cmd1 cmd2 ...]
E              or: pytest --help-commands
E              or: pytest cmd --help
E
E           error: option -r not recognized

/usr/lib/python3.8/site-packages/setuptools/_distutils/core.py:174: SystemExit
================================================================================== short test summary info ==================================================================================
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_compiler - AttributeError: '_DocTestSuite' object has no attribute 'test_compiler'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_exc - AttributeError: '_DocTestSuite' object has no attribute 'test_exc'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_tal - AttributeError: '_DocTestSuite' object has no attribute 'test_tal'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_tales - AttributeError: '_DocTestSuite' object has no attribute 'test_tales'
ERROR src/chameleon/tests/test_doctests.py::DoctestCase::test_utils - AttributeError: '_DocTestSuite' object has no attribute 'test_utils'
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_consecutive_loads - SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_load_abs - SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_load_egg - SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_load_relative - SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_load_relative_badpath_in_searchpath - SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
ERROR src/chameleon/tests/test_loader.py::LoadPageTests::test_load_wheel - SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
ERROR src/chameleon/tests/test_loader.py::ModuleLoadTests::test_build - SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
ERROR src/chameleon/tests/test_loader.py::ZPTLoadTests::test_load_getitem_gets_xml_file - SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
ERROR src/chameleon/tests/test_loader.py::ZPTLoadTests::test_load_text - SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
ERROR src/chameleon/tests/test_loader.py::ZPTLoadTests::test_load_xml - SystemExit: usage: pytest [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
=============================================================================== 92 passed, 15 errors in 4.26s ===============================================================================

@malthe
Copy link
Owner

malthe commented Dec 19, 2023

@kloczek how does this work for you?

@kloczek
Copy link
Contributor Author

kloczek commented Dec 19, 2023

Ha .. just found that you moved to pytest 😄
Will check that in next few hours and back to you ASP 👍

@malthe
Copy link
Owner

malthe commented Dec 26, 2023

Closing this issue for now, but if this doesn't quite work for RPM packaging, let's reopen and sort out any remaining issues.

@malthe malthe closed this as completed Dec 26, 2023
@kloczek
Copy link
Contributor Author

kloczek commented Dec 30, 2023

Looks like 4.4.3 test suite is OK now (thank you).
It is yet another small issue. test suite is part of installed resources (content of the chameleon/tests/).
Easiest way to fix that would be move chameleon/tests/ to tests/.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants