diff --git a/_multibuild b/_multibuild
new file mode 100644
index 0000000..b257b4c
--- /dev/null
+++ b/_multibuild
@@ -0,0 +1,6 @@
+
+ test-pyqt5
+ test-pyqt6
+ test-pyside2
+
+
diff --git a/pytest-qt-3.3.0.tar.gz b/pytest-qt-3.3.0.tar.gz
deleted file mode 100644
index c885dd4..0000000
--- a/pytest-qt-3.3.0.tar.gz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:714b0bf86c5313413f2d300ac613515db3a1aef595051ab8ba2ffe619dbe8925
-size 113439
diff --git a/pytest-qt-4.0.2.tar.gz b/pytest-qt-4.0.2.tar.gz
new file mode 100644
index 0000000..bbedd53
--- /dev/null
+++ b/pytest-qt-4.0.2.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dfc5240dec7eb43b76bcb5f9a87eecae6ef83592af49f3af5f1d5d093acaa93e
+size 113466
diff --git a/python-pytest-qt.changes b/python-pytest-qt.changes
index edd9297..585e3e5 100644
--- a/python-pytest-qt.changes
+++ b/python-pytest-qt.changes
@@ -1,3 +1,103 @@
+-------------------------------------------------------------------
+Mon Jul 12 20:18:59 UTC 2021 - Ben Greiner
+
+- Allow either of the valid Qt binding implementations, do not hard
+ require python-qt5
+- Enable multibuild for tests with different implementations
+ * Pyside2, PyQt5, PyQt6
+ * Prepared for Pyside6
+
+-------------------------------------------------------------------
+Mon Jun 14 15:02:19 UTC 2021 - Ben Greiner
+
+- Update to version 4.0.2
+ * Restored compatibility with PySide2 5.11, which doesn't depend on the
+ ``shiboken2`` project, used by pytest-qt 4.0.0. The dependency is now not
+ needed anymore, and the ``.isdeleted`` attribute of ``qt_compat`` (which
+ isn't intended for public use) is removed.
+- Release 4.0.1
+ * The ``sip`` module now gets imported directly if ``PyQt5.sip`` /
+ ``PyQt6.sip`` wasn't found, as it's still packaged like that in some
+ distributions (`#369`_). Thanks `@The-Compiler`_ for the PR.
+- Release 4.0.0
+ * `PySide6 `__ and `PyQt6 `__ (6.1+)
+ are now supported. Thanks `@jensheilman`_ and `@The-Compiler`_ for the PRs (`#328`_, `#330`_).
+ * ``pytest-qt`` now requires Python 3.6+.
+ * When using PyQt5, ``pytest-qt`` now requires PyQt5 5.11 or newer (`#330`_).
+ * Support for Qt4 (i.e. ``PyQt4`` and ``PySide``) is now dropped (`#279`_).
+ * The ``qtbot.waitActive`` and ``qtbot.waitExposed`` context managers are now
+ available with all Qt APIs, rather than only PyQt5 (`#361`_). Thanks
+ `@The-Compiler`_ for the PR.
+ * The ``qtbot.waitForWindowShown`` method is deprecated, as the underlying Qt
+ method was obsoleted in Qt 5.0 and removed in Qt 6.0. Its name is imprecise and
+ the pytest-qt wrapper does not raise TimeoutError if the window wasn't shown.
+ Please use the ``qtbot.waitExposed`` context manager instead (`#361`_). Thanks
+ `@The-Compiler`_ for the PR.
+ * The old ``qtbot.stopForInteraction()`` name is now removed as it was
+ cumbersome and rarely used. Use ``qtbot.stop()`` (added in 1.1.1) instead
+ (`#306`_). Thanks `@The-Compiler`_ for the PR.
+ * The old ``SignalTimeoutError`` exception alias is now removed, as it was renamed to
+ ``TimeoutError`` in 2.1 (`#306`_). Thanks `@The-Compiler`_ for the PR.
+ * The old ``qt_wait_signal_raising`` option is now removed, as it was renamed to
+ ``qt_default_raising`` in 3.1 (`#306`_). Thanks `@The-Compiler`_ for the PR.
+ * ``qtbot.waitSignal`` and ``waitSignals`` (as well as their PEP-8 aliases)
+ supported passing ``None`` as signal, making them wait for the given timeout
+ instead. This is not supported anymore, use ``qtbot.wait(ms)`` instead
+ (`#306`_). Thanks `@The-Compiler`_ for the PR.
+ * Various arguments to ``qtbot`` methods are now keyword-only (`#366`_):
+ * ``qtbot.waitActive``: ``timeout`` (``widget`` being the only positional argument)
+ * ``qtbot.waitExposed``: ``timeout`` (``widget`` being the only positional argument)
+ * ``qtbot.waitSignal``: ``timeout``, ``raising`` and ``check_params_cb`` (``signal`` being the only positional argument)
+ * ``qtbot.waitSignals``: ``timeout``, ``raising`` and ``check_params_cbs`` (``signals`` being the only positional argument)
+ * ``qtbot.assertNotEmitted``: ``wait`` (``signal`` being the only positional argument)
+ * ``qtbot.waitUntil``: ``timeout`` (``callback`` being the only positional argument)
+ * ``qtbot.waitCallback``: ``timeout`` and ``raising`` (with no positional arguments)
+ The same applies to the respective PEP-8 aliases. Thanks `@The-Compiler`_ for
+ the PR.
+ * Various classes are now not importable from ``pytestqt.plugin`` anymore, and
+ should instead be imported from the module they're residing in since the 1.6.0
+ release (`#306`_):
+ * ``pytestqt.plugin.QtBot`` -> ``pytestqt.qtbot.QtBot``
+ * ``pytestqt.plugin.SignalBlocker`` -> ``pytestqt.wait_signal.SignalBlocker``
+ * ``pytestqt.plugin.MultiSignalBlocker`` -> ``pytestqt.wait_signal.MultiSignalBlocker``
+ * ``pytestqt.plugin.Record`` -> ``pytestqt.logging.Record``
+ * ``pytestqt.plugin.capture_exceptions`` ->
+ ``pytestqt.exceptions.capture_exceptions`` (but consider using
+ ``qtbot.capture_exceptions`` instead)
+ * ``pytestqt.plugin.format_captured_exceptions`` ->
+ ``pytestqt.exceptions.format_captured_exceptions``
+ * The ``qt_api.extract_from_variant`` and ``qt_api.make_variant`` functions
+ (which were never intended for public usage) as well as all class aliases
+ (such as ``qt_api.QWidget`` or ``qt_api.QEvent``, among others) are now
+ removed. Thanks `@The-Compiler`_ for the PR.
+ * The default timeouts for ``qtbot.waitSignal``, ``waitSignals``, ``waitUntil``
+ and ``waitCallback``, ``waitActive`` and ``waitExposed`` have been raised from
+ 1s to 5s. This makes them in line the default timeout used by Qt's underlying
+ methods such as ``QSignalSpy::wait``. To get the old behavior back, explicitly
+ pass ``timeout=1000`` to those functions (`#306`_). Thanks `@The-Compiler`_
+ for the PR.
+ * ``waitUntil`` now raises a ``TimeoutError`` when a timeout occurs to make the
+ cause of the timeout more explict (`#222`_). Thanks `@karlch`_ for the PR.
+ * The ``QtTest::keySequence`` method is now exposed (if available, with Qt >=
+ 5.10) (`#289`_). Thanks `@The-Compiler`_ for the PR.
+ * ``addWidget`` now enforces that its argument is a ``QWidget`` in order to
+ display a clearer error when this isn't the case (`#290`_). Thanks
+ `@The-Compiler`_ for the PR.
+ * New option ``qt_qapp_name`` can be used to set the name of the
+ ``QApplication`` created by ``pytest-qt``, defaulting to ``"pytest-qt-qapp"``
+ (`#302`_). Thanks `@The-Compiler`_ for the PR.
+ * When the ``-s`` (``--capture=no``) argument is passed to pytest, Qt log
+ capturing is now disabled as well (`#300`_). Thanks `@The-Compiler`_ for the PR.
+ * PEP-8 aliases (``add_widget``, ``wait_active``, etc) are no longer just simple
+ assignments to the methods, but they are real methods which call the normal
+ implementations. This makes subclasses work as expected, instead of having to
+ duplicate the assignment (`#326`_, `#333`_). Thanks `@oliveira-mauricio`_ and
+ `@jensheilman`_ for the PRs.
+ * Errors related to the ``qt_compat`` module (such as an invalid
+ ``PYTEST_QT_API`` setting or missing Qt API wrappers) are now shown as a more
+ human-readable error message rather than an internal pytest error (`#355`_). Thanks
+ `@The-Compiler`_ for the PR.
+
-------------------------------------------------------------------
Fri Sep 25 09:19:58 UTC 2020 - Benjamin Greiner
diff --git a/python-pytest-qt.spec b/python-pytest-qt.spec
index 063d652..be9914b 100644
--- a/python-pytest-qt.spec
+++ b/python-pytest-qt.spec
@@ -1,7 +1,7 @@
#
-# spec file for package python-pytest-qt
+# spec file
#
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -16,28 +16,85 @@
#
-%{?!python_module:%define python_module() python-%{**} python3-%{**}}
-Name: python-pytest-qt
-Version: 3.3.0
+%{?!python_module:%define python_module() python3-%{**}}
+%define skip_python2 1
+%global flavor @BUILD_FLAVOR@%{nil}
+%if "%{flavor}" == ""
+%define psuffix %{nil}
+%bcond_with test
+%endif
+%if "%{flavor}" == "test-pyqt5"
+%define psuffix -%{flavor}
+%define test_qtapi pyqt5
+%bcond_without test
+BuildRequires: %{python_module qt5}
+BuildConflicts: %{python_module PyQt6}
+BuildConflicts: %{python_module pyside2}
+BuildConflicts: %{python_module pyside6}
+%endif
+%if "%{flavor}" == "test-pyqt6"
+%define psuffix -%{flavor}
+%define test_qtapi pyqt6
+%bcond_without test
+BuildRequires: %{python_module PyQt6}
+BuildConflicts: %{python_module pyside2}
+BuildConflicts: %{python_module pyside6}
+BuildConflicts: %{python_module qt5}
+%endif
+%if "%{flavor}" == "test-pyside2"
+%define psuffix -%{flavor}
+# pyside is for the primary python3 flavor only
+%define pythons python3
+%define test_qtapi pyside2
+%bcond_without test
+BuildRequires: %{python_module pyside2}
+BuildConflicts: %{python_module PyQt6}
+BuildConflicts: %{python_module pyside6}
+BuildConflicts: %{python_module qt5}
+%endif
+%if "%{flavor}" == "test-pyside6"
+%define psuffix -%{flavor}
+# pyside is for the primary python3 flavor only
+%define pythons python3
+%define test_qtapi pyside6
+%bcond_without test
+BuildRequires: %{python_module pyside6}
+BuildConflicts: %{python_module PyQt6}
+BuildConflicts: %{python_module pyside2}
+BuildConflicts: %{python_module qt5}
+%endif
+
+Name: python-pytest-qt%{psuffix}
+Version: 4.0.2
Release: 0
Summary: Pytest support for PyQt and PySide applications
License: MIT
Group: Development/Languages/Python
-URL: http://github.com/pytest-dev/pytest-qt
+URL: https://github.com/pytest-dev/pytest-qt
Source: https://files.pythonhosted.org/packages/source/p/pytest-qt/pytest-qt-%{version}.tar.gz
-BuildRequires: %{python_module pytest >= 3.0}
-BuildRequires: %{python_module pytest-xvfb}
-BuildRequires: %{python_module qt5}
BuildRequires: %{python_module setuptools_scm}
BuildRequires: %{python_module setuptools}
BuildRequires: dos2unix
BuildRequires: fdupes
-BuildRequires: python-rpm-macros
-Requires: python-pytest >= 3.0
-Requires: python-qt5
+BuildRequires: python-rpm-macros >= 20210608
# https://github.com/pytest-dev/pytest-qt/issues/317
-Requires: free-ttf-fonts
+Requires: bitstream-vera-fonts
+Requires: python-pytest >= 3.0
+Suggests: python-PyQt6
+Suggests: python-pyside2
+Suggests: python-pyside6
+Suggests: python-qt5
BuildArch: noarch
+%if "%{python_flavor}" == "python3" || "%{python_provides}" == "python3"
+Requires: (python-qt5 or python-PyQt6 or python3-pyside2 or python3-pyside6)
+%else
+Requires: (python-qt5 or python-PyQt6)
+%endif
+%if %{with test}
+# https://github.com/pytest-dev/pytest-qt/issues/376
+BuildRequires: %{python_module pytest >= 4.5}
+BuildRequires: %{python_module pytest-qt = %{version}}
+%endif
%python_subpackages
%description
@@ -52,23 +109,30 @@ like key presses and mouse clicks.
%setup -q -n pytest-qt-%{version}
dos2unix LICENSE
+%if ! %{with test}
%build
%python_build
+%endif
+%if ! %{with test}
%install
%python_install
%python_expand %fdupes %{buildroot}%{$python_sitelib}
+%endif
+%if %{with test}
%check
-export PYTEST_QT_API=pyqt5
-# test_qt_api_ini_config* needs the qt4 and pyside/etc
-# test_wait_window fails randomly on OBS
-%pytest -k 'not (test_qt_api_ini_config or test_wait_window)'
+export QT_QPA_PLATFORM=offscreen
+export PYTEST_QT_API=%{test_qtapi}
+%pytest
+%endif
+%if ! %{with test}
%files %{python_files}
%license LICENSE
%doc CHANGELOG.rst README.rst
%{python_sitelib}/pytestqt
%{python_sitelib}/pytest_qt-%{version}-py*.egg-info
+%endif
%changelog