projects/guix·blob java-team · refs

1258 lines · 49.3 KiB

1;;; GNU Guix --- Functional package management for GNU
2;;; Copyright © 2020, 2023 Lars-Dominik Braun <[email protected]>
3;;; Copyright © 2021 Adam Kandur <[email protected]>
4;;; Copyright © 2021 Ekaitz Zarraga <[email protected]>
5;;; Copyright © 2021 Ludovic Courtès <[email protected]>
6;;; Copyright © 2021 Morgan Smith <[email protected]>
7;;; Copyright © 2021, 2023 Daniel Meißner <[email protected]>
8;;; Copyright © 2022 Jean-Pierre De Jesus DIAZ <[email protected]>
9;;; Copyright © 2022 Marius Bakke <[email protected]>
10;;; Copyright © 2022 Ryan Prior <[email protected]>
11;;; Copyright © 2023 Adam Faiz <[email protected]>
12;;; Copyright © 2023 Simon Tournier <[email protected]>
13;;; Copyright © 2024 Artyom V. Poptsov <[email protected]>
14;;; Copyright © 2024-2025 Sharlatan Hellseher <[email protected]>
15;;; Copyright © 2025 Sisiutl <[email protected]>
16;;;
17;;; This file is part of GNU Guix.
18;;;
19;;; GNU Guix is free software; you can redistribute it and/or modify it
20;;; under the terms of the GNU General Public License as published by
21;;; the Free Software Foundation; either version 3 of the License, or (at
22;;; your option) any later version.
23;;;
24;;; GNU Guix is distributed in the hope that it will be useful, but
25;;; WITHOUT ANY WARRANTY; without even the implied warranty of
26;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27;;; GNU General Public License for more details.
28;;;
29;;; You should have received a copy of the GNU General Public License
30;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
31
32(define-module (gnu packages python-graphics)
33 #:use-module ((guix licenses) #:prefix license:)
34 #:use-module (guix build-system pyproject)
35 #:use-module (guix download)
36 #:use-module (guix gexp)
37 #:use-module (guix git-download)
38 #:use-module (guix packages)
39 #:use-module (gnu packages)
40 #:use-module (gnu packages audio)
41 #:use-module (gnu packages base)
42 #:use-module (gnu packages boost)
43 #:use-module (gnu packages check)
44 #:use-module (gnu packages cmake)
45 #:use-module (gnu packages compression)
46 #:use-module (gnu packages fontutils)
47 #:use-module (gnu packages game-development)
48 #:use-module (gnu packages gl)
49 #:use-module (gnu packages glib)
50 #:use-module (gnu packages graphics)
51 #:use-module (gnu packages gstreamer)
52 #:use-module (gnu packages gtk)
53 #:use-module (gnu packages image)
54 #:use-module (gnu packages maths)
55 #:use-module (gnu packages pkg-config)
56 #:use-module (gnu packages pulseaudio)
57 #:use-module (gnu packages python)
58 #:use-module (gnu packages python-build)
59 #:use-module (gnu packages python-check)
60 #:use-module (gnu packages python-science)
61 #:use-module (gnu packages python-web)
62 #:use-module (gnu packages python-xyz)
63 #:use-module (gnu packages qt)
64 #:use-module (gnu packages sdl)
65 #:use-module (gnu packages simulation)
66 #:use-module (gnu packages swig)
67 #:use-module (gnu packages tex)
68 #:use-module (gnu packages video)
69 #:use-module (gnu packages xorg))
70
71;;; Commentary:
72;;;
73;;; Python modules which are meant to be used in GUI creation or mainly are
74;;; bindings to low level libraries such as Glue, Mesa, OpenGL, Xorg etc.
75;;;
76;;; Please: Try to add new module packages in alphabetic order.
77;;;
78;;; Code:
79
80(define-public python-asyncgui
81 (package
82 (name "python-asyncgui")
83 (version "0.11.1")
84 (source
85 (origin
86 (method git-fetch)
87 (uri (git-reference
88 (url "https://github.com/asyncgui/asyncgui")
89 (commit (string-append "v" version))))
90 (file-name (git-file-name name version))
91 (sha256
92 (base32 "0fcd4gshygwcfpmxb3sas9awp15rv3m3m1gcxdbf2vrbdchdqhgf"))))
93 (build-system pyproject-build-system)
94 (arguments
95 (list
96 #:build-backend "poetry.core.masonry.api"))
97 (native-inputs
98 (list python-poetry-core
99 python-pytest))
100 (home-page "https://github.com/asyncgui/asyncgui")
101 (synopsis "Enables async/await without an event loop")
102 (description
103 "This package provides support for async/await applications without
104requiring an event loop, useful for creative responsive GUIs.")
105 (license license:expat)))
106
107(define-public python-asynckivy
108 (package
109 (name "python-asynckivy")
110 (version "0.11.0")
111 (source
112 (origin
113 (method git-fetch)
114 (uri (git-reference
115 (url "https://github.com/asyncgui/asynckivy")
116 (commit (string-append "v" version))))
117 (file-name (git-file-name name version))
118 (sha256
119 (base32 "0jxij58ax5lpnhhmhvvbf3sa1mdrbpq6kxab9r25lzgsbqjxj62z"))))
120 (build-system pyproject-build-system)
121 (arguments
122 (list
123 #:build-backend "poetry.core.masonry.api"
124 ;; XXX: Tests need some setup: AttributeError: 'NoneType' object has no
125 ;; attribute 'create_window'.
126 #:tests? #f))
127 (native-inputs
128 (list python-poetry-core))
129 (propagated-inputs
130 (list python-asyncgui))
131 (home-page "https://github.com/asyncgui/asynckivy")
132 (synopsis "Async library for Kivy")
133 (description
134 "This package provides async versions of Kivy functions to avoid the
135callback-heavy mode of interaction typical in some Kivy applications.")
136 (license license:expat)))
137
138(define-public python-glcontext
139 (let (;; Upstream is known for abusing mutable tag, hence pinpoint the
140 ;; relevant commit.
141 (revision "2")
142 (commit "f2875abdb18b24e785c3958cc22845c81725d5cd"))
143 (package
144 (name "python-glcontext")
145 (version (git-version "3.0.0" revision commit))
146 (source
147 (origin
148 (method git-fetch)
149 (uri (git-reference
150 (url "https://github.com/moderngl/glcontext")
151 (commit commit)))
152 (file-name (git-file-name name version))
153 (sha256
154 (base32 "15pngnc4agdvm8crq782vjlb5v1qrclln5xpqiyhz3jhmipsqb8q"))))
155 (build-system pyproject-build-system)
156 (arguments
157 (list
158 #:phases
159 #~(modify-phases %standard-phases
160 (add-before 'build 'fix-lib-paths
161 (lambda* (#:key inputs outputs #:allow-other-keys)
162 (let ((mesa (assoc-ref inputs "mesa"))
163 (libx11 (assoc-ref inputs "libx11")))
164 (substitute* '("glcontext/x11.cpp"
165 "glcontext/egl.cpp")
166 (("\"libGL.so\"")
167 (string-append "\"" mesa "/lib/libGL.so\""))
168 (("\"libEGL.so\"")
169 (string-append "\"" mesa "/lib/libEGL.so\""))
170 (("\"libX11.so\"")
171 (string-append "\"" libx11 "/lib/libX11.so\"")))
172 (substitute* '("glcontext/__init__.py")
173 (("find_library\\('GL'\\)")
174 (string-append "'" mesa "/lib/libGL.so'"))
175 (("find_library\\('EGL'\\)")
176 (string-append "'" mesa "/lib/libEGL.so'"))
177 (("find_library\\(\"X11\"\\)")
178 (string-append "'" libx11 "/lib/libX11.so'"))))))
179 (add-before 'check 'prepare-test-environment
180 (lambda _
181 (system "Xvfb :1 &")
182 (setenv "DISPLAY" ":1"))))))
183 (inputs
184 (list libx11
185 mesa))
186 (native-inputs
187 (list python-psutil
188 python-pytest
189 python-setuptools
190 python-wheel
191 xorg-server-for-tests))
192 (home-page "https://github.com/moderngl/glcontext")
193 (synopsis "Portable OpenGL Context for ModernGL")
194 (description
195 "Python-glcontext is a library providing an OpenGL implementation for
196ModernGL on multiple platforms.")
197 (license license:expat))))
198
199(define-public python-glfw
200 (package
201 (name "python-glfw")
202 (version "2.8.0")
203 (source
204 (origin
205 (method url-fetch)
206 (uri (pypi-uri "glfw" version))
207 (sha256
208 (base32 "1w36jvn6fx8p7irhwj6bbl67m2id3s0227b3w7bgw9hbicr0vsch"))))
209 (build-system pyproject-build-system)
210 (arguments
211 (list
212 #:tests? #f ; no tests provided
213 #:phases
214 #~(modify-phases %standard-phases
215 (add-after 'unpack 'fix-lib-paths
216 (lambda _
217 (substitute* "glfw/library.py"
218 (("_get_library_search_paths\\(\\), ")
219 (format #f "[ '~a/lib' ],"
220 #$(this-package-input "glfw")))))))))
221 (native-inputs
222 (list python-pytest
223 python-setuptools
224 python-wheel))
225 (inputs
226 (list glfw))
227 (home-page "https://github.com/FlorianRhiem/pyGLFW")
228 (synopsis "Python bindings for GLFW")
229 (description
230 "This package provides Python bindings for @url{http://www.glfw.org/,
231GLFW} OpenGL application development library.")
232 (license license:expat)))
233
234(define-public python-isosurfaces
235 (package
236 (name "python-isosurfaces")
237 (version "0.1.2")
238 (source
239 (origin
240 (method git-fetch)
241 (uri (git-reference
242 (url "https://github.com/jared-hughes/isosurfaces")
243 (commit (string-append "v" version))))
244 (file-name (git-file-name name version))
245 (sha256
246 (base32 "11rmbx6hfjz14sykcmqasg4akqm31b67v95sxaxcnkpmqqq8kqzz"))))
247 (build-system pyproject-build-system)
248 (arguments
249 (list
250 #:tests? #f)) ;no tests provided.
251 (native-inputs
252 (list python-setuptools))
253 (propagated-inputs
254 (list python-numpy))
255 (home-page "https://github.com/jared-hughes/isosurfaces")
256 (synopsis "Construct isolines/isosurfaces over a 2D/3D scalar field")
257 (description
258 "Construct isolines/isosurfaces of a 2D/3D scalar field defined by a
259function, i.e. curves over which @code{f(x,y)=0} or surfaces over which
260@code{f(x,y,z)=0}. Most similar libraries use marching squares or similar
261over a uniform grid, but this uses a quadtree to avoid wasting time sampling
262many far from the implicit surface.")
263 (license license:expat)))
264
265(define-public python-kivy
266 (package
267 (name "python-kivy")
268 ;; 2.3.1 (2024-12-26), to suport Python 3.12+ and Cython 3+.
269 (properties '((commit . "92d2cc2f56453c55ae7913e1a64809df6cc61ae5")
270 (revision . "1")))
271 (version (git-version "2.3.1"
272 (assoc-ref properties 'revision)
273 (assoc-ref properties 'commit)))
274 (source
275 (origin
276 (method git-fetch)
277 (uri (git-reference
278 (url "https://github.com/kivy/kivy")
279 (commit (assoc-ref properties 'commit))))
280 (file-name (git-file-name name version))
281 (sha256
282 (base32 "19fk1l061kjmnhm2yl4vym323s53x1p4jfb1armfd4ly5h0ik0m0"))))
283 (build-system pyproject-build-system)
284 (arguments
285 `(#:tests? #f ; Tests require many optional packages
286 #:phases
287 (modify-phases %standard-phases
288 (add-after 'patch-generated-file-shebangs 'set-sdl-paths
289 (lambda* (#:key inputs #:allow-other-keys)
290 (setenv "KIVY_SDL2_PATH"
291 (search-input-directory inputs "/include/SDL2"))))
292 (add-before 'build 'set-home
293 (lambda _
294 ;; 'kivy/__init__.py' wants to create $HOME/.kivy.
295 (setenv "HOME" (getcwd)))))))
296 (native-inputs
297 (list pkg-config
298 python-cython
299 ;; Not packaged yet, for tests.
300 ;; python-kivy-deps-glew
301 ;; python-kivy-deps-glew-dev
302 ;; python-kivy-deps-gstreamer
303 ;; python-kivy-deps-gstreamer-dev
304 ;; python-kivy-deps-sdl2
305 ;; python-kivy-deps-sdl2-dev
306 python-packaging
307 python-setuptools))
308 (inputs
309 (list gstreamer
310 mesa
311 (sdl-union (list sdl2 sdl2-image sdl2-mixer sdl2-ttf))))
312 (propagated-inputs
313 (list python-docutils
314 python-filetype
315 python-kivy-garden
316 python-pygments
317 python-requests))
318 (home-page "https://kivy.org")
319 (synopsis "Multitouch application framework")
320 (description
321 "Kivy is a software library for rapid development of hardware-accelerated
322multitouch applications.")
323 (license license:expat)))
324
325(define-public python-kivymd
326 (package
327 (name "python-kivymd")
328 (version "1.1.1")
329 (source
330 (origin
331 (method git-fetch) ; no tests in PyPI release
332 (uri (git-reference
333 (url "https://github.com/kivymd/KivyMD")
334 (commit version)))
335 (file-name (git-file-name name version))
336 (sha256
337 (base32 "1nprldcm54qybbwf7zlb32fkmz375j8i3k3g41d6ykc6vasq3w5j"))))
338 (build-system pyproject-build-system)
339 (arguments
340 (list
341 #:test-flags
342 ;; <https://github.com/pyinstaller/pyinstaller> is not packaged yet in
343 ;; Guix.
344 #~(list "--ignore=kivymd/tests/pyinstaller"
345 "-k" (string-join
346 ;; FIXME: Only some tests passed, the most fail with err:
347 ;; ValueError: KivyMD: App object must be initialized
348 ;; before loading root widget.
349 (list "not test_backdrop_raw_app"
350 "test_bottom_navigation_m3_style_raw_app"
351 "test_card_m3_style_raw_app"
352 "test_chip_raw_app"
353 "test_imagelist_raw_app"
354 "test_list_raw_app"
355 "test_navigationdrawer_raw_app"
356 "test_tab_raw_app"
357 "test_textfield_raw_app")
358 " and not "))
359 #:phases
360 #~(modify-phases %standard-phases
361 (add-after 'unpack 'fix-modules
362 (lambda _
363 (substitute* "setup.py"
364 ;; If excluded, sanity check fails with error:
365 ;; ModuleNotFoundError: No module named 'kivymd.tools.release'
366 (("\"kivymd.tools.release\"") ""))
367 ;; Check phase fails struggling to find tests module.
368 (with-output-to-file "kivymd/tests/__init__.py"
369 (lambda _ (display "")))))
370 (add-before 'build 'set-home
371 (lambda _
372 ;; FileNotFoundError: [Errno 2] No such file or directory:
373 ;; '/homeless-shelter/.kivy'
374 (setenv "HOME" "/tmp"))))))
375 (native-inputs
376 (list python-docutils
377 python-pytest
378 python-pytest-asyncio
379 python-setuptools
380 python-wheel))
381 (propagated-inputs
382 (list python-kivy
383 python-pillow
384 python-pygments
385 python-kivy-garden))
386 (home-page "https://github.com/kivymd/KivyMD")
387 (synopsis "Material Design compliant widgets for use with Kivy")
388 (description
389 "This package provides Kivy widgets that approximate Google's Material
390Design spec without sacrificing ease of use or application performance.")
391 (license license:expat)))
392
393;; XXX: The package was placed here to prevent adding (gnu packages video) to
394;; (gnu packages maths) module, it fits more there.
395(define-public python-manim
396 (package
397 (name "python-manim")
398 (version "0.20.1")
399 (source
400 (origin
401 (method git-fetch)
402 (uri (git-reference
403 (url "https://github.com/ManimCommunity/manim")
404 (commit (string-append "v" version))))
405 (file-name (git-file-name name version))
406 (sha256
407 (base32 "1ifgcsz9dhb7qyqsi60q840wqcqfmqxf19r8qlncakziyqlfmwxd"))))
408 (build-system pyproject-build-system)
409 (arguments
410 (list
411 #:test-flags
412 #~(list "--numprocesses" (number->string (parallel-job-count))
413 ;; OpenGL tests skipped: require GPU/EGL acceleration
414 ;; unavailable in build environment. These tests pass on systems
415 ;; with proper GPU drivers.
416 ;;
417 ;; command/logging tests skipped: expected failures due to Guix
418 ;; build environment specifics (PATH wrapping, offline mode).
419 "-k" "not (opengl or OpenGL)"
420 "--ignore=tests/interface/test_commands.py"
421 "--ignore=tests/test_logging/test_logging.py")
422 #:phases
423 #~(modify-phases %standard-phases
424 (add-before 'check 'set-x-server
425 (lambda _
426 (system "Xvfb :1 -screen 0 1024x768x24 &")
427 (setenv "DISPLAY" ":1")))
428 (add-after 'unpack 'fix-pytest-config
429 (lambda _
430 (substitute* "pyproject.toml"
431 ((" -n auto ") " ")))))))
432 (native-inputs
433 (list python-hatchling
434 python-pytest
435 python-pytest-xdist
436 (texlive-local-tree
437 (list texlive-dvisvgm
438 texlive-fontspec
439 texlive-preview
440 texlive-standalone
441 texlive-xcolor))
442 xorg-server))
443 (propagated-inputs
444 (list ffmpeg
445 python-av
446 python-beautifulsoup4
447 python-click
448 python-cloup
449 python-decorator
450 python-isosurfaces
451 python-manimpango
452 python-mapbox-earcut
453 python-moderngl
454 python-moderngl-window
455 python-networkx
456 python-numpy
457 python-pillow
458 python-pycairo
459 python-pydub
460 python-pygments
461 python-rich
462 python-screeninfo
463 python-skia-pathops
464 python-srt
465 python-svgelements
466 python-tqdm
467 python-typing-extensions
468 python-watchdog))
469 (home-page "https://www.manim.community/")
470 (synopsis "Python animation engine for explanatory math videos")
471 (description
472 "Manim is a Python library for creating mathematical animations. The
473animations are written as Python code which is based on predefined objects.
474You can make animations with maths formulas (LaTeX-based), simple shapes, 3D
475objects, function graphs and more.")
476 (license license:expat)))
477
478(define-public python-mapbox-earcut
479 (package
480 (name "python-mapbox-earcut")
481 (version "2.0.0")
482 (source
483 (origin
484 (method git-fetch)
485 (uri (git-reference
486 (url "https://github.com/skogler/mapbox_earcut_python")
487 (commit (string-append "v" version))))
488 (file-name (git-file-name name version))
489 (sha256
490 (base32 "18mpr453wbfdaa95xsvhqy5vmb311ja59dzi0aizwdf3nwjh75j7"))))
491 (build-system pyproject-build-system)
492 (native-inputs
493 (list python-nanobind
494 python-pytest
495 python-scikit-build-core))
496 (propagated-inputs
497 (list python-numpy))
498 (home-page "https://github.com/skogler/mapbox_earcut_python")
499 (synopsis "Python bindings to the mapbox earcut C++ library")
500 (description
501 "Python bindings for the C++ implementation of the Mapbox Earcut library,
502which provides very fast and quite robust triangulation of 2D polygons.
503
504The library implements a modified ear slicing algorithm, optimized by z-order
505curve hashing and extended to handle holes, twisted polygons, degeneracies and
506self-intersections in a way that doesn't guarantee correctness of
507triangulation, but attempts to always produce acceptable results for practical
508data like geographical shapes.")
509 (license license:isc)))
510
511(define-public python-moderngl
512 (package
513 (name "python-moderngl")
514 (version "5.12.0")
515 (source
516 (origin
517 (method git-fetch)
518 (uri (git-reference
519 (url "https://github.com/moderngl/moderngl")
520 (commit version)))
521 (file-name (git-file-name name version))
522 (sha256
523 (base32 "0gf8cam9m6sz73ndlwz8a5vd0qz06lbww3lgfjcdmla6bwyxjxd5"))))
524 (build-system pyproject-build-system)
525 (arguments
526 (list
527 #:test-flags
528 #~(list "-k" "not (test_local or test_compute_shader)")))
529 (native-inputs
530 (list python-numpy
531 python-pyopengl
532 python-pytest
533 python-scipy-minimal
534 python-setuptools))
535 (propagated-inputs
536 (list python-glcontext))
537 (home-page "https://github.com/moderngl/moderngl")
538 (synopsis "Modern OpenGL binding for Python")
539 (description
540 "ModernGL is a Python wrapper over OpenGL Core. ModernGL simplifies the
541creation of graphics applications like scientific simulations, games or user
542interfaces. Usually, acquiring in-depth knowledge of OpenGL requires a steep
543learning curve. In contrast, ModernGL is easy to learn and use. ModernGL is
544capable of rendering with high performance and quality, with less code
545written.")
546 (license license:expat)))
547
548(define-public python-moderngl-window
549 (package
550 (name "python-moderngl-window")
551 (version "3.1.1")
552 (source
553 (origin
554 (method git-fetch)
555 (uri (git-reference
556 (url "https://github.com/moderngl/moderngl-window")
557 (commit version)))
558 (file-name (git-file-name name version))
559 (sha256
560 (base32 "1f5mnm1c92ssn7hww40k5yyz4r6b1d5xb2i9y99mcrjv6g1m4jd4"))))
561 (build-system pyproject-build-system)
562 (arguments
563 (list
564 #:phases
565 #~(modify-phases %standard-phases
566 (add-before 'check 'set-x-server
567 (lambda _
568 (system "Xvfb :1 &")
569 (setenv "DISPLAY" ":1"))))))
570 (native-inputs
571 (list python-pytest
572 python-pywavefront
573 python-setuptools
574 python-trimesh
575 xorg-server-for-tests))
576 (propagated-inputs
577 (list python-moderngl
578 python-numpy
579 python-pillow
580 python-pyglet
581 python-pyglm))
582 (home-page "https://github.com/moderngl/moderngl_window")
583 (synopsis "Helper library for ModernGL making window simple")
584 (description
585 "Cross platform utility library for ModernGL making window creation and
586resource loading simple. It can also be used with PyOpenGL for rendering with
587the programmable pipeline.
588
589Features:
590
591@itemize
592@item Cross platform support.
593@item Easily create a window for ModernGL using pyglet, pygame, PySide2, GLFW,
594SDL2, PyQt5 or tkinter supporting a wide range of window, keyboard and mouse
595events. These events are unified into a single system so your project can
596work with any window.
597@item Load 2D textures, texture arrays and cube maps using Pillow.
598@item Load shaders as single or multiple @code{glsl} files.
599@item Load objects/scenes from wavefront/obj, GLTF 2.0 or STL.
600@item Resource finder system supporting multiple resource directories.
601@item A highly plugable library supporting custom loaders, resource finders
602and windows.
603@item Type hints everywhere making code completion and linting a breeze.
604@end itemize")
605 (license license:expat)))
606
607(define-public python-pivy
608 (package
609 (name "python-pivy")
610 (version "0.6.11")
611 (source
612 (origin
613 (method git-fetch)
614 (uri (git-reference
615 (url "https://github.com/coin3d/pivy")
616 (commit version)))
617 (file-name (git-file-name name version))
618 (sha256
619 (base32 "0rjbhhxyrh0fszc0va7qmkv6ayf2s49ppnw31p51xmq63bx3n5wc"))))
620 (build-system pyproject-build-system)
621 (arguments
622 (list
623 ;; The test suite fails due to an import cycle between 'pivy' and '_coin'
624 #:tests? #f
625 #:phases
626 #~(modify-phases %standard-phases
627 (add-after 'unpack 'patch-cmake-include-dirs
628 (lambda _
629 ;; Patch buildsystem to respect Coin3D include directory
630 (substitute* "CMakeLists.txt"
631 (("\\$\\{SoQt_INCLUDE_DIRS}")
632 "${Coin_INCLUDE_DIR};${SoQt_INCLUDE_DIRS}")))))))
633 (native-inputs
634 (list cmake-minimal
635 python-setuptools
636 swig-4.4))
637 (inputs
638 (list qtbase
639 libxi
640 libice
641 glew
642 coin3d))
643 (home-page "https://github.com/coin3d/pivy")
644 (synopsis "Python bindings to Coin3D")
645 (description
646 "Pivy provides python bindings for Coin, a 3D graphics library with an
647Application Programming Interface based on the Open Inventor 2.1 API.")
648 (license license:isc)))
649
650(define-public python-py3exiv2
651 (package
652 (name "python-py3exiv2")
653 (version "0.12.0")
654 (source
655 (origin
656 (method url-fetch)
657 ;; Source: https://code.launchpad.net/py3exiv2
658 (uri (pypi-uri "py3exiv2" version))
659 (sha256
660 (base32 "12is7xb393wvq3la9lhi0y1xkmpvjj6v13cikb7k6iqcfrgkxckj"))))
661 (build-system pyproject-build-system)
662 (arguments
663 (list #:tests? #f)) ;no tests in PyPI
664 (native-inputs
665 (list boost
666 python-setuptools))
667 (inputs
668 (list exiv2))
669 (home-page "https://www.py3exiv2.tuxfamily.org/")
670 (synopsis "Python binding to the exiv2 library")
671 (description
672 "This package provides a Python binding to the library
673@code{https://exiv2.org/, exiv2} - cross-platform C++ library and a command
674line utility to manage image metadata.")
675 (license license:gpl3+)))
676
677(define-public python-pyglet
678 (package
679 (name "python-pyglet")
680 (version "2.0.18")
681 (source
682 (origin
683 (method url-fetch)
684 (uri (pypi-uri "pyglet" version))
685 (sha256
686 (base32 "1p4rizj81vfqxal288m3afbrgk0il3w7k5kmhai2sah8f26j7ybw"))))
687 (build-system pyproject-build-system)
688 (arguments
689 (list
690 #:test-flags
691 #~(list "tests"
692 "--ignore=tests/interactive"
693 ;; All tests errored
694 "--ignore=tests/integration/media/test_openal.py"
695 "--ignore=tests/integration/text/test_empty_document.py"
696 ;; Tests failed
697 "-k" (string-append "not test2"
698 " and not test5"
699 " and not testPad"
700 " and not testPad"
701 " and not testRange"
702 " and not testRect"
703 " and not testRect"
704 " and not testSet"
705 " and not testSquare"
706 " and not testSquare"
707 " and not testTuple"
708 " and not testTupleRange"
709 " and not test_context_noshare_texture"
710 " and not test_context_share_texture"
711 " and not test_method"
712 " and not test_openal_listener"
713 " and not test_parse_all_controller_mappings"
714 " and not test_player_play"
715 " and not test_player_play_multiple"
716 " and not test_stream_write_needed"
717 " and not test_window_caption"
718 " and not test_window_caption_from_argv"))
719 #:phases
720 #~(modify-phases %standard-phases
721 (add-after 'unpack 'patch-lib-paths
722 (lambda* (#:key inputs #:allow-other-keys)
723 (substitute* (list "pyglet/font/fontconfig.py"
724 "pyglet/font/freetype_lib.py"
725 "pyglet/gl/lib_glx.py"
726 "pyglet/input/linux/evdev.py"
727 "pyglet/libs/egl/egl.py"
728 "pyglet/libs/egl/lib.py"
729 "pyglet/libs/x11/xf86vmode.py"
730 "pyglet/libs/x11/xinerama.py"
731 "pyglet/libs/x11/xlib.py"
732 "pyglet/libs/x11/xsync.py"
733 "pyglet/media/drivers/openal/lib_openal.py"
734 "pyglet/media/drivers/pulse/lib_pulseaudio.py")
735 (("'EGL'")
736 (format #f "'~a/~a'" #$(this-package-input "mesa")
737 "lib/libEGL.so"))
738 (("\"fontconfig\"")
739 (format #f "'~a/~a'" #$(this-package-input "fontconfig-minimal")
740 "lib/libfontconfig.so"))
741 (("\"freetype\"")
742 (format #f "'~a/~a'" #$(this-package-input "freetype")
743 "lib/libfreetype.so"))
744 (("'GL'")
745 (format #f "'~a/~a'" #$(this-package-input "mesa")
746 "lib/libGL.so"))
747 (("'GLU'")
748 (format #f "'~a/~a'" #$(this-package-input "glu")
749 "lib/libGLU.so"))
750 (("'X11'")
751 (format #f "'~a/~a'" #$(this-package-input "libx11")
752 "lib/libX11.so"))
753 (("'Xext'")
754 (format #f "'~a/~a'" #$(this-package-input "libxext")
755 "lib/libXext.so"))
756 (("'Xinerama'")
757 (format #f "'~a/~a'" #$(this-package-input "libxinerama")
758 "lib/libXinerama.so"))
759 (("'Xxf86vm'")
760 (format #f "'~a/~a'" #$(this-package-input "libxxf86vm")
761 "lib/libXxf86vm.so"))
762 (("'c'")
763 (format #f "'~a/~a'" #$(this-package-input "glibc")
764 "lib/libc.so"))
765 (("'gdk-x11-2.0'")
766 (format #f "'~a/~a'" #$(this-package-input "gtk+")
767 "lib/gdk-pixbuf-2.0.so"))
768 (("'gdk_pixbuf-2.0'")
769 (format #f "'~a/~a'" #$(this-package-input "gdk-pixbuf")
770 "lib/libgdk_pixbuf-2.0.so"))
771 (("'openal'")
772 (format #f "'~a/~a'" #$(this-package-input "openal")
773 "lib/libopenal.so"))
774 (("'pulse'")
775 (format #f "'~a/~a'" #$(this-package-input "pulseaudio")
776 "lib/libpulse.so")))))
777 (add-before 'check 'prepare-test-environment
778 (lambda _
779 ;; The test suite requires a running X server.
780 (system "Xvfb :1 &")
781 (setenv "DISPLAY" ":1")
782 (setenv "HOME" "/tmp")
783 (setenv "PYGLET_HEADLESS" "True"))))))
784 (native-inputs
785 (list python-flit-core
786 python-pytest
787 unzip
788 xorg-server-for-tests))
789 (inputs
790 (list ffmpeg
791 fontconfig
792 freeglut
793 freetype
794 gdk-pixbuf
795 glibc
796 glu
797 gtk+
798 libx11
799 libxext
800 libxinerama
801 libxxf86vm
802 mesa
803 openal
804 pulseaudio
805 python-pygobject))
806 (home-page "https://github.com/pyglet/pyglet")
807 (synopsis "Windowing and multimedia library")
808 (description
809 "Pyglet is a Python library for developing games and other visually-rich
810applications. It supports windowing, user interface event handling,
811Joysticks, OpenGL graphics, loading images and videos, playing sounds and
812music." )
813 (license license:bsd-3)))
814
815(define-public python-pyglet-1
816 (package
817 (inherit python-pyglet)
818 (name "python-pyglet")
819 (version "1.5.30") ;the latest 1.* version from 2024-12-24
820 (source
821 (origin
822 (method git-fetch)
823 (uri (git-reference
824 (url "https://github.com/pyglet/pyglet")
825 (commit (string-append "v" version))))
826 (file-name (git-file-name name version))
827 (sha256
828 (base32 "0q1690pqkks3na6vc8ps44h0gymlmq752xlk7fm0yvz05yqdqn51"))))
829 (arguments
830 (list
831 ;; tests: 317 passed, 24 skipped, 1 deselected, 2 warnings
832 #:test-flags
833 #~(list "--ignore=tests/base"
834 "--ignore=tests/interactive"
835 "--ignore=tests/integration/media"
836 "--ignore=tests/integration/font"
837 "--ignore=tests/integration/platform/test_linux_fontconfig.py"
838 ;; AssertionError: False is not true : Did not receive next
839 ;; expected event
840 "--ignore=tests/integration/window/test_event_sequence.py"
841 ;; pyglet.media.drivers.openal.interface.OpenALException: OpenAL
842 ;; Exception [40964: b'Invalid Value']: Failed to open device.
843 "--deselect=tests/unit/media/test_listener.py::test_openal_listener")
844 #:phases
845 #~(modify-phases %standard-phases
846 (add-after 'unpack 'fix-python-3.12-incompatibility
847 ;; The only user of pyglet@1 is printrun, see:
848 ;; <https://github.com/kliment/Printrun/issues/1468>.
849 (lambda _
850 (substitute* "tests/integration/test_toplevel_imports.py"
851 (("import imp") ""))))
852 (add-after 'unpack 'patch-lib-paths
853 (lambda* (#:key inputs #:allow-other-keys)
854 (substitute* (list "pyglet/font/fontconfig.py"
855 "pyglet/font/freetype_lib.py"
856 "pyglet/gl/lib_glx.py"
857 "pyglet/libs/egl/egl.py"
858 "pyglet/libs/egl/lib.py"
859 "pyglet/libs/x11/xf86vmode.py"
860 "pyglet/libs/x11/xinerama.py"
861 "pyglet/libs/x11/xlib.py"
862 "pyglet/libs/x11/xsync.py"
863 "pyglet/media/drivers/openal/lib_openal.py"
864 "pyglet/media/drivers/pulse/lib_pulseaudio.py")
865 (("'EGL'")
866 (format #f "'~a/~a'" #$(this-package-input "mesa")
867 "lib/libEGL.so"))
868 (("'fontconfig'")
869 (format #f "'~a/~a'" #$(this-package-input "fontconfig-minimal")
870 "lib/libfontconfig.so"))
871 (("'freetype'")
872 (format #f "'~a/~a'" #$(this-package-input "freetype")
873 "lib/libfreetype.so"))
874 (("'GL'")
875 (format #f "'~a/~a'" #$(this-package-input "mesa")
876 "lib/libGL.so"))
877 (("'GLU'")
878 (format #f "'~a/~a'" #$(this-package-input "glu")
879 "lib/libGLU.so"))
880 (("'X11'")
881 (format #f "'~a/~a'" #$(this-package-input "libx11")
882 "lib/libX11.so"))
883 (("'Xext'")
884 (format #f "'~a/~a'" #$(this-package-input "libxext")
885 "lib/libXext.so"))
886 (("'Xinerama'")
887 (format #f "'~a/~a'" #$(this-package-input "libxinerama")
888 "lib/libXinerama.so"))
889 (("'Xxf86vm'")
890 (format #f "'~a/~a'" #$(this-package-input "libxxf86vm")
891 "lib/libXxf86vm.so"))
892 (("'c'")
893 (format #f "'~a/~a'" #$(this-package-input "glibc")
894 "lib/libc.so"))
895 (("'gdk-x11-2.0'")
896 (format #f "'~a/~a'" #$(this-package-input "gtk+")
897 "lib/gdk-pixbuf-2.0.so"))
898 (("'gdk_pixbuf-2.0'")
899 (format #f "'~a/~a'" #$(this-package-input "gdk-pixbuf")
900 "lib/libgdk_pixbuf-2.0.so"))
901 (("'openal'")
902 (format #f "'~a/~a'" #$(this-package-input "openal")
903 "lib/libopenal.so"))
904 (("'pulse'")
905 (format #f "'~a/~a'" #$(this-package-input "pulseaudio")
906 "lib/libpulse.so")))))
907 (add-before 'check 'prepare-test-environment
908 (lambda _
909 ;; The test suite requires a running X server.
910 (system "Xvfb :1 &")
911 (setenv "DISPLAY" ":1")
912 (setenv "HOME" "/tmp")
913 (setenv "PYGLET_HEADLESS" "True"))))))
914 (native-inputs
915 (list python-pytest
916 python-setuptools
917 xorg-server-for-tests))))
918
919(define-public python-pyopengl
920 (package
921 (name "python-pyopengl")
922 (version "3.1.10")
923 (source
924 (origin
925 (method git-fetch)
926 (uri (git-reference
927 (url "https://github.com/mcfletch/pyopengl")
928 (commit version)))
929 (file-name (git-file-name name version))
930 (sha256
931 (base32 "0gn6n6z76xrvwj9inl2v6rr707n1w8s072qxfmzpla1i9bfckzjk"))))
932 (build-system pyproject-build-system)
933 (arguments
934 (list
935 ;; 62 passed, 26 skipped, 26 deselected, 2 xfailed, 2 warnings
936 #:test-flags
937 #~(list #$@(map (lambda (test) (string-append "--deselect=tests/" test))
938 (list
939 ;; RuntimeError: Test script failure on <...>
940 "test_checks.py::test_check_crash_on_glutinit"
941 "test_checks.py::test_check_egl_es1"
942 "test_checks.py::test_check_egl_es2"
943 "test_checks.py::test_check_egl_opengl"
944 "test_checks.py::test_check_glutwindow"
945 "test_checks.py::test_check_freeglut_deinit"
946 "test_checks.py::test_check_glut_debug"
947 "test_checks.py::test_check_glut_fc"
948 "test_checks.py::test_check_glut_load"
949 "test_checks.py::test_check_glutinit"
950 "test_checks.py::test_check_glutinit_0args"
951 "test_checks.py::test_check_glutinit_single"
952 "test_checks.py::test_check_glutinit_simplest"
953 "test_checks.py::test_egl_ext_enumerate"
954 "test_checks.py::test_test_instanced_draw_detect"
955 "test_checks.py::test_test_gldouble_ctypes"
956 ;; OpenGL.error.Error: Attempt to retrieve context when
957 ;; no valid context
958 "test_arraydatatype.py::TestCoreDatatype::test_numpyConversion"
959 "test_arraydatatype.py::TestCoreDatatype::test_pointers"
960 "test_core.py::TestCore::test_glCallLists_twice2"
961 "test_core.py::TestCore::test_glmultidraw"
962 ;; RuntimeError: Test Failed
963 "test_checks.py::test_feedbackvarying"
964 "test_checks.py::test_test_sf2946226"
965 "test_checks.py::test_test_glgetactiveuniform"
966 ;; TypeError: '<' not supported between instances of
967 ;; 'bool' and 'list'
968 "test_core.py::TestCore::test_get_read_fb_binding"
969 "test_core.py::TestCore::test_lookupint"
970 ;; assert not glShaderSource
971 "test_core.py::TestCore::test_get_version")))
972 #:phases
973 #~(modify-phases %standard-phases
974 (add-before 'build 'fix-paths
975 (lambda* (#:key inputs #:allow-other-keys)
976 (substitute* '("OpenGL/platform/ctypesloader.py")
977 (("filenames_to_try = \\[base_name\\]")
978 "filenames_to_try = [name]"))
979 (substitute* '("OpenGL/platform/glx.py"
980 "OpenGL/platform/egl.py"
981 "OpenGL/platform/osmesa.py"
982 "OpenGL/platform/darwin.py"
983 "tests/check_glut_load.py")
984 (("\"GLU\",")
985 (format #f "~s," (search-input-file inputs "lib/libGLU.so")))
986 (("'GLU',")
987 (format #f "~s," (search-input-file inputs "lib/libGLU.so")))
988 (("\"glut\",")
989 (format #f "~s," (search-input-file inputs "lib/libglut.so")))
990 (("'glut',")
991 (format #f "~s," (search-input-file inputs "lib/libglut.so")))
992 (("'(GL|EGL|GLESv1_CM|GLESv2)'" all gl-library)
993 (format #f "~s" (search-input-file inputs (string-append
994 "lib/lib"
995 gl-library ".so"))))
996 (("\"(GLESv1_CM|GLESv2)\"" all gl-library)
997 (format #f "~s" (search-input-file inputs (string-append
998 "lib/lib"
999 gl-library ".so")))))))
1000 (add-before 'check 'pre-check
1001 (lambda _
1002 (setenv "LANG" "fr_FR.UTF-8")
1003 (setenv "LANGUAGE" "fr_FR.UTF-8")
1004 (setenv "DISPLAY" ":1")
1005 (setenv "HOME" "/tmp")
1006 (setenv "USER" "guix")
1007 (setenv "XDG_RUNTIME_DIR" "/tmp")
1008 (setenv "XDG_SESSION_ID" "11235813")
1009 (setenv "XDG_SESSION_PATH" "/tmp")
1010 (setenv "XDG_SESSION_TYPE" "x11"))))))
1011 (native-inputs
1012 (list python-cython
1013 python-numpy
1014 python-psutil
1015 python-pygame-ce
1016 python-pytest
1017 python-setuptools))
1018 (inputs
1019 (list freeglut
1020 glu
1021 mesa))
1022 (home-page "https://pyopengl.sourceforge.net")
1023 (synopsis "Standard OpenGL bindings for Python")
1024 (description
1025 "PyOpenGL is the most common cross platform Python binding to OpenGL and
1026related APIs. The binding is created using the standard @code{ctypes}
1027library.")
1028 (license license:bsd-3)))
1029
1030(define-public python-pyopengl-accelerate
1031 (package
1032 (inherit python-pyopengl)
1033 (name "python-pyopengl-accelerate")
1034 (version "3.1.10")
1035 (source
1036 (origin
1037 (method url-fetch)
1038 (uri (pypi-uri "pyopengl_accelerate" version))
1039 (sha256
1040 (base32
1041 "0waskwvw9mp830bnnxcqd8bkh7a4qbnr0fcjnnw35xx6y21iqxc2"))))
1042 (arguments
1043 `(#:tests? #f
1044 #:phases
1045 (modify-phases %standard-phases
1046 (delete 'fix-paths))))
1047 (synopsis "Acceleration code for PyOpenGL")
1048 (description
1049 "This is the Cython-coded accelerator module for PyOpenGL.")))
1050
1051(define-public python-pysdl2
1052 (package
1053 (name "python-pysdl2")
1054 (version "0.9.17")
1055 (source
1056 (origin
1057 (method url-fetch)
1058 (uri (pypi-uri "pysdl2" version))
1059 (sha256
1060 (base32 "0axm6m3wj8x643zg65g60xdpaxanaqdilvp4yysks4pblh0yzij8"))))
1061 (build-system pyproject-build-system)
1062 (arguments
1063 (list
1064 #:tests? #f ;; Requires /dev/dri, OpenGL module, etc.
1065 #:phases
1066 #~(modify-phases %standard-phases
1067 (add-after 'unpack 'patch-paths
1068 (lambda _
1069 (substitute* "sdl2/dll.py"
1070 ;; Disable pysdl2-dll. It can't be packaged on GNU Guix
1071 ;; as it duplicates an existing package (sdl2).
1072 (("prepath = os\\.getenv\\('PYSDL2_DLL_PATH'\\)")
1073 "prepath = \"system\"")
1074 (("^import sdl2dll$") "")
1075 (("postpath = os\\.getenv\\('PYSDL2_DLL_PATH'\\)")
1076 "postpath = \"system\"")
1077 (("DLL\\(.*, os\\.getenv\\(\"PYSDL2_DLL_PATH\"\\)\\)")
1078 (format #f "DLL('SDL2', ['SDL2', 'SDL2-2.0', 'SDL2-2.0.0'], '~a/lib')"
1079 #$(this-package-input "sdl2"))))
1080 (substitute* "sdl2/sdlimage.py"
1081 (("os\\.getenv\\(\"PYSDL2_DLL_PATH\"\\)")
1082 (format #f "'~a/~a'" #$(this-package-input "sdl2-image")
1083 "lib/libSDL2_image.so")))
1084 (substitute* "sdl2/sdlgfx.py"
1085 (("os\\.getenv\\(\"PYSDL2_DLL_PATH\"\\)")
1086 (format #f "'~a/~a'" #$(this-package-input "sdl2-gfx")
1087 "lib/libSDL2_gfx.so")))
1088 (substitute* "sdl2/sdlmixer.py"
1089 (("os\\.getenv\\(\"PYSDL2_DLL_PATH\"\\)")
1090 (format #f "'~a/~a'" #$(this-package-input "sdl2-mixer")
1091 "lib/libSDL2_mixer.so")))
1092 (substitute* "sdl2/sdlttf.py"
1093 (("os\\.getenv\\(\"PYSDL2_DLL_PATH\"\\)")
1094 (format #f "'~a/~a'" #$(this-package-input "sdl2-ttf")
1095 "lib/libSDL2_ttf.so"))))))))
1096 (native-inputs
1097 (list python-setuptools
1098 python-wheel))
1099 (inputs
1100 (list sdl2 sdl2-image sdl2-gfx sdl2-mixer sdl2-ttf))
1101 (home-page "https://github.com/py-sdl/py-sdl2")
1102 (synopsis "Python bindings around the SDL2 game development library")
1103 (description
1104 "PySDL2 is a pure Python wrapper around the
1105@code{SDL2},@code{SDL2_mixer}, @code{SDL2_image}, @code{SDL2_ttf}, and
1106@code{SDL2_gfx} libraries. Instead of relying on C code, it uses the built-in
1107ctypes module to interface with SDL2, and provides simple Python classes and
1108wrappers for common SDL2 functionality.")
1109 (license license:cc0)))
1110
1111(define-public python-pywavefront
1112 (package
1113 (name "python-pywavefront")
1114 (version "1.3.3")
1115 (source
1116 (origin
1117 (method git-fetch)
1118 (uri (git-reference
1119 (url "https://github.com/pywavefront/PyWavefront")
1120 (commit version)))
1121 (file-name (git-file-name name version))
1122 (sha256
1123 (base32 "07r9z0dzz5xq9qlmp855mxsf9776b1ypk06nc9cf69r9d8pk8bkj"))))
1124 (build-system pyproject-build-system)
1125 (native-inputs
1126 (list python-mock
1127 python-pytest
1128 python-setuptools))
1129 (home-page "https://github.com/pywavefront/PyWavefront")
1130 (synopsis "Python library for loading Wavefront @code{.obj} files")
1131 (description
1132 "PyWavefront reads Wavefront 3D object files (@code{something.obj},
1133@code{something.obj.gz} and @code{something.mtl}) and generates interleaved
1134vertex data for each material ready for rendering.
1135
1136A simple (optional) visualization module is also provided for rendering the
1137object(s). The interleaved data can also be used by more modern renderers
1138thought VBOs or VAOs.
1139
1140Currently the most commonly used features in the specification has been
1141implemented:
1142@itemize
1143@item positions;
1144@item texture coordinates;
1145@item normals;
1146@item vertex color;
1147@item material parsing;
1148@item texture and texture parameters.
1149@end itemize")
1150 (license license:bsd-3)))
1151
1152(define-public python-qtawesome
1153 (package
1154 (name "python-qtawesome")
1155 (version "1.4.2")
1156 (source
1157 (origin
1158 (method git-fetch)
1159 (uri (git-reference
1160 (url "https://github.com/spyder-ide/qtawesome")
1161 (commit (string-append "v" version))))
1162 (file-name (git-file-name name version))
1163 (sha256
1164 (base32 "16vjnngg5hjmmbp0c2ikgc88g8q0l44n1w3wa04ga5zfhd1yhyn2"))))
1165 (build-system pyproject-build-system)
1166 (arguments
1167 (list
1168 #:test-flags
1169 ;; Actually just ::test_get_fonts_info would be better.
1170 #~(list "--ignore" "qtawesome/tests/test_qtawesome.py")
1171 #:phases
1172 #~(modify-phases %standard-phases
1173 (add-before 'check 'setenv
1174 (lambda _
1175 (setenv "QT_QPA_PLATFORM" "offscreen"))))))
1176 (propagated-inputs (list python-qtpy python-pyqt-6))
1177 (native-inputs (list python-pytest python-pytest-qt python-setuptools))
1178 (home-page "https://github.com/spyder-ide/qtawesome")
1179 (synopsis "FontAwesome icons in PyQt and PySide applications")
1180 (description
1181 "@code{FontAwesome} icons in @code{PyQt} and @code{PySide} applications.")
1182 (license license:expat)))
1183
1184(define-public python-vispy
1185 (package
1186 (name "python-vispy")
1187 (version "0.14.3")
1188 (source
1189 (origin
1190 (method url-fetch)
1191 (uri (pypi-uri "vispy" version))
1192 (sha256
1193 (base32 "07fkk4bdffn0iq5cprk7ydj978rqc4lvzfcs2vkzgfh8m53vifzg"))))
1194 (build-system pyproject-build-system)
1195 (arguments
1196 (list
1197 #:test-flags
1198 ;; Test requiring network access to download test data from
1199 ;; <https://raw.githubusercontent.com/vispy/demo-data/main/CONTRIBUTING.txt>.
1200 #~(list "-k" (string-append "not test_read_write_image"
1201 " and not test_wavefront"
1202 " and not test_config"))
1203 #:phases
1204 #~(modify-phases %standard-phases
1205 (add-after 'unpack 'patch-library-path
1206 (lambda _
1207 (substitute* (list "vispy/ext/egl.py"
1208 "vispy/ext/fontconfig.py"
1209 "vispy/gloo/gl/es2.py"
1210 "vispy/gloo/gl/gl2.py")
1211 (("ctypes\\.util\\.find_library\\('EGL'\\)")
1212 (format #f "'~a/~a'" #$(this-package-input "mesa")
1213 "lib/libEGL.so"))
1214 (("ctypes\\.util\\.find_library\\('GL'\\)")
1215 (format #f "'~a/~a'" #$(this-package-input "mesa")
1216 "lib/libGL.so"))
1217 (("ctypes\\.util\\.find_library\\('GLESv2'\\)")
1218 (format #f "'~a/~a'" #$(this-package-input "mesa")
1219 "lib/libGLESv2.so"))
1220 (("util\\.find_library\\('fontconfig'\\)")
1221 (format #f "'~a/~a'" #$(this-package-input "fontconfig-minimal")
1222 "lib/libfontconfig.so")))))
1223 (add-before 'check 'prepare-test-environment
1224 (lambda _
1225 ;; XXX: Check how to set DPI to run headless tests, fails when
1226 ;; DISPLAY is set.
1227 ;; E RuntimeError: could not determine DPI
1228 (setenv "HOME" "/tmp")
1229 (invoke "python" "setup.py" "build_ext" "--inplace"))))))
1230 (native-inputs
1231 (list python-cython
1232 python-pytest
1233 python-setuptools
1234 python-setuptools-scm
1235 python-wheel))
1236 (inputs
1237 (list fontconfig
1238 mesa))
1239 (propagated-inputs
1240 (list python-freetype-py
1241 python-hsluv
1242 python-kiwisolver
1243 python-meshio
1244 python-numpy
1245 python-packaging
1246 python-pillow))
1247 (home-page "http://vispy.org")
1248 (synopsis "Interactive scientific visualization in Python")
1249 (description
1250 "VisPy is a high-performance interactive 2D/3D data visualization library
1251leveraging the computational power of modern Graphics Processing Units (GPUs)
1252through the OpenGL library to display very large datasets.")
1253 (license license:bsd-3)))
1254
1255;;;
1256;;; Avoid adding new packages to the end of this file. To reduce the chances
1257;;; of a merge conflict, place them above in alphabetical order.
1258;;;