1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
# 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 ) || ( qt5 qt6 )"
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
)
sys-apps/gawk
"
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
gawk -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
liborder+=( "PY${qt^^}" )
fi
done
gawk -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
gawk -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
)
local -x PYTEST_DISABLE_PLUGIN_AUTOLOAD=1
epytest -p xvfb
}
|