Bug 1900756 - python-testfixtures fails to build with Python 3.10: TypeError: MockPopenInstance.communicate() got an unexpected keyword argument 'foo' [NEEDINFO]
Summary: python-testfixtures fails to build with Python 3.10: TypeError: MockPopenInst...
Keywords:
Status: NEW
Alias: None
Product: Fedora
Classification: Fedora
Component: python-testfixtures
Version: rawhide
Hardware: Unspecified
OS: Unspecified
unspecified
unspecified
Target Milestone: ---
Assignee: Fabian Affolter
QA Contact: Fedora Extras Quality Assurance
URL:
Whiteboard:
Depends On:
Blocks: PYTHON3.10
TreeView+ depends on / blocked
 
Reported: 2020-11-23 16:40 UTC by Tomáš Hrnčiar
Modified: 2021-02-09 16:23 UTC (History)
5 users (show)

Fixed In Version:
Doc Type: If docs needed, set a value
Doc Text:
Clone Of:
Environment:
Last Closed:
Type: Bug
thrnciar: needinfo? (mail)


Attachments (Terms of Use)

Description Tomáš Hrnčiar 2020-11-23 16:40:05 UTC
python-testfixtures fails to build with Python 3.10.0a2.

=================================== FAILURES ===================================
_____________________ Tests.test_invalid_communicate_call ______________________

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_communicate_call>

    def test_invalid_communicate_call(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        with ShouldRaise(TypeError(
                "communicate() got an unexpected keyword argument 'foo'"
        )):
>           process.communicate(foo='bar')

testfixtures/tests/test_popen.py:501: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <testfixtures.popen.MockPopenInstance object at 0x7efdc57f1820>
args = (), kw = {'foo': 'bar'}

    @wraps(func)
    def recorder(self, *args, **kw):
        self._record((func.__name__,), *args, **kw)
>       return func(self, *args, **kw)
E       TypeError: MockPopenInstance.communicate() got an unexpected keyword argument 'foo'

testfixtures/popen.py:43: TypeError

During handling of the above exception, another exception occurred:

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_communicate_call>

    def test_invalid_communicate_call(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        with ShouldRaise(TypeError(
                "communicate() got an unexpected keyword argument 'foo'"
        )):
>           process.communicate(foo='bar')
E           AssertionError: TypeError("communicate() got an unexpected keyword argument 'foo'") (expected) != TypeError("MockPopenInstance.communicate() got an unexpected keyword argument 'foo'") (raised)

testfixtures/tests/test_popen.py:501: AssertionError
___________________________ Tests.test_invalid_kill ____________________________

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_kill>

    def test_invalid_kill(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        if PY2:
            text = 'kill() takes exactly 1 argument (2 given)'
        else:
            text = 'kill() takes 1 positional argument but 2 were given'
        with ShouldRaise(TypeError(text)):
>           process.kill('moo')

testfixtures/tests/test_popen.py:539: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <testfixtures.popen.MockPopenInstance object at 0x7efdc584d100>
args = ('moo',), kw = {}

    @wraps(func)
    def recorder(self, *args, **kw):
        self._record((func.__name__,), *args, **kw)
>       return func(self, *args, **kw)
E       TypeError: MockPopenInstance.kill() takes 1 positional argument but 2 were given

testfixtures/popen.py:43: TypeError

During handling of the above exception, another exception occurred:

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_kill>

    def test_invalid_kill(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        if PY2:
            text = 'kill() takes exactly 1 argument (2 given)'
        else:
            text = 'kill() takes 1 positional argument but 2 were given'
        with ShouldRaise(TypeError(text)):
>           process.kill('moo')
E           AssertionError: TypeError('kill() takes 1 positional argument but 2 were given') (expected) != TypeError('MockPopenInstance.kill() takes 1 positional argument but 2 were given') (raised)

testfixtures/tests/test_popen.py:539: AssertionError
________________________ Tests.test_invalid_parameters _________________________

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_parameters>

    def test_invalid_parameters(self):
        Popen = MockPopen()
        with ShouldRaise(TypeError(
                "__init__() got an unexpected keyword argument 'foo'"
        )):
>           Popen(foo='bar')

testfixtures/tests/test_popen.py:478: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <testfixtures.popen.MockPopen object at 0x7efdc56d98b0>, args = ()
kw = {'foo': 'bar'}, root_call = call.Popen(foo='bar')

    def __call__(self, *args, **kw):
        self.mock.Popen(*args, **kw)
        root_call = call.Popen(*args, **kw)
        self.all_calls.append(root_call)
>       return MockPopenInstance(self, root_call, *args, **kw)
E       TypeError: MockPopenInstance.__init__() got an unexpected keyword argument 'foo'

testfixtures/popen.py:257: TypeError

During handling of the above exception, another exception occurred:

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_parameters>

    def test_invalid_parameters(self):
        Popen = MockPopen()
        with ShouldRaise(TypeError(
                "__init__() got an unexpected keyword argument 'foo'"
        )):
>           Popen(foo='bar')
E           AssertionError: TypeError("__init__() got an unexpected keyword argument 'foo'") (expected) != TypeError("MockPopenInstance.__init__() got an unexpected keyword argument 'foo'") (raised)

testfixtures/tests/test_popen.py:478: AssertionError
___________________________ Tests.test_invalid_poll ____________________________

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_poll>

    def test_invalid_poll(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        if PY2:
            text = 'poll() takes exactly 1 argument (2 given)'
        else:
            text = 'poll() takes 1 positional argument but 2 were given'
        with ShouldRaise(TypeError(text)):
>           process.poll('moo')

testfixtures/tests/test_popen.py:550: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <testfixtures.popen.MockPopenInstance object at 0x7efdc57aa2e0>
args = ('moo',), kw = {}

    @wraps(func)
    def recorder(self, *args, **kw):
        self._record((func.__name__,), *args, **kw)
>       return func(self, *args, **kw)
E       TypeError: MockPopenInstance.poll() takes 1 positional argument but 2 were given

testfixtures/popen.py:43: TypeError

During handling of the above exception, another exception occurred:

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_poll>

    def test_invalid_poll(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        if PY2:
            text = 'poll() takes exactly 1 argument (2 given)'
        else:
            text = 'poll() takes 1 positional argument but 2 were given'
        with ShouldRaise(TypeError(text)):
>           process.poll('moo')
E           AssertionError: TypeError('poll() takes 1 positional argument but 2 were given') (expected) != TypeError('MockPopenInstance.poll() takes 1 positional argument but 2 were given') (raised)

testfixtures/tests/test_popen.py:550: AssertionError
________________________ Tests.test_invalid_send_signal ________________________

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_send_signal>

    def test_invalid_send_signal(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        with ShouldRaise(TypeError(
                "send_signal() got an unexpected keyword argument 'foo'"
        )):
>           process.send_signal(foo='bar')

testfixtures/tests/test_popen.py:519: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <testfixtures.popen.MockPopenInstance object at 0x7efdc57abc10>
args = (), kw = {'foo': 'bar'}

    @wraps(func)
    def recorder(self, *args, **kw):
        self._record((func.__name__,), *args, **kw)
>       return func(self, *args, **kw)
E       TypeError: MockPopenInstance.send_signal() got an unexpected keyword argument 'foo'

testfixtures/popen.py:43: TypeError

During handling of the above exception, another exception occurred:

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_send_signal>

    def test_invalid_send_signal(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        with ShouldRaise(TypeError(
                "send_signal() got an unexpected keyword argument 'foo'"
        )):
>           process.send_signal(foo='bar')
E           AssertionError: TypeError("send_signal() got an unexpected keyword argument 'foo'") (expected) != TypeError("MockPopenInstance.send_signal() got an unexpected keyword argument 'foo'") (raised)

testfixtures/tests/test_popen.py:519: AssertionError
_________________________ Tests.test_invalid_terminate _________________________

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_terminate>

    def test_invalid_terminate(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        with ShouldRaise(TypeError(
                "terminate() got an unexpected keyword argument 'foo'"
        )):
>           process.terminate(foo='bar')

testfixtures/tests/test_popen.py:528: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <testfixtures.popen.MockPopenInstance object at 0x7efdc56a49a0>
args = (), kw = {'foo': 'bar'}

    @wraps(func)
    def recorder(self, *args, **kw):
        self._record((func.__name__,), *args, **kw)
>       return func(self, *args, **kw)
E       TypeError: MockPopenInstance.terminate() got an unexpected keyword argument 'foo'

testfixtures/popen.py:43: TypeError

During handling of the above exception, another exception occurred:

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_terminate>

    def test_invalid_terminate(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        with ShouldRaise(TypeError(
                "terminate() got an unexpected keyword argument 'foo'"
        )):
>           process.terminate(foo='bar')
E           AssertionError: TypeError("terminate() got an unexpected keyword argument 'foo'") (expected) != TypeError("MockPopenInstance.terminate() got an unexpected keyword argument 'foo'") (raised)

testfixtures/tests/test_popen.py:528: AssertionError
_________________________ Tests.test_invalid_wait_call _________________________

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_wait_call>

    def test_invalid_wait_call(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        with ShouldRaise(TypeError(
                "wait() got an unexpected keyword argument 'foo'"
        )):
>           process.wait(foo='bar')

testfixtures/tests/test_popen.py:510: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <testfixtures.popen.MockPopenInstance object at 0x7efdc56a8790>
args = (), kw = {'foo': 'bar'}

    @wraps(func)
    def recorder(self, *args, **kw):
        self._record((func.__name__,), *args, **kw)
>       return func(self, *args, **kw)
E       TypeError: MockPopenInstance.wait() got an unexpected keyword argument 'foo'

testfixtures/popen.py:43: TypeError

During handling of the above exception, another exception occurred:

self = <testfixtures.tests.test_popen.Tests testMethod=test_invalid_wait_call>

    def test_invalid_wait_call(self):
        Popen = MockPopen()
        Popen.set_command('bar')
        process = Popen('bar')
        with ShouldRaise(TypeError(
                "wait() got an unexpected keyword argument 'foo'"
        )):
>           process.wait(foo='bar')
E           AssertionError: TypeError("wait() got an unexpected keyword argument 'foo'") (expected) != TypeError("MockPopenInstance.wait() got an unexpected keyword argument 'foo'") (raised)

testfixtures/tests/test_popen.py:510: AssertionError
=============================== warnings summary ===============================
/usr/lib/python3.10/site-packages/_pytest/config/__init__.py:1148
  /usr/lib/python3.10/site-packages/_pytest/config/__init__.py:1148: PytestConfigWarning: Unknown config ini key: django_settings_module
  
    self._warn_or_fail_if_strict("Unknown config ini key: {}\n".format(key))

-- Docs: https://docs.pytest.org/en/stable/warnings.html
=========================== short test summary info ============================
FAILED testfixtures/tests/test_popen.py::Tests::test_invalid_communicate_call
FAILED testfixtures/tests/test_popen.py::Tests::test_invalid_kill - Assertion...
FAILED testfixtures/tests/test_popen.py::Tests::test_invalid_parameters - Ass...
FAILED testfixtures/tests/test_popen.py::Tests::test_invalid_poll - Assertion...
FAILED testfixtures/tests/test_popen.py::Tests::test_invalid_send_signal - As...
FAILED testfixtures/tests/test_popen.py::Tests::test_invalid_terminate - Asse...
FAILED testfixtures/tests/test_popen.py::Tests::test_invalid_wait_call - Asse...
============ 7 failed, 721 passed, 3 deselected, 1 warning in 3.31s ============
error: Bad exit status from /var/tmp/rpm-tmp.SqpxEv (%check)
    Bad exit status from /var/tmp/rpm-tmp.SqpxEv (%check)


For the build logs, see:
https://copr-be.cloud.fedoraproject.org/results/@python/python3.10/fedora-rawhide-x86_64/01773441-python-testfixtures/

For all our attempts to build python-testfixtures with Python 3.10, see:
https://copr.fedorainfracloud.org/coprs/g/python/python3.10/package/python-testfixtures/

Testing and mass rebuild of packages is happening in copr. You can follow these instructions to test locally in mock if your package builds with Python 3.10:
https://copr.fedorainfracloud.org/coprs/g/python/python3.10/

Let us know here if you have any questions.

Python 3.10 will be included in Fedora 35. To make that update smoother, we're building Fedora packages with early pre-releases of Python 3.10.
A build failure prevents us from testing all dependent packages (transitive [Build]Requires), so if this package is required a lot, it's important for us to get it fixed soon.
We'd appreciate help from the people who know this package best, but if you don't want to work on this now, let us know so we can try to work around it on our side.

Comment 1 Tomáš Hrnčiar 2021-01-20 09:21:38 UTC
Hello, is there any update on this? It blocks us from testing other packages (python-prawcore, python-praw) with Python 3.10. Thank you.

Comment 2 Petr Viktorin 2021-01-28 10:42:23 UTC
It might be easier to make python-prawcore use pytest's logging capture, and drop the dependency on testfixtures.

Comment 3 Ben Cotton 2021-02-09 15:27:45 UTC
This bug appears to have been reported against 'rawhide' during the Fedora 34 development cycle.
Changing version to 34.


Note You need to log in before you can comment on or make changes to this bug.