summary refs log tree commit diff
path: root/gnu/packages/ruby.scm
diff options
context:
space:
mode:
authorJakub Kądziołka <kuba@kadziolka.net>2020-07-23 21:43:06 +0200
committerJakub Kądziołka <kuba@kadziolka.net>2020-07-23 21:43:06 +0200
commitd726b954baaeff876ce9728e00920fa45f529f9a (patch)
tree4b767b7586a1082dd2691bc33c3e45ace044e6e5 /gnu/packages/ruby.scm
parent9a74a7db8626bc139307d115f5cec2648f5273ad (diff)
parente165a2492d73d37c8b95d6970d453b9d88911ee6 (diff)
downloadguix-d726b954baaeff876ce9728e00920fa45f529f9a.tar.gz
Merge branch 'master' into core-updates
Conflicts:
	gnu/packages/ruby.scm
Diffstat (limited to 'gnu/packages/ruby.scm')
-rw-r--r--gnu/packages/ruby.scm2525
1 files changed, 2240 insertions, 285 deletions
diff --git a/gnu/packages/ruby.scm b/gnu/packages/ruby.scm
index b76b5fe411..7610244ff0 100644
--- a/gnu/packages/ruby.scm
+++ b/gnu/packages/ruby.scm
@@ -20,6 +20,7 @@
 ;;; Copyright © 2019 Collin J. Doering <collin@rekahsoft.ca>
 ;;; Copyright © 2019 Diego N. Barbato <dnbarbato@posteo.de>
 ;;; Copyright © 2019 Brett Gilio <brettg@posteo.de>
+;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -41,6 +42,7 @@
   #:use-module (gnu packages)
   #:use-module (gnu packages base)
   #:use-module (gnu packages bison)
+  #:use-module (gnu packages c)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages crypto)
@@ -49,6 +51,7 @@
   #:use-module (gnu packages rails)
   #:use-module (gnu packages readline)
   #:use-module (gnu packages autotools)
+  #:use-module (gnu packages haskell-xyz)
   #:use-module (gnu packages java)
   #:use-module (gnu packages libffi)
   #:use-module (gnu packages libidn)
@@ -58,6 +61,7 @@
   #:use-module (gnu packages ncurses)
   #:use-module (gnu packages networking)
   #:use-module (gnu packages node)
+  #:use-module (gnu packages protobuf)
   #:use-module (gnu packages python)
   #:use-module (gnu packages python-xyz)
   #:use-module (gnu packages ragel)
@@ -75,6 +79,13 @@
   #:use-module (guix build-system ruby)
   #:use-module ((srfi srfi-1) #:select (alist-delete)))
 
+(define %prawn-project-licenses
+  ;; This set of licenses applies to most (all?) components of the Prawn
+  ;; project (it is triple licensed).
+  (list license:ruby
+        license:gpl2+
+        license:gpl3+))
+
 (define-public ruby-2.6
   (package
     (name "ruby")
@@ -222,7 +233,7 @@ a focus on simplicity and productivity.")
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/mruby/mruby.git")
+             (url "https://github.com/mruby/mruby")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
@@ -622,6 +633,97 @@ outcomes of a code example.")
     (propagated-inputs
      `(("ruby-diff-lcs" ,ruby-diff-lcs)))))
 
+(define-public ruby-sorcerer
+  (package
+    (name "ruby-sorcerer")
+    (version "2.0.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (rubygems-uri "sorcerer" version))
+        (sha256
+          (base32
+            "0d32ha9pp9slpmsm027pkdpbr9vc5jn2m8rl6hwwx6a87m8cr58h"))))
+    (build-system ruby-build-system)
+    (synopsis "Ripper-style abstract syntax tree to Ruby source generator")
+    (description "Sorcerer generates Ruby code from a Ripper-like abstract
+syntax tree (i.e. S-Expressions).  Sorcerer is targeted mainly at small
+snippets of Ruby code, expressable in a single line.  Longer examples may be
+re-sourced, but they will be rendered in a single line format.")
+    (home-page "https://github.com/rspec-given/sorcerer")
+    (license license:expat)))
+
+(define-public ruby-given-core
+  (package
+    (name "ruby-given-core")
+    (version "3.8.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "given_core" version))
+       (sha256
+        (base32
+         "1lzyqllbbv6as3qgwz2007mvy7wy247bgkch9adnmh1zfa73bkrg"))))
+    (build-system ruby-build-system)
+    (arguments '(#:tests? #f))          ;no test suite for the core package
+    (propagated-inputs
+     `(("ruby-sorcerer" ,ruby-sorcerer)))
+    (synopsis "Core abstractions used by rspec-given and minitest-given")
+    (description "Given_core is the basic functionality behind rspec-given and
+minitest-given, extensions that allow the use of Given/When/Then terminology
+when defining specifications.")
+    (home-page "https://github.com/rspec-given/rspec-given")
+    (license license:expat)))
+
+(define-public ruby-rspec-given
+  (package
+    (name "ruby-rspec-given")
+    (version "3.8.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "rspec-given" version))
+       (sha256
+        (base32
+         "1783bazja10kbha8hk15khvybsq88siyax02cpkk688604h54nji"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:test-target "rs"
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'fix-rakefile
+           (lambda _
+             (substitute* '("Rakefile" "rakelib/gemspec.rake")
+               (("require '\\./lib/given/.*") "")
+               (("Given::VERSION") (format #f "~s" ,version))
+               ;; Fix the error: "cannot load such file -- example_helper"
+               (("sh \"rspec")
+                "sh \"rspec -Ilib:examples"))
+             #t))
+         (add-after 'extract-gemspec 'delete-failing-tests
+           ;; See: https://github.com/jimweirich/rspec-given/issues/57.
+           (lambda _
+             (substitute* ".gemspec"
+               (("\"spec/lib/given/natural_assertion_spec.rb\".freeze, ")
+                "")
+               (("\"examples/integration/failing_messages_spec.rb\".freeze, ")
+                ""))
+             (delete-file "spec/lib/given/natural_assertion_spec.rb")
+             (delete-file "examples/integration/failing_messages_spec.rb")
+             #t)))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)
+       ("ruby-minitest" ,ruby-minitest)))
+    (propagated-inputs
+     `(("ruby-given-core" ,ruby-given-core)
+       ("ruby-rspec" ,ruby-rspec)))
+    (synopsis "Given/When/Then for RSpec and Minitest")
+    (description "Given is an RSpec extension that allows the use of
+Given/When/Then terminology when defining specifications, in a way similar to
+the Cucumber Gherkin language.")
+    (home-page "https://github.com/rspec-given/rspec-given")
+    (license license:expat)))
+
 (define-public ruby-rspec-its
   (package
     (name "ruby-rspec-its")
@@ -630,7 +732,7 @@ outcomes of a code example.")
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/rspec/rspec-its.git")
+             (url "https://github.com/rspec/rspec-its")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
@@ -679,6 +781,16 @@ eq(1)\\}}.")
     (home-page "https://github.com/rspec/rspec-its")
     (license license:expat)))
 
+;;; This variant is used to break a cycle with ruby-protobuf.
+(define-public ruby-rspec-its-minimal
+  (hidden-package
+   (package
+     (inherit ruby-rspec-its)
+     (arguments
+      (substitute-keyword-arguments (package-arguments ruby-rspec-its)
+        ((#:tests? _ #f) #f)))
+     (native-inputs '()))))
+
 (define-public ruby-rspec-mocks
   (package
     (name "ruby-rspec-mocks")
@@ -808,13 +920,13 @@ expectations and mocks frameworks.")
 (define-public bundler
   (package
     (name "bundler")
-    (version "1.17.3")
+    (version "2.1.4")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "bundler" version))
               (sha256
                (base32
-                "0ln3gnk7cls81gwsbxvrmlidsfd78s6b2hzlm4d4a9wbaidzfjxw"))))
+                "12glbb1357x91fvd004jgkw7ihlkpc9dwr349pd7j83isqhls0ah"))))
     (build-system ruby-build-system)
     (arguments
      '(#:tests? #f)) ; avoid dependency cycles
@@ -973,52 +1085,733 @@ line of code.")
     ;; of the Expat license.
     (license license:bsd-3)))
 
+(define-public ruby-pandoc-ruby
+  (package
+    (name "ruby-pandoc-ruby")
+    (version "2.1.4")
+    (source
+     (origin
+       (method git-fetch)               ;the gem lacks many test files
+       (uri (git-reference
+             (url "https://github.com/xwmx/pandoc-ruby")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "03a11clhycyn0jhc7g9davpqd83sn60jqwjy1y145ag9sq6sp935"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'disable-failing-tests
+           ;; TODO: Remove this phase after ghc-pandoc gets upgraded to 2.9.2+
+           ;; (see: https://github.com/xwmx/pandoc-ruby/issues/39).
+           (lambda _
+             (substitute* "test/test_conversions.rb"
+               (("next if from == to.*" all)
+                (string-append
+                 all
+                 "      next if ['plain', 'beamer'].include? to\n")))
+             #t))
+         (add-after 'unpack 'patch-pandoc-path
+           (lambda* (#:key inputs #:allow-other-keys)
+             (let ((pandoc (string-append (assoc-ref inputs "ghc-pandoc")
+                                          "/bin/pandoc")))
+               (substitute* "lib/pandoc-ruby.rb"
+                 (("@@pandoc_path = 'pandoc'")
+                  (format #f "@@pandoc_path = '~a'" pandoc)))
+               (substitute* "test/test_pandoc_ruby.rb"
+                 (("('|\")pandoc" _ quote)
+                  (string-append quote pandoc))
+                 (("\\^pandoc")
+                  ".*pandoc"))
+               #t)))
+         (add-after 'extract-gemspec 'remove-Gemfile.lock
+           (lambda _
+             (delete-file "Gemfile.lock")
+             (substitute* "pandoc-ruby.gemspec"
+               (("Gemfile\\.lock") ""))
+             #t)))))
+    (native-inputs
+     `(("ruby-mocha" ,ruby-mocha)))
+    (inputs
+     `(("ghc-pandoc" ,ghc-pandoc)))
+    (synopsis "Ruby wrapper for Pandoc")
+    (description "PandocRuby is a wrapper for Pandoc, a Haskell library with
+command line tools for converting one markup format to another.  Pandoc can
+convert documents from a variety of formats including markdown,
+reStructuredText, textile, HTML, DocBook, LaTeX, and MediaWiki markup to a
+variety of other formats, including markdown, reStructuredText, HTML, LaTeX,
+ConTeXt, PDF, RTF, DocBook XML, OpenDocument XML, ODT, GNU Texinfo, MediaWiki
+markup, groff man pages, HTML slide shows, EPUB, Microsoft Word docx, and
+more.")
+    (home-page "https://github.com/xwmx/pandoc-ruby")
+    (license license:expat)))
+
+(define-public ruby-slim
+  (package
+    (name "ruby-slim")
+    (version "4.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "slim" version))
+       (sha256
+        (base32
+         "0gjx30g84c82qzg32bd7giscvb4206v7mvg56kc839w9wjagn36n"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         ;; See: https://github.com/slim-template/slim/issues/857 and
+         ;; https://github.com/slim-template/slim/issues/858.
+         (add-after 'unpack 'skip-broken-tests
+           (lambda _
+             (substitute* "test/core/test_embedded_engines.rb"
+               (("def test_render_with_markdown")
+                "def skipped_test_render_with_markdown"))
+             (substitute* "test/translator/test_translator.rb"
+               (("raise (\"Missing test for.*)" _ tail)
+                (string-append "print " tail)))
+             #t))
+         ;; See: https://salsa.debian.org/ruby-team/ruby-slim/-/commit/
+         ;; 824862bd99d1675bc699d8fc71ba965a785c1f44.
+         (add-after 'unpack 'prevent-bundler-interference
+           (lambda _
+             (substitute* "Rakefile"
+               (("require 'bundler/setup'") "nil")
+               (("Bundler::GemHelper\\.install_tasks") "nil"))
+             #t)))))
+    (native-inputs
+     `(("ruby-rack-test" ,ruby-rack-test)
+       ("ruby-sinatra" ,ruby-sinatra)))
+    (propagated-inputs
+     `(("ruby-temple" ,ruby-temple)
+       ("ruby-tilt" ,ruby-tilt)))
+    (synopsis "Minimalist template language for Ruby")
+    (description "Slim is a template language for Ruby that aims to reduce the
+syntax to the minimum while remaining clear.")
+    (home-page "http://slim-lang.com/")
+    (license license:expat)))
+
 (define-public ruby-asciidoctor
   (package
-  (name "ruby-asciidoctor")
-  (version "1.5.7.1")
-  (source
-    (origin
-      (method url-fetch)
-      (uri (rubygems-uri "asciidoctor" version))
-      (sha256
+    (name "ruby-asciidoctor")
+    (version "2.0.10")
+    (source
+     (origin
+       (method git-fetch)               ;the gem release lacks a Rakefile
+       (uri (git-reference
+             (url "https://github.com/asciidoctor/asciidoctor")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
         (base32
-          "0v52bzc72cvg7zfgq27pa4mgyf29dx9m20fghrw1xmvwgd519n1w"))))
-  (build-system ruby-build-system)
-  (arguments
-   `(#:test-target "test:all"
-     #:phases
-     (modify-phases %standard-phases
-       (add-before 'check 'remove-circular-tests
-         (lambda _
-           ;; Remove tests that require circular dependencies to load or pass.
-           (delete-file "test/invoker_test.rb")
-           (delete-file "test/converter_test.rb")
-           (delete-file "test/options_test.rb")
-           #t)))))
-  (native-inputs
-   `(("ruby-minitest" ,ruby-minitest)
-     ("ruby-nokogiri" ,ruby-nokogiri)
-     ("ruby-asciimath" ,ruby-asciimath)
-     ("ruby-coderay" ,ruby-coderay)))
-  (synopsis "Converter from AsciiDoc content to other formats")
-  (description
-    "Asciidoctor is a text processor and publishing toolchain for converting
-AsciiDoc content to HTML5, DocBook 5 (or 4.5), PDF, and other formats.")
-  (home-page "https://asciidoctor.org")
-  (license license:expat)))
+         "0jaxpnsdnx3qyjw5p2lsx1swny12q1i2vxw2kgdp4vlsyjv95z95"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:test-target "test:all"
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'replace-git-ls-files
+           (lambda _
+             ;; TODO: Remove after the fix of using 'cut' to better mimic the
+             ;; git ls-files output is merged in ruby-build-system.
+             (substitute* "asciidoctor.gemspec"
+               (("`git ls-files -z`")
+                "`find . -type f -print0 |sort -z|cut -zc3-`"))
+             #t))
+         (add-after 'extract-gemspec 'strip-version-requirements
+           (lambda _
+             (delete-file "Gemfile")
+             (substitute* "asciidoctor.gemspec"
+               (("(.*add_.*dependency '[_A-Za-z0-9-]+').*" _ stripped)
+                (string-append stripped "\n")))
+             #t)))))
+    (native-inputs
+     `(("ruby-erubis" ,ruby-erubis)
+       ("ruby-minitest" ,ruby-minitest)
+       ("ruby-nokogiri" ,ruby-nokogiri)
+       ("ruby-asciimath" ,ruby-asciimath)
+       ("ruby-coderay" ,ruby-coderay)
+       ("ruby-cucumber" ,ruby-cucumber)
+       ("ruby-haml" ,ruby-haml)
+       ("ruby-rouge" ,ruby-rouge)
+       ("ruby-rspec-expectations" ,ruby-rspec-expectations)
+       ("ruby-simplecov" ,ruby-simplecov)
+       ("ruby-slim" ,ruby-slim)
+       ("ruby-tilt" ,ruby-tilt)))
+    (synopsis "Converter from AsciiDoc content to other formats")
+    (description "Asciidoctor is a text processor and publishing toolchain for
+converting AsciiDoc content to HTML5, DocBook 5 (or 4.5), PDF, and other
+formats.")
+    (home-page "https://asciidoctor.org")
+    (license license:expat)))
+
+(define-public ruby-prawn-icon
+  (package
+    (name "ruby-prawn-icon")
+    (version "2.5.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "prawn-icon" version))
+       (sha256
+        (base32
+         "1ivkdf8rdf92hhy97vbmc2a4w97vcvqd58jcj4z9hz3hfsb1526w"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:test-target "spec"
+       #:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'remove-unnecessary-dependencies
+                    (lambda _
+                      (substitute* '("Rakefile" "spec/spec_helper.rb")
+                        ((".*[Bb]undler.*") "")
+                        (("^require 'rubocop.*") "")
+                        (("^RuboCop.*") ""))
+                      #t)))))
+    (native-inputs
+     `(("ruby-pdf-inspector" ,ruby-pdf-inspector)
+       ("ruby-pdf-reader" ,ruby-pdf-reader)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby-simplecov" ,ruby-simplecov)))
+    (propagated-inputs
+     `(("ruby-prawn" ,ruby-prawn)))
+    (synopsis "Icon fonts for use with the Prawn PDF toolkit")
+    (description "@code{Prawn::Icon} provides various icon fonts including
+FontAwesome, PaymentFont and Foundation Icons for use with the Prawn PDF
+toolkit.")
+    (home-page "https://github.com/jessedoyle/prawn-icon/")
+    (license %prawn-project-licenses)))
+
+(define-public ruby-css-parser
+  (package
+    (name "ruby-css-parser")
+    (version "1.7.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "css_parser" version))
+       (sha256
+        (base32
+         "04c4dl8cm5rjr50k9qa6yl9r05fk9zcb1zxh0y0cdahxlsgcydfw"))))
+    (build-system ruby-build-system)
+    (arguments `(#:tests? #f))          ;gem doesn't ship with test suite
+    (propagated-inputs
+     `(("ruby-addressable" ,ruby-addressable)))
+    (synopsis "Ruby Cascading Style Sheets (CSS) parser")
+    (description "This package allows loading, parsing and cascading Cascading
+Style Sheets (CSS) rule sets in Ruby.")
+    (home-page "https://github.com/premailer/css_parser")
+    (license license:expat)))
+
+(define-public ruby-prawn-svg
+  (package
+    (name "ruby-prawn-svg")
+    (version "0.30.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "prawn-svg" version))
+       (sha256
+        (base32
+         "0df3l49cy3xpwi0b73hmi2ykbjg9kjwrvhk0k3z7qhh5ghmmrn77"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'do-not-use-bundler
+                    (lambda _
+                      (substitute* "spec/spec_helper.rb"
+                        ((".*[Bb]undler.*") ""))
+                      #t))
+                  (replace 'check
+                    (lambda* (#:key tests? #:allow-other-keys)
+                      (when tests?
+                        (invoke "rspec" "-Ilib" "-rprawn-svg"))
+                      #t)))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)))
+    (propagated-inputs
+     `(("ruby-css-parser" ,ruby-css-parser)
+       ("ruby-prawn" ,ruby-prawn)))
+    (synopsis "SVG renderer for the Prawn PDF library")
+    (description "This library allows rendering Scalable Vector Graphics (SVG)
+graphics directly into a Portable Document Format (PDF) document using the
+Prawn module.")
+    (home-page "https://github.com/mogest/prawn-svg")
+    (license license:expat)))
+
+(define-public ruby-prawn-templates
+  (package
+    (name "ruby-prawn-templates")
+    (version "0.1.2")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/prawnpdf/prawn-templates.git")
+             (commit version)))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0wll54wxxwixpwazfn4ffbqvqbfrl01cfsv8y11vnlzy7isx5xvl"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'do-not-use-bundler
+                    (lambda _
+                      (substitute* "spec/spec_helper.rb"
+                        ((".*[Bb]undler.*") ""))
+                      #t))
+                  (replace 'check
+                    (lambda* (#:key tests? #:allow-other-keys)
+                      (when tests?
+                        (invoke "rspec"))
+                      #t)))))
+    (native-inputs
+     `(("ruby-pdf-inspector" ,ruby-pdf-inspector)
+       ("ruby-rspec" ,ruby-rspec)))
+    (propagated-inputs
+     `(("ruby-pdf-reader" ,ruby-pdf-reader)
+       ("ruby-prawn" ,ruby-prawn)))
+    (synopsis "Prawn extension to include or combine PDF documents")
+    (description "This @strong{unmaintained} package provides a Prawn
+extension that allows including other Portable Document Format (PDF) documents
+as background or combining several PDF documents into one.  This functionality
+used to be part of Prawn itself, but was extracted from Prawn 0.15.0 because
+of its many longstanding issues.")
+    (home-page "https://github.com/prawnpdf/prawn-templates")
+    (license %prawn-project-licenses)))
+
+(define-public ruby-polyglot
+  (package
+    (name "ruby-polyglot")
+    (version "0.3.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "polyglot" version))
+       (sha256
+        (base32
+         "1bqnxwyip623d8pr29rg6m8r0hdg08fpr2yb74f46rn1wgsnxmjr"))))
+    (build-system ruby-build-system)
+    (arguments `(#:tests? #f))           ;no test suite
+    (synopsis "Augment @code{require} to load non-Ruby file types")
+    (description "The Polyglot library allows a Ruby module to register a
+loader for the file type associated with a filename extension, and it augments
+@code{require} to find and load matching files.")
+    (home-page "https://github.com/cjheath/polyglot")
+    (license license:expat)))
+
+(define-public ruby-treetop
+  (package
+    (name "ruby-treetop")
+    (version "1.6.10")
+    (source
+     (origin
+       (method git-fetch)               ;no test suite in distributed gem
+       (uri (git-reference
+             (url "https://github.com/cjheath/treetop.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "1dmk94z6ivhrz5hsq68vl5vgydhkz89n394rha1ymddw3rymbfcv"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:test-target "spec"
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'replace-git-ls-files
+           (lambda _
+             ;; TODO: Remove after the fix of using 'cut' to better mimic the
+             ;; git ls-files output is merged in ruby-build-system.
+             (substitute* "treetop.gemspec"
+               (("`git ls-files -z`")
+                "`find . -type f -print0 |sort -z|cut -zc3-`"))
+             #t)))))
+    (native-inputs
+     `(("ruby-activesupport" ,ruby-activesupport)
+       ("ruby-rr" ,ruby-rr)
+       ("ruby-rspec" ,ruby-rspec)))
+    (propagated-inputs
+     `(("ruby-polyglot" ,ruby-polyglot)))
+    (synopsis "Ruby-based parsing DSL based on parsing expression grammars")
+    (description "This package provides a Ruby-based Parsing Expression
+Grammar (PEG) parser generator Domain Specific Language (DSL).")
+    (home-page "https://github.com/cjheath/treetop")
+    (license license:expat)))
+
+(define-public ruby-rubocop-performance
+  (package
+    (name "ruby-rubocop-performance")
+    (version "1.7.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "rubocop-performance" version))
+       (sha256
+        (base32
+         "04r8d4x62ygv17spvz9yyfxbmbf8qxwhijs0xycfvzr0q4pyg9sw"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))                    ;no test suite in the distributed gem
+    (propagated-inputs
+     `(("ruby-rubocop" ,ruby-rubocop)))
+    (synopsis "Performance optimizations checkers for Ruby code")
+    (description "This package provides a collection of RuboCop cops to check
+for performance optimizations in Ruby code.")
+    (home-page "https://docs.rubocop.org/rubocop-performance/")
+    (license license:expat)))
+
+(define-public ruby-gimme
+  (let ((revision "1")
+        (commit "4e71f0236f1271871916dd403261d26533db34c0"))
+    (package
+      (name "ruby-gimme")
+      (version (git-version "0.5.0" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/searls/gimme.git")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "0hrd32ygvf3i7h47ak8f623cz8ns9q7g60nnnvvlnywbggjaz3h6"))))
+      (build-system ruby-build-system)
+      (native-inputs
+       `(("ruby-coveralls" ,ruby-coveralls)
+         ("ruby-cucumber" ,ruby-cucumber)
+         ("ruby-pry" ,ruby-pry)
+         ("ruby-simplecov" ,ruby-simplecov)
+         ("ruby-rspec-given" ,ruby-rspec-given)))
+      (arguments
+       `(;; The cucumber task fails with error: "index 3 out of matches
+         ;; (IndexError)", apparently due to our newer Cucumber version.
+         ;; TODO: Try the "default" task with a future release.
+         #:test-target "spec"
+         #:phases
+         (modify-phases %standard-phases
+           (add-after 'extract-gemspec 'prepare-for-tests
+             (lambda _
+               ;; Delete failing tests (possibly due to our newer rspec
+               ;; version).
+               (delete-file "spec/gimme/gives_class_methods_spec.rb")
+               (delete-file "spec/gimme/rspec_adapter_spec.rb")
+               (delete-file "spec/gimme/verifies_class_methods_spec.rb")
+               ;; Fix duplicate version requirements and de-register files.
+               (delete-file "Gemfile")
+               (delete-file "Gemfile.lock")
+               (substitute* "gimme.gemspec"
+                 ((".*\"Gemfile\".*") "")
+                 ((".*\"Gemfile\\.lock\",.*") "")
+                 ((".*(rspec|cucumber).*\">= 0\".*") "")
+                 (("\"spec/gimme/gives_class_methods_spec.rb\",") "")
+                 (("\"spec/gimme/rspec_adapter_spec.rb\",") "")
+                 (("\"spec/gimme/verifies_class_methods_spec.rb\",") "")
+                 ;; All of these gems relate to development, and are
+                 ;; unnecessary when running the tests.
+                 ((".*(add|gem).*guard-.*") "")
+                 ((".*(add|gem).*jeweler.*") "")
+                 ((".*(add|gem).*pry.*") "")
+                 ((".*(add|gem).*growl.*") "")
+                 ((".*(add|gem).*rb-fsevent.*") ""))
+               #t)))))
+      (synopsis "Lightweight test double library for Ruby")
+      (description "Gimme is a very lightweight test double library for Ruby,
+based on Mockito (a mocking framework for Java).  It is an opinionated (but
+not noisy) means to facilitate test-driving by enabling the authors to specify
+only what they care about.")
+      (home-page "https://github.com/searls/gimme")
+      (license license:expat))))
+
+(define-public ruby-standard
+  (package
+    (name "ruby-standard")
+    (version "0.4.7")
+    (source
+     (origin
+       (method git-fetch)               ;no test suite in distributed gem
+       (uri (git-reference
+             (url "https://github.com/testdouble/standard.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0ylx0lm2pbbgr5h7fban592w96bl3wxmvfcpcdfrhkxnpg5kiwgv"))))
+    (build-system ruby-build-system)
+    (arguments
+     ;; TODO: the tests are currently broken due to using a newer Rubocop.
+     `(#:tests? #f
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'relax-version-requiremens
+           (lambda _
+             (delete-file "Gemfile")
+             (delete-file "Gemfile.lock")
+             #t))
+         (replace 'replace-git-ls-files
+           (lambda _
+             ;; TODO: Remove after the fix of using 'cut' to better mimic the
+             ;; git ls-files output is merged in ruby-build-system.
+             (substitute* "standard.gemspec"
+               (("`git ls-files -z`")
+                "`find . -type f -not -regex '.*\\.gem$' -print0 \
+|sort -z|cut -zc3-`"))
+             #t)))))
+    (native-inputs
+     `(("ruby-gimme" ,ruby-gimme)
+       ("ruby-pry" ,ruby-pry)
+       ("ruby-simplecov" ,ruby-simplecov)))
+    (propagated-inputs
+     `(("ruby-rubocop" ,ruby-rubocop)
+       ("ruby-rubocop-performance" ,ruby-rubocop-performance)))
+    (synopsis "Ruby Style Guide, with linter & automatic code fixer")
+    (description "Standard is a port of StandardJS.  Like StandardJS, it aims
+to save time in the following ways:
+@itemize
+@item No configuration.
+@item Automatically format code.
+@item Catch style issues and programmer errors early.
+@end itemize")
+    (home-page "https://github.com/testdouble/standard")
+    (license license:expat)))
+
+(define-public ruby-chunky-png
+  ;; There hasn't been a release since 2018/11/21 and there are test failures
+  ;; in that release, so use the latest commit.
+  (let ((revision "1")
+        (commit "143b9cd1412e49edd4f8b661c7cd9b22941f43c0"))
+    (package
+      (name "ruby-chunky-png")
+      (version (git-version "1.3.11" revision commit))
+      (source
+       (origin
+         (method git-fetch)
+         (uri (git-reference
+               (url "https://github.com/wvanbergen/chunky_png.git")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "0wbcgfzymbpmmxsb04arc49a2icki6f2fc6d6sqgg8369mc67g9z"))))
+      (build-system ruby-build-system)
+      (arguments
+       `(#:test-target "spec"
+         #:phases
+         (modify-phases %standard-phases
+           (add-after 'unpack 'disable-bundler
+             (lambda _
+               (substitute* (find-files "." "\\.rb$")
+                 (("require.*bundler/setup.*") ""))
+               #t))
+           (replace 'replace-git-ls-files
+             (lambda _
+               ;; TODO: Remove after the fix of using 'cut' to better mimic the
+               ;; git ls-files output is merged in ruby-build-system.
+               (substitute* "chunky_png.gemspec"
+                 (("`git ls-files`")
+                  "`find . -type f -not -regex '.*\\.gem$' |sort |cut -c3-`"))
+               #t)))))
+      (native-inputs
+       `(("bundler" ,bundler)
+         ("ruby-rspec" ,ruby-rspec)
+         ("ruby-standard" ,ruby-standard)
+         ("ruby-yard" ,ruby-yard)))
+      (synopsis "Ruby library to handle PNG images")
+      (description "ChunkyPNG is a pure Ruby library that can read and write
+Portable Network Graphics (PNG) images without depending on an external image
+library.  It tries to be memory efficient and reasonably fast.  It has
+features such as:
+@itemize
+@item
+Decoding support for any image that the PNG standard allows.  This includes all
+standard color modes, all bit depths, all transparency, and interlacing and
+filtering options.
+@item
+Encoding support for images of all color modes (true color, grayscale, and
+indexed) and transparency for all these color modes.  The best color mode is
+chosen automatically, based on the amount of used colors.
+@item Read/write access to the image's pixels.
+@item Read/write access to all image metadata that is stored in chunks.
+@item
+Memory efficiency: @code{fixnum} are used, i.e. 4 or 8 bytes of memory per
+pixel, depending on the hardware).
+@item
+Performance: ChunkyPNG is reasonably fast for Ruby standards, by only using
+integer math and a highly optimized saving routine.
+@item Interoperability with RMagick.
+@end itemize")
+      (home-page "https://github.com/wvanbergen/chunky_png/wiki")
+      (license license:expat))))
+
+(define-public ruby-text-hyphen
+  (package
+    (name "ruby-text-hyphen")
+    (version "1.4.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (rubygems-uri "text-hyphen" version))
+        (sha256
+          (base32
+            "1gj4awvs9ryf960m0iawg43jyjmfwcqgfwrbcfp890a57b9ag7q1"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("ruby-hoe" ,ruby-hoe)))
+    (synopsis "Ruby library to hyphenate words in various languages")
+    (description "Text::Hyphen is a Ruby library to hyphenate words in various
+languages using Ruby-fied versions of TeX hyphenation patterns.  It will
+properly hyphenate various words according to the rules of the language the
+word is written in.  The algorithm is based on that of the TeX typesetting
+system by Donald E.  Knuth.")
+    (home-page "https://github.com/halostatue/text-hyphen")
+    ;; The whole is licensed under the Expat license, but parts use various
+    ;; versions of the LaTeX Project Public License.
+    (license license:expat)))
+
+(define-public ruby-open-uri-cached
+  (package
+    (name "ruby-open-uri-cached")
+    (version "0.0.5")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "open-uri-cached" version))
+       (sha256
+        (base32
+         "13xy2vhrgz9mdxhklw5fszhamsdxh8ysf3l40g92hqm4hm288wap"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f))                    ;no test suite
+    (synopsis "OpenURI with transparent disk caching")
+    (description "OpenURI with transparent disk caching, which is
+useful to avoid making excessive queries, for example when scraping
+web pages.")
+    (home-page "https://github.com/tigris/open-uri-cached")
+    (license license:expat)))
+
+(define-public ruby-asciidoctor-pdf
+  ;; Use the latest commit, as the last tag doesn't build with the
+  ;; latest Ruby dependencies in Guix.
+  (let ((revision "1")
+        (commit "d257440df895d1595a3825ef58b32e4b290ba1c3"))
+    (package
+      (name "ruby-asciidoctor-pdf")
+      (version (git-version "1.5.3" revision commit))
+      (source
+       (origin
+         (method git-fetch)      ;no test suite in the distributed gem
+         (uri (git-reference
+               (url "https://github.com/asciidoctor/asciidoctor-pdf.git")
+               (commit commit)))
+         (file-name (git-file-name name version))
+         (sha256
+          (base32
+           "1563d11ghzsrsg4inwfwj6b9hb5sk5b429f49fwq5qg3sq76kgjj"))))
+      (build-system ruby-build-system)
+      (arguments
+       `(#:test-target "spec"
+         #:phases
+         (modify-phases %standard-phases
+           (add-after 'unpack 'remove-failing-tests
+             ;; Two tests module fail for unknown reasons, *only* when
+             ;; ran in the build container (see:
+             ;; https://github.com/asciidoctor/asciidoctor-pdf/issues/1725#issuecomment-658777965).
+             (lambda _
+               (delete-file "spec/audio_spec.rb")
+               (delete-file "spec/video_spec.rb")
+               #t))
+           (add-after 'extract-gemspec 'strip-version-requirements
+             (lambda _
+               (substitute* "asciidoctor-pdf.gemspec"
+                 (("(.*add_.*dependency '[_A-Za-z0-9-]+').*" _ stripped)
+                  (string-append stripped "\n")))
+               #t))
+           (replace 'replace-git-ls-files
+             ;; TODO: Remove after the fix of using 'cut' to better mimic the
+             ;; git ls-files output is merged in ruby-build-system.
+             (lambda _
+               (substitute* "asciidoctor-pdf.gemspec"
+                 (("`git ls-files -z`")
+                  "`find . -type f -not -regex '.*\\.gem$' -print0 \
+|sort -z|cut -zc3-`"))
+               #t))
+           ;; The tests rely on the Gem being installed, so move the check phase
+           ;; after the install phase.
+           (delete 'check)
+           (add-after 'install 'check
+             (lambda* (#:key outputs tests? #:allow-other-keys)
+               (let ((new-gem (string-append (assoc-ref outputs "out")
+                                             "/lib/ruby/vendor_ruby")))
+                 (setenv "GEM_PATH"
+                         (string-append (getenv "GEM_PATH") ":" new-gem))
+                 (when tests?
+                   (invoke "rspec" "-t" "~visual" "-t" "~cli" "-t" "~network"))
+                 #t))))))
+      (native-inputs
+       `(("ruby-chunky-png" ,ruby-chunky-png)
+         ("ruby-coderay" ,ruby-coderay)
+         ("ruby-pdf-inspector" ,ruby-pdf-inspector)
+         ("ruby-rouge" ,ruby-rouge)
+         ("ruby-rspec" ,ruby-rspec)))
+      (propagated-inputs
+       `(("ruby-asciidoctor" ,ruby-asciidoctor)
+         ("ruby-concurrent-ruby" ,ruby-concurrent)
+         ("ruby-open-uri-cached" ,ruby-open-uri-cached)
+         ("ruby-prawn" ,ruby-prawn)
+         ("ruby-prawn-icon" ,ruby-prawn-icon)
+         ("ruby-prawn-svg" ,ruby-prawn-svg)
+         ("ruby-prawn-table" ,ruby-prawn-table)
+         ("ruby-prawn-templates" ,ruby-prawn-templates)
+         ("ruby-safe-yaml" ,ruby-safe-yaml)
+         ("ruby-text-hyphen" ,ruby-text-hyphen)
+         ("ruby-thread-safe" ,ruby-thread-safe)
+         ("ruby-treetop" ,ruby-treetop)
+         ("ruby-ttfunk" ,ruby-ttfunk)))
+      (synopsis"AsciiDoc to Portable Document Format (PDF)} converter")
+      (description "Asciidoctor PDF is an extension for Asciidoctor that
+converts AsciiDoc documents to Portable Document Format (PDF) using the Prawn
+PDF library.  It has features such as:
+@itemize
+@item Direct AsciiDoc to PDF conversion
+@item Configuration-driven theme (style and layout)
+@item Scalable Vector Graphics (SVG) support
+@item PDF document outline (i.e., bookmarks)
+@item Table of contents page(s)
+@item Document metadata (title, authors, subject, keywords, etc.)
+@item Internal cross reference links
+@item Syntax highlighting with Rouge, Pygments, or CodeRay
+@item Page numbering
+@item Customizable running content (header and footer)
+@item
+“Keep together” blocks (i.e., page breaks avoided in certain block content)
+@item Orphaned section titles avoided
+@item Autofit verbatim blocks (as permitted by base_font_size_min setting)
+@item Table border settings honored
+@item Font-based icons
+@item Custom TrueType (TTF) fonts
+@item Double-sided printing mode (margins alternate on recto and verso pages)
+@end itemize")
+      (home-page "https://asciidoctor.org/docs/asciidoctor-pdf")
+      (license license:expat))))
 
 (define-public ruby-ast
   (package
     (name "ruby-ast")
-    (version "2.4.0")
+    (version "2.4.1")
     (source
      (origin
-       (method url-fetch)
-       (uri (rubygems-uri "ast" version))
+       (method git-fetch)               ;no test included in gem from v2.4.1
+       (uri (git-reference
+             (url "https://github.com/whitequark/ast")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "184ssy3w93nkajlz2c70ifm79jp3j737294kbc5fjw69v1w0n9x7"))))
+         "0k8vya256chimy473g818gim06m5rjgh6mz5sc5g8xz3csh3rysi"))))
     (build-system ruby-build-system)
     (arguments
      '(#:phases
@@ -1066,7 +1859,7 @@ It does this through immutable data structures.")
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
-                      (url "https://github.com/sporkmonger/rack-mount.git")
+                      (url "https://github.com/sporkmonger/rack-mount")
                       (commit commit)))
                 (file-name (git-file-name name version))
                 (sha256
@@ -1522,7 +2315,7 @@ support.")
        ;; fetch from github as the gem does not contain testing code
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/rails/execjs.git")
+             (url "https://github.com/rails/execjs")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
@@ -2055,7 +2848,7 @@ standard output stream.")
        ;; the tests.
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/thekompanee/fuubar.git")
+             (url "https://github.com/thekompanee/fuubar")
              (commit (string-append "releases/v" version))))
        (file-name (git-file-name name version))
        (sha256
@@ -2318,7 +3111,7 @@ Ruby Gems.")
   (synopsis "Ruby module is for reading and writing zip files")
   (description
     "The rubyzip module provides ways to read from and create zip files.")
-  (home-page "http://github.com/rubyzip/rubyzip")
+  (home-page "https://github.com/rubyzip/rubyzip")
   (license license:bsd-2)))
 
 (define-public ruby-simplecov-html
@@ -2650,14 +3443,14 @@ localization.")
 (define-public ruby-temple
   (package
     (name "ruby-temple")
-    (version "0.8.1")
+    (version "0.8.2")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "temple" version))
        (sha256
         (base32
-         "158d7ygbwcifqnvrph219p7m78yjdjazhykv5darbkms7bxm5y09"))))
+         "060zzj7c2kicdfk6cpnn40n9yjnhfrr13d0rsbdhdij68chp2861"))))
     (build-system ruby-build-system)
     (native-inputs
      `(("ruby-tilt" ,ruby-tilt)
@@ -2968,7 +3761,7 @@ specs for Ruby implementations in ruby/spec.")
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/brianmario/mysql2.git")
+             (url "https://github.com/brianmario/mysql2")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
@@ -3393,7 +4186,7 @@ with processes on remote servers, via SSH2.")
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/net-ssh/net-scp.git")
+             (url "https://github.com/net-ssh/net-scp")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
@@ -3565,7 +4358,7 @@ is to be run.")
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
-                      (url "https://github.com/adammck/minitest-pretty_diff.git")
+                      (url "https://github.com/adammck/minitest-pretty_diff")
                       (commit commit)))
                 (file-name (string-append name "-" version "-checkout"))
                 (sha256
@@ -4075,7 +4868,7 @@ Extensions} type detection using magic numbers, filenames, and extensions")
        (origin
          (method git-fetch)
          (uri (git-reference
-               (url "https://github.com/halostatue/minitar.git")
+               (url "https://github.com/halostatue/minitar")
                (commit commit)))
          (file-name (string-append name "-" version "-checkout"))
          (sha256
@@ -4174,14 +4967,14 @@ both CSS3 selector and XPath 1.0 support.")
 (define-public ruby-method-source
   (package
     (name "ruby-method-source")
-    (version "0.9.0")
+    (version "1.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "method_source" version))
        (sha256
         (base32
-         "0xqj21j3vfq4ldia6i2akhn2qd84m0iqcnsl49kfpq3xk6x0dzgn"))))
+         "1pnyh44qycnf9mzi1j6fywd5fkskv3x7nmsqrrws0rjn5dd4ayfp"))))
     (build-system ruby-build-system)
     (arguments
      `(#:test-target "spec"))
@@ -4215,10 +5008,36 @@ for select languages.")
     (home-page "http://coderay.rubychan.de")
     (license license:expat)))
 
+(define-public ruby-cuke-modeler
+  (package
+    (name "ruby-cuke-modeler")
+    (version "3.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "cuke_modeler" version))
+       (sha256
+        (base32
+         "19smj3g3wvz0203l549sadpcxgh0ir350a6k78gq0bmlv9cchmjb"))))
+    (build-system ruby-build-system)
+    (arguments `(#:tests? #f))          ;no test suite in gem
+    (propagated-inputs
+     `(("ruby-gherkin" ,ruby-gherkin)))
+    (synopsis "Gherkin test suite analysis tool")
+    (description "CukeModeler facilitates modeling a test suite that is
+written in Gherkin (e.g.  Cucumber, SpecFlow, Lettuce, etc.).  It does this by
+providing an abstraction layer on top of the Abstract Syntax Tree (AST) that
+the @code{cucumber-gherkin} generates when parsing features, as well as
+providing models for feature files and directories in order to be able to have
+a fully traversable model tree of a test suite's structure.  These models can
+then be analyzed or manipulated more easily than the underlying AST layer.")
+    (home-page "https://github.com/enkessler/cuke_modeler")
+    (license license:expat)))
+
 (define-public ruby-parallel-tests
   (package
     (name "ruby-parallel-tests")
-    (version "2.32.0")
+    (version "3.0.0")
     (home-page "https://github.com/grosser/parallel_tests")
     (source (origin
               (method git-fetch)
@@ -4228,7 +5047,7 @@ for select languages.")
               (file-name (string-append name version))
               (sha256
                (base32
-                "0l2rjz9fnxv7hvz679v7a75mghsh9x9qpvbyapiavqsx21v42l7m"))))
+                "08a6ndqn2dqacmc7yg48k0dh2rfrynvhkd5hiay16dl9m1r9q8pz"))))
     (build-system ruby-build-system)
     (arguments
      '(#:test-target "default"
@@ -4266,6 +5085,7 @@ for select languages.")
     (native-inputs
      `(("ruby-bump" ,ruby-bump)
        ("ruby-cucumber" ,ruby-cucumber)
+       ("ruby-cuke-modeler" ,ruby-cuke-modeler)
        ("ruby-minitest" ,ruby-minitest)
        ("ruby-rake" ,ruby-rake)
        ("ruby-rspec" ,ruby-rspec)
@@ -4282,14 +5102,14 @@ across multiple CPU cores.")
 (define-public ruby-parser
   (package
     (name "ruby-parser")
-    (version "2.6.0.0")
+    (version "2.7.1.4")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "parser" version))
        (sha256
         (base32
-         "1hhz2k5417vr2k1llwqgjdnmyrhlpqicy0y2arr6r1gp04fg9wlm"))))
+         "1030znhvhkfn39svwbj6qn4xb6hgl94gnvg57k4d3r76f9bryqmn"))))
     (build-system ruby-build-system)
     (native-inputs
      `(("bundler" ,bundler)
@@ -4306,6 +5126,54 @@ across multiple CPU cores.")
     (home-page "https://github.com/whitequark/parser")
     (license license:expat)))
 
+(define-public ruby-sexp-processor
+  (package
+    (name "ruby-sexp-processor")
+    (version "4.15.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "sexp_processor" version))
+       (sha256
+        (base32
+         "0d1vks77xnd0m3s94a58f9bkdwlaml5qdkmprx279m2s0pc2gv55"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     ;; TODO: Add ruby-minitest-proveit once available.
+     `(("hoe" ,ruby-hoe)))
+    (synopsis "ParseTree fork which includes generic S-exp processing tools")
+    (description "The sexp_processor package is derived from ParseTree, but
+contrary to ParseTree, it includes all the generic S-exp processing tools.
+Amongst the included tools are @code{Sexp}, @code{SexpProcessor} and
+@code{Environment}")
+    (home-page "https://github.com/seattlerb/sexp_processor")
+    (license license:expat)))
+
+(define-public ruby-ruby-parser
+  (package
+    (name "ruby-ruby-parser")
+    (version "3.14.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "ruby_parser" version))
+       (sha256
+        (base32
+         "09qcdyjjw3p7g6cjm5m9swkms1xnv35ndiy7yw24cas16qrhha6c"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("hoe" ,ruby-hoe)
+       ("racc" ,ruby-racc)
+       ("unifdef" ,unifdef)))
+    (propagated-inputs
+     `(("ruby-sexp-processor" ,ruby-sexp-processor)))
+    (home-page "https://github.com/seattlerb/ruby_parser/")
+    (synopsis "Ruby parser written in pure Ruby")
+    (description "The ruby_parser (RP) package provides a Ruby parser written
+in pure Ruby.  It outputs S-expressions which can be manipulated and converted
+back to Ruby via the @code{ruby2ruby} library.")
+    (license license:expat)))
+
 (define-public ruby-prawn-manual-builder
   (package
     (name "ruby-prawn-manual-builder")
@@ -4333,10 +5201,7 @@ across multiple CPU cores.")
      "This package provides a tool for writing manuals for Prawn and Prawn
 accessories")
     (home-page "https://github.com/prawnpdf/prawn-manual_builder")
-    (license (list
-              ;; GPLv2 or GPLv3 or custom license described in LICENSE file
-              license:gpl2
-              license:gpl3))))
+    (license %prawn-project-licenses)))
 
 (define-public ruby-progress_bar
   (package
@@ -4414,14 +5279,14 @@ The output can be customized with a formatting system.")
 (define-public ruby-pry
   (package
     (name "ruby-pry")
-    (version "0.11.3")
+    (version "0.13.1")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "pry" version))
        (sha256
         (base32
-         "1mh312k3y94sj0pi160wpia0ps8f4kmzvm505i6bvwynfdh7v30g"))))
+         "0iyw4q4an2wmk8v5rn2ghfy2jaz9vmw2nk8415nnpx2s866934qk"))))
     (build-system ruby-build-system)
     (arguments
      '(#:tests? #f)) ; no tests
@@ -4432,7 +5297,7 @@ The output can be customized with a formatting system.")
     (description "Pry is an IRB alternative and runtime developer console for
 Ruby.  It features syntax highlighting, a plugin architecture, runtime
 invocation, and source and documentation browsing.")
-    (home-page "https://pryrepl.org")
+    (home-page "https://cobaltbluemedia.com/pryrepl/")
     (license license:expat)))
 
 (define-public ruby-single-cov
@@ -4543,7 +5408,7 @@ file or directories are modified.")
   (package
     (name "ruby-spinach")
     (version "0.11.0")
-    (home-page "http://github.com/codegram/spinach")
+    (home-page "https://github.com/codegram/spinach")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "spinach" version))
@@ -4570,14 +5435,17 @@ define executable specifications of your code.")
 (define-public ruby-tilt
   (package
     (name "ruby-tilt")
-    (version "2.0.9")
+    (version "2.0.10")
     (source
      (origin
-       (method url-fetch)
-       (uri (rubygems-uri "tilt" version))
+       (method git-fetch)               ;the distributed gem lacks tests
+       (uri (git-reference
+             (url "https://github.com/rtomayko/tilt")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0ca4k0clwf0rkvy7726x4nxpjxkpv67w043i39saxgldxd97zmwz"))))
+         "0adb7fg7925n2rd9a8kkqz3mgylw2skp9hkh9qc1rnph72mqsm6r"))))
     (build-system ruby-build-system)
     (arguments
      '(#:phases
@@ -4599,13 +5467,15 @@ define executable specifications of your code.")
                ;; the Gemfile instead.
                (("group :secondary") "[].each"))
              #t)))))
+    (propagated-inputs
+     `(("ruby-pandoc-ruby" ,ruby-pandoc-ruby)
+       ("ruby-sassc" ,ruby-sassc)))
     (native-inputs
      `(("bundler" ,bundler)
        ("ruby-yard" ,ruby-yard)
        ("ruby-builder" ,ruby-builder)
        ("ruby-erubis" ,ruby-erubis)
-       ("ruby-markaby" ,ruby-markaby)
-       ("ruby-sassc" ,ruby-sassc)))
+       ("ruby-markaby" ,ruby-markaby)))
     (synopsis "Generic interface to multiple Ruby template engines")
     (description
      "Tilt is a thin interface over a number of different Ruby template
@@ -4751,13 +5621,13 @@ current line in an external editor.")
 (define-public ruby-sdoc
   (package
     (name "ruby-sdoc")
-    (version "0.4.2")
+    (version "1.1.0")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "sdoc" version))
               (sha256
                (base32
-                "0qhvy10vnmrqcgh8494m13kd5ag9c3sczzhfasv8j0294ylk679n"))))
+                "1am73dldx1fqlw2xny5vyk00pgkisg6bvs0pa8jjd7c19drjczrd"))))
     (build-system ruby-build-system)
     (arguments
      `(#:phases
@@ -5158,7 +6028,7 @@ a native C extension.")
        ;; repository.
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/guard/listen.git")
+             (url "https://github.com/guard/listen")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
@@ -5298,7 +6168,7 @@ multibyte strings, internationalization, time zones, and testing.")
               ;; published gem and the tarball on Github is outdated.
               (method git-fetch)
               (uri (git-reference
-                    (url "https://github.com/rubys/nokogumbo.git")
+                    (url "https://github.com/rubys/nokogumbo")
                     (commit (string-append "v" version))))
               (file-name (string-append name "-" version "-checkout"))
               (sha256
@@ -5490,6 +6360,60 @@ other things and it comes with a command line interface.")
     (home-page "https://github.com/deivid-rodriguez/byebug")
     (license license:bsd-2)))
 
+;;; TODO: Make it the default byebug in core-updates.
+(define-public ruby-byebug-11
+  (package
+    (inherit ruby-byebug)
+    (name "ruby-byebug")
+    (version "11.1.3")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/deivid-rodriguez/byebug")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0vyy3k2s7dcndngj6m8kxhs1vxc2c93dw8b3yyand3srsg9ffpij"))
+       (modules '((guix build utils)))
+       (snippet
+        '(begin
+           ;; Remove wrappers that try to setup a bundle environment.
+           (with-directory-excursion "bin"
+             (for-each delete-file '("bundle" "rake" "rubocop"))
+             ;; ruby-minitest doesn't come with a launcher, so fix the one
+             ;; provided.
+             (substitute* "minitest"
+               (("load File\\.expand_path\\(\"bundle\".*") "")
+               (("require \"bundler/setup\".*") "")))
+           #t))))
+    (arguments
+     `(#:tests? #t
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'skip-tmp-path-sensitive-test
+           (lambda _
+             (substitute* "test/commands/where_test.rb"
+               (("unless /cygwin\\|mswin\\|mingw\\|darwin/.*")
+                "unless true\n"))
+             #t))
+         (add-before 'build 'compile
+           (lambda _
+             (invoke "rake" "compile")))
+         (add-before 'check 'set-home
+           (lambda _
+             (setenv "HOME" (getcwd))
+             #t)))))
+    (native-inputs
+     `(("bundler" ,bundler)
+       ("ruby-chandler" ,ruby-chandler)
+       ("ruby-minitest" ,ruby-minitest)
+       ("ruby-pry" ,ruby-pry)
+       ("ruby-rake-compiler" ,ruby-rake-compiler)
+       ("ruby-rubocop" ,ruby-rubocop)
+       ("ruby-yard" ,ruby-yard)))))
+
 (define-public ruby-netrc
   (package
     (name "ruby-netrc")
@@ -5562,7 +6486,7 @@ including comments and whitespace.")
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
-                      (url "https://github.com/postmodern/tdiff.git")
+                      (url "https://github.com/postmodern/tdiff")
                       (commit commit)))
                 (file-name (string-append name "-" version "-checkout"))
                 (sha256
@@ -5589,7 +6513,7 @@ tree-like structures.  It is similar to Ruby's built-in @code{TSort} module.")
       (source (origin
                 (method git-fetch)
                 (uri (git-reference
-                      (url "https://github.com/postmodern/nokogiri-diff.git")
+                      (url "https://github.com/postmodern/nokogiri-diff")
                       (commit commit)))
                 (file-name (string-append name "-" version "-checkout"))
                 (sha256
@@ -5863,28 +6787,308 @@ inspired by the Sinatra microframework style of specifying actions:
     (home-page "https://github.com/rest-client/rest-client")
     (license license:expat)))
 
+(define-public ruby-rubocop-ast
+  (package
+    (name "ruby-rubocop-ast")
+    (version "0.1.0")
+    (source
+     (origin
+       (method git-fetch)               ;no test suite in distributed gem
+       (uri (git-reference
+             (url "https://github.com/rubocop-hq/rubocop-ast.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0nz25z5b76xkgb9sh370hni3l946j07fr05cdwkdj9x7ibgsb6nj"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:test-target "spec"
+       #:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'disable-bundler
+                    (lambda _
+                      (substitute* "Rakefile"
+                        (("Bundler\\.setup.*") "nil\n"))
+                      #t))
+                  (replace 'replace-git-ls-files
+                    (lambda _
+                      (substitute* "rubocop-ast.gemspec"
+                        (("`git ls-files(.*)`" _ files)
+                         (format #f "`find ~a -type f| sort`" files)))
+                      #t)))))
+    (native-inputs
+     `(("ruby-bump" ,ruby-bump)
+       ("ruby-rspec" ,ruby-rspec)))
+    (propagated-inputs
+     `(("ruby-parser" ,ruby-parser)))
+    (synopsis "RuboCop's AST extensions and NodePattern functionality")
+    (description "Rubocop::AST extends @code{ruby-parser} with classes used
+by RuboCop to deal with Ruby's Abstract Syntax Tree (AST), in particular:
+@itemize
+@item @code{RuboCop::AST::Node}
+@item @code{RuboCop::AST::NodePattern}
+@end itemize")
+    (home-page "https://rubocop.org/")
+    (license license:expat)))
+
+(define-public ruby-rexml
+  (package
+    (name "ruby-rexml")
+    (version "3.2.4")
+    (source
+     (origin
+       (method git-fetch)               ;no tests in distributed gem
+       (uri (git-reference
+             (url "https://github.com/ruby/rexml.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0rhjjbkaq2f2cs8hyr2i4yjqpcyl8m0wmr2cypa401m3fvz4221i"))))
+    (build-system ruby-build-system)
+    (synopsis "XML toolkit for Ruby")
+    (description "Inspired by Electric XML library for Java, REXML aims to be
+easy-to-use API, small and fast.  It supports both tree and stream document
+parsing.")
+    (home-page "https://github.com/ruby/rexml")
+    (license license:bsd-2)))
+
+(define-public ruby-character-set
+  (package
+    (name "ruby-character-set")
+    (version "1.4.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (rubygems-uri "character_set" version))
+        (sha256
+          (base32
+            "0affq9n77vwy897ri2zhmfinfagf37hcwwimrccy1bcxan9mj3h3"))))
+    (build-system ruby-build-system)
+    (arguments '(#:tests? #f))          ;avoid a cycle with ruby-regexp-parser
+    (synopsis "Ruby library to manipulate Unicode")
+    (description "CharacterSet is a C-extended Ruby library to work with sets
+of Unicode code points.  It can read and write these sets in various formats
+and implements the @code{stdlib} @code{Set} interface for them.  It also
+offers an alternate paradigm of @code{String} processing which grants much
+better performance than @code{Regexp} and @code{String} methods from the
+@code{stdlib} where applicable.  Many parts can be used independently, e.g.:
+@itemize
+@item @code{CharacterSet::Character}
+@item @code{CharacterSet::Parser}
+@item @code{CharacterSet::Writer}
+@item @code{RangeCompressor}
+@end itemize")
+    (home-page "https://github.com/jaynetics/character_set")
+    (license license:expat)))
+
+(define-public ruby-range-compressor
+  (package
+    (name "ruby-range-compressor")
+    (version "1.0.0")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+              (url "https://github.com/janosch-x/range_compressor.git")
+              (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32
+          "0y8slri2msyyg2szgwgriqd6qw9hkxycssdrcl5lk2dbcq5zvn54"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:test-target "spec"
+       #:phases (modify-phases %standard-phases
+                  (add-after 'extract-gemspec 'strip-version-requirements
+                    (lambda _
+                      (substitute* "range_compressor.gemspec"
+                        (("(.*add_.*dependency '[_A-Za-z0-9-]+').*" _ stripped)
+                         (string-append stripped "\n")))
+                      #t)))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)))
+    (synopsis "Simple arrays of objects to arrays of ranges compressor")
+    (description "RangeCompresses is a tiny library that allows compressing
+arrays of objects into arrays of ranges.  For example, it can turn the
+following: @code{[1, 2, 3, 4, 6, 8, 9, 10]} into @code{[1..4, 6..6, 8..10]}.")
+    (home-page "https://github.com/janosch-x/range_compressor")
+    (license license:expat)))
+
+(define-public ruby-regexp-property-values
+  (package
+    (name "ruby-regexp-property-values")
+    (version "1.0.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference              ;no test suite in distributed gem
+             (url "https://github.com/jaynetics/regexp_property_values.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0l3fjmscg1wxn7kc6bl022cc6k5d91pwb7daq1b5w36kvsx52w1j"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:test-target "default"))
+    (native-inputs
+     `(("ruby-character-set" ,ruby-character-set)
+       ("ruby-rake-compiler" ,ruby-rake-compiler)
+       ("ruby-range-compressor" ,ruby-range-compressor)
+       ("ruby-rspec" ,ruby-rspec)))
+    (synopsis "Inspect Ruby's regex engine property values")
+    (description "This small library lets you see which property values are
+supported by the regular expression engine of the Ruby version you are running
+and can directly read out their code point ranges.  In other words, it
+determines all supported values for @code{\\p{value}} expressions and what
+they match.")
+    (home-page "https://github.com/jaynetics/regexp_property_values")
+    (license license:expat)))
+
+(define-public ruby-regexp-parser
+  (package
+    (name "ruby-regexp-parser")
+    (version "1.7.1")
+    (source
+     (origin
+       (method git-fetch)               ;bin/test missing from gem
+       (uri (git-reference
+             (url "https://github.com/ammar/regexp_parser.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0dk9d4vpw31cc06s29fqyr1kq0kipym1mydifkcrnppvpl3pd53r"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:test-target "default"
+       #:phases (modify-phases %standard-phases
+                  (add-before 'build 'compile-scanner.rb
+                    (lambda _
+                      (invoke "rake" "build")
+                      ;; XXX: This is needed otherwise the install
+                      ;; phase fails to delete the installed cached
+                      ;; gem file.
+                      (delete-file-recursively "pkg")
+                      #t)))))
+    (native-inputs
+     `(("ragel" ,ragel)
+       ("ruby-regexp-property-values" ,ruby-regexp-property-values)
+       ("ruby-rspec" ,ruby-rspec)))
+    (synopsis "A regular expression parser library for Ruby ")
+    (description "A Ruby gem for tokenizing, parsing, and transforming regular
+expressions.  It comprises the following components:
+@itemize
+@item A scanner/tokenizer based on Ragel,
+@item A lexer that produces a stream of token objects,
+@item A parser that produces a tree of Expression objects.
+@end itemize")
+    (home-page "https://github.com/ammar/regexp_parser")
+    (license license:expat)))
+
+(define-public ruby-test-queue
+  (package
+    (name "ruby-test-queue")
+    (version "0.4.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "test-queue" version))
+       (sha256
+        (base32
+         "0hvm3n1qrqxqilhqk4rjivw3gcrd08zz1i6am9qzg1ppjxv6f36f"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:phases
+       (modify-phases %standard-phases
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (invoke "rspec"))
+             #t)))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)))
+    (synopsis "Minitest/RSpec parallel test runner for CI environments")
+    (description "The test-queue module is a parallel test runner,
+built using a centralized queue to ensure optimal distribution of
+tests between workers.  It is specifically optimized for Continuous
+Integration (CI) environments: build statistics from each run are
+stored locally and used to sort the queue at the beginning of the next
+run.")
+    (home-page "https://github.com/tmm1/test-queue")
+    (license license:expat)))
+
 (define-public ruby-rubocop
   (package
     (name "ruby-rubocop")
-    (version "0.77.0")
+    (version "0.88.0")
     (source
      (origin
-       (method url-fetch)
-       (uri (rubygems-uri "rubocop" version))
+       (method git-fetch)               ;no tests in distributed gem
+       (uri (git-reference
+             (url "https://github.com/rubocop-hq/rubocop.git")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0m88b1bgbhmmbdnz2xv6n0il0j4q5qm9jbc0vf1zsaxmxqp06nx9"))))
+         "1d06893jp8pd85fvgp5d16vqcf31bafi430v4f4y746ihyvhzz5r"))
+       (patches (search-patches "ruby-rubocop-break-dependency-cycle.patch"))))
     (build-system ruby-build-system)
     (arguments
-     '(;; No included tests
-       #:tests? #f))
+     '(#:test-target "default"
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'remove-problematic-tests
+           ;; These tests depend on Rubocop extensions, which cannot be
+           ;; included as they cause a dependency cycle with Rubocop itself.
+           (lambda _
+             (delete-file "spec/rubocop/config_loader_spec.rb")
+             (substitute* "Gemfile"
+               ((".*'rubocop-performance'.*") "")
+               ((".*'rubocop-rspec'.*") ""))
+             ;; Prevent "Unnecessary disabling of RSpec/* (unknown cop)"
+             ;; errors.
+             (substitute* (find-files "spec/rubocop/cop/" "_spec\\.rb$")
+               (("# (rubocop:(enable|disable) RSpec.*)" _ what)
+                (string-append "# Disabled: " what)))
+             #t))
+         (add-after 'unpack 'disable-bundler
+           (lambda _
+             (substitute* "Rakefile"
+               (("Bundler\\.setup.*") "nil\n"))
+             #t))
+         (replace 'replace-git-ls-files
+           (lambda _
+             (substitute* "rubocop.gemspec"
+               (("`git ls-files(.*)`" _ files)
+                (format #f "`find ~a -type f| sort`" files)))
+             #t))
+         (add-before 'check 'set-home
+           (lambda _
+             (setenv "HOME" (getcwd))
+             #t))
+         (add-before 'check 'make-adoc-files-writable
+           (lambda _
+             (let ((adoc-files (find-files "docs/modules/ROOT/pages"
+                                           "\\.adoc$")))
+               (for-each make-file-writable adoc-files))
+             #t)))))
+    (native-inputs
+     `(("ruby-bump" ,ruby-bump)
+       ("ruby-pry" ,ruby-pry)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby-test-queue" ,ruby-test-queue)
+       ("ruby-webmock" ,ruby-webmock-2)
+       ("ruby-yard" ,ruby-yard)))
     (propagated-inputs
-     `(("ruby-parser" ,ruby-parser)
-       ("ruby-powerpack" ,ruby-powerpack)
+     `(("ruby-parallel" ,ruby-parallel)
+       ("ruby-parser" ,ruby-parser)
        ("ruby-rainbow" ,ruby-rainbow)
+       ("ruby-regexp-parser" ,ruby-regexp-parser)
+       ("ruby-rexml" ,ruby-rexml)
+       ("ruby-rubocop-ast" ,ruby-rubocop-ast)
        ("ruby-progressbar" ,ruby-progressbar)
-       ("ruby-parallel" ,ruby-parallel)
-       ("ruby-jaro-winkler" ,ruby-jaro-winkler)
        ("ruby-unicode-display-width" ,ruby-unicode-display-width)))
     (synopsis "Ruby code style checking tool")
     (description
@@ -5954,34 +7158,409 @@ Ruby classes.")
     (home-page "https://ms-ati.github.io/docile/")
     (license license:expat)))
 
+(define-public ruby-middleware
+  (package
+    (name "ruby-middleware")
+    (version "0.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "middleware" version))
+       (sha256
+        (base32
+         "0703nkf2v371wqr41c04x5qid7ww45cxqv3hnlg07if3b3xrm9xl"))))
+    (build-system ruby-build-system)
+    (arguments '(#:tests? #f))          ;no test suite
+    (synopsis "Implementation of a middleware abstraction for Ruby")
+    (description "Middleware is a generalized implementation of a middleware
+abstraction for Ruby.")
+    (home-page "https://github.com/mitchellh/middleware")
+    (license license:expat)))
+
+(define-public ruby-benchmark-ips
+  (package
+    (name "ruby-benchmark-ips")
+    (version "2.8.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "benchmark-ips" version))
+       (sha256
+        (base32
+         "1n9397j7kh4vvikfann1467qgksc679imlr50hax3lk1q3af8kdw"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("ruby-hoe" ,ruby-hoe)))
+    (synopsis "Iterations per second enhancement for the Ruby Benchmark module")
+    (description "Benchmark-ips enhances the Ruby Benchmark module with the
+iterations per second count.  For short snippets of code, it can automatically
+figure out how many times to run the code to get interesting data.")
+    (home-page "https://github.com/evanphx/benchmark-ips")
+    (license license:expat)))
+
+(define-public ruby-ffi-rzmq-core
+  (package
+    (name "ruby-ffi-rzmq-core")
+    (version "1.0.7")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "ffi-rzmq-core" version))
+       (sha256
+        (base32
+         "0amkbvljpjfnv0jpdmz71p1i3mqbhyrnhamjn566w0c01xd64hb5"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+                  (add-after 'unpack 'patch-libzmq-search-path
+                    (lambda* (#:key inputs #:allow-other-keys)
+                      (let ((zeromq (assoc-ref inputs "zeromq")))
+                        (substitute* "lib/ffi-rzmq-core/libzmq.rb"
+                          (("/usr/local/lib")
+                           (string-append zeromq "/lib")))
+                        #t)))
+                  (replace 'check
+                    (lambda _
+                      (invoke "rspec"))))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)))
+    (inputs
+     `(("zeromq" ,zeromq)))
+    (propagated-inputs `(("ruby-ffi" ,ruby-ffi)))
+    (synopsis "Low-level Ruby FFI wrapper for the ZeroMQ networking library")
+    (description "This library only provides the FFI wrapper for the ZeroMQ
+networking library.  It can be used to implement a Ruby API for the ZeroMQ
+library.")
+    (home-page "https://github.com/chuckremes/ffi-rzmq-core")
+    (license license:expat)))
+
+(define-public ruby-ffi-rzmq
+  (package
+    (name "ruby-ffi-rzmq")
+    (version "2.0.7")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "ffi-rzmq" version))
+       (sha256
+        (base32
+         "14a5kxfnf8l3ngyk8hgmk30z07aj1324ll8i48z67ps6pz2kpsrg"))))
+    (build-system ruby-build-system)
+    (arguments '(#:tests? #t
+                 #:phases (modify-phases %standard-phases
+                            (replace 'check
+                              (lambda _
+                                (invoke "rspec"))))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)))
+    (propagated-inputs
+     `(("ruby-ffi-rzmq-core" ,ruby-ffi-rzmq-core)))
+    (synopsis "High-level Ruby wrapper for the ZeroMQ networking library")
+    (description "This library provides a high-level API that wraps the ZeroMQ
+networking library using the Ruby foreign function interface (FFI).  It is a
+pure Ruby wrapper, hence is compatible with any Ruby runtime that has support
+for FFI.")
+    (home-page "https://github.com/chuckremes/ffi-rzmq")
+    (license license:expat)))
+
+(define-public ruby-sawyer
+  (package
+    (name "ruby-sawyer")
+    (version "0.8.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "sawyer" version))
+       (sha256
+        (base32
+         "0yrdchs3psh583rjapkv33mljdivggqn99wkydkjdckcjn43j3cz"))))
+    (build-system ruby-build-system)
+    (propagated-inputs
+     `(("ruby-addressable" ,ruby-addressable)
+       ("ruby-faraday" ,ruby-faraday)))
+    (synopsis "Experimental hypermedia agent for Ruby")
+    (description "Sawyer is an experimental hypermedia agent for Ruby built on
+top of Faraday.")
+    (home-page "https://github.com/lostisland/sawyer")
+    (license license:expat)))
+
+(define-public ruby-octokit
+  (package
+    (name "ruby-octokit")
+    (version "4.18.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "octokit" version))
+       (sha256
+        (base32
+         "0zvfr9njmj5svi39fcsi2b0g7pcxb0vamw9dlyas8bg814jlzhi6"))))
+    (build-system ruby-build-system)
+    (arguments '(#:tests? #f))          ;no test suite in the gem release
+    (propagated-inputs
+     `(("ruby-faraday" ,ruby-faraday)
+       ("ruby-sawyer" ,ruby-sawyer)))
+    (synopsis "Ruby toolkit for the GitHub API")
+    (description "Octokit wraps the GitHub API in a flat API client that
+follows Ruby conventions and requires little knowledge of REST.")
+    (home-page "https://github.com/octokit/octokit.rb")
+    (license license:expat)))
+
+(define-public ruby-chandler
+  (package
+    (name "ruby-chandler")
+    (version "0.9.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "chandler" version))
+       (sha256
+        (base32
+         "1n8a4mr2jkcz5vaaps45g2rxa2pzy1wb7cylgw85xmmyyp14lnrr"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("ruby-rubocop" ,ruby-rubocop)))
+    (propagated-inputs
+     `(("ruby-netrc" ,ruby-netrc)
+       ("ruby-octokit" ,ruby-octokit)))
+    (synopsis "Sync CHANGELOG entries to GitHub's release notes")
+    (description "Chandler syncs a project's CHANGELOG file entries to
+GitHub's release notes to remove the need of manually entering release
+notes.")
+    (home-page "https://github.com/mattbrictson/chandler")
+    (license license:expat)))
+
+(define-public ruby-pry-byebug
+  (package
+    (name "ruby-pry-byebug")
+    (version "3.9.0")
+    (source
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/deivid-rodriguez/pry-byebug")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "1kchrwccai92068p50zyd6mh524ywqnm0jw5g3lks7iwmf0xkmgc"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-before 'check 'set-home
+                    (lambda _
+                      (setenv "HOME" (getcwd))
+                      #t)))))
+    (native-inputs
+     `(("ruby-chandler" ,ruby-chandler)
+       ("ruby-rubocop" ,ruby-rubocop)
+       ("ruby-simplecov" ,ruby-simplecov)))
+    (propagated-inputs
+     `(("ruby-byebug" ,ruby-byebug-11)
+       ("ruby-pry" ,ruby-pry)))
+    (synopsis "Step-by-step debugging and stack navigation in Pry")
+    (description "This package adds step-by-step debugging and stack
+navigation capabilities to @code{pry}, using @code{byebug}.")
+    (home-page "https://github.com/deivid-rodriguez/pry-byebug")
+    (license license:expat)))
+
+(define-public ruby-binding-of-caller
+  (package
+    (name "ruby-binding-of-caller")
+    (version "0.8.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "binding_of_caller" version))
+       (sha256
+        (base32
+         "05syqlks7463zsy1jdfbbdravdhj9hpj5pv2m74blqpv8bq4vv5g"))))
+    (build-system ruby-build-system)
+    ;; Attempting to run the test suite fails with a rake deprecation error
+    ;; (see: https://github.com/banister/binding_of_caller/issues/76).
+    (arguments '(#:tests? #f))
+    (propagated-inputs
+     `(("ruby-debug-inspector" ,ruby-debug-inspector)))
+    (synopsis "Retrieve the binding of a method's caller")
+    (description "The @code{binding_of_caller} module provides the
+@code{Binding#of_caller} method.  It allows accessing bindings from upper
+frames in the call stack and can evaluate code in that context.")
+    (home-page "https://github.com/banister/binding_of_caller")
+    (license license:expat)))
+
+(define-public ruby-pry-stack-explorer
+  (package
+    (name "ruby-pry-stack-explorer")
+    (version "0.5.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "pry-stack_explorer" version))
+       (sha256
+        (base32
+         "157rd2n9pfvcmmicm0xkq8z4p6famaj13syrpra6b4032qpb1wn0"))))
+    (build-system ruby-build-system)
+    (arguments '(#:tests? #f))          ;no test suite in gem release
+    (propagated-inputs
+     `(("ruby-binding-of-caller" ,ruby-binding-of-caller)
+       ("ruby-pry" ,ruby-pry)))
+    (synopsis "Call-stack navigation plugin for the Pry REPL")
+    (description "@code{pry-stack_explorer} is a plugin for the Pry REPL that
+add support to navigate the call-stack.")
+    (home-page "https://github.com/pry/pry-stack_explorer")
+    (license license:expat)))
+
+(define-public ruby-varint
+  (package
+    (name "ruby-varint")
+    (version "0.1.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "varint" version))
+       (sha256
+        (base32
+         "1y0l2qc64cwsyv76ygg9bbjnk86riz2kq73kmn87gdrlmpiyrdac"))))
+    (build-system ruby-build-system)
+    (arguments '(#:tests? #f))          ;no test suite
+    (synopsis "Variable length integers (varint) C extension for Ruby")
+    (description "This package provides a small C extension to speed up
+variable length integers (varint) in Ruby Protocol Buffers.")
+    (home-page "https://github.com/liquidm/varint")
+    (license license:bsd-3)))
+
+(define-public ruby-ruby-prof
+  (package
+    (name "ruby-ruby-prof")
+    (version "1.4.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "ruby-prof" version))
+       (sha256
+        (base32
+         "12cd91m08ih0imfpy4k87618hd4mhyz291a6bx2hcskza4nf6d27"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-rakefile
+           ;; This fixes the following error: "NameError: uninitialized
+           ;; constant Bundler::GemHelper" (see:
+           ;; https://github.com/ruby-prof/ruby-prof/issues/274).
+           (lambda _
+             (substitute* "Rakefile"
+               ((".*require \"bundler/setup\".*" all)
+                (string-append all "  require 'bundler/gem_tasks'\n")))
+             #t))
+         ;; The LineNumbersTest test fails non-deterministically (see:
+         ;; https://github.com/ruby-prof/ruby-prof/issues/276).
+         (add-after 'extract-gemspec 'delete-flaky-test
+           (lambda _
+             (delete-file "test/line_number_test.rb")
+             (substitute* "ruby-prof.gemspec"
+               (("\"test/line_number_test\\.rb\"\\.freeze, ") ""))
+             #t))
+         (add-before 'check 'compile
+          (lambda _
+            (invoke "rake" "compile"))))))
+    (native-inputs
+     `(("bundler" ,bundler)
+       ("ruby-minitest" ,ruby-minitest)
+       ("ruby-rake-compiler" ,ruby-rake-compiler)
+       ("ruby-rdoc" ,ruby-rdoc)))
+    (synopsis "Fast code profiler for Ruby")
+    (description "RubyProf is a fast code profiler for Ruby.  Its features
+include:
+@table @asis
+@item Speed
+Being a C extension, it is many times faster than the standard Ruby profiler.
+@item Measurement Modes
+It can measure program wall time, process time, object allocations and memory
+usage.
+@item Reports
+A variety of text and cross-referenced HTML reports can be generated.
+@item Threads
+Profiling multiple threads simultaneously is supported.
+@end table")
+    (home-page "https://github.com/ruby-prof/ruby-prof")
+    (license license:bsd-2)))
+
+(define-public ruby-cucumber-messages
+  (package
+    (name "ruby-cucumber-messages")
+    (version "12.2.0")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/cucumber/messages-ruby")
+                    (commit "12cd07eac87bce7843fd1bb0bf64bc4da09f097c")))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "16wwqfpsq7crvxc3q08lphgyh12cl2d83p1c79p312q4jmy9cn5a"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'patch-protobuf.rb
+                    (lambda _
+                      (substitute* "rake/protobuf.rb"
+                        (("load 'protobuf/tasks/compile.rake'")
+                         "require 'protobuf/tasks'"))
+                      #t))
+                  (add-before 'build 'compile
+                    (lambda _
+                      (substitute* "Makefile"
+                        (("bundle exec ") "")
+                        (("include default.mk.*" all)
+                         (string-append "#" all)))
+                      (invoke "make")))
+                  (replace 'check
+                    (lambda _
+                      (invoke "rspec"))))))
+    (propagated-inputs
+     `(("ruby-protobuf" ,ruby-protobuf-cucumber)))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)))
+    (home-page "https://github.com/cucumber/messages-ruby")
+    (synopsis "Cucumber Messages for Ruby (Protocol Buffers)")
+    (description "Cucumber Messages for Ruby is a library which allows
+serialization and deserialization of the protocol buffer messages used in
+Cucumber.")
+    (license license:expat)))
+
 (define-public ruby-gherkin
   (package
     (name "ruby-gherkin")
-    (version "5.1.0")
-    (source
-      (origin
-        (method url-fetch)
-        (uri (rubygems-uri "gherkin" version))
-        (sha256
-          (base32
-            "1cgcdchwwdm10rsk44frjwqd4ihprhxjbm799nscqy2q1raqfj5s"))))
+    (version "14.0.1")
+    (source (origin
+              (method git-fetch)
+              (uri (git-reference
+                    (url "https://github.com/cucumber/gherkin-ruby")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
+              (sha256
+               (base32
+                "1dwa8632nc6kijv8p257jl64rsjmc0fimlaqvxlkdi2h9n1nympb"))))
     (build-system ruby-build-system)
     (native-inputs
-     `(("bundler" ,bundler)))
+     `(("ruby-cucumber-messages" ,ruby-cucumber-messages)
+       ("ruby-rspec" ,ruby-rspec)))
     (arguments
-     '(#:tests? #f)) ; needs simplecov, among others
+     `(#:test-target "spec"))
     (synopsis "Gherkin parser for Ruby")
     (description "Gherkin is a parser and compiler for the Gherkin language.
 It is intended be used by all Cucumber implementations to parse
 @file{.feature} files.")
-    (home-page "https://github.com/cucumber-attic/gherkin")
+    (home-page "https://github.com/cucumber/gherkin-ruby")
     (license license:expat)))
 
 (define-public ruby-gherkin-ruby
   (package
     (name "ruby-gherkin-ruby")
     (version "0.3.2")
-    (home-page "http://github.com/codegram/gherkin-ruby")
+    (home-page "https://github.com/codegram/gherkin-ruby")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "gherkin-ruby" version))
@@ -6078,54 +7657,152 @@ language.")
                        (package-propagated-inputs ruby-aruba))))
     (native-inputs '())))
 
+(define-public ruby-sys-uname
+  (package
+  (name "ruby-sys-uname")
+  (version "1.2.1")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (rubygems-uri "sys-uname" version))
+      (sha256
+        (base32
+          "00p3wwvkdbg6pl38bchaagncv3i4fq4y0ks470imwykjanpy2ic0"))))
+  (build-system ruby-build-system)
+  (arguments
+   `(#:test-target "spec"))
+  (propagated-inputs `(("ruby-ffi" ,ruby-ffi)))
+  (native-inputs `(("ruby-rspec" ,ruby-rspec)))
+  (synopsis "Ruby interface for gathering system information")
+  (description "The sys-uname library provides an interface for gathering
+information about your current platform.  It allows retrieving information
+such as the OS name, OS version, system name, etc.")
+  (home-page "https://github.com/djberg96/sys-uname")
+  (license license:asl2.0)))
+
+(define-public ruby-cucumber-create-meta
+  (package
+    (name "ruby-cucumber-create-meta")
+    (version "1.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "cucumber-create-meta" version))
+       (sha256
+        (base32
+         "0i0i3arymjrnjk72mg79w1a11607x4d0lrqafm9sz2gq9l52zasw"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (add-after 'extract-gemspec 'relax-version-requirements
+                    (lambda _
+                      (substitute* ".gemspec"
+                        ((" 12\\.2")
+                         " 12.1"))
+                      #t))
+                  (replace 'check
+                    (lambda _
+                      (invoke "rspec"))))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)))
+    (propagated-inputs
+     `(("ruby-cucumber-messages" ,ruby-cucumber-messages)
+       ("ruby-sys-uname" ,ruby-sys-uname)))
+    (synopsis "Function to create @code{Meta} messages for Cucumber Ruby")
+    (description "The @code{createMeta} utility function allows generating
+system-specific @code{Meta} messages for Cucumber Ruby.")
+    (home-page "https://github.com/cucumber/cucumber/tree/master/create-meta/ruby")
+    (license license:expat)))
+
+(define-public ruby-cucumber-html-formatter
+  (package
+    (name "ruby-cucumber-html-formatter")
+    (version "7.0.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "cucumber-html-formatter" version))
+       (sha256
+        (base32
+         "0lshj4sw9jw7687wrhknyb9kffblai3l843zgrznyqij3ga0bc62"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (replace 'check
+                    (lambda _
+                      (invoke "rspec"))))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)))
+    (propagated-inputs
+     `(("ruby-cucumber-messages" ,ruby-cucumber-messages)))
+    (synopsis "HTML formatter for Cucumber")
+    (description "Cucumber HTML Formatter produces a HTML report for Cucumber
+runs.  It is built on top of cucumber-react and works with any Cucumber
+implementation with a protocol buffer formatter that outputs Cucumber
+messages.")
+    (home-page "https://github.com/cucumber/cucumber/tree/\
+master/html-formatter/ruby")
+    (license license:expat)))
+
 (define-public ruby-cucumber
   (package
     (name "ruby-cucumber")
-    (version "3.1.2")
+    (version "4.1.0")
     (source
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/cucumber/cucumber-ruby.git")
+             (url "https://github.com/cucumber/cucumber-ruby")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0764wp2cjg60qa3l69q1dxda5g06a01n5w92szqbf89d2hgl47n3"))))
+         "0g9rqfslbzkkrq2kvl14fgknrhfbji3bjjpjxff5nc9wzd3hd549"))))
     (build-system ruby-build-system)
     (arguments
-     '(#:test-target "spec"
+     '(#:test-target "default"
        #:phases
        (modify-phases %standard-phases
-         ;; Don't run or require rubocop, the code linting tool, as this is a
-         ;; bit unnecessary.
-         (add-after 'unpack 'dont-run-rubocop
+         (add-after 'unpack 'disable-rubocop
+           ;; Rubocop lint check fails with our more recent version.
            (lambda _
              (substitute* "Rakefile"
-               ((".*rubocop/rake\\_task.*") "")
-               ((".*RuboCop.*") ""))
+               (("spec cucumber rubocop")
+                "spec cucumber"))
+             #t))
+         (add-after 'extract-gemspec 'strip-version-requirements
+           (lambda _
+             (delete-file "Gemfile")    ;do not use Bundler
+             (substitute* "cucumber.gemspec"
+               (("(.*add_.*dependency '[_A-Za-z0-9-]+').*" _ stripped)
+                (string-append stripped "\n")))
+             #t))
+         (add-before 'check 'set-home
+           (lambda _
+             (setenv "HOME" (getcwd))
              #t)))))
     (propagated-inputs
      `(("ruby-builder" ,ruby-builder)
        ("ruby-cucumber-core" ,ruby-cucumber-core)
+       ("ruby-cucumber-create-meta" ,ruby-cucumber-create-meta)
+       ("ruby-cucumber-html-formatter" ,ruby-cucumber-html-formatter)
+       ("ruby-cucumber-messages" ,ruby-cucumber-messages)
        ("ruby-cucumber-wire" ,ruby-cucumber-wire)
-       ("ruby-cucumber-expressions" ,ruby-cucumber-expressions)
        ("ruby-diff-lcs" ,ruby-diff-lcs)
        ("ruby-gherkin" ,ruby-gherkin)
        ("ruby-multi-json" ,ruby-multi-json)
        ("ruby-multi-test" ,ruby-multi-test)))
     (native-inputs
-     `(("bundler" ,bundler)
-       ;; Use a untested version of aruba, to avoid a circular dependency, as
+     `(;; Use a untested version of aruba, to avoid a circular dependency, as
        ;; ruby-aruba depends on ruby-cucumber.
        ("ruby-aruba", ruby-aruba-without-tests)
        ("ruby-rspec" ,ruby-rspec)
        ("ruby-pry" ,ruby-pry)
-       ("ruby-nokogiri" ,ruby-nokogiri)))
+       ("ruby-nokogiri" ,ruby-nokogiri)
+       ("ruby-rubocop" ,ruby-rubocop)))
     (synopsis "Describe automated tests in plain language")
-    (description
-     "Cucumber is a tool for running automated tests written in plain
-language.  It's designed to support a Behaviour Driven Development (BDD)
+    (description "Cucumber is a tool for running automated tests written in
+plain language.  It's designed to support a Behaviour Driven Development (BDD)
 software development workflow.")
     (home-page "https://cucumber.io/")
     (license license:expat)))
@@ -6137,27 +7814,98 @@ software development workflow.")
     (native-inputs
      '())))
 
+(define-public ruby-coveralls
+  (package
+    (name "ruby-coveralls")
+    (version "0.8.23")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "coveralls" version))
+       (sha256
+        (base32
+         "1mv4fn5lfxhy7bc2f1lpnc5yp9mvv97az77j4r7jgrxcqwn8fqxc"))))
+    (build-system ruby-build-system)
+    ;; The test suite depends on ruby-vcr, which cannot be included in Guix
+    ;; because of its nonfree, Hippocratic-derived license.
+    (arguments
+     `(#:tests? #f
+       #:phases (modify-phases %standard-phases
+                  (add-after 'extract-gemspec 'strip-version-requirements
+                    ;; Keeping strict version requirements can cause problems
+                    ;; to users of the library, such as: Gem::ConflictError:
+                    ;; Unable to activate coveralls-0.8.23, because
+                    ;; simplecov-0.17.1 conflicts with simplecov (~> 0.16.1).
+                    (lambda _
+                      (substitute* "coveralls-ruby.gemspec"
+                        (("(.*add_.*dependency\\([^,]+), .*" _ stripped)
+                         (string-append stripped ")\n")))
+                      #t)))))
+    (propagated-inputs
+     `(("ruby-json" ,ruby-json)
+       ("ruby-term-ansicolor" ,ruby-term-ansicolor)
+       ("ruby-thor" ,ruby-thor)
+       ("ruby-tins" ,ruby-tins)))
+    (synopsis "Ruby implementation of the Coveralls API")
+    (description "This package provides a Ruby implementation of the Coveralls
+API.")
+    (home-page "https://coveralls.io")
+    (license license:expat)))
+
+(define-public ruby-unindent
+  (package
+  (name "ruby-unindent")
+  (version "1.0")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (rubygems-uri "unindent" version))
+      (sha256
+        (base32
+          "1wqh3rzv8589yzibigminxx3qpmj2nqj28f90xy1sczk1pijmcrd"))))
+  (build-system ruby-build-system)
+  (synopsis "Ruby method to unindent strings")
+  (description "This module provides a @code{String#unindent} Ruby method to
+unindent strings, which can be useful to unindent multiline strings embedded
+in already-indented code.")
+  (home-page "https://github.com/mynyml/unindent")
+  (license license:expat)))
+
 (define-public ruby-cucumber-core
   (package
     (name "ruby-cucumber-core")
-    ;; Stick to major version 3, until version 4 of Cucumber is released.
-    (version "3.2.1")
+    (version "7.1.0")
     (source
      (origin
-       (method url-fetch)
-       (uri (rubygems-uri "cucumber-core" version))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/cucumber/cucumber-ruby-core")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "1iavlh8hqj9lwljbpkw06259gdicbr1bdb6pbj5yy3n8szgr8k3c"))))
+         "1p5wb6wbggbw37ariyag4kxpiczznvgm3c8cnz1744dmbj79q1rn"))))
     (build-system ruby-build-system)
+    (arguments
+     `(#:test-target "spec"
+       #:phases
+       (modify-phases %standard-phases
+         (add-after 'extract-gemspec 'relax-version-requirements
+           (lambda _
+             (substitute* "cucumber-core.gemspec"
+               (("'cucumber-tag-expressions',.*")
+                 "'cucumber-tag-expressions', '>=2.0.0'\n"))
+             #t)))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)
+       ("ruby-coveralls" ,ruby-coveralls)
+       ("ruby-rubocop" ,ruby-rubocop)
+       ("ruby-simplecov" ,ruby-simplecov)
+       ("ruby-unindent" ,ruby-unindent)))
     (propagated-inputs
-     `(("ruby-backports" ,ruby-backports)
+     `(("ruby-cucumber-messages" ,ruby-cucumber-messages)
        ("ruby-gherkin" ,ruby-gherkin)
        ("ruby-cucumber-tag-expressions" ,ruby-cucumber-tag-expressions)))
-    (native-inputs
-     `(("bundler" ,bundler)))
-    (arguments
-     '(#:tests? #f)) ; needs simplecov, among others
     (synopsis "Core library for the Cucumber BDD app")
     (description "Cucumber is a tool for running automated tests
 written in plain language.  Because they're written in plain language,
@@ -6170,20 +7918,22 @@ and trust on your team.")
 (define-public ruby-cucumber-expressions
   (package
     (name "ruby-cucumber-expressions")
-    (version "6.0.1")
+    (version "10.2.0")
     (source
      (origin
-       (method url-fetch)
-       (uri (rubygems-uri "cucumber-expressions" version))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/cucumber/cucumber-expressions-ruby")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0zwmv6hznyz9vk81f5dhwcr9jhxx2vmbk8yyazayvllvhy0fkpdw"))))
+         "1aivhcpjrmbvp9bg0y7g6zxh2swfvylvg0sapq5jc4i1y74k8npd"))))
     (build-system ruby-build-system)
     (arguments
      '(#:test-target "spec"))
     (native-inputs
-     `(("bundler" ,bundler)
-       ("ruby-rspec" ,ruby-rspec)
+     `(("ruby-rspec" ,ruby-rspec)
        ("ruby-simplecov" ,ruby-simplecov)))
     (synopsis "Simpler alternative to Regular Expressions")
     (description "Cucumber Expressions offer similar functionality to Regular
@@ -6195,63 +7945,56 @@ Expressions are extensible with parameter types.")
 (define-public ruby-cucumber-wire
   (package
     (name "ruby-cucumber-wire")
-    ;; Package version 0.0.1 initially, as this is what's needed by Cucumber
-    ;; 3, and Cucumber 4 hasn't been released yet.
-    (version "0.0.1")
+    (version "3.1.0")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "cucumber-wire" version))
        (sha256
         (base32
-         "09ymvqb0sbw2if1nxg8rcj33sf0va88ancq5nmp8g01dfwzwma2f"))))
+         "0z1n13lqv70zb2lcrvs2263lm0gsb3gz8gbv890kxzwp8cvd433k"))))
     (build-system ruby-build-system)
     (arguments
-     '(;; TODO: Currently, the tests can't be run as cucumber is required,
-       ;; which would lead to a circular dependency.
-       #:tests? #f
-       #:test-target "default"
+     '(#:tests? #f                      ;tests use cucumber, causing a cycle
        #:phases
        (modify-phases %standard-phases
-         (add-before 'check 'set-CUCUMBER_USE_RELEASED_GEMS
+         (add-after 'extract-gemspec 'relax-version-requirements
            (lambda _
-             (setenv "CUCUMBER_USE_RELEASED_GEMS" "true")
+             (substitute* ".gemspec"
+               ((" 10\\.1") " 10.2"))
              #t)))))
-    (native-inputs
-     `(("bundler" ,bundler)
-       ("ruby-rspec" ,ruby-rspec)))
+    (propagated-inputs
+     `(("ruby-cucumber-core" ,ruby-cucumber-core)
+       ("ruby-cucumber-expressions" ,ruby-cucumber-expressions)
+       ("ruby-cucumber-messages" ,ruby-cucumber-messages)))
     (synopsis "Cucumber wire protocol plugin")
-    (description
-     "Cucumber's wire protocol allows step definitions to be implemented and
-invoked on any platform.")
+    (description "Cucumber's wire protocol allows step definitions to be
+implemented and invoked on any platform.")
     (home-page "https://github.com/cucumber/cucumber-ruby-wire")
     (license license:expat)))
 
 (define-public ruby-cucumber-tag-expressions
   (package
     (name "ruby-cucumber-tag-expressions")
-    (version "1.1.1")
+    (version "3.0.0")
     (source
      (origin
-       (method url-fetch)
-       (uri (rubygems-uri "cucumber-tag_expressions" version))
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/cucumber/tag-expressions-ruby")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "0cvmbljybws0qzjs1l67fvr9gqr005l8jk1ni5gcsis9pfmqh3vc"))))
+         "15dw4w0npd4m6aw7zhqkjxxzngp42kswrkwfygxkxcxnhy5zl1vx"))))
     (build-system ruby-build-system)
     (arguments
-     '(#:phases
-       (modify-phases %standard-phases
-         (replace 'check
-           (lambda _
-             (invoke "rspec")
-             #t)))))
+     `(#:test-target "spec"))
     (native-inputs
      `(("ruby-rspec" ,ruby-rspec)))
     (synopsis "Cucumber tag expressions for Ruby")
-    (description
-     "Cucumber tag expression parser for Ruby.  A tag expression is an infix
-boolean expression used by Cucumber.")
+    (description "Cucumber tag expression parser for Ruby.  A tag expression
+is an infix boolean expression used by Cucumber.")
     (home-page "https://github.com/cucumber/tag-expressions-ruby")
     (license license:expat)))
 
@@ -6341,42 +8084,161 @@ A modified copy of yajl is used, and included in the package.")
 (define-public ruby-yard
   (package
     (name "ruby-yard")
-    (version "0.9.20")
+    (version "0.9.25")
     (source
      (origin
        (method git-fetch)
        ;; Tests do not pass if we build from the distributed gem.
        (uri (git-reference
-              (url "https://github.com/lsegal/yard")
-              (commit (string-append "v" version))))
+             (url "https://github.com/lsegal/yard")
+             (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1v48zz8hzazrg79jksj9siys21d2axvzijvkxw2j42zh86syi1wi"))))
+         "1x7y4s557hrnq439lih7nqg1y7ximardw75jx9i92x3yzpviqqwa"))))
+    (build-system ruby-build-system)
+    (arguments
+     ;; Note: Tests are willfully disabled to alleviate dependency cycle
+     ;; problems.
+     `(#:tests? #f
+       #:phases (modify-phases %standard-phases
+                  (add-after 'unpack 'do-not-set-date-in-gemspec
+                    ;; Fix a reproducibility issue (see:
+                    ;; https://github.com/lsegal/yard/issues/1343).
+                    (lambda _
+                      (substitute* "yard.gemspec"
+                        ((".*s\\.date.*") ""))
+                      #t)))))
+    (synopsis "Documentation generation tool for Ruby")
+    (description "YARD is a documentation generation tool for the Ruby
+programming language.  It enables the user to generate consistent, usable
+documentation that can be exported to a number of formats very easily, and
+also supports extending for custom Ruby constructs such as custom class level
+definitions.")
+    (home-page "https://yardoc.org")
+    (license license:expat)))
+
+(define-public ruby-yard-with-tests
+  (package
+    (inherit ruby-yard)
+    (name "ruby-yard-with-tests")
+    (arguments
+     (substitute-keyword-arguments (package-arguments ruby-yard)
+       ((#:tests? _ #t) #t)
+       ((#:test-target _ "default") "default")
+       ((#:phases phases '%standard-phases)
+        `(modify-phases ,phases
+           (add-before 'check 'prepare-for-tests
+             (lambda* (#:key tests? #:allow-other-keys)
+               (when tests?
+                 (substitute* "Rakefile"
+                   ((".*[Ss]amus.*") ""))
+                 ;; Delete the Gemfile to avoid errors relating to it.
+                 (delete-file "Gemfile")
+                 ;; $HOME needs to be set to somewhere writeable for tests to
+                 ;; run.
+                 (setenv "HOME" "/tmp"))
+               #t))))))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)
+       ("ruby-rack" ,ruby-rack)
+       ("ruby-redcloth" ,ruby-redcloth)
+       ("ruby-asciidoc" ,ruby-asciidoctor)))))
+
+(define-public ruby-spectroscope
+  (package
+    (name "ruby-spectroscope")
+    (version "0.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "spectroscope" version))
+       (sha256
+        (base32
+         "0iiid9sm110qhx0i1zkds710cvsnmhd308wbqa7slkzbq2akrb3y"))))
     (build-system ruby-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
          (replace 'check
            (lambda _
-             ;; Delete the Gemfile to avoid errors relating to it
-             (delete-file "Gemfile")
-             ;; $HOME needs to be set to somewhere writeable for tests to run
-             (setenv "HOME" "/tmp")
-             ;; Run tests without using 'rake' to avoid dependencies.
-             (invoke "rspec"))))))
+             (with-output-to-file ".test"
+               (lambda _
+                 (display
+                  "\
+require 'ae/should'
+require 'rspec'
+
+include RSpec
+
+Test.run :default do |run|
+  run.files << 'spec/*_spec.rb'
+end")))
+             (invoke "ruby" "-Ilib" "-rrubytest" ".test"))))))
     (native-inputs
-     `(("ruby-rspec" ,ruby-rspec)
-       ("ruby-rack" ,ruby-rack)
-       ("ruby-redcloth" ,ruby-redcloth)
-       ("ruby-asciidoc" ,ruby-asciidoctor)))
-    (synopsis "Documentation generation tool for Ruby")
-    (description
-     "YARD is a documentation generation tool for the Ruby programming
-language.  It enables the user to generate consistent, usable documentation
-that can be exported to a number of formats very easily, and also supports
-extending for custom Ruby constructs such as custom class level definitions.")
-    (home-page "https://yardoc.org")
+     `(("ruby-ae" ,ruby-ae)
+       ("ruby-rspec" ,ruby-rspec)))
+    (propagated-inputs
+     `(("ruby-rubytest" ,ruby-rubytest)))
+    (synopsis "Behavior-Driven Development (BDD) framework built on RubyTest")
+    (description "Spectroscope is a Behavior-Driven Development (BDD)
+framework built on RubyTest, designed to emulate RSpec in most respects.  It
+is assertion framework independent so any number of assertion systems can be
+used, such as Assay or AE.")
+    (home-page "http://rubyworks.github.com/spectroscope/")
+    (license license:bsd-2)))
+
+(define-public ruby-tomparse
+  (package
+    (name "ruby-tomparse")
+    (version "0.4.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "tomparse" version))
+       (sha256
+        (base32
+         "06xakk41f1kgj6j1ahkwn4r6cvidixvm4phhlrvmwb7c3pr8ygc8"))))
+    (build-system ruby-build-system)
+    ;; TODO: Tests require citron and rulebow, not yet packaged.
+    (arguments '(#:tests? #f))
+    (synopsis "TomDoc parser for Ruby")
+    (description "TomParse is a TomDoc parser for Ruby.  It takes a code
+comment as input and parses it into a convenient object-oriented structure in
+accordance with the TomDoc standard.  See
+@url{https://github.com/mojombo/tomdoc, TomDoc} for more information about the
+TomDoc format.")
+    (home-page "http://rubyworks.github.com/tomparse/")
+    (license license:bsd-2)))
+
+(define-public ruby-yard-tomdoc
+  (package
+    (name "ruby-yard-tomdoc")
+    (version "0.7.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "yard-tomdoc" version))
+       (sha256
+        (base32
+         "1725gs8b8klpwhrvnf2wwp7dw3zxs9vz2la983l2d8c4r4fn1j2z"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:phases (modify-phases %standard-phases
+                  (replace 'check
+                    (lambda _
+                      (invoke "rubytest" "-Ilib" "-Itest" "test/"))))))
+    (native-inputs
+     `(("ruby-rubytest-cli" ,ruby-rubytest-cli)
+       ("ruby-spectroscope" ,ruby-spectroscope)
+       ("ruby-ae" ,ruby-ae)))
+    (propagated-inputs
+     `(("ruby-tomparse" ,ruby-tomparse)
+       ("ruby-yard" ,ruby-yard)))
+    (synopsis "TomDoc syntax for YARD")
+    (description "This module adds support for the TomDoc documentation format
+to YARD, a documentation generation tool for Ruby.")
+    (home-page "http://rubyworks.github.com/yard-tomdoc/")
     (license license:expat)))
 
 (define-public ruby-clap
@@ -6487,19 +8349,19 @@ used to create both network servers and clients.")
 (define-public ruby-ruby-engine
   (package
     (name "ruby-ruby-engine")
-    (version "1.0.1")
+    (version "2.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "ruby_engine" version))
        (sha256
         (base32
-         "1d0sd4q50zkcqhr395wj1wpn2ql52r0fpwhzjfvi1bljml7k546v"))))
+         "0wqdcv8gxybp1y7kjhh18g3r9dczacs62d4ahcvyhz32bih8c9fm"))))
     (build-system ruby-build-system)
     (arguments
      `(#:phases
        (modify-phases %standard-phases
-         (add-before 'check 'clean-up
+         (add-after 'extract-gemspec 'clean-up
            (lambda _
              (delete-file "Gemfile.lock")
              (substitute* "ruby_engine.gemspec"
@@ -6508,18 +8370,19 @@ used to create both network servers and clients.")
                ((".*<rdoc.*") "")
                ((".*<rubygems-tasks.*") "")
                ;; Remove extraneous .gem file
-               (("\\\"pkg/ruby_engine-1.0.0.gem\\\",") "")
+               (("\"pkg/ruby_engine-[0-9.]+\\.gem\".freeze, ") "")
+               (("\"Gemfile.lock\".freeze, ") "")
                ;; Soften rake dependency
-               (("%q<rake>.freeze, \\[\\\"~> 10.0\\\"\\]")
+               (("%q<rake>.freeze, \\[\"~> 10.0\"\\]")
                 "%q<rake>.freeze, [\">= 10.0\"]")
                ;; Soften the rspec dependency
-               (("%q<rspec>.freeze, \\[\\\"~> 2.4\\\"\\]")
+               (("%q<rspec>.freeze, \\[\"~> 2.4\"\\]")
                 "%q<rspec>.freeze, [\">= 2.4\"]"))
              (substitute* "Rakefile"
                (("require 'rubygems/tasks'") "")
                (("Gem::Tasks.new") ""))
              ;; Remove extraneous .gem file that otherwise gets installed.
-             (delete-file "pkg/ruby_engine-1.0.0.gem")
+             (delete-file-recursively "pkg")
              #t)))))
     (native-inputs
      `(("bundler" ,bundler)
@@ -6960,44 +8823,40 @@ display width of strings in Ruby.")
 (define-public ruby_version
   (package
     (name "ruby_version")
-    (version "1.0.1")
+    (version "1.0.2")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "ruby_version" version))
        (sha256
         (base32
-         "0854i1bjy56176anr05l5m0vc81nl53c7fyfg7sljj62m1d64dgj"))))
+         "0lvc7bd5ps3w2vq2wb02i0pi3vfcx2rnckx2ix4rjym1qf52kb2j"))))
     (build-system ruby-build-system)
     (arguments
-     '(#:phases
+     `(#:phases
        (modify-phases %standard-phases
          (add-before 'check 'fix-dependencies
            (lambda _
              ;; Remove the Gemfile.lock, as we want to use Guix packages at
              ;; whatever versions.
              (delete-file "Gemfile.lock")
-             ;; Remove the incldued gem file as it's unnecessary.
-             (delete-file "pkg/ruby_version-1.0.0.gem")
+             ;; Remove the included gem files as they unnecessary.
+             (delete-file-recursively "pkg/")
+             ;; Accept any version of rake, rdoc and rspec
              (substitute* "ruby_version.gemspec"
-               ;; Don't require rdoc and rubygems-tasks as they're unnecessary
-               ((".*rdoc.*") "\n")
-               ((".*rubygems-tasks.*") "\n")
-               ;; Accept any version of rake and rspec
                (("%q<rake.*") "%q<rake>)\n")
+               (("%q<rdoc.*") "%q<rdoc>)\n")
                (("%q<rspec.*") "%q<rspec>)\n"))
-             ;; Remove the use of rubygems-tasks from the Rakefile, as it's
-             ;; unnecessary.
+             ;; Do not use bundler.
              (substitute* "Rakefile"
-               (("^require 'rubygems/tasks'") "")
-               (("Gem::Tasks.new") ""))
+               (("Bundler\\.setup.*") "nil\n"))
              #t)))))
     (native-inputs
-     `(("bundler" ,bundler)
-       ("ruby-rspec" ,ruby-rspec)))
+     `(("ruby-rdoc" ,ruby-rdoc)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby-rubygems-tasks", ruby-rubygems-tasks)))
     (synopsis "Ruby library to help check the Ruby version")
-    (description
-     "@code{ruby_version} provides a @code{RubyVersion} module to simplify
+    (description "@code{ruby_version} provides a @code{RubyVersion} module to simplify
 checking for the right Ruby version in software.")
     (home-page "https://github.com/janlelis/ruby_version")
     (license license:expat)))
@@ -7598,7 +9457,7 @@ binary-to-text encoding.  The main modern use of Ascii85 is in PostScript and
 (define-public ruby-ttfunk
   (package
     (name "ruby-ttfunk")
-    (version "1.5.1")
+    (version "1.6.2.1")
     (source
      (origin
        (method git-fetch)
@@ -7609,7 +9468,7 @@ binary-to-text encoding.  The main modern use of Ascii85 is in PostScript and
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0dx9891zcli0sjrslmsvrwalv86hbjbqlmbrcasnjr069v05h9v9"))))
+         "0rsf4j6s97wbcnjbvmmh6xrc7imw4g9lrlcvn945wh400lc8r53z"))))
     (build-system ruby-build-system)
     (arguments
      `(#:test-target "spec"
@@ -7641,7 +9500,7 @@ part of the Prawn PDF generator.")
     (home-page "https://github.com/prawnpdf/ttfunk")
     ;; From the README: "Matz's terms for Ruby, GPLv2, or GPLv3. See LICENSE
     ;; for details."
-    (license (list license:gpl2 license:gpl3 license:ruby))))
+    (license %prawn-project-licenses)))
 
 (define-public ruby-puma
   (package
@@ -7946,7 +9805,7 @@ integrates other mathematical standard libraries.  Prior to Ruby 2.5,
     (description
      "This gem is a port of the rails 'rake stats' method so it can be made
 more robust and work for non rails projects.")
-    (home-page "http://github.com/danmayer/code_statistics")
+    (home-page "https://github.com/danmayer/code_statistics")
     (license license:expat)))
 
 (define-public ruby-rubypants
@@ -7997,14 +9856,14 @@ Markdown.")
 (define-public ruby-rake
   (package
     (name "ruby-rake")
-    (version "12.3.1")
+    (version "13.0.1")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "rake" version))
        (sha256
         (base32
-         "1idi53jay34ba9j68c3mfr9wwkg3cd9qh0fn9cg42hv72c6q8dyg"))))
+         "0w6qza25bq1s825faaglkx1k6d59aiyjjk3yw3ip5sb463mhhai9"))))
     (build-system ruby-build-system)
     (native-inputs
      `(("bundler" ,bundler)))
@@ -8109,7 +9968,7 @@ all known public suffixes.")
        ("bundler" ,bundler)
        ("ruby-idn-ruby" ,ruby-idn-ruby)
        ("ruby-sporkmonger-rack-mount" ,ruby-sporkmonger-rack-mount)
-       ("ruby-rspec-its", ruby-rspec-its)
+       ("ruby-rspec-its", ruby-rspec-its-minimal)
        ("ruby-yard" ,ruby-yard)
        ("ruby-simplecov" ,ruby-simplecov)))
     (propagated-inputs
@@ -8148,7 +10007,7 @@ RFC 3987, and RFC 6570 (level 4), providing support for IRIs and URI templates."
      "This package extends the @code{String} class and adds a
 @code{ColorizedString} with methods to set text color, background color,
 and text effects.")
-    (home-page "http://github.com/fazibear/colorize")
+    (home-page "https://github.com/fazibear/colorize")
     (license license:gpl2+)))
 
 (define-public ruby-colorator
@@ -8215,20 +10074,64 @@ your application.")
                (base32
                 "1h39zqqxp3k4qk49ajpx0jps1vmvxgkh43mqkb6znk583bl0fv71"))))))
 
+(define-public ruby-kpeg
+  (package
+  (name "ruby-kpeg")
+  (version "1.1.0")
+  (source
+    (origin
+      (method url-fetch)
+      (uri (rubygems-uri "kpeg" version))
+      (sha256
+        (base32
+          "0x2kpfrcagj931masm5y1kwbnc6nxl60cqdcd3lyd1d2hz7kzlia"))))
+  (build-system ruby-build-system)
+  (native-inputs
+   `(("ruby-hoe" ,ruby-hoe)))
+  (synopsis "PEG library for Ruby")
+  (description "KPeg is a simple PEG library for Ruby.  It provides an API as
+well as native grammar to build the grammar.  KPeg supports direct left
+recursion of rules via the
+@uref{http://www.vpri.org/pdf/tr2008003_experimenting.pdf,OMeta memoization}
+technique.")
+  (home-page "https://github.com/evanphx/kpeg")
+  (license license:expat)))
+
 (define-public ruby-rdoc
   (package
     (name "ruby-rdoc")
-    (version "6.0.4")
+    (version "6.2.0")
     (source
-      (origin
-        (method url-fetch)
-        (uri (rubygems-uri "rdoc" version))
-        (sha256
-          (base32
-            "0anv42cqcdc6g4n386mrva7mgav5i0c2ry3yzvzzc6z6hymkmcr7"))))
+     (origin
+       (method git-fetch)
+       (uri (git-reference
+             (url "https://github.com/ruby/rdoc")
+             (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
+       (sha256
+        (base32
+         "0dhk29nidv93b5vnjvlm9gcixgn4i0jcyzrgxdk6pdg019bw4cj6"))))
     (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-gemspec
+           ;; TODO: Remove after next release is tagged.
+           (lambda _
+             (substitute* "rdoc.gemspec"
+               (("\"lib/rdoc/generator/template/darkfish/js/\
+jquery\\.js\", ") ""))
+             #t))
+         (add-before 'build 'generate
+           ;; 'gem build' doesn't honor Rakefile dependencies (see:
+           ;; https://github.com/ruby/rdoc/issues/432#issuecomment-650808977).
+           (lambda _
+             (invoke "rake" "generate"))))))
     (native-inputs
-     `(("bundler" ,bundler)))
+     `(("bundler" ,bundler)
+       ("ruby-kpeg" ,ruby-kpeg)
+       ("ruby-racc" ,ruby-racc)
+       ("ruby-rubocop" ,ruby-rubocop)))
     (home-page "https://ruby.github.io/rdoc/")
     (synopsis "HTML and command-line documentation utility")
     (description "RDoc produces HTML and command-line documentation for Ruby
@@ -8317,7 +10220,7 @@ strings or files.")
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/sass/sass-spec.git")
+             (url "https://github.com/sass/sass-spec")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
@@ -8504,7 +10407,7 @@ interface.  It allows Jekyll to rebuild your site when a file changes.")
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/grosser/parallel.git")
+             (url "https://github.com/grosser/parallel")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
@@ -8602,18 +10505,26 @@ custom checks.  This gem provides a set of additional checks.")
 (define-public ruby-pdf-reader
   (package
     (name "ruby-pdf-reader")
-    (version "2.1.0")
+    (version "2.4.0")
     (source (origin
-              (method url-fetch)
-              (uri (rubygems-uri "pdf-reader" version))
+              (method git-fetch)        ;no test in distributed gem archive
+              (uri (git-reference
+                    (url "https://github.com/yob/pdf-reader.git")
+                    (commit (string-append "v" version))))
+              (file-name (git-file-name name version))
               (sha256
                (base32
-                "1b3ig4wpcgdbqa7yw0ahwbmikkkywn2a22bfmrknl5ls7g066x45"))))
+                "1yh8yrlssf5ppnkvk4m78vmh5r5vqwdcd0gm3lqipw162llz0rai"))))
     (build-system ruby-build-system)
-    (arguments `(#:test-target "spec"))
+    (arguments `(#:test-target "spec"
+                 #:phases (modify-phases %standard-phases
+                            (add-after 'unpack 'do-not-use-bundler
+                              (lambda _
+                                (substitute* "spec/spec_helper.rb"
+                                  ((".*[Bb]undler.*") ""))
+                                #t)))))
     (native-inputs
-     `(("bundler" ,bundler)
-       ("ruby-rspec" ,ruby-rspec)
+     `(("ruby-rspec" ,ruby-rspec)
        ("ruby-cane" ,ruby-cane)
        ("ruby-morecane" ,ruby-morecane)))
     (propagated-inputs
@@ -8630,25 +10541,46 @@ access to the contents of a PDF file with a high degree of flexibility.")
     (license license:gpl3+)))
 
 (define-public ruby-pdf-inspector
-  (package
-    (name "ruby-pdf-inspector")
-    (version "1.3.0")
-    (source (origin
-              (method url-fetch)
-              (uri (rubygems-uri "pdf-inspector" version))
-              (sha256
-               (base32
-                "1g853az4xzgqxr5xiwhb76g4sqmjg4s79mm35mp676zjsrwpa47w"))))
-    (build-system ruby-build-system)
-    (propagated-inputs
-     `(("ruby-pdf-reader" ,ruby-pdf-reader)))
-    (arguments `(#:tests? #f)); No rakefile
-    (home-page "https://github.com/prawnpdf/pdf-inspector")
-    (synopsis "Analysis classes for inspecting PDF output")
-    (description "This library provides a number of PDF::Reader based tools for
+  (let ((revision "1")
+        (commit "00ee4c92ff917118785ebec188e81effc968abeb"))
+    (package
+      (name "ruby-pdf-inspector")
+      (version (git-version "1.3.0" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/prawnpdf/pdf-inspector.git")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "0h9w81ddd0gvkh5n2cvny9ddb5qiac1si0dhinkk0xxh5382qs0m"))))
+      (build-system ruby-build-system)
+      (arguments
+       `(#:test-target "spec"
+         #:phases (modify-phases %standard-phases
+                    (add-before 'build 'drop-signing-key-requirement
+                      (lambda _
+                        (substitute* "pdf-inspector.gemspec"
+                          (("spec.signing_key =.*")
+                           "spec.signing_key = nil"))
+                        #t))
+                    (replace 'check
+                      (lambda _
+                        (substitute* "pdf-inspector.gemspec"
+                          ((".*rubocop.*") "")
+                          ((".*yard.*") ""))
+                        (invoke "rspec"))))))
+      (native-inputs
+       `(("ruby-rspec" ,ruby-rspec)))
+      (propagated-inputs
+       `(("ruby-pdf-reader" ,ruby-pdf-reader)))
+      (home-page "https://github.com/prawnpdf/pdf-inspector")
+      (synopsis "Analysis classes for inspecting PDF output")
+      (description "This library provides a number of PDF::Reader based tools for
 use in testing PDF output.  Presently, the primary purpose of this tool is to
 support the tests found in Prawn, a pure Ruby PDF generation library.")
-    (license license:gpl3+)))
+      (license %prawn-project-licenses))))
 
 (define-public ruby-pdf-core
   (package
@@ -8671,39 +10603,52 @@ functionality from Prawn.")
     (license license:gpl3+)))
 
 (define-public ruby-prawn
-  (package
-    (name "ruby-prawn")
-    (version "2.2.2")
-    (source (origin
-              (method url-fetch)
-              (uri (rubygems-uri "prawn" version))
-              (sha256
-               (base32
-                "1qdjf1v6sfl44g3rqxlg8k4jrzkwaxgvh2l4xws97a8f3xv4na4m"))))
-    (build-system ruby-build-system)
-    (arguments
-     ; No tests
-     `(#:tests? #f
-       #:phases
-       (modify-phases %standard-phases
-         (add-before 'build 'fix-dependencies
-           (lambda _
-             (substitute* "prawn.gemspec"
-               (("~> 0.7.0") "~> 0.7"))
-             #t)))))
-    (propagated-inputs
-     `(("ruby-pdf-core" ,ruby-pdf-core)
-       ("ruby-ttfunk" ,ruby-ttfunk)))
-    (native-inputs
-     `(("bundler" ,bundler)
-       ("ruby-pdf-inspector" ,ruby-pdf-inspector)
-       ("ruby-rspec" ,ruby-rspec)
-       ("ruby-simplecov" ,ruby-simplecov)
-       ("ruby-yard" ,ruby-yard)))
-    (home-page "http://prawnpdf.org/api-docs/2.0/")
-    (synopsis "PDF generation for Ruby")
-    (description "Prawn is a pure Ruby PDF generation library.")
-    (license license:gpl3+)))
+  ;; There hasn't been a new release since 2017/03/17.
+  (let ((revision "1")
+        (commit "d980247be8a00e7c59cd4e5785e3aa98f9856db1"))
+    (package
+      (name "ruby-prawn")
+      (version (git-version "2.2.2" revision commit))
+      (source (origin
+                (method git-fetch)
+                (uri (git-reference
+                      (url "https://github.com/prawnpdf/prawn.git")
+                      (commit commit)))
+                (file-name (git-file-name name version))
+                (sha256
+                 (base32
+                  "0mcmvf22h8il93yq48v9f31qpy27pvjxgv9172p0f4x9lqy0imwr"))))
+      (build-system ruby-build-system)
+      (arguments
+       `(#:phases
+         (modify-phases %standard-phases
+           (add-before 'build 'drop-signing-key-requirement
+             (lambda _
+               (substitute* "prawn.gemspec"
+                 (("spec.signing_key =.*")
+                  "spec.signing_key = nil"))
+               #t))
+           (replace 'check
+             (lambda* (#:key tests? #:allow-other-keys)
+               (when tests?
+                 ;; The Prawn manual test fails (see:
+                 ;; https://github.com/prawnpdf/prawn/issues/1163), so exclude
+                 ;; it.
+                 (invoke "rspec" "--exclude-pattern" "prawn_manual_spec.rb"))
+               #t)))))
+      (propagated-inputs
+       `(("ruby-pdf-core" ,ruby-pdf-core)
+         ("ruby-ttfunk" ,ruby-ttfunk)))
+      (native-inputs
+       `(("ruby-pdf-inspector" ,ruby-pdf-inspector)
+         ("ruby-prawn-manual-builder" ,ruby-prawn-manual-builder)
+         ("ruby-rspec" ,ruby-rspec)
+         ("ruby-simplecov" ,ruby-simplecov)
+         ("ruby-yard" ,ruby-yard)))
+      (home-page "https://prawnpdf.org/api-docs/2.0/")
+      (synopsis "PDF generation for Ruby")
+      (description "Prawn is a pure Ruby PDF generation library.")
+      (license %prawn-project-licenses))))
 
 (define-public ruby-prawn-table
   (package
@@ -8832,13 +10777,13 @@ implementation.")
 (define-public ruby-rouge
   (package
     (name "ruby-rouge")
-    (version "3.13.0")
+    (version "3.21.0")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "rouge" version))
               (sha256
                (base32
-                "1y90nx9ph9adnrpcsvs2adca2l3dyz8am2d2kzxkwd3a086ji7aw"))))
+                "1agrrmj88k9jkk36ra1ml2c1jffpp595pkxmcla74ac9ia09vn3s"))))
     (build-system ruby-build-system)
     (arguments `(#:tests? #f)); No rakefile
     (home-page "http://rouge.jneen.net/")
@@ -8917,7 +10862,7 @@ indentation will probably be an issue and hence this gem.")
      (origin
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/dtao/safe_yaml.git")
+             (url "https://github.com/dtao/safe_yaml")
              (commit version)))
        (file-name (git-file-name name version))
        (sha256
@@ -9258,15 +11203,25 @@ entities.")
 (define-public ruby-sinatra
   (package
     (name "ruby-sinatra")
-    (version "2.0.5")
+    (version "2.0.8.1")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "sinatra" version))
        (sha256
         (base32
-         "1gasgn5f15myv08k10i16p326pchxjsy37pgqfw0xm66kcc5d7ry"))))
+         "0riy3hwjab1mr73jcqx3brmbmwspnw3d193j06a5f0fy1w35z15q"))))
     (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         ;; See: https://github.com/sinatra/sinatra/issues/1578.
+         (add-after 'extract-gemspec 'fix-slow-doc-generation
+           (lambda _
+             (substitute* "sinatra.gemspec"
+               (("\"README.rdoc\"\\.freeze," all)
+                (string-append all " \"--exclude=.*\\.md\".freeze,")))
+             #t)))))
     (propagated-inputs
      `(("ruby-mustermann" ,ruby-mustermann)
        ("ruby-rack" ,ruby-rack)
@@ -9432,7 +11387,7 @@ then check out http://127.0.0.1:1080 to see the mail.")
        ;; The gem does not include test code, so fetch from the Git repository.
        (method git-fetch)
        (uri (git-reference
-             (url "https://github.com/castwide/backport.git")
+             (url "https://github.com/castwide/backport")
              (commit (string-append "v" version))))
        (file-name (git-file-name name version))
        (sha256
@@ -9639,7 +11594,7 @@ which snapshots to consider and what files to include.")
   (package
     (name "ruby-wwtd")
     (version "1.4.1")
-    (home-page "http://github.com/grosser/wwtd")
+    (home-page "https://github.com/grosser/wwtd")
     (source (origin
               (method git-fetch)
               (uri (git-reference