Name: python-vispy Version: 0.16.2 Release: 2%{?dist} Summary: Interactive scientific visualization with OpenGL License: BSD-3-Clause URL: https://vispy.org Source0: %{pypi_source vispy} # One Cython extension (vispy/visuals/text/_sdf_cpu) -> arch-specific build. BuildRequires: gcc BuildRequires: python3-devel BuildRequires: pyproject-rpm-macros # vispy.ext.fontconfig dlopens libfontconfig at import time (font discovery); # `import vispy` fails outright without it. Needed for %check and at runtime. BuildRequires: fontconfig %global _description %{expand: VisPy is a high-performance interactive 2D/3D data-visualization library that leverages the GPU through OpenGL. It provides both low-level GL access (gloo) and a high-level scene graph, and is the rendering engine used by napari.} %description %{_description} %package -n python3-vispy Summary: %{summary} # libfontconfig is dlopen'd via ctypes (not caught by the auto-dep generator). Requires: fontconfig # Runtime backend toolkits are optional extras upstream; pull a usable GUI # backend by default without making it mandatory (napari brings its own). Recommends: python3-pyqt6 %description -n python3-vispy %{_description} %prep %autosetup -n vispy-%{version} # Strip non-functional `#!/usr/bin/env python` shebangs from library modules # (they are imported, not executed) — rpmlint: non-executable-script. find vispy -name '*.py' -exec sed -i '1{\,^#!.*python,d}' {} + %generate_buildrequires # Tarball has no .git; setuptools_scm cannot derive the version -> pin it. export SETUPTOOLS_SCM_PRETEND_VERSION=%{version} %pyproject_buildrequires %build export SETUPTOOLS_SCM_PRETEND_VERSION=%{version} %pyproject_wheel %install export SETUPTOOLS_SCM_PRETEND_VERSION=%{version} %pyproject_install %pyproject_save_files vispy %check # Top-level import only (-t): there is no OpenGL context/display/Qt in mock, so # importing every submodule (backends, qt, tests) would fail. A bare # `import vispy` exercises the font/freetype/fontconfig path and the package # init without opening a GL context. %pyproject_check_import -t %files -n python3-vispy -f %{pyproject_files} %license LICENSE.txt %doc README.rst %changelog * Mon Sep 28 2026 Morgan Hough - 0.16.2-2 - Rebuild for f45's current Python 3.15 and Cython. The -1 build's compiled vispy/visuals/text/_sdf_cpu extension SIGSEGVs inside its own module-init function on f45. It was generated by Cython 3.2.4 on 2026-06-22 against a then-current Python 3.15 pre-release; 3.15.0rc2 moved the interpreter internals that Cython's __Pyx__ExceptionSave reaches into, so the old object reads a relocated field and dies. Nothing in rpm can express this: no soname moves, so the package installs and fails only at load. - Proven, not inferred: recompiling the identical shipped _sdf_cpu.pyx with the current Cython in the same chroot produces a .so that loads (embedded marker _cython_3_2_8 vs the shipped _cython_3_2_4), and dropping that one file into the failing chroot makes "from napari.qt.threading import thread_worker" succeed. ctypes.CDLL on the shipped .so succeeds, so dlopen is fine and the fault is specifically module init. f44 (python 3.14, same vispy NVR, built the same day) loads it fine -- 3.14 was already stable, so no ABI drift. - This is what actually blocked python-napari-openflexure on f45, NOT napari, psygnal or magicgui. `import napari` survives only because napari's lazy top level never reaches napari.layers -> vispy.visuals.text. * Mon Jun 22 2026 Morgan Hough - 0.16.2-1 - Initial package: vispy 0.16.2 (GPU scientific visualization). - napari's rendering engine; pinned to the 0.16.x line napari 0.7.x requires (vispy >=0.16.2,<0.17). One Cython extension (_sdf_cpu); runtime deps (freetype-py, hsluv, kiwisolver) all already in Fedora.