about summary refs log tree commit diff
path: root/gn
diff options
context:
space:
mode:
Diffstat (limited to 'gn')
-rw-r--r--gn/packages/bioinformatics.scm356
-rw-r--r--gn/packages/check.scm53
-rw-r--r--gn/packages/file-systems.scm31
-rw-r--r--gn/packages/jupyterhub.scm2
-rw-r--r--gn/packages/machine-learning.scm2
-rw-r--r--gn/packages/python.scm30
-rw-r--r--gn/packages/rust-crates.scm525
-rw-r--r--gn/packages/twint.scm44
-rw-r--r--gn/packages/virtualization.scm1
9 files changed, 1009 insertions, 35 deletions
diff --git a/gn/packages/bioinformatics.scm b/gn/packages/bioinformatics.scm
index fb2ee18..7cf1398 100644
--- a/gn/packages/bioinformatics.scm
+++ b/gn/packages/bioinformatics.scm
@@ -15,6 +15,7 @@
   #:use-module (guix build-system gnu)
   #:use-module (guix build-system meson)
   #:use-module (guix build-system ocaml)
+  #:use-module (guix build-system pyproject)
   #:use-module (guix build-system python)
   #:use-module (guix build-system r)
   #:use-module (guix build-system trivial)
@@ -573,7 +574,7 @@ reads.")
 (define-public gfaffix
   (package
     (name "gfaffix")
-    (version "0.1.5")
+    (version "0.2.1")
     (source
       (origin
         (method git-fetch)
@@ -582,20 +583,12 @@ reads.")
                (commit version)))
         (file-name (git-file-name name version))
         (sha256
-         (base32 "181jxl8ldj39jgscyqzhz4l4k5kxj1j9hvzi8dxj59h2zzznb0kb"))))
+         (base32 "0yn8i70ww3x544qm4fwr33vklsxf3fvivpfpv46prkfz9hsmd9ps"))))
     (build-system cargo-build-system)
     (arguments
-     `(#:install-source? #f
-       #:cargo-inputs
-       (("rust-clap" ,rust-clap-3)
-        ("rust-rustc-hash" ,rust-rustc-hash-1)
-        ("rust-regex" ,rust-regex-1)
-        ("rust-handlegraph" ,rust-handlegraph-0.7.0-alpha.9)
-        ("rust-gfa" ,rust-gfa-0.10)
-        ("rust-quick-csv", rust-quick-csv-0.1)
-        ("rust-rayon" ,rust-rayon-1)
-        ("rust-log" ,rust-log-0.4)
-        ("rust-env-logger" ,rust-env-logger-0.7))))
+     `(#:install-source? #f))
+    (inputs (cargo-inputs 'gfaffix
+                          #:module '(gn packages rust-crates)))
     (home-page "https://github.com/marschall-lab/GFAffix")
     (synopsis "Identify walk-preserving shared affixes in variation graphs")
     (description
@@ -1814,14 +1807,14 @@ dictionaries to record a queryable version of the graph.")
 (define-public smoothxg
   (package
     (name "smoothxg")
-    (version "0.8.0")
+    (version "0.8.2")
     (source (origin
              (method url-fetch)
              (uri (string-append "https://github.com/pangenome/smoothxg"
                                  "/releases/download/v" version
                                  "/smoothxg-v" version ".tar.gz"))
              (sha256
-              (base32 "1gl4dskj81hlma7wsjrwwg77hgzk7dc9iaqqnf2wzrf2f4ll1cdj"))
+              (base32 "1hqaa6l904zl01rsmw5vzx2kvcncl97i5kln850snywyv33skxp6"))
              (snippet
               #~(begin
                   (use-modules (guix build utils))
@@ -1968,27 +1961,15 @@ here}.")
 (define-public mummer
   (package
     (name "mummer")
-    (version "4.0.0rc1")
+    (version "4.0.1")
     (source
       (origin
         (method url-fetch)
         (uri (string-append "https://github.com/mummer4/mummer/releases/"
                             "download/v" version "/mummer-" version ".tar.gz"))
         (sha256
-         (base32 "07bxw1vax1sai3g5xjn6sqngddlbnlabpqy373vw4fb55pdnl045"))))
+         (base32 "0gix9qay0bcv515q9xag9arhq3wal77vf5g5whiy7cm004ksw85w"))))
     (build-system gnu-build-system)
-    (arguments
-     (list
-       #:phases
-       #~(modify-phases %standard-phases
-           (add-after 'configure 'skip-test_md5-tests
-             (lambda _
-               ;; There seems to be a bug with how these tests are called.
-               (substitute* "Makefile"
-                 (("tests/mummer.sh") "")
-                 (("tests/nucmer.sh") "")
-                 (("tests/genome.sh") "")
-                 (("tests/sam.sh") "")))))))
     (inputs
      (list gnuplot
            perl))
@@ -2338,6 +2319,138 @@ in-memory footprint at the cost of packing and unpacking.")
                             odgi-x86-64-v4)))
     (properties `((tunable? . #f)))))
 
+(define-public vcflib
+  (package
+    (name "vcflib")
+    (version "1.0.12")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/vcflib/vcflib")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32 "1llqnbgx4ybb77cp5k3cs0y7n4p8ma6b3sj10iarpg5r6a5gps5a"))
+       (modules '((guix build utils)))
+       (snippet
+        #~(begin
+            (substitute* "CMakeLists.txt"
+              ((".*fastahack.*") "")
+              ((".*smithwaterman.*") "")
+              (("(pkg_check_modules\\(TABIXPP)" text)
+               (string-append
+                "pkg_check_modules(WFA2 REQUIRED libwfa2)\n"
+                "pkg_check_modules(FASTAHACK REQUIRED fastahack)\n"
+                "pkg_check_modules(SMITHWATERMAN REQUIRED smithwaterman)\n"
+                text))
+              (("\\$\\{TABIXPP_LIBRARIES\\}" text)
+               (string-append "${FASTAHACK_LIBRARIES} "
+                              "${WFA2_LIBRARIES} "
+                              "${SMITHWATERMAN_LIBRARIES} "
+                              text))
+              (("install\\(TARGETS \\$\\{WFALIB\\}.*") ""))
+            (substitute* (find-files "." "\\.(h|c)(pp)?$")
+              (("SmithWatermanGotoh.h") "smithwaterman/SmithWatermanGotoh.h")
+              (("\"convert.h\"") "<smithwaterman/convert.h>")
+              (("\"disorder.h\"") "<smithwaterman/disorder.h>")
+              (("\"wavefront/wfa.hpp\"") "<wavefront/wfa.hpp>")
+              (("Fasta.h") "fastahack/Fasta.h"))))))
+    (build-system cmake-build-system)
+    (inputs
+     (list bzip2
+           curl
+           htslib
+           fastahack
+           perl
+           python
+           pybind11
+           smithwaterman
+           tabixpp
+           xz
+           zlib))
+    (propagated-inputs
+     (list wfa2-lib))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)
+       ;; Submodules.
+       ;; This package builds against the .o files so we need to extract the source.
+       ("filevercmp-src" ,(package-source filevercmp))
+       ("fsom-src" ,(package-source fsom))
+       ("intervaltree-src" ,(package-source intervaltree))))
+    (arguments
+     (list
+      #:configure-flags
+      #~(list "-DZIG=OFF"
+              "-DTABIXPP_LOCAL=OFF"
+              "-DTABIX_FOUND=ON"
+              "-DWFA_GITMODULE=OFF")
+      #:tests? #f                       ; no tests
+      #:phases
+      #~(modify-phases %standard-phases
+          (add-after 'unpack 'find-wfa2lib-headers
+            (lambda _
+              (setenv "CPLUS_INCLUDE_PATH"
+                      (string-append
+                       #$(this-package-input "wfa2-lib")
+                       "/include/wfa2lib:"
+                       (or (getenv "CPLUS_INCLUDE_PATH") "")))))
+          (add-after 'unpack 'build-shared-library
+            (lambda _
+              (substitute* "CMakeLists.txt"
+                (("vcflib STATIC") "vcflib SHARED"))))
+          (add-after 'unpack 'unpack-submodule-sources
+            (lambda* (#:key inputs native-inputs #:allow-other-keys)
+              (let ((unpack (lambda (source target)
+                              (mkdir-p target)
+                              (with-directory-excursion target
+                                (let ((source (or (assoc-ref inputs source)
+                                                  (assoc-ref native-inputs source))))
+                                  (if (file-is-directory? source)
+                                      (copy-recursively source ".")
+                                      (invoke "tar" "xvf"
+                                              source
+                                              "--strip-components=1")))))))
+                (and
+                 (unpack "filevercmp-src" "contrib/filevercmp")
+                 (unpack "fsom-src" "contrib/fsom")
+                 (unpack "intervaltree-src" "contrib/intervaltree"))
+
+                ;; This is needed for downstream packages to allow building
+                ;; with GCC 11+.
+                (substitute* "contrib/intervaltree/IntervalTree.h"
+                  (("#include <vector>" m)
+                   (string-append m "
+#include <limits> /* std::numeric_limits */"))))))
+          ;; This pkg-config file is provided by other distributions.
+          (add-after 'install 'install-pkg-config-file
+            (lambda _
+              (let ((pkgconfig (string-append #$output "/lib/pkgconfig")))
+                (mkdir-p pkgconfig)
+                (with-output-to-file (string-append pkgconfig "/vcflib.pc")
+                  (lambda _
+                    (format #t "\
+prefix=~a~@
+exec_prefix=${prefix}~@
+libdir=${exec_prefix}/lib~@
+includedir=${prefix}/include~@
+~@
+Name: vcflib~@
+Version: ~a~@
+Requires: libwfa2, smithwaterman, fastahack, tabixpp~@
+Description: C++ library for parsing and manipulating VCF files~@
+Libs: -L${libdir} -lvcflib~@
+Cflags: -I${includedir}~%"
+                            #$output #$version)))))))))
+    (home-page "https://github.com/vcflib/vcflib/")
+    (synopsis "Library for parsing and manipulating VCF files")
+    (description "Vcflib provides methods to manipulate and interpret
+sequence variation as it can be described by VCF.  It is both an API for parsing
+and operating on records of genomic variation as it can be described by the VCF
+format, and a collection of command-line utilities for executing complex
+manipulations on VCF files.")
+    (license license:expat)))
+
 (define-public vg
   (package
     (name "vg")
@@ -4785,3 +4898,188 @@ reads, and it is one of the best haplotype-resolved assemblers for the
 trio-binning assembly given parental short reads.  For a human genome,
 hifiasm can produce the telomere-to-telomere assembly in one day.")
     (license license:expat)))
+
+(define-public parasail
+  (package
+   (name "parasail")
+   (version "2.6.2")
+   (source (origin
+            (method git-fetch)
+            (uri (git-reference
+                  (url "https://github.com/jeffdaily/parasail")
+                  (commit (string-append "v" version))))
+            (file-name (git-file-name name version))
+            (sha256
+             (base32
+              "0pnw8x266b4qggv9hn4sng9z6zcq0rg7h6slcq3ka3snybzn61r8"))))
+   (build-system gnu-build-system)
+   (arguments
+    (list #:phases
+          #~(modify-phases %standard-phases
+              (add-after 'unpack 'patch-tests
+                (lambda _
+                  (substitute* "tests/test_verify_traces.c"
+                    (("ref_trace_table = parasail")
+                     "ref_trace_table = (int8_t*)parasail")
+                    ((", trace_table,")
+                     ", (int8_t*)trace_table,")))))))
+   (native-inputs
+    (list autoconf
+          automake
+          libtool))
+   (home-page "https://github.com/jeffdaily/parasail")
+   (synopsis "Pairwise sequence alignment library")
+   (description "parasail is a SIMD C (C99) library containing
+implementations of the Smith-Waterman (local),
+Needleman-Wunsch (global), and various semi-global pairwise sequence
+alignment algorithms.  Here, semi-global means insertions before the
+start or after the end of either the query or target sequence are
+optionally not penalized.  parasail implements most known algorithms
+for vectorized pairwise sequence alignment, including diagonal
+[Wozniak, 1997], blocked [Rognes and Seeberg, 2000], striped [Farrar,
+2007], and prefix scan [Daily, 2015].  Therefore, parasail is a
+reference implementation for these algorithms in addition to providing
+an implementation of the best-performing algorithm(s) to date on
+today's most advanced CPUs.")
+   (license license:bsd-2)))
+
+(define-public python-parasail
+  (package
+   (name "python-parasail")
+   (version "1.3.4")
+   (source
+    (origin
+     (method url-fetch)
+     (uri (pypi-uri "parasail" version))
+     (sha256
+      (base32 "03qvnswvzv6pv5lzlnd05rbjphhl29qiasbyvnpmmvz3z9fh79yn"))))
+   (build-system pyproject-build-system)
+   (arguments
+    (list #:test-backend #~'unittest
+          #:phases
+          #~(modify-phases %standard-phases
+              (add-after 'unpack 'insert-libparasail
+                (lambda* (#:key inputs #:allow-other-keys)
+                  (copy-file (search-input-file inputs "/lib/libparasail.so")
+                             "parasail/libparasail.so"))))))
+   (inputs
+    (list parasail))
+   (native-inputs
+    (list python-setuptools python-wheel))
+   (propagated-inputs
+    (list python-numpy))
+   (home-page "https://github.com/jeffdaily/parasail-python")
+   (synopsis "Parasail Python bindings")
+   (description "This package provides Python bindings for the
+parasail C library.")
+   (license license:bsd-2)))
+
+(define-public liftoff
+  (package
+    (name "liftoff")
+    (version "1.6.3")
+    (source
+     ;; The PyPI tarball is missing the tests.
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+              (url "https://github.com/agshumate/Liftoff")
+              (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "18840vdv75nsq0fw5hzvrp7l0k6ciamlzkhgxxhnjh23ghih71dx"))))
+    (build-system pyproject-build-system)
+    (arguments
+     (list #:phases
+           #~(modify-phases %standard-phases
+               (add-after 'unpack 'relax-version-requirements
+                 (lambda _
+                   (substitute* "setup.py"
+                     (("==") ">=")))))))
+    (inputs
+     (list python-biopython
+           python-gffutils
+           python-interlap
+           python-networkx
+           python-numpy
+           python-parasail
+           python-pyfaidx
+           python-pysam
+           python-ujson))
+    (native-inputs
+     (list minimap2
+           python-pytest
+           python-setuptools
+           python-wheel))
+    (home-page "https://github.com/ashumate/Liftoff")
+    (synopsis "GFF3/GTF lift over pipeline")
+    (description "Liftoff is a tool that accurately maps annotations
+in GFF or GTF between assemblies of the same, or closely-related
+species.  Unlike current coordinate lift-over tools which require a
+pre-generated “chain” file as input, Liftoff is a standalone tool that
+takes two genome assemblies and a reference annotation as input and
+outputs an annotation of the target genome.  Liftoff uses minimap2 to
+align the gene sequences from a reference genome to the target genome.
+Rather than aligning whole genomes, aligning only the gene sequences
+allows genes to be lifted over even if there are many structural
+differences between the two genomes.  For each gene, Liftoff finds the
+alignments of the exons that maximize sequence identity while
+preserving the transcript and gene structure.  If two genes incorrectly
+map to overlapping loci, Liftoff determines which gene is most-likely
+mis-mapped, and attempts to re-map it.  Liftoff can also find
+additional gene copies present in the target assembly that are not
+annotated in the reference.")
+    (license license:gpl3+)))
+
+(define-public r-gggenes
+  (package
+    (name "r-gggenes")
+    (version "0.6.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "gggenes" version))
+       (sha256
+        (base32 "0400qhppx8kg70f6bbya3k6lhdgjj3dllgfgg6s509kbp5qsjbcd"))))
+    (properties `((upstream-name . "gggenes")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-cli r-ggfittext r-ggplot2 r-lifecycle r-rlang))
+    (native-inputs (list r-knitr r-spelling r-testthat))
+    (home-page "https://wilkox.org/gggenes/")
+    (synopsis "Draw Gene Arrow Maps in 'ggplot2'")
+    (description
+     "This package provides a ggplot2 extension for drawing gene arrow maps.")
+    (license gpl2)))
+
+
+(define-public r-dendextend
+  (package
+    (name "r-dendextend")
+    (version "1.19.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (cran-uri "dendextend" version))
+       (sha256
+        (base32 "0097bmdv960khjkf3gvbdrazx4ns8i9221m9h68vnq541h61ag5y"))))
+    (properties `((upstream-name . "dendextend")))
+    (build-system r-build-system)
+    (propagated-inputs (list r-ggplot2 r-magrittr r-viridis))
+    (native-inputs (list r-ape
+                         r-cluster
+                         r-data-table
+                         r-dendextendrcpp
+                         r-fpc
+                         r-knitr
+                         r-pvclust
+                         r-testthat))
+    (home-page "https://talgalili.github.io/dendextend/")
+    (synopsis "Extending 'dendrogram' Functionality in R")
+    (description
+     "Offers a set of functions for extending dendrogram objects in R, letting you
+visualize and compare trees of hierarchical clusterings'.  You can (1) Adjust a
+tree's graphical parameters - the color, size, type, etc of its branches, nodes
+and labels. (2) Visually and statistically compare different dendrograms to one
+another.")
+    (license (list gpl2 gpl3))))
diff --git a/gn/packages/check.scm b/gn/packages/check.scm
index 960e78e..01f1508 100644
--- a/gn/packages/check.scm
+++ b/gn/packages/check.scm
@@ -1,9 +1,12 @@
 (define-module (gn packages check)
   #:use-module (guix packages)
   #:use-module (guix download)
+  #:use-module (guix build-system pyproject)
   #:use-module (guix build-system python)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages check)
+  #:use-module (gnu packages python-build)
+  #:use-module (gnu packages python-check)
   #:use-module (gnu packages python-xyz)
   #:use-module (past packages python27))
 
@@ -30,6 +33,34 @@ It will honor all the options you pass to the Nose coverage plugin,
 especially -cover-package.")
     (license license:expat)))
 
+(define-public python-traceback2
+  (package
+    (name "python-traceback2")
+    (version "1.4.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "traceback2" version))
+       (sha256
+        (base32
+         "0c1h3jas1jp1fdbn9z2mrgn3jj0hw1x3yhnkxp7jw34q15xcdb05"))))
+    (build-system python-build-system)
+    (arguments
+     `(;; python-traceback2 and python-unittest2 depend on one another.
+       #:tests? #f))
+    (native-inputs
+     (list python-pbr))
+    (propagated-inputs
+     (list python-linecache2 python-six))
+    (home-page
+     "https://github.com/testing-cabal/traceback2")
+    (synopsis "Backports of the traceback module")
+    (description
+     "This module provides a standard interface to extract, format and print
+stack traces of Python programs.  It exactly mimics the behavior of the Python
+interpreter when it prints a stack trace.")
+    (license license:psfl)))
+
 (define-public python-unittest2
   (package
     (name "python-unittest2")
@@ -59,3 +90,25 @@ especially -cover-package.")
      "Unittest2 is a replacement for the unittest module in the Python
 standard library.")
     (license license:psfl)))
+
+(define-public python-pyux
+  (package
+    (name "python-pyux")
+    (version "0.0.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "pyux" version))
+       (sha256
+        (base32
+         "1i17xh4dy238ibrjdgh8vn78fk5q6dj37mcznpvdfzidj57js7ca"))))
+    (build-system pyproject-build-system)
+    (arguments
+     `(#:tests? #f))                  ;the mini test suite fails
+    (native-inputs
+     (list python-pytest python-setuptools))
+    (home-page "https://github.com/farizrahman4u/pyux")
+    (synopsis "Utility to check API integrity in Python libraries")
+    (description "The pyux utility detects API changes in Python
+libraries.")
+    (license license:expat)))
diff --git a/gn/packages/file-systems.scm b/gn/packages/file-systems.scm
index bf92ed9..1610a76 100644
--- a/gn/packages/file-systems.scm
+++ b/gn/packages/file-systems.scm
@@ -5,6 +5,10 @@
   #:use-module (guix git-download)
   #:use-module (guix utils)
   #:use-module (guix build-system cmake)
+  #:use-module (guix build-system gnu)
+  #:use-module (gnu packages admin)
+  #:use-module (gnu packages autotools)
+  #:use-module (gnu packages base)
   #:use-module (gnu packages boost)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
@@ -15,6 +19,33 @@
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages python))
 
+(define-public moosefs
+  (package
+    (name "moosefs")
+    (version "4.58.3")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/moosefs/moosefs")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32
+          "163x7ziamqy79xaiy5fhr8afbj65ssnyqki5v6wxanciwczw4jcl"))))
+    (build-system gnu-build-system)
+    (inputs
+     (list
+       autoconf automake fuse libpcap zlib python libtool))
+    (native-inputs
+     `(("pkg-config" ,pkg-config)))
+    (home-page "https://moosefs.com/")
+    (synopsis "Distributed, scalable, fault-tolerant, highly available file system")
+    (description
+     "MooseFS is a Petabyte Open Source Network Distributed File System. It is easy to deploy and maintain, highly reliable, fault tolerant, highly performing, easily scalable and POSIX compliant.")
+    (license (list license:asl2.0   ; external/crcutil
+                   license:gpl2+))))
+
 (define-public lizardfs
   (package
     (name "lizardfs")
diff --git a/gn/packages/jupyterhub.scm b/gn/packages/jupyterhub.scm
index 2779d3e..165bb8a 100644
--- a/gn/packages/jupyterhub.scm
+++ b/gn/packages/jupyterhub.scm
@@ -213,7 +213,7 @@ libraries into this environment without any specialized knowledge.")
        ("python-etcd3" ,python-etcd3)
        ("python-aiohttp" ,python-aiohttp)
        ("python-passlib" ,python-passlib)
-       ("python-consul" ,python-consul)
+       ("python-py-consul" ,python-py-consul)
        ("python-toml" ,python-toml)
        ("python-escapism" ,python-escapism)))
     (native-inputs
diff --git a/gn/packages/machine-learning.scm b/gn/packages/machine-learning.scm
index 541b3b6..d302150 100644
--- a/gn/packages/machine-learning.scm
+++ b/gn/packages/machine-learning.scm
@@ -5,10 +5,12 @@
   #:use-module (gnu packages machine-learning)
   #:use-module (guix download)
   #:use-module (guix build-system python)
+  #:use-module (gn packages check)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages graphviz)
   #:use-module (gnu packages python-science)
   #:use-module (gnu packages check)
+  #:use-module (gnu packages python-build)
   #:use-module (gnu packages python-check)
   #:use-module (gnu packages sphinx)
   #:use-module (gnu packages python-web)
diff --git a/gn/packages/python.scm b/gn/packages/python.scm
index e429058..2b25775 100644
--- a/gn/packages/python.scm
+++ b/gn/packages/python.scm
@@ -870,16 +870,36 @@ spreadsheets without the need for COM objects.")
     (description "Extensions to the standard Python datetime module")
     (license license:bsd-3)))
 
-(define-public python-pyshex
+(define-public python-cfgraph
   (package
-    (name "python-pyshex")
-    (version "0.7.14")
+    (name "python-cfgraph")
+    (version "0.2.1")
     (source
       (origin
         (method url-fetch)
-        (uri (pypi-uri "PyShEx" version))
+        (uri (pypi-uri "CFGraph" version))
         (sha256
-         (base32 "1fy664bh6hpmr4cf49fwwxng36kv7s6b2986hbv0cqcypc4ri2cs"))))
+         (base32
+          "0x7yz0lvqb6mkhl5fbml27sppmscgpf8v2ism9jzzf0h982ffzxm"))))
+    (build-system python-build-system)
+    (propagated-inputs
+     (list python-rdflib))
+    (home-page "https://github.com/hsolbrig/CFGraph")
+    (synopsis "RDF Collections flattener for rdflib")
+    (description
+     "This package contains RDF Collections flattener for @code{rdflib}.")
+    (license license:asl2.0)))
+
+(define-public python-pyshex
+  (package
+    (name "python-pyshex")
+    (version "0.7.14")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "PyShEx" version))
+       (sha256
+        (base32 "1fy664bh6hpmr4cf49fwwxng36kv7s6b2986hbv0cqcypc4ri2cs"))))
     (arguments
      '(#:tests? #f          ; Tests try to use the internet.
        #:phases
diff --git a/gn/packages/rust-crates.scm b/gn/packages/rust-crates.scm
new file mode 100644
index 0000000..e9945aa
--- /dev/null
+++ b/gn/packages/rust-crates.scm
@@ -0,0 +1,525 @@
+(define-module (gn packages rust-crates)
+  #:use-module (guix build-system cargo)
+  #:export (lookup-cargo-inputs))
+
+(define rust-adler2-2.0.1
+  (crate-source "adler2" "2.0.1"
+                "1ymy18s9hs7ya1pjc9864l30wk8p2qfqdi7mhhcc5nfakxbij09j"))
+
+(define rust-aho-corasick-1.1.4
+  (crate-source "aho-corasick" "1.1.4"
+                "00a32wb2h07im3skkikc495jvncf62jl6s96vwc7bhi70h9imlyx"))
+
+(define rust-anstream-0.6.21
+  (crate-source "anstream" "0.6.21"
+                "0jjgixms4qjj58dzr846h2s29p8w7ynwr9b9x6246m1pwy0v5ma3"))
+
+(define rust-anstyle-1.0.13
+  (crate-source "anstyle" "1.0.13"
+                "0y2ynjqajpny6q0amvfzzgw0gfw3l47z85km4gvx87vg02lcr4ji"))
+
+(define rust-anstyle-parse-0.2.7
+  (crate-source "anstyle-parse" "0.2.7"
+                "1hhmkkfr95d462b3zf6yl2vfzdqfy5726ya572wwg8ha9y148xjf"))
+
+(define rust-anstyle-query-1.1.5
+  (crate-source "anstyle-query" "1.1.5"
+                "1p6shfpnbghs6jsa0vnqd8bb8gd7pjd0jr7w0j8jikakzmr8zi20"))
+
+(define rust-anstyle-wincon-3.0.11
+  (crate-source "anstyle-wincon" "3.0.11"
+                "0zblannm70sk3xny337mz7c6d8q8i24vhbqi42ld8v7q1wjnl7i9"))
+
+(define rust-anyhow-1.0.101
+  (crate-source "anyhow" "1.0.101"
+                "1skmg90fnjnlgs3vl7bksw7036d3rqwqj20n2fxd2ppg67p0y3jz"))
+
+(define rust-arrayvec-0.5.2
+  (crate-source "arrayvec" "0.5.2"
+                "12q6hn01x5435bprwlb7w9m7817dyfq55yrl4psygr78bp32zdi3"))
+
+(define rust-autocfg-1.5.0
+  (crate-source "autocfg" "1.5.0"
+                "1s77f98id9l4af4alklmzq46f21c980v13z2r1pcxx6bqgw0d1n0"))
+
+(define rust-bitflags-1.3.2
+  (crate-source "bitflags" "1.3.2"
+                "12ki6w8gn1ldq7yz9y680llwk5gmrhrzszaa17g1sbrw2r2qvwxy"))
+
+(define rust-bitflags-2.11.0
+  (crate-source "bitflags" "2.11.0"
+                "1bwjibwry5nfwsfm9kjg2dqx5n5nja9xymwbfl6svnn8jsz6ff44"))
+
+(define rust-boomphf-0.5.9
+  (crate-source "boomphf" "0.5.9"
+                "0braniw72g9yq5006sfgc1g8d4317bb524c694jw6nggizrvg3sf"))
+
+(define rust-bstr-0.2.17
+  (crate-source "bstr" "0.2.17"
+                "08rjbhysy6gg27db2h3pnhvr2mlr5vkj797i9625kwg8hgrnjdds"))
+
+(define rust-bytemuck-1.25.0
+  (crate-source "bytemuck" "1.25.0"
+                "1v1z32igg9zq49phb3fra0ax5r2inf3aw473vldnm886sx5vdvy8"))
+
+(define rust-bytemuck-derive-1.10.2
+  (crate-source "bytemuck_derive" "1.10.2"
+                "1zvmjmw1sdmx9znzm4dpbb2yvz9vyim8w6gp4z256l46qqdvvazr"))
+
+(define rust-byteorder-1.5.0
+  (crate-source "byteorder" "1.5.0"
+                "0jzncxyf404mwqdbspihyzpkndfgda450l0893pz5xj685cg5l0z"))
+
+(define rust-cc-1.2.56
+  (crate-source "cc" "1.2.56"
+                "1chvh9g2izhqad7vzy4cc7xpdljdvqpsr6x6hv1hmyqv3mlkbgxf"))
+
+(define rust-cfg-if-1.0.4
+  (crate-source "cfg-if" "1.0.4"
+                "008q28ajc546z5p2hcwdnckmg0hia7rnx52fni04bwqkzyrghc4k"))
+
+(define rust-clap-4.5.59
+  (crate-source "clap" "4.5.59"
+                "16b4kgj909yyshz9kj7nkalbyi46yz1lrhqha54wbbn32x6zgjn5"))
+
+(define rust-clap-builder-4.5.59
+  (crate-source "clap_builder" "4.5.59"
+                "094fc76nsq3v52r1a9rbwix22cqnda8p2wr2a24j302v0r2sl39p"))
+
+(define rust-clap-derive-4.5.55
+  (crate-source "clap_derive" "4.5.55"
+                "1r949xis3jmhzh387smd70vc8a3b9734ck3g5ahg59a63bd969x9"))
+
+(define rust-clap-lex-1.0.0
+  (crate-source "clap_lex" "1.0.0"
+                "0c8888qi1l9sayqlv666h8s0yxn2qc6jr88v1zagk43mpjjjx0is"))
+
+(define rust-colorchoice-1.0.4
+  (crate-source "colorchoice" "1.0.4"
+                "0x8ymkz1xr77rcj1cfanhf416pc4v681gmkc9dzb3jqja7f62nxh"))
+
+(define rust-crc32fast-1.5.0
+  (crate-source "crc32fast" "1.5.0"
+                "04d51liy8rbssra92p0qnwjw8i9rm9c4m3bwy19wjamz1k4w30cl"))
+
+(define rust-crossbeam-channel-0.5.15
+  (crate-source "crossbeam-channel" "0.5.15"
+                "1cicd9ins0fkpfgvz9vhz3m9rpkh6n8d3437c3wnfsdkd3wgif42"))
+
+(define rust-crossbeam-deque-0.8.6
+  (crate-source "crossbeam-deque" "0.8.6"
+                "0l9f1saqp1gn5qy0rxvkmz4m6n7fc0b3dbm6q1r5pmgpnyvi3lcx"))
+
+(define rust-crossbeam-epoch-0.9.18
+  (crate-source "crossbeam-epoch" "0.9.18"
+                "03j2np8llwf376m3fxqx859mgp9f83hj1w34153c7a9c7i5ar0jv"))
+
+(define rust-crossbeam-utils-0.8.21
+  (crate-source "crossbeam-utils" "0.8.21"
+                "0a3aa2bmc8q35fb67432w16wvi54sfmb69rk9h5bhd18vw0c99fh"))
+
+(define rust-either-1.15.0
+  (crate-source "either" "1.15.0"
+                "069p1fknsmzn9llaizh77kip0pqmcwpdsykv2x30xpjyija5gis8"))
+
+(define rust-env-filter-1.0.0
+  (crate-source "env_filter" "1.0.0"
+                "13rhwy5arjn626a0z3hvvkpf9w9pnll14c35vscyqx3jwp43q73s"))
+
+(define rust-env-logger-0.11.9
+  (crate-source "env_logger" "0.11.9"
+                "13913sqpnhv741z5ixmcy5j3nnml53gmsllnhajjkx2ili7fxnmj"))
+
+(define rust-equivalent-1.0.2
+  (crate-source "equivalent" "1.0.2"
+                "03swzqznragy8n0x31lqc78g2af054jwivp7lkrbrc0khz74lyl7"))
+
+(define rust-errno-0.3.14
+  (crate-source "errno" "0.3.14"
+                "1szgccmh8vgryqyadg8xd58mnwwicf39zmin3bsn63df2wbbgjir"))
+
+(define rust-find-msvc-tools-0.1.9
+  (crate-source "find-msvc-tools" "0.1.9"
+                "10nmi0qdskq6l7zwxw5g56xny7hb624iki1c39d907qmfh3vrbjv"))
+
+(define rust-flate2-1.1.9
+  (crate-source "flate2" "1.1.9"
+                "0g2pb7cxnzcbzrj8bw4v6gpqqp21aycmf6d84rzb6j748qkvlgw4"))
+
+(define rust-fnv-1.0.7
+  (crate-source "fnv" "1.0.7"
+                "1hc2mcqha06aibcaza94vbi81j6pr9a1bbxrxjfhc91zin8yr7iz"))
+
+(define rust-gfa-0.10.1
+  (crate-source "gfa" "0.10.1"
+                "1x996rpfnflgi2j4dgaj5sdxdbf24zfm9d2ha0zy8aid0cd60cln"))
+
+(define rust-handlegraph-0.7.0-alpha.9
+  (crate-source "handlegraph" "0.7.0-alpha.9"
+                "1frlcdwhycjvizb0gfb0v36vxjdi0jxagl2l2v6dzdjxpaawv9rs"))
+
+(define rust-hashbrown-0.16.1
+  (crate-source "hashbrown" "0.16.1"
+                "004i3njw38ji3bzdp9z178ba9x3k0c1pgy8x69pj7yfppv4iq7c4"))
+
+(define rust-heck-0.5.0
+  (crate-source "heck" "0.5.0"
+                "1sjmpsdl8czyh9ywl3qcsfsq9a307dg4ni2vnlwgnzzqhc4y0113"))
+
+(define rust-indexmap-2.13.0
+  (crate-source "indexmap" "2.13.0"
+                "05qh5c4h2hrnyypphxpwflk45syqbzvqsvvyxg43mp576w2ff53p"))
+
+(define rust-is-terminal-polyfill-1.70.2
+  (crate-source "is_terminal_polyfill" "1.70.2"
+                "15anlc47sbz0jfs9q8fhwf0h3vs2w4imc030shdnq54sny5i7jx6"))
+
+(define rust-jiff-0.2.20
+  (crate-source "jiff" "0.2.20"
+                "0hv59kcqj5sc0jgk4q7yrq5dp8yb3qlan98qk3s36sq9ribc6ry8"))
+
+(define rust-jiff-static-0.2.20
+  (crate-source "jiff-static" "0.2.20"
+                "1rcvbp9aj8ll4ljxcgzq4l2h9idmkb0v6mdvf3r3i5r64m1np57p"))
+
+(define rust-lazy-static-1.5.0
+  (crate-source "lazy_static" "1.5.0"
+                "1zk6dqqni0193xg6iijh7i3i44sryglwgvx20spdvwk3r6sbrlmv"))
+
+(define rust-lexical-core-0.7.6
+  (crate-source "lexical-core" "0.7.6"
+                "1zjzab1fnaw4kj6ixyrskp4dyz761gdcab07m4bkvlk1l4mcc1v6"))
+
+(define rust-libc-0.2.182
+  (crate-source "libc" "0.2.182"
+                "04k1w1mq9f4cxv520dbr5xw1i7xkbc9fcrvaggyjy25jdkdvl038"))
+
+(define rust-libz-sys-1.1.23
+  ;; TODO: Check bundled sources.
+  (crate-source "libz-sys" "1.1.23"
+                "1xy0l46gmhfyk28r9pm7njl0h7dh8l2vpiqw67kn043pyfxiil8m"))
+
+(define rust-linux-raw-sys-0.11.0
+  ;; TODO: Check bundled sources.
+  (crate-source "linux-raw-sys" "0.11.0"
+                "0fghx0nn8nvbz5yzgizfcwd6ap2pislp68j8c1bwyr6sacxkq7fz"))
+
+(define rust-log-0.4.29
+  (crate-source "log" "0.4.29"
+                "15q8j9c8g5zpkcw0hnd6cf2z7fxqnvsjh3rw5mv5q10r83i34l2y"))
+
+(define rust-memchr-2.8.0
+  (crate-source "memchr" "2.8.0"
+                "0y9zzxcqxvdqg6wyag7vc3h0blhdn7hkq164bxyx2vph8zs5ijpq"))
+
+(define rust-memmap-0.7.0
+  (crate-source "memmap" "0.7.0"
+                "0ns7kkd1h4pijdkwfvw4qlbbmqmlmzwlq3g2676dcl5vwyazv1b5"))
+
+(define rust-miniz-oxide-0.8.9
+  (crate-source "miniz_oxide" "0.8.9"
+                "05k3pdg8bjjzayq3rf0qhpirq9k37pxnasfn4arbs17phqn6m9qz"))
+
+(define rust-nom-5.1.3
+  (crate-source "nom" "5.1.3"
+                "0jyxc4d3pih60pp8hvzpg5ajh16s273cpnsdpzp04qv7g8w9m588"))
+
+(define rust-num-traits-0.2.19
+  (crate-source "num-traits" "0.2.19"
+                "0h984rhdkkqd4ny9cif7y2azl3xdfb7768hb9irhpsch4q3gq787"))
+
+(define rust-once-cell-polyfill-1.70.2
+  (crate-source "once_cell_polyfill" "1.70.2"
+                "1zmla628f0sk3fhjdjqzgxhalr2xrfna958s632z65bjsfv8ljrq"))
+
+(define rust-pkg-config-0.3.32
+  (crate-source "pkg-config" "0.3.32"
+                "0k4h3gnzs94sjb2ix6jyksacs52cf1fanpwsmlhjnwrdnp8dppby"))
+
+(define rust-portable-atomic-1.13.1
+  (crate-source "portable-atomic" "1.13.1"
+                "0j8vlar3n5acyigq8q6f4wjx3k3s5yz0rlpqrv76j73gi5qr8fn3"))
+
+(define rust-portable-atomic-util-0.2.5
+  (crate-source "portable-atomic-util" "0.2.5"
+                "1xcm0ia8756k6hdgafx4g3lx3fw0hvz2zqswq7c2sy58gxnvk7bs"))
+
+(define rust-proc-macro2-1.0.106
+  (crate-source "proc-macro2" "1.0.106"
+                "0d09nczyaj67x4ihqr5p7gxbkz38gxhk4asc0k8q23g9n85hzl4g"))
+
+(define rust-quote-1.0.44
+  (crate-source "quote" "1.0.44"
+                "1r7c7hxl66vz3q9qizgjhy77pdrrypqgk4ghc7260xvvfb7ypci1"))
+
+(define rust-rand-core-0.6.4
+  (crate-source "rand_core" "0.6.4"
+                "0b4j2v4cb5krak1pv6kakv4sz6xcwbrmy2zckc32hsigbrwy82zc"))
+
+(define rust-rayon-1.11.0
+  (crate-source "rayon" "1.11.0"
+                "13x5fxb7rn4j2yw0cr26n7782jkc7rjzmdkg42qxk3xz0p8033rn"))
+
+(define rust-rayon-core-1.13.0
+  (crate-source "rayon-core" "1.13.0"
+                "14dbr0sq83a6lf1rfjq5xdpk5r6zgzvmzs5j6110vlv2007qpq92"))
+
+(define rust-regex-1.12.3
+  (crate-source "regex" "1.12.3"
+                "0xp2q0x7ybmpa5zlgaz00p8zswcirj9h8nry3rxxsdwi9fhm81z1"))
+
+(define rust-regex-automata-0.1.10
+  (crate-source "regex-automata" "0.1.10"
+                "0ci1hvbzhrfby5fdpf4ganhf7kla58acad9i1ff1p34dzdrhs8vc"))
+
+(define rust-regex-automata-0.4.14
+  (crate-source "regex-automata" "0.4.14"
+                "13xf7hhn4qmgfh784llcp2kzrvljd13lb2b1ca0mwnf15w9d87bf"))
+
+(define rust-regex-syntax-0.8.9
+  (crate-source "regex-syntax" "0.8.9"
+                "0k0a47r1rcl794wj8a948niakbg081s5pp5nlgcbmmr2iy3qfs59"))
+
+(define rust-rustc-hash-2.1.1
+  (crate-source "rustc-hash" "2.1.1"
+                "03gz5lvd9ghcwsal022cgkq67dmimcgdjghfb5yb5d352ga06xrm"))
+
+(define rust-rustix-1.1.3
+  (crate-source "rustix" "1.1.3"
+                "0d0z2zcw4rwzni1hm8snw8xdxwwrij336m31c4ghq66cghj9wv0l"))
+
+(define rust-ryu-1.0.23
+  (crate-source "ryu" "1.0.23"
+                "0zs70sg00l2fb9jwrf6cbkdyscjs53anrvai2hf7npyyfi5blx4p"))
+
+(define rust-serde-core-1.0.228
+  (crate-source "serde_core" "1.0.228"
+                "1bb7id2xwx8izq50098s5j2sqrrvk31jbbrjqygyan6ask3qbls1"))
+
+(define rust-serde-derive-1.0.228
+  (crate-source "serde_derive" "1.0.228"
+                "0y8xm7fvmr2kjcd029g9fijpndh8csv5m20g4bd76w8qschg4h6m"))
+
+(define rust-shlex-1.3.0
+  (crate-source "shlex" "1.3.0"
+                "0r1y6bv26c1scpxvhg2cabimrmwgbp4p3wy6syj9n0c4s3q2znhg"))
+
+(define rust-simd-adler32-0.3.8
+  (crate-source "simd-adler32" "0.3.8"
+                "18lx2gdgislabbvlgw5q3j5ssrr77v8kmkrxaanp3liimp2sc873"))
+
+(define rust-static-assertions-1.1.0
+  (crate-source "static_assertions" "1.1.0"
+                "0gsl6xmw10gvn3zs1rv99laj5ig7ylffnh71f9l34js4nr4r7sx2"))
+
+(define rust-strsim-0.11.1
+  (crate-source "strsim" "0.11.1"
+                "0kzvqlw8hxqb7y598w1s0hxlnmi84sg5vsipp3yg5na5d1rvba3x"))
+
+(define rust-succinct-0.5.2
+  (crate-source "succinct" "0.5.2"
+                "0654c9gq50x7djyf25zbzz3d2pc4x3z21wmjj3qbr6d9h4hbd63p"))
+
+(define rust-syn-2.0.116
+  (crate-source "syn" "2.0.116"
+                "1jv9pk48qmhn6yrdfl3lngy5i74wg7gcx13gfhvm4s8q0p3j9x1x"))
+
+(define rust-terminal-size-0.4.3
+  (crate-source "terminal_size" "0.4.3"
+                "1l7cicmz49c0cyskfp5a389rsai649xi7y032v73475ikjbwpf30"))
+
+(define rust-unicode-ident-1.0.24
+  (crate-source "unicode-ident" "1.0.24"
+                "0xfs8y1g7syl2iykji8zk5hgfi5jw819f5zsrbaxmlzwsly33r76"))
+
+(define rust-utf8parse-0.2.2
+  (crate-source "utf8parse" "0.2.2"
+                "088807qwjq46azicqwbhlmzwrbkz7l4hpw43sdkdyyk524vdxaq6"))
+
+(define rust-vcpkg-0.2.15
+  (crate-source "vcpkg" "0.2.15"
+                "09i4nf5y8lig6xgj3f7fyrvzd3nlaw4znrihw8psidvv5yk4xkdc"))
+
+(define rust-version-check-0.9.5
+  (crate-source "version_check" "0.9.5"
+                "0nhhi4i5x89gm911azqbn7avs9mdacw2i3vcz3cnmz3mv4rqz4hb"))
+
+(define rust-winapi-0.3.9
+  (crate-source "winapi" "0.3.9"
+                "06gl025x418lchw1wxj64ycr7gha83m44cjr5sarhynd9xkrm0sw"))
+
+(define rust-winapi-i686-pc-windows-gnu-0.4.0
+  (crate-source "winapi-i686-pc-windows-gnu" "0.4.0"
+                "1dmpa6mvcvzz16zg6d5vrfy4bxgg541wxrcip7cnshi06v38ffxc"
+                #:snippet '(delete-file-recursively "lib")))
+
+(define rust-winapi-x86-64-pc-windows-gnu-0.4.0
+  (crate-source "winapi-x86_64-pc-windows-gnu" "0.4.0"
+                "0gqq64czqb64kskjryj8isp62m2sgvx25yyj3kpc2myh85w24bki"
+                #:snippet '(delete-file-recursively "lib")))
+
+(define rust-windows-aarch64-gnullvm-0.53.1
+  (crate-source "windows_aarch64_gnullvm" "0.53.1"
+                "0lqvdm510mka9w26vmga7hbkmrw9glzc90l4gya5qbxlm1pl3n59"
+                #:snippet '(delete-file-recursively "lib")))
+
+(define rust-windows-aarch64-msvc-0.53.1
+  (crate-source "windows_aarch64_msvc" "0.53.1"
+                "01jh2adlwx043rji888b22whx4bm8alrk3khjpik5xn20kl85mxr"
+                #:snippet '(delete-file-recursively "lib")))
+
+(define rust-windows-i686-gnu-0.53.1
+  (crate-source "windows_i686_gnu" "0.53.1"
+                "18wkcm82ldyg4figcsidzwbg1pqd49jpm98crfz0j7nqd6h6s3ln"
+                #:snippet '(delete-file-recursively "lib")))
+
+(define rust-windows-i686-gnullvm-0.53.1
+  (crate-source "windows_i686_gnullvm" "0.53.1"
+                "030qaxqc4salz6l4immfb6sykc6gmhyir9wzn2w8mxj8038mjwzs"
+                #:snippet '(delete-file-recursively "lib")))
+
+(define rust-windows-i686-msvc-0.53.1
+  (crate-source "windows_i686_msvc" "0.53.1"
+                "1hi6scw3mn2pbdl30ji5i4y8vvspb9b66l98kkz350pig58wfyhy"
+                #:snippet '(delete-file-recursively "lib")))
+
+(define rust-windows-link-0.2.1
+  (crate-source "windows-link" "0.2.1"
+                "1rag186yfr3xx7piv5rg8b6im2dwcf8zldiflvb22xbzwli5507h"))
+
+(define rust-windows-sys-0.60.2
+  ;; TODO: Check bundled sources.
+  (crate-source "windows-sys" "0.60.2"
+                "1jrbc615ihqnhjhxplr2kw7rasrskv9wj3lr80hgfd42sbj01xgj"))
+
+(define rust-windows-sys-0.61.2
+  ;; TODO: Check bundled sources.
+  (crate-source "windows-sys" "0.61.2"
+                "1z7k3y9b6b5h52kid57lvmvm05362zv1v8w0gc7xyv5xphlp44xf"))
+
+(define rust-windows-targets-0.53.5
+  (crate-source "windows-targets" "0.53.5"
+                "1wv9j2gv3l6wj3gkw5j1kr6ymb5q6dfc42yvydjhv3mqa7szjia9"))
+
+(define rust-windows-x86-64-gnu-0.53.1
+  (crate-source "windows_x86_64_gnu" "0.53.1"
+                "16d4yiysmfdlsrghndr97y57gh3kljkwhfdbcs05m1jasz6l4f4w"
+                #:snippet '(delete-file-recursively "lib")))
+
+(define rust-windows-x86-64-gnullvm-0.53.1
+  (crate-source "windows_x86_64_gnullvm" "0.53.1"
+                "1qbspgv4g3q0vygkg8rnql5c6z3caqv38japiynyivh75ng1gyhg"
+                #:snippet '(delete-file-recursively "lib")))
+
+(define rust-windows-x86-64-msvc-0.53.1
+  (crate-source "windows_x86_64_msvc" "0.53.1"
+                "0l6npq76vlq4ksn4bwsncpr8508mk0gmznm6wnhjg95d19gzzfyn"
+                #:snippet '(delete-file-recursively "lib")))
+
+(define rust-wyhash-0.5.0
+  (crate-source "wyhash" "0.5.0"
+                "15f26hvx6nyp4d6iswha7rm3psidxa2k2iab1f1aqgsyq9iy3xms"))
+
+(define-cargo-inputs lookup-cargo-inputs
+                     (gfaffix =>
+                              (list rust-adler2-2.0.1
+                                    rust-aho-corasick-1.1.4
+                                    rust-anstream-0.6.21
+                                    rust-anstyle-1.0.13
+                                    rust-anstyle-parse-0.2.7
+                                    rust-anstyle-query-1.1.5
+                                    rust-anstyle-wincon-3.0.11
+                                    rust-anyhow-1.0.101
+                                    rust-arrayvec-0.5.2
+                                    rust-autocfg-1.5.0
+                                    rust-bitflags-1.3.2
+                                    rust-bitflags-2.11.0
+                                    rust-boomphf-0.5.9
+                                    rust-bstr-0.2.17
+                                    rust-bytemuck-1.25.0
+                                    rust-bytemuck-derive-1.10.2
+                                    rust-byteorder-1.5.0
+                                    rust-cc-1.2.56
+                                    rust-cfg-if-1.0.4
+                                    rust-clap-4.5.59
+                                    rust-clap-builder-4.5.59
+                                    rust-clap-derive-4.5.55
+                                    rust-clap-lex-1.0.0
+                                    rust-colorchoice-1.0.4
+                                    rust-crc32fast-1.5.0
+                                    rust-crossbeam-channel-0.5.15
+                                    rust-crossbeam-deque-0.8.6
+                                    rust-crossbeam-epoch-0.9.18
+                                    rust-crossbeam-utils-0.8.21
+                                    rust-either-1.15.0
+                                    rust-env-filter-1.0.0
+                                    rust-env-logger-0.11.9
+                                    rust-equivalent-1.0.2
+                                    rust-errno-0.3.14
+                                    rust-find-msvc-tools-0.1.9
+                                    rust-flate2-1.1.9
+                                    rust-fnv-1.0.7
+                                    rust-gfa-0.10.1
+                                    rust-handlegraph-0.7.0-alpha.9
+                                    rust-hashbrown-0.16.1
+                                    rust-heck-0.5.0
+                                    rust-indexmap-2.13.0
+                                    rust-is-terminal-polyfill-1.70.2
+                                    rust-jiff-0.2.20
+                                    rust-jiff-static-0.2.20
+                                    rust-lazy-static-1.5.0
+                                    rust-lexical-core-0.7.6
+                                    rust-libc-0.2.182
+                                    rust-libz-sys-1.1.23
+                                    rust-linux-raw-sys-0.11.0
+                                    rust-log-0.4.29
+                                    rust-memchr-2.8.0
+                                    rust-memmap-0.7.0
+                                    rust-miniz-oxide-0.8.9
+                                    rust-nom-5.1.3
+                                    rust-num-traits-0.2.19
+                                    rust-once-cell-polyfill-1.70.2
+                                    rust-pkg-config-0.3.32
+                                    rust-portable-atomic-1.13.1
+                                    rust-portable-atomic-util-0.2.5
+                                    rust-proc-macro2-1.0.106
+                                    rust-quote-1.0.44
+                                    rust-rand-core-0.6.4
+                                    rust-rayon-1.11.0
+                                    rust-rayon-core-1.13.0
+                                    rust-regex-1.12.3
+                                    rust-regex-automata-0.1.10
+                                    rust-regex-automata-0.4.14
+                                    rust-regex-syntax-0.8.9
+                                    rust-rustc-hash-2.1.1
+                                    rust-rustix-1.1.3
+                                    rust-ryu-1.0.23
+                                    rust-serde-core-1.0.228
+                                    rust-serde-derive-1.0.228
+                                    rust-shlex-1.3.0
+                                    rust-simd-adler32-0.3.8
+                                    rust-static-assertions-1.1.0
+                                    rust-strsim-0.11.1
+                                    rust-succinct-0.5.2
+                                    rust-syn-2.0.116
+                                    rust-terminal-size-0.4.3
+                                    rust-unicode-ident-1.0.24
+                                    rust-utf8parse-0.2.2
+                                    rust-vcpkg-0.2.15
+                                    rust-version-check-0.9.5
+                                    rust-winapi-0.3.9
+                                    rust-winapi-i686-pc-windows-gnu-0.4.0
+                                    rust-winapi-x86-64-pc-windows-gnu-0.4.0
+                                    rust-windows-link-0.2.1
+                                    rust-windows-sys-0.60.2
+                                    rust-windows-sys-0.61.2
+                                    rust-windows-targets-0.53.5
+                                    rust-windows-aarch64-gnullvm-0.53.1
+                                    rust-windows-aarch64-msvc-0.53.1
+                                    rust-windows-i686-gnu-0.53.1
+                                    rust-windows-i686-gnullvm-0.53.1
+                                    rust-windows-i686-msvc-0.53.1
+                                    rust-windows-x86-64-gnu-0.53.1
+                                    rust-windows-x86-64-gnullvm-0.53.1
+                                    rust-windows-x86-64-msvc-0.53.1
+                                    rust-wyhash-0.5.0)))
diff --git a/gn/packages/twint.scm b/gn/packages/twint.scm
index b61b6ca..f665003 100644
--- a/gn/packages/twint.scm
+++ b/gn/packages/twint.scm
@@ -1,13 +1,16 @@
 (define-module (gn packages twint)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages)
+  #:use-module (guix build-system pyproject)
   #:use-module (guix build-system python)
+  #:use-module (guix gexp)
   #:use-module (guix git-download)
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (gnu packages check)
   #:use-module (gnu packages geo)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-build)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-science)
   #:use-module (gnu packages python-xyz)
@@ -104,6 +107,47 @@
      "cChardet is high speed universal character encoding detector.")
     (license #f)))
 
+(define-public python-curio
+  (package
+    (name "python-curio")
+    (version "1.6")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (pypi-uri "curio" version))
+       (sha256
+        (base32 "0isj3jl5mx6m25nr1f7r91hfaydhkvmks9p85dyvl5h2n9nmhajn"))))
+    (build-system pyproject-build-system)
+    (arguments
+     (list
+      #:test-flags
+      #~(list ;; AttributeError: 'NoneType' object has no attribute
+         ;; 'terminate'
+         "--deselect=tests/test_workers.py::test_exception"
+         ;; Tries to open an outgoing connection.
+         "--deselect=tests/test_network.py::test_ssl_outgoing"
+         ;; This test fails since Python 3.9.9, see
+         ;; <https://github.com/dabeaz/curio/issues/347>.
+         ;; AttributeError: 'NoneType' object has no attribute
+         ;; 'terminate'
+         "--deselect=tests/test_workers.py::test_worker_timeout"
+         ;; AttributeError: 'NoneType' object has no attribute
+         ;; 'terminate'
+         "--deselect=tests/test_workers.py::test_bad_cpu"
+         "--deselect=tests/test_workers.py::test_cpu"
+         "--deselect=tests/test_workers.py::test_worker_cancel")))
+    (native-inputs
+     (list python-pytest
+           python-setuptools
+           python-wheel))
+    (home-page "https://github.com/dabeaz/curio")
+    (synopsis "Coroutine-based library for concurrent Python")
+    (description
+     "Curio is a coroutine-based library for concurrent Python systems
+programming.  It provides standard programming abstractions such as as
+tasks, sockets, files, locks, and queues.")
+    (license license:bsd-3)))
+
 ;; TODO: Upstream
 (define-public python-socks
   (package
diff --git a/gn/packages/virtualization.scm b/gn/packages/virtualization.scm
index 22753f8..b176ec7 100644
--- a/gn/packages/virtualization.scm
+++ b/gn/packages/virtualization.scm
@@ -16,6 +16,7 @@
   #:use-module (gnu packages pkg-config)
   #:use-module (gnu packages protobuf)
   #:use-module (gnu packages python)
+  #:use-module (gnu packages python-build)
   #:use-module (gnu packages python-xyz)
   #:use-module (past packages python27))