guix_mirror_bot pushed a commit to branch master
in repository guix.

commit 311fd17066e04427cf9a731fc14d61b9d21c2041
Author: Daniel Khodabakhsh <[email protected]>
AuthorDate: Sun Jan 25 17:17:30 2026 -0800

    gnu: Add rayforge.
    
    * gnu/packages/engineering.scm (rayforge): New variable.
    
    Change-Id: I13550eef3f42b0354d2cffe1c6e4324cdedcdbd5
    Signed-off-by: Andreas Enge <[email protected]>
---
 gnu/packages/engineering.scm | 85 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 85 insertions(+)

diff --git a/gnu/packages/engineering.scm b/gnu/packages/engineering.scm
index 2699fee599..bf3d9839ea 100644
--- a/gnu/packages/engineering.scm
+++ b/gnu/packages/engineering.scm
@@ -48,6 +48,7 @@
 ;;; Copyright © 2025 Remco van 't Veer <[email protected]>
 ;;; Copyright © 2025 bdunahu <[email protected]>
 ;;; Copyright © 2026 Cayetano Santos <[email protected]>
+;;; Copyright © 2026 Daniel Khodabakhsh <[email protected]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -171,6 +172,7 @@
   #:use-module (gnu packages qt)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages ruby-check)
+  #:use-module (gnu packages rust-apps)
   #:use-module (gnu packages sagemath)
   #:use-module (gnu packages serialization)
   #:use-module (gnu packages sqlite)
@@ -2231,6 +2233,89 @@ like relocation symbols.  It is able to deal with 
malformed binaries, making
 it suitable for security research and analysis.")
     (license license:lgpl3)))
 
+(define-public rayforge
+  (package
+    (name "rayforge")
+    (version "1.0.2")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/barebaric/rayforge";)
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1c6dl0x3pafmh4p533jbk2cj73q90vz1797jya3hzzxdv0h383yc"))))
+    (build-system pyproject-build-system)
+    (native-inputs (list python-gitpython
+                         python-pytest
+                         python-pytest-asyncio
+                         python-pytest-cov
+                         python-pytest-mock
+                         python-setuptools))
+    (inputs (list bash-minimal
+                  libadwaita
+                  opencv
+                  python-aiohttp
+                  python-asyncudp
+                  python-blinker
+                  python-ezdxf
+                  python-numpy
+                  python-platformdirs
+                  python-pycairo
+                  python-pyclipper
+                  python-pygobject
+                  python-pyopengl
+                  python-pyopengl-accelerate
+                  python-pypdf
+                  python-pyserial-asyncio
+                  python-pyvips
+                  python-pyyaml
+                  python-scipy
+                  python-semver
+                  python-svgelements
+                  python-websockets
+                  vtracer))
+    (arguments
+     (list
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'write-version-file
+            (lambda _
+              (call-with-output-file "rayforge/version.txt"
+                (lambda (port)
+                  (display #$version port)))
+              (let ((port (open-file "MANIFEST.in" "a")))
+                (display "include rayforge/version.txt\n" port)
+                (close-port port))))
+          (add-after 'unpack 'fix-tests
+            (lambda _
+              (mkdir "tmp-home")
+              (setenv "HOME"
+                      (string-append (getcwd) "/tmp-home"))
+              ;; Fix abstract class test for older Python error message format
+              (substitute* "tests/pipeline/stage/test_base_stage.py"
+                (("without an implementation for abstract method 'reconcile'")
+                 "abstract method '?reconcile'?"))
+              ;; Fix arc fitting test: add looser tolerance for floating point 
comparison
+              (substitute* "tests/core/geo/test_fitting.py"
+                (("(assert np\\.allclose\\(.*, \\(-10\\.0, 0\\.0\\))" match)
+                 (string-append match ", atol=1e-3")))))
+          (delete 'sanity-check) ; Tests against python package version of 
rayforge
+          (add-after 'wrap 'wrap-rayforge
+            (lambda _
+              (wrap-program (string-append #$output "/bin/rayforge")
+                `("GI_TYPELIB_PATH" ":" prefix
+                  (,(getenv "GI_TYPELIB_PATH")))))))))
+    (home-page "https://github.com/barebaric/rayforge";)
+    (synopsis "Desktop application for laser cutting and engraving")
+    (description
+     "Rayforge is a cross-platform 2D CAD and G-code control software designed
+for GRBL-based laser cutters and engravers.  It features an interface built
+using GTK4 and Libadwaita, with support for SVG, DXF, PDF, and various image
+formats.")
+    (license license:expat)))
+
 (define-public zycore
   (package
     (name "zycore")

Reply via email to