projects/guix·blob core-packages-team · refs

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