commit: ff28ef53fe73447eece90c95ce36245e0ede1d8f Author: Matt Jolly <kangie <AT> gentoo <DOT> org> AuthorDate: Wed Dec 11 02:09:52 2024 +0000 Commit: Matt Jolly <kangie <AT> gentoo <DOT> org> CommitDate: Wed Dec 11 02:28:31 2024 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=ff28ef53
dev-python/pyqtgraph: add `qt5` and `qt6` USE net-wireless/gnuradio requires a pyqtgraph that is built against PyQt5 (as previous versions of this package always did). This became apparent when Qt6 was forced to avoid complicated patching of the sources. Revert to editing the sources to enable (and test) only the USE-selected (Py)Qt versions. Bug: https://bugs.gentoo.org/946181 Signed-off-by: Matt Jolly <kangie <AT> gentoo.org> dev-python/pyqtgraph/pyqtgraph-0.13.7-r2.ebuild | 181 ++++++++++++++++++++++++ 1 file changed, 181 insertions(+) diff --git a/dev-python/pyqtgraph/pyqtgraph-0.13.7-r2.ebuild b/dev-python/pyqtgraph/pyqtgraph-0.13.7-r2.ebuild new file mode 100644 index 000000000000..19cf3d006c7b --- /dev/null +++ b/dev-python/pyqtgraph/pyqtgraph-0.13.7-r2.ebuild @@ -0,0 +1,181 @@ +# Copyright 1999-2024 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +DISTUTILS_USE_PEP517=setuptools +PYTHON_COMPAT=( python3_{10..13} ) + +inherit distutils-r1 + +DESCRIPTION="A pure-python graphics and GUI library built on PyQt and numpy" +HOMEPAGE=" + https://www.pyqtgraph.org/ + https://github.com/pyqtgraph/pyqtgraph/ + https://pypi.org/project/pyqtgraph/ +" +SRC_URI=" + https://github.com/pyqtgraph/pyqtgraph/archive/${P}.tar.gz + -> ${P}.gh.tar.gz +" +S=${WORKDIR}/${PN}-${P} + +LICENSE="MIT" +SLOT="0" +KEYWORDS="amd64 ~arm arm64 ~riscv ~x86" +IUSE="opengl svg qt5 +qt6" +REQUIRED_USE="test? ( opengl svg )" + +RDEPEND=" + >=dev-python/numpy-1.22[${PYTHON_USEDEP}] + dev-python/scipy[${PYTHON_USEDEP}] + opengl? ( dev-python/pyopengl[${PYTHON_USEDEP}] ) + qt5? ( dev-python/pyqt5[gui,widgets,opengl=,svg=,${PYTHON_USEDEP}] ) + qt6? ( dev-python/pyqt6[gui,widgets,opengl=,svg=,${PYTHON_USEDEP}] ) +" +BDEPEND=" + test? ( + dev-python/h5py[${PYTHON_USEDEP}] + qt5? ( dev-python/pyqt5[testlib,${PYTHON_USEDEP}] ) + qt6? ( dev-python/pyqt6[testlib,${PYTHON_USEDEP}] ) + dev-python/pytest-xvfb[${PYTHON_USEDEP}] + dev-vcs/git + ) +" + +EPYTEST_XDIST=1 +distutils_enable_tests pytest + +python_prepare_all() { + distutils-r1_python_prepare_all + + if ! use opengl; then + rm -r pyqtgraph/opengl || die + fi + + # pyqtgraph will automatically use any QT bindings it finds, + # patch the supported Qt versions to only include the ones we have enabled + # This can be simplified to: + # `sed 's/QT_LIB = os.getenv('PYQTGRAPH_QT_LIB')/'QT_LIB = "PyQt6"/' -i pyqtgraph/Qt/__init__.py` + # when we only need to support pyqt6. + local upstream_supported_qt=( + PySide{,2,6} + PyQt{4,5,6} + ) + local gentoo_qt=() + local is_supported_impl use_qt qt + # pyqtgraph has conditionals that depend on these values; we can't just remove them. + # set deselected or unsupported to None to avoid more patching + for qt in "${upstream_supported_qt[@]}"; do + is_supported_impl=0 + case ${qt} in + PyQt5) is_supported_impl=1; use_qt=${qt:2} ;; + PyQt6) is_supported_impl=1; use_qt=${qt:2} ;; + esac + if [[ "${is_supported_impl}" -eq 0 ]]; then + gentoo_qt+=( "${qt^^} = None" ) + continue + fi + if use ${use_qt,,}; then + gentoo_qt+=( "${qt^^} = '${qt}'" ) + else + gentoo_qt+=( "${qt^^} = None" ) + fi + done + + awk -v qt_string="$(printf "%s\n" "${gentoo_qt[@]}")" -i inplace ' + BEGIN { + i = 0 + split(qt_string, qt_array, "\n") + j = 1 + } + /PYSIDE = '"'"'PySide'"'"'/ { + i = 6 # length of upstream_supported_qt + for (k = 1; k <= length(qt_array); k++) { + print qt_array[k] + j++ + } + } + i > 0 { + i-- + next + } + { print } + ' pyqtgraph/Qt/__init__.py || die "Failed to patch supported Qt versions" + + # We also need to remove them from load order. + local liborder=() + local qt + # The order is important (we want to prefer the newest at runtime) + for qt in qt6 qt5; do + if use ${qt}; then + if [[ "${qt}" == qt* ]]; then + liborder+=( "PY${qt^^}" ) + else + liborder+=( "${qt^^}" ) + fi + fi + done + + awk -v libOrder="$(printf "%s, " "${liborder[@]}")" -i inplace ' + BEGIN { + libOrder = "[" substr(libOrder, 1, length(libOrder) - 2) "]" + } + /libOrder = \[PYQT6, PYSIDE6, PYQT5, PYSIDE2\]/ { + sub(/\[PYQT6, PYSIDE6, PYQT5, PYSIDE2\]/, libOrder) + } + { print } + ' pyqtgraph/Qt/__init__.py || die "Failed to patch qt version order" + + # Finally update the list of supported frontends in test to never try unsupported or deselected + if use test; then + local frontends=() + for qt in qt5 qt6; do + if use ${qt}; then + frontends+=( "Qt.PY${qt^^}: False," ) + fi + done + awk -v frontends="$(printf "%s\n" "${frontends[@]}")" -i inplace ' + BEGIN { + i = 0 + split(frontends, frontend_array, "\n") + j = 1 + } + /frontends = {/ { + i = 6 # length of frontends + + print "frontends = {" + for (k = 1; k <= length(frontend_array); k++) { + print " " frontend_array[k] + } + print "}" + } + i > 0 { + i-- + next + } + { print } + ' pyqtgraph/examples/test_examples.py || die "Failed to patch test frontends" + fi +} + +python_test() { + local EPYTEST_DESELECT=( + # apparently fragile + tests/test_reload.py::test_reload + + # TODO + tests/exporters/test_svg.py::test_plotscene + tests/graphicsItems/test_ROI.py::test_PolyLineROI + + # pyside2 is normally skipped if not installed but these two + # fail if it is installed + # TODO: this could be due to USE flags, revisit when pyside2 + # gains py3.9 + 'pyqtgraph/examples/test_examples.py::testExamples[ DateAxisItem_QtDesigner.py - PySide2 ]' + 'pyqtgraph/examples/test_examples.py::testExamples[ designerExample.py - PySide2 ]' + ) + + local -x PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 + epytest -p xvfb +}
