projects/guix·blob beam-team · refs

1257 lines · 49.2 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 graphics)
50 #:use-module (gnu packages gstreamer)
51 #:use-module (gnu packages gtk)
52 #:use-module (gnu packages image)
53 #:use-module (gnu packages maths)
54 #:use-module (gnu packages pkg-config)
55 #:use-module (gnu packages pulseaudio)
56 #:use-module (gnu packages python)
57 #:use-module (gnu packages python-build)
58 #:use-module (gnu packages python-check)
59 #:use-module (gnu packages python-science)
60 #:use-module (gnu packages python-web)
61 #:use-module (gnu packages python-xyz)
62 #:use-module (gnu packages qt)
63 #:use-module (gnu packages sdl)
64 #:use-module (gnu packages simulation)
65 #:use-module (gnu packages swig)
66 #:use-module (gnu packages tex)
67 #:use-module (gnu packages video)
68 #:use-module (gnu packages xorg))
69
70;;; Commentary:
71;;;
72;;; Python modules which are meant to be used in GUI creation or mainly are
73;;; bindings to low level libraries such as Glue, Mesa, OpenGL, Xorg etc.
74;;;
75;;; Please: Try to add new module packages in alphabetic order.
76;;;
77;;; Code:
78
79(define-public python-asyncgui
80 (package
81 (name "python-asyncgui")
82 (version "0.8.0")
83 (source
84 (origin
85 (method git-fetch) ; no tests in PyPI release
86 (uri (git-reference
87 (url "https://github.com/asyncgui/asyncgui")
88 (commit version)))
89 (file-name (git-file-name name version))
90 (sha256
91 (base32 "1b074msb580wify2wag3swm3s21x23kckxpw974y6dibsmrfr5n3"))))
92 (build-system pyproject-build-system)
93 (native-inputs
94 (list python-poetry-core
95 python-pytest))
96 (home-page "https://github.com/asyncgui/asyncgui")
97 (synopsis "Enables async/await without an event loop")
98 (description
99 "This package provides support for async/await applications without
100requiring an event loop, useful for creative responsive GUIs.")
101 (license license:expat)))
102
103(define-public python-asynckivy
104 (package
105 (name "python-asynckivy")
106 (version "0.8.1")
107 (source
108 (origin
109 (method git-fetch) ; no tests in PyPI release
110 (uri (git-reference
111 (url "https://github.com/asyncgui/asynckivy")
112 (commit version)))
113 (file-name (git-file-name name version))
114 (sha256
115 (base32 "0gjddv6d7bbjymvly2x5zaay1gyihls1c4bh7y1ppbvz15152lkj"))))
116 (build-system pyproject-build-system)
117 (arguments
118 (list
119 #:phases
120 #~(modify-phases %standard-phases
121 (add-before 'check 'set-home
122 (lambda _
123 ;; 'kivy/__init__.py' wants to create $HOME/.kivy.
124 (setenv "HOME" "/tmp"))))))
125 (native-inputs
126 (list python-poetry-core
127 python-pytest))
128 (propagated-inputs
129 (list python-kivy
130 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 . "c38d019ed96a7f50db628975fbe944ea8b3cf66d")
270 (revision . "0")))
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 "1f415556ykydqxxjnnc496j81xd2bvkwk5d5m8wlmfad0wkn3nrb"))))
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 (home-page "https://github.com/pyglet/pyglet")
806 (synopsis "Windowing and multimedia library")
807 (description
808 "Pyglet is a Python library for developing games and other visually-rich
809applications. It supports windowing, user interface event handling,
810Joysticks, OpenGL graphics, loading images and videos, playing sounds and
811music." )
812 (license license:bsd-3)))
813
814(define-public python-pyglet-1
815 (package
816 (inherit python-pyglet)
817 (name "python-pyglet")
818 (version "1.5.30") ;the latest 1.* version from 2024-12-24
819 (source
820 (origin
821 (method git-fetch)
822 (uri (git-reference
823 (url "https://github.com/pyglet/pyglet")
824 (commit (string-append "v" version))))
825 (file-name (git-file-name name version))
826 (sha256
827 (base32 "0q1690pqkks3na6vc8ps44h0gymlmq752xlk7fm0yvz05yqdqn51"))))
828 (arguments
829 (list
830 ;; tests: 317 passed, 24 skipped, 1 deselected, 2 warnings
831 #:test-flags
832 #~(list "--ignore=tests/base"
833 "--ignore=tests/interactive"
834 "--ignore=tests/integration/media"
835 "--ignore=tests/integration/font"
836 "--ignore=tests/integration/platform/test_linux_fontconfig.py"
837 ;; AssertionError: False is not true : Did not receive next
838 ;; expected event
839 "--ignore=tests/integration/window/test_event_sequence.py"
840 ;; pyglet.media.drivers.openal.interface.OpenALException: OpenAL
841 ;; Exception [40964: b'Invalid Value']: Failed to open device.
842 "--deselect=tests/unit/media/test_listener.py::test_openal_listener")
843 #:phases
844 #~(modify-phases %standard-phases
845 (add-after 'unpack 'fix-python-3.12-incompatibility
846 ;; The only user of pyglet@1 is printrun, see:
847 ;; <https://github.com/kliment/Printrun/issues/1468>.
848 (lambda _
849 (substitute* "tests/integration/test_toplevel_imports.py"
850 (("import imp") ""))))
851 (add-after 'unpack 'patch-lib-paths
852 (lambda* (#:key inputs #:allow-other-keys)
853 (substitute* (list "pyglet/font/fontconfig.py"
854 "pyglet/font/freetype_lib.py"
855 "pyglet/gl/lib_glx.py"
856 "pyglet/libs/egl/egl.py"
857 "pyglet/libs/egl/lib.py"
858 "pyglet/libs/x11/xf86vmode.py"
859 "pyglet/libs/x11/xinerama.py"
860 "pyglet/libs/x11/xlib.py"
861 "pyglet/libs/x11/xsync.py"
862 "pyglet/media/drivers/openal/lib_openal.py"
863 "pyglet/media/drivers/pulse/lib_pulseaudio.py")
864 (("'EGL'")
865 (format #f "'~a/~a'" #$(this-package-input "mesa")
866 "lib/libEGL.so"))
867 (("'fontconfig'")
868 (format #f "'~a/~a'" #$(this-package-input "fontconfig-minimal")
869 "lib/libfontconfig.so"))
870 (("'freetype'")
871 (format #f "'~a/~a'" #$(this-package-input "freetype")
872 "lib/libfreetype.so"))
873 (("'GL'")
874 (format #f "'~a/~a'" #$(this-package-input "mesa")
875 "lib/libGL.so"))
876 (("'GLU'")
877 (format #f "'~a/~a'" #$(this-package-input "glu")
878 "lib/libGLU.so"))
879 (("'X11'")
880 (format #f "'~a/~a'" #$(this-package-input "libx11")
881 "lib/libX11.so"))
882 (("'Xext'")
883 (format #f "'~a/~a'" #$(this-package-input "libxext")
884 "lib/libXext.so"))
885 (("'Xinerama'")
886 (format #f "'~a/~a'" #$(this-package-input "libxinerama")
887 "lib/libXinerama.so"))
888 (("'Xxf86vm'")
889 (format #f "'~a/~a'" #$(this-package-input "libxxf86vm")
890 "lib/libXxf86vm.so"))
891 (("'c'")
892 (format #f "'~a/~a'" #$(this-package-input "glibc")
893 "lib/libc.so"))
894 (("'gdk-x11-2.0'")
895 (format #f "'~a/~a'" #$(this-package-input "gtk+")
896 "lib/gdk-pixbuf-2.0.so"))
897 (("'gdk_pixbuf-2.0'")
898 (format #f "'~a/~a'" #$(this-package-input "gdk-pixbuf")
899 "lib/libgdk_pixbuf-2.0.so"))
900 (("'openal'")
901 (format #f "'~a/~a'" #$(this-package-input "openal")
902 "lib/libopenal.so"))
903 (("'pulse'")
904 (format #f "'~a/~a'" #$(this-package-input "pulseaudio")
905 "lib/libpulse.so")))))
906 (add-before 'check 'prepare-test-environment
907 (lambda _
908 ;; The test suite requires a running X server.
909 (system "Xvfb :1 &")
910 (setenv "DISPLAY" ":1")
911 (setenv "HOME" "/tmp")
912 (setenv "PYGLET_HEADLESS" "True"))))))
913 (native-inputs
914 (list python-pytest
915 python-setuptools
916 xorg-server-for-tests))))
917
918(define-public python-pyopengl
919 (package
920 (name "python-pyopengl")
921 (version "3.1.10")
922 (source
923 (origin
924 (method git-fetch)
925 (uri (git-reference
926 (url "https://github.com/mcfletch/pyopengl")
927 (commit version)))
928 (file-name (git-file-name name version))
929 (sha256
930 (base32 "0gn6n6z76xrvwj9inl2v6rr707n1w8s072qxfmzpla1i9bfckzjk"))))
931 (build-system pyproject-build-system)
932 (arguments
933 (list
934 ;; 62 passed, 26 skipped, 26 deselected, 2 xfailed, 2 warnings
935 #:test-flags
936 #~(list #$@(map (lambda (test) (string-append "--deselect=tests/" test))
937 (list
938 ;; RuntimeError: Test script failure on <...>
939 "test_checks.py::test_check_crash_on_glutinit"
940 "test_checks.py::test_check_egl_es1"
941 "test_checks.py::test_check_egl_es2"
942 "test_checks.py::test_check_egl_opengl"
943 "test_checks.py::test_check_glutwindow"
944 "test_checks.py::test_check_freeglut_deinit"
945 "test_checks.py::test_check_glut_debug"
946 "test_checks.py::test_check_glut_fc"
947 "test_checks.py::test_check_glut_load"
948 "test_checks.py::test_check_glutinit"
949 "test_checks.py::test_check_glutinit_0args"
950 "test_checks.py::test_check_glutinit_single"
951 "test_checks.py::test_check_glutinit_simplest"
952 "test_checks.py::test_egl_ext_enumerate"
953 "test_checks.py::test_test_instanced_draw_detect"
954 "test_checks.py::test_test_gldouble_ctypes"
955 ;; OpenGL.error.Error: Attempt to retrieve context when
956 ;; no valid context
957 "test_arraydatatype.py::TestCoreDatatype::test_numpyConversion"
958 "test_arraydatatype.py::TestCoreDatatype::test_pointers"
959 "test_core.py::TestCore::test_glCallLists_twice2"
960 "test_core.py::TestCore::test_glmultidraw"
961 ;; RuntimeError: Test Failed
962 "test_checks.py::test_feedbackvarying"
963 "test_checks.py::test_test_sf2946226"
964 "test_checks.py::test_test_glgetactiveuniform"
965 ;; TypeError: '<' not supported between instances of
966 ;; 'bool' and 'list'
967 "test_core.py::TestCore::test_get_read_fb_binding"
968 "test_core.py::TestCore::test_lookupint"
969 ;; assert not glShaderSource
970 "test_core.py::TestCore::test_get_version")))
971 #:phases
972 #~(modify-phases %standard-phases
973 (add-before 'build 'fix-paths
974 (lambda* (#:key inputs #:allow-other-keys)
975 (substitute* '("OpenGL/platform/ctypesloader.py")
976 (("filenames_to_try = \\[base_name\\]")
977 "filenames_to_try = [name]"))
978 (substitute* '("OpenGL/platform/glx.py"
979 "OpenGL/platform/egl.py"
980 "OpenGL/platform/osmesa.py"
981 "OpenGL/platform/darwin.py"
982 "tests/check_glut_load.py")
983 (("\"GLU\",")
984 (format #f "~s," (search-input-file inputs "lib/libGLU.so")))
985 (("'GLU',")
986 (format #f "~s," (search-input-file inputs "lib/libGLU.so")))
987 (("\"glut\",")
988 (format #f "~s," (search-input-file inputs "lib/libglut.so")))
989 (("'glut',")
990 (format #f "~s," (search-input-file inputs "lib/libglut.so")))
991 (("'(GL|EGL|GLESv1_CM|GLESv2)'" all gl-library)
992 (format #f "~s" (search-input-file inputs (string-append
993 "lib/lib"
994 gl-library ".so"))))
995 (("\"(GLESv1_CM|GLESv2)\"" all gl-library)
996 (format #f "~s" (search-input-file inputs (string-append
997 "lib/lib"
998 gl-library ".so")))))))
999 (add-before 'check 'pre-check
1000 (lambda _
1001 (setenv "LANG" "fr_FR.UTF-8")
1002 (setenv "LANGUAGE" "fr_FR.UTF-8")
1003 (setenv "DISPLAY" ":1")
1004 (setenv "HOME" "/tmp")
1005 (setenv "USER" "guix")
1006 (setenv "XDG_RUNTIME_DIR" "/tmp")
1007 (setenv "XDG_SESSION_ID" "11235813")
1008 (setenv "XDG_SESSION_PATH" "/tmp")
1009 (setenv "XDG_SESSION_TYPE" "x11"))))))
1010 (native-inputs
1011 (list python-cython
1012 python-numpy
1013 python-psutil
1014 python-pygame-ce
1015 python-pytest
1016 python-setuptools))
1017 (inputs
1018 (list freeglut
1019 glu
1020 mesa))
1021 (home-page "https://pyopengl.sourceforge.net")
1022 (synopsis "Standard OpenGL bindings for Python")
1023 (description
1024 "PyOpenGL is the most common cross platform Python binding to OpenGL and
1025related APIs. The binding is created using the standard @code{ctypes}
1026library.")
1027 (license license:bsd-3)))
1028
1029(define-public python-pyopengl-accelerate
1030 (package
1031 (inherit python-pyopengl)
1032 (name "python-pyopengl-accelerate")
1033 (version "3.1.10")
1034 (source
1035 (origin
1036 (method url-fetch)
1037 (uri (pypi-uri "pyopengl_accelerate" version))
1038 (sha256
1039 (base32
1040 "0waskwvw9mp830bnnxcqd8bkh7a4qbnr0fcjnnw35xx6y21iqxc2"))))
1041 (arguments
1042 `(#:tests? #f
1043 #:phases
1044 (modify-phases %standard-phases
1045 (delete 'fix-paths))))
1046 (synopsis "Acceleration code for PyOpenGL")
1047 (description
1048 "This is the Cython-coded accelerator module for PyOpenGL.")))
1049
1050(define-public python-pysdl2
1051 (package
1052 (name "python-pysdl2")
1053 (version "0.9.17")
1054 (source
1055 (origin
1056 (method url-fetch)
1057 (uri (pypi-uri "pysdl2" version))
1058 (sha256
1059 (base32 "0axm6m3wj8x643zg65g60xdpaxanaqdilvp4yysks4pblh0yzij8"))))
1060 (build-system pyproject-build-system)
1061 (arguments
1062 (list
1063 #:tests? #f ;; Requires /dev/dri, OpenGL module, etc.
1064 #:phases
1065 #~(modify-phases %standard-phases
1066 (add-after 'unpack 'patch-paths
1067 (lambda _
1068 (substitute* "sdl2/dll.py"
1069 ;; Disable pysdl2-dll. It can't be packaged on GNU Guix
1070 ;; as it duplicates an existing package (sdl2).
1071 (("prepath = os\\.getenv\\('PYSDL2_DLL_PATH'\\)")
1072 "prepath = \"system\"")
1073 (("^import sdl2dll$") "")
1074 (("postpath = os\\.getenv\\('PYSDL2_DLL_PATH'\\)")
1075 "postpath = \"system\"")
1076 (("DLL\\(.*, os\\.getenv\\(\"PYSDL2_DLL_PATH\"\\)\\)")
1077 (format #f "DLL('SDL2', ['SDL2', 'SDL2-2.0', 'SDL2-2.0.0'], '~a/lib')"
1078 #$(this-package-input "sdl2"))))
1079 (substitute* "sdl2/sdlimage.py"
1080 (("os\\.getenv\\(\"PYSDL2_DLL_PATH\"\\)")
1081 (format #f "'~a/~a'" #$(this-package-input "sdl2-image")
1082 "lib/libSDL2_image.so")))
1083 (substitute* "sdl2/sdlgfx.py"
1084 (("os\\.getenv\\(\"PYSDL2_DLL_PATH\"\\)")
1085 (format #f "'~a/~a'" #$(this-package-input "sdl2-gfx")
1086 "lib/libSDL2_gfx.so")))
1087 (substitute* "sdl2/sdlmixer.py"
1088 (("os\\.getenv\\(\"PYSDL2_DLL_PATH\"\\)")
1089 (format #f "'~a/~a'" #$(this-package-input "sdl2-mixer")
1090 "lib/libSDL2_mixer.so")))
1091 (substitute* "sdl2/sdlttf.py"
1092 (("os\\.getenv\\(\"PYSDL2_DLL_PATH\"\\)")
1093 (format #f "'~a/~a'" #$(this-package-input "sdl2-ttf")
1094 "lib/libSDL2_ttf.so"))))))))
1095 (native-inputs
1096 (list python-setuptools
1097 python-wheel))
1098 (inputs
1099 (list sdl2 sdl2-image sdl2-gfx sdl2-mixer sdl2-ttf))
1100 (home-page "https://github.com/py-sdl/py-sdl2")
1101 (synopsis "Python bindings around the SDL2 game development library")
1102 (description
1103 "PySDL2 is a pure Python wrapper around the
1104@code{SDL2},@code{SDL2_mixer}, @code{SDL2_image}, @code{SDL2_ttf}, and
1105@code{SDL2_gfx} libraries. Instead of relying on C code, it uses the built-in
1106ctypes module to interface with SDL2, and provides simple Python classes and
1107wrappers for common SDL2 functionality.")
1108 (license license:cc0)))
1109
1110(define-public python-pywavefront
1111 (package
1112 (name "python-pywavefront")
1113 (version "1.3.3")
1114 (source
1115 (origin
1116 (method git-fetch)
1117 (uri (git-reference
1118 (url "https://github.com/pywavefront/PyWavefront")
1119 (commit version)))
1120 (file-name (git-file-name name version))
1121 (sha256
1122 (base32 "07r9z0dzz5xq9qlmp855mxsf9776b1ypk06nc9cf69r9d8pk8bkj"))))
1123 (build-system pyproject-build-system)
1124 (native-inputs
1125 (list python-mock
1126 python-pytest
1127 python-setuptools))
1128 (home-page "https://github.com/pywavefront/PyWavefront")
1129 (synopsis "Python library for loading Wavefront @code{.obj} files")
1130 (description
1131 "PyWavefront reads Wavefront 3D object files (@code{something.obj},
1132@code{something.obj.gz} and @code{something.mtl}) and generates interleaved
1133vertex data for each material ready for rendering.
1134
1135A simple (optional) visualization module is also provided for rendering the
1136object(s). The interleaved data can also be used by more modern renderers
1137thought VBOs or VAOs.
1138
1139Currently the most commonly used features in the specification has been
1140implemented:
1141@itemize
1142@item positions;
1143@item texture coordinates;
1144@item normals;
1145@item vertex color;
1146@item material parsing;
1147@item texture and texture parameters.
1148@end itemize")
1149 (license license:bsd-3)))
1150
1151(define-public python-qtawesome
1152 (package
1153 (name "python-qtawesome")
1154 (version "1.4.2")
1155 (source
1156 (origin
1157 (method git-fetch)
1158 (uri (git-reference
1159 (url "https://github.com/spyder-ide/qtawesome")
1160 (commit (string-append "v" version))))
1161 (file-name (git-file-name name version))
1162 (sha256
1163 (base32 "16vjnngg5hjmmbp0c2ikgc88g8q0l44n1w3wa04ga5zfhd1yhyn2"))))
1164 (build-system pyproject-build-system)
1165 (arguments
1166 (list
1167 #:test-flags
1168 ;; Actually just ::test_get_fonts_info would be better.
1169 #~(list "--ignore" "qtawesome/tests/test_qtawesome.py")
1170 #:phases
1171 #~(modify-phases %standard-phases
1172 (add-before 'check 'setenv
1173 (lambda _
1174 (setenv "QT_QPA_PLATFORM" "offscreen"))))))
1175 (propagated-inputs (list python-qtpy python-pyqt))
1176 (native-inputs (list python-pytest python-pytest-qt python-setuptools))
1177 (home-page "https://github.com/spyder-ide/qtawesome")
1178 (synopsis "FontAwesome icons in PyQt and PySide applications")
1179 (description
1180 "@code{FontAwesome} icons in @code{PyQt} and @code{PySide} applications.")
1181 (license license:expat)))
1182
1183(define-public python-vispy
1184 (package
1185 (name "python-vispy")
1186 (version "0.14.3")
1187 (source
1188 (origin
1189 (method url-fetch)
1190 (uri (pypi-uri "vispy" version))
1191 (sha256
1192 (base32 "07fkk4bdffn0iq5cprk7ydj978rqc4lvzfcs2vkzgfh8m53vifzg"))))
1193 (build-system pyproject-build-system)
1194 (arguments
1195 (list
1196 #:test-flags
1197 ;; Test requiring network access to download test data from
1198 ;; <https://raw.githubusercontent.com/vispy/demo-data/main/CONTRIBUTING.txt>.
1199 #~(list "-k" (string-append "not test_read_write_image"
1200 " and not test_wavefront"
1201 " and not test_config"))
1202 #:phases
1203 #~(modify-phases %standard-phases
1204 (add-after 'unpack 'patch-library-path
1205 (lambda _
1206 (substitute* (list "vispy/ext/egl.py"
1207 "vispy/ext/fontconfig.py"
1208 "vispy/gloo/gl/es2.py"
1209 "vispy/gloo/gl/gl2.py")
1210 (("ctypes\\.util\\.find_library\\('EGL'\\)")
1211 (format #f "'~a/~a'" #$(this-package-input "mesa")
1212 "lib/libEGL.so"))
1213 (("ctypes\\.util\\.find_library\\('GL'\\)")
1214 (format #f "'~a/~a'" #$(this-package-input "mesa")
1215 "lib/libGL.so"))
1216 (("ctypes\\.util\\.find_library\\('GLESv2'\\)")
1217 (format #f "'~a/~a'" #$(this-package-input "mesa")
1218 "lib/libGLESv2.so"))
1219 (("util\\.find_library\\('fontconfig'\\)")
1220 (format #f "'~a/~a'" #$(this-package-input "fontconfig-minimal")
1221 "lib/libfontconfig.so")))))
1222 (add-before 'check 'prepare-test-environment
1223 (lambda _
1224 ;; XXX: Check how to set DPI to run headless tests, fails when
1225 ;; DISPLAY is set.
1226 ;; E RuntimeError: could not determine DPI
1227 (setenv "HOME" "/tmp")
1228 (invoke "python" "setup.py" "build_ext" "--inplace"))))))
1229 (native-inputs
1230 (list python-cython
1231 python-pytest
1232 python-setuptools
1233 python-setuptools-scm
1234 python-wheel))
1235 (inputs
1236 (list fontconfig
1237 mesa))
1238 (propagated-inputs
1239 (list python-freetype-py
1240 python-hsluv
1241 python-kiwisolver
1242 python-meshio
1243 python-numpy
1244 python-packaging
1245 python-pillow))
1246 (home-page "http://vispy.org")
1247 (synopsis "Interactive scientific visualization in Python")
1248 (description
1249 "VisPy is a high-performance interactive 2D/3D data visualization library
1250leveraging the computational power of modern Graphics Processing Units (GPUs)
1251through the OpenGL library to display very large datasets.")
1252 (license license:bsd-3)))
1253
1254;;;
1255;;; Avoid adding new packages to the end of this file. To reduce the chances
1256;;; of a merge conflict, place them above in alphabetical order.
1257;;;