summary refs log tree commit diff
path: root/gnu/packages/ruby.scm
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/packages/ruby.scm')
-rw-r--r--gnu/packages/ruby.scm634
1 files changed, 507 insertions, 127 deletions
diff --git a/gnu/packages/ruby.scm b/gnu/packages/ruby.scm
index ede5516088..ea17c91457 100644
--- a/gnu/packages/ruby.scm
+++ b/gnu/packages/ruby.scm
@@ -7,7 +7,7 @@
 ;;; Copyright © 2015, 2016, 2017 Ben Woodcroft <donttrustben@gmail.com>
 ;;; Copyright © 2017 Nikita <nikita@n0.is>
 ;;; Copyright © 2017, 2019, 2020 Marius Bakke <mbakke@fastmail.com>
-;;; Copyright © 2017, 2018, 2019, 2020 Efraim Flashner <efraim@flashner.co.il>
+;;; Copyright © 2017, 2018, 2019, 2020, 2021 Efraim Flashner <efraim@flashner.co.il>
 ;;; Copyright © 2017, 2018, 2020 Tobias Geerinckx-Rice <me@tobias.gr>
 ;;; Copyright © 2017 Clément Lassieur <clement@lassieur.org>
 ;;; Copyright © 2017, 2018, 2019 Christopher Baines <mail@cbaines.net>
@@ -21,11 +21,12 @@
 ;;; Copyright © 2019 Diego N. Barbato <dnbarbato@posteo.de>
 ;;; Copyright © 2019 Brett Gilio <brettg@posteo.de>
 ;;; Copyright © 2020 Maxim Cournoyer <maxim.cournoyer@gmail.com>
-;;; Copyright © 2020 Nicolas Goaziou <mail@nicolasgoaziou.fr>
+;;; Copyright © 2020, 2021 Nicolas Goaziou <mail@nicolasgoaziou.fr>
 ;;; Copyright © 2020 Michael Rohleder <mike@rohleder.de>
 ;;; Copyright © 2020 Holgr Peters <holger.peters@posteo.de>
 ;;; Copyright © 2020 Giacomo Leidi <goodoldpaul@autistici.org>
 ;;; Copyright © 2021 EuAndreh <eu@euandre.org>
+;;; Copyright © 2020 Tomás Ortín Fernández <tomasortin@mailbox.org>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -45,7 +46,6 @@
 (define-module (gnu packages ruby)
   #:use-module ((guix licenses) #:prefix license:)
   #:use-module (gnu packages)
-  #:use-module (gnu packages base)
   #:use-module (gnu packages bison)
   #:use-module (gnu packages c)
   #:use-module (gnu packages check)
@@ -78,6 +78,7 @@
   #:use-module (guix packages)
   #:use-module (guix download)
   #:use-module (guix git-download)
+  #:use-module (guix gexp)
   #:use-module (guix utils)
   #:use-module (guix build-system gnu)
   #:use-module (gnu packages xml)
@@ -959,13 +960,13 @@ specified in a \"Gemfile\", as well as their dependencies.")
 (define-public ruby-builder
   (package
     (name "ruby-builder")
-    (version "3.2.3")
+    (version "3.2.4")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "builder" version))
               (sha256
                (base32
-                "0qibi5s67lpdv1wgcj66wcymcr04q6j4mzws6a479n0mlrmh5wr1"))))
+                "045wzckxpwcqzrjr353cxnyaxgf0qg22jh00dcx7z38cys5g1jlr"))))
     (build-system ruby-build-system)
     (arguments
      `(#:phases
@@ -1530,28 +1531,105 @@ logic.")
     (home-page "https://github.com/typhoeus/typhoeus")
     (license license:expat)))
 
+(define-public ruby-rubocop-rspec
+  (package
+    (name "ruby-rubocop-rspec")
+    (version "2.2.0")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/rubocop-hq/rubocop-rspec")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32
+          "0gdpjpympb6qc77bang759z7z6lckf14ghkx8v6614agxg8l3g5y"))))
+    (build-system ruby-build-system)
+    (arguments
+     '(#:test-target "internal_investigation"
+       #:phases
+       (modify-phases %standard-phases
+         (add-before 'check 'set-HOME
+           (lambda _
+             (setenv "HOME" "/tmp")
+             #t)))))
+    (propagated-inputs
+     `(("ruby-rubocop" ,ruby-rubocop)
+       ("ruby-rubocop-ast" ,ruby-rubocop-ast)))
+    (native-inputs
+     `(("ruby-rack" ,ruby-rack)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby-rubocop-performance" ,ruby-rubocop-performance)
+       ("ruby-simplecov" ,ruby-simplecov)
+       ("ruby-yard" ,ruby-yard)))
+    (synopsis "Code style checking for RSpec files")
+    (description "This package provides a plugin for the RuboCop code style
+enforcing & linting tool.")
+    (home-page "https://github.com/rubocop-hq/rubocop-rspec")
+    (license license:expat)))
+
+(define-public ruby-rubocop-rspec-minimal
+  (hidden-package
+   (package
+     (inherit ruby-rubocop-rspec)
+     (arguments
+      (substitute-keyword-arguments (package-arguments ruby-rubocop-rspec)
+        ((#:tests? _ #f) #f)))
+     (propagated-inputs '())
+     (native-inputs '()))))
+
 (define-public ruby-rubocop-performance
   (package
     (name "ruby-rubocop-performance")
-    (version "1.7.1")
+    (version "1.9.2")
     (source
      (origin
-       (method url-fetch)
-       (uri (rubygems-uri "rubocop-performance" version))
+       (method git-fetch)
+       (uri (git-reference
+              (url "https://github.com/rubocop-hq/rubocop-performance")
+              (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "04r8d4x62ygv17spvz9yyfxbmbf8qxwhijs0xycfvzr0q4pyg9sw"))))
+         "04lmkmz6c0ccs5miikrww7lakp7y6xz00g7b47ay7rn7sx5j6qyf"))))
     (build-system ruby-build-system)
     (arguments
-     `(#:tests? #f))                    ;no test suite in the distributed gem
+     `(#:tests? #f  ; tests require a git checkout of rubocop's source code.
+       #:phases
+       (modify-phases %standard-phases
+         (replace 'replace-git-ls-files
+           (lambda _
+             (substitute* "rubocop-performance.gemspec"
+               (("`git ls-files -z config lib LICENSE.txt README.md`")
+                "`find config lib LICENSE.txt README.md -type f -print0 |sort -z`"))
+             #t))
+         (add-before 'check 'set-HOME
+           (lambda _
+             (setenv "HOME" "/tmp")
+             #t)))))
     (propagated-inputs
-     `(("ruby-rubocop" ,ruby-rubocop)))
+     `(("ruby-rubocop" ,ruby-rubocop)
+       ("ruby-rubocop-ast" ,ruby-rubocop-ast)))
+    (native-inputs
+     `(("ruby-bump" ,ruby-bump)
+       ("ruby-yard" ,ruby-yard)))
     (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-rubocop-performance-minimal
+  (hidden-package
+   (package
+     (inherit ruby-rubocop-performance)
+     (arguments
+      (substitute-keyword-arguments (package-arguments ruby-rubocop-performance)
+        ((#:tests? _ #f) #f)))
+     (propagated-inputs '())
+     (native-inputs '()))))
+
 (define-public ruby-gimme
   (let ((revision "1")
         (commit "4e71f0236f1271871916dd403261d26533db34c0"))
@@ -2005,14 +2083,14 @@ value is found.")
 (define-public ruby-crack
   (package
     (name "ruby-crack")
-    (version "0.4.3")
+    (version "0.4.5")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "crack" version))
        (sha256
         (base32
-         "0abb0fvgw00akyik1zxnq7yv391va148151qxdghnzngv66bl62k"))))
+         "1cr1kfpw3vkhysvkk3wg7c54m75kd68mbm9rs5azdjdq57xid13r"))))
     (build-system ruby-build-system)
     (arguments
      `(#:phases
@@ -2026,7 +2104,7 @@ value is found.")
                          (find-files "test" ".*rb$")))
              #t)))))
     (propagated-inputs
-     `(("ruby-safe-yaml" ,ruby-safe-yaml)))
+     `(("ruby-rexml" ,ruby-rexml)))
     (synopsis "Simple JSON and XML parsing for Ruby")
     (description
      "@code{crack} provides really simple JSON and XML parsing, extracted from
@@ -2201,19 +2279,20 @@ with a similar style to the original OAuth spec.")
 (define-public ruby-omniauth
   (package
     (name "ruby-omniauth")
-    (version "1.9.1")
+    (version "2.0.3")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "omniauth" version))
        (sha256
-        (base32 "002vi9gwamkmhf0dsj2im1d47xw2n1jfhnzl18shxf3ampkqfmyz"))))
+        (base32 "105mzgvmn2kjaacxw01h4wqv33r7hfn5z8fxlkk3jcjar14j71bh"))))
     (build-system ruby-build-system)
-    (arguments
-     '(#:tests? #f)) ; No included tests
     (propagated-inputs
      `(("ruby-hashie" ,ruby-hashie)
-       ("ruby-rack" ,ruby-rack)))
+       ("ruby-rack" ,ruby-rack)
+       ("ruby-rack-protection" ,ruby-rack-protection)))
+    (native-inputs
+     `(("ruby-rspec" ,ruby-rspec)))
     (synopsis "Generalized Rack framework for multiple-provider authentication")
     (description
      "This package provides a generalized Rack framework for multiple-provider
@@ -2224,14 +2303,14 @@ authentication.")
 (define-public ruby-omniauth-oauth2
   (package
     (name "ruby-omniauth-oauth2")
-    (version "1.6.0")
+    (version "1.7.1")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "omniauth-oauth2" version))
        (sha256
         (base32
-         "11mi36l9d97r77q99jnafdc1yaa0a9wahhpp7dj7ank8q52g7g79"))))
+         "10fr2b58sp7l6nfdvxpbi67374hkrvsf507cvda89jjs0jacy319"))))
     (build-system ruby-build-system)
     (arguments
      '(#:phases
@@ -2254,7 +2333,7 @@ authentication.")
        ("ruby-rspec" ,ruby-rspec)
        ("ruby-simplecov" ,ruby-simplecov)
        ("ruby-rack-test" ,ruby-rack-test)
-       ("ruby-webmock" ,ruby-webmock-2)))
+       ("ruby-webmock" ,ruby-webmock)))
     (synopsis "Abstract OAuth2 strategy for OmniAuth")
     (description
      "This library provides a generic OAuth2 strategy for OmniAuth.  It
@@ -2998,7 +3077,7 @@ HTML or XML that is designed to express the structure of documents using
 indentation rather than closing tags.  It was originally envisioned as a
 plugin for Ruby on Rails, but it can function as a stand-alone templating
 engine.")
-    (home-page "http://haml.info/")
+    (home-page "https://haml.info/")
     (license license:expat)))
 
 (define-public ruby-hamster
@@ -3050,20 +3129,19 @@ immutable queue or stack).")
 (define-public ruby-hashdiff
   (package
     (name "ruby-hashdiff")
-    (version "0.3.8")
+    (version "1.0.1")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "hashdiff" version))
        (sha256
         (base32
-         "19ykg5pax8798nh1yv71adkx0zzs7gn2rxjj86v7nsw0jba5lask"))))
+         "1nynpl0xbj0nphqx1qlmyggq58ms1phf5i03hk64wcc0a17x1m1c"))))
     (build-system ruby-build-system)
     (arguments
      '(#:phases
        (modify-phases %standard-phases
-         ;; Run tests directly via rspec to avoid Rake issue:
-         ;; NoMethodError: undefined method `last_comment'
+         ;; Run tests directly via rspec to avoid depending on rubocop.
          (replace 'check
            (lambda* (#:key tests? #:allow-other-keys)
              (when tests?
@@ -4298,13 +4376,13 @@ client protocol.")
 (define-public ruby-minitest
   (package
     (name "ruby-minitest")
-    (version "5.11.3")
+    (version "5.12.2")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "minitest" version))
               (sha256
                (base32
-                "0icglrhghgwdlnzzp4jf76b0mbc71s80njn5afyfjn4wqji8mqbq"))))
+                "0zjm24aiz42i9n37mcw8lydd7n0y7wfk27by06jx77ypcld3qvkw"))))
     (build-system ruby-build-system)
     (native-inputs
      `(("ruby-hoe" ,ruby-hoe)))
@@ -5222,14 +5300,14 @@ across multiple CPU cores.")
 (define-public ruby-parser
   (package
     (name "ruby-parser")
-    (version "2.7.2.0")
+    (version "3.0.0.0")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "parser" version))
        (sha256
         (base32
-         "1f7gmm60yla325wlnd3qkxs59qm2y0aan8ljpg6k18rwzrrfil6z"))))
+         "1jixakyzmy0j5c1rb0fjrrdhgnyryvrr6vgcybs14jfw09akv5ml"))))
     (build-system ruby-build-system)
     (arguments
      '(#:tests? #f)) ; tests not included in gem
@@ -5477,6 +5555,29 @@ projects.  It has very little overhead and can be easily integrated with
 development tools to catch coverage problems early.")
     (license license:expat)))
 
+(define-public ruby-oedipus-lex
+  (package
+    (name "ruby-oedipus-lex")
+    (version "2.5.2")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (rubygems-uri "oedipus_lex" version))
+        (sha256
+         (base32
+          "1v1rk78khwq87ar300lwll570zxpkq9rjnpgc9mgsyd6mm9qjz4w"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("ruby-hoe" ,ruby-hoe)))
+    (synopsis "Ruby lexer")
+    (description
+     "Oedipus Lex is a lexer generator in the same family as Rexical and Rex.
+It is based primarily on generating code much like you would a hand-written
+lexer.  It uses StrScanner within a multi-level case statement.  As such,
+Oedipus matches on the first match, not the longest.")
+      (home-page "https://github.com/seattlerb/oedipus_lex")
+      (license license:expat)))
+
 (define-public ruby-guard
   (package
     (name "ruby-guard")
@@ -5628,14 +5729,18 @@ utilities for Ruby.")
 (define-public ruby-tzinfo
   (package
     (name "ruby-tzinfo")
-    (version "1.2.4")
+    (version "2.0.4")
     (source
      (origin
-       (method url-fetch)
-       (uri (rubygems-uri "tzinfo" version))
+       (method git-fetch)
+       (uri (git-reference
+              ;; Pull from git because the gem has no tests.
+              (url "https://github.com/tzinfo/tzinfo")
+              (commit (string-append "v" version))))
+       (file-name (git-file-name name version))
        (sha256
         (base32
-         "09dpbrih054mn42flbbcdpzk2727mzfvjrgqb12zdafhx7p9rrzp"))))
+         "0jaq1givdaz5jxz47xngyj3j315n872rk97mnpm5njwm48wy45yh"))))
     (build-system ruby-build-system)
     (arguments
      '(#:phases
@@ -5646,9 +5751,22 @@ utilities for Ruby.")
                (("def safe_test\\(options = \\{\\}\\)")
                  "def safe_test(options = {})
       skip('The Guix build environment has an unsafe load path')"))
+             #t))
+         (add-before 'check 'pre-check
+           (lambda _
+             (setenv "HOME" (getcwd))
+             (substitute* "Gemfile"
+               (("simplecov.*") "simplecov'\n"))
+             #t))
+         (replace 'check
+           (lambda* (#:key tests? test-target #:allow-other-keys)
+             (when tests?
+               (invoke "bundler" "exec" "rake" test-target))
              #t)))))
     (propagated-inputs
-     `(("ruby-thread-safe" ,ruby-thread-safe)))
+     `(("ruby-concurrent-ruby" ,ruby-concurrent)))
+    (native-inputs
+     `(("ruby-simplecov" ,ruby-simplecov)))
     (synopsis "Time zone library for Ruby")
     (description "TZInfo is a Ruby library that provides daylight savings
 aware transformations between times in different time zones.")
@@ -5658,7 +5776,7 @@ aware transformations between times in different time zones.")
 (define-public ruby-tzinfo-data
   (package
     (name "ruby-tzinfo-data")
-    (version "1.2017.3")
+    (version "1.2021.1")
     (source
      (origin
        (method git-fetch)
@@ -5670,15 +5788,61 @@ aware transformations between times in different time zones.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "0v3phl5l3jrm6waxcszqmj2dkjhqawxfsxb6mss7vkp1hlckqcdp"))
-       ;; Remove the known test failure.
-       ;; https://github.com/tzinfo/tzinfo-data/issues/10
-       ;; https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1587128
-       (patches (search-patches
-                 "ruby-tzinfo-data-ignore-broken-test.patch"))))
+         "0yzyr3rf8qaw6kxfc0gwpxsb7gl3rhfpx9g1c2z15vapyminhi60"))))
     (build-system ruby-build-system)
+    (arguments
+     `(#:phases
+       (modify-phases %standard-phases
+         (add-after 'unpack 'patch-source
+           (lambda* (#:key inputs #:allow-other-keys)
+             (substitute* "Rakefile"
+               (("https://data.iana.org/time-zones/releases")
+                (assoc-ref inputs "tzdata")))
+             #t))
+         (add-before 'check 'pre-check
+           (lambda _
+             (setenv "HOME" (getcwd))
+             (substitute* "Rakefile"
+               ;; Don't need gpg, and it may break after a time.
+               (("gpg ") "echo ")
+               (("    sh\\(\\\"make -C" text)
+                (string-append "    sh(\"sed -i 's@/bin/sh@sh@' #{tzdb_combined_path}/Makefile \")\n"
+                               "    sh(\"sed -i 's@cc=@cc?=@' #{tzdb_combined_path}/Makefile \")\n" text)))
+               (setenv "cc" ,(cc-for-target))
+             #t)))))
     (propagated-inputs
      `(("ruby-tzinfo" ,ruby-tzinfo)))
+    (native-inputs
+     `(("tzdata"
+        ,(file-union "tzdata-for-ruby-tzdata-info"
+           `(("tzdata2021a.tar.gz"
+              ,(origin
+                 (method url-fetch)
+                 (uri "https://data.iana.org/time-zones/releases/tzdata2021a.tar.gz")
+                 (sha256
+                  (base32
+                   "022fn6gkmp7pamlgab04x0dm5hnyn2m2fcnyr3pvm36612xd5rrr"))))
+             ("tzdata2021a.tar.gz.asc"
+              ,(origin
+                 (method url-fetch)
+                 (uri "https://data.iana.org/time-zones/releases/tzdata2021a.tar.gz.asc")
+                 (sha256
+                  (base32
+                   "0n7h2w8ji1lrxpk0d44wyfshlhr7c9jmwj6lqbxlyvqnfi3gbicx"))))
+             ("tzcode2021a.tar.gz"
+              ,(origin
+                 (method url-fetch)
+                 (uri "https://data.iana.org/time-zones/releases/tzcode2021a.tar.gz")
+                 (sha256
+                  (base32
+                   "1l02b0jiwp3fl0xd6227i69d26rmx3yrnq0ssq9vvdmm4jhvyipb"))))
+             ("tzcode2021a.tar.gz.asc"
+              ,(origin
+                 (method url-fetch)
+                 (uri "https://data.iana.org/time-zones/releases/tzcode2021a.tar.gz.asc")
+                 (sha256
+                  (base32
+                   "1qhlj4lr810s47s1lwcvv1sgvg2sflf98w4sbg1lc8wzv5qxxv7g")))))))))
     (synopsis "Data from the IANA Time Zone database")
     (description
      "This library provides @code{TZInfo::Data}, which contains data from the
@@ -5810,13 +5974,13 @@ documentation for Ruby code.")
 (define-public ruby-gem-hadar
   (package
     (name "ruby-gem-hadar")
-    (version "1.9.1")
+    (version "1.11.0")
     (source (origin
               (method url-fetch)
               (uri (rubygems-uri "gem_hadar" version))
               (sha256
                (base32
-                "1zxvd9l95rbks7x3cxn396w0sn7nha5542bf97v8akkn4vm7nby9"))))
+                "160abb3l4n3gkhd86f22n981bhqxkbf5ym6fhsk796pix6696pd5"))))
     (build-system ruby-build-system)
     ;; This gem needs itself at development time. We disable rebuilding of the
     ;; gemspec to avoid this loop.
@@ -6193,14 +6357,14 @@ you about the changes.")
 (define-public ruby-loofah
   (package
     (name "ruby-loofah")
-    (version "2.2.3")
+    (version "2.3.1")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "loofah" version))
        (sha256
         (base32
-         "1ccsid33xjajd0im2xv941aywi58z7ihwkvaf1w2bv89vn5bhsjg"))))
+         "0npqav026zd7r4qdidq9x5nxcp2dzg71bnp421xxx7sngbxf2xbd"))))
     (build-system ruby-build-system)
     (arguments
      '(#:phases
@@ -6209,11 +6373,9 @@ you about the changes.")
            (lambda _
              ;; concourse is a development tool which is unused, so remove it
              ;; so it's not required.
-             (substitute* "Gemfile"
-               ((".*\"concourse\".*") "\n"))
              (substitute* "Rakefile"
-               (("require 'concourse'") "")
-               (("Concourse\\.new.*") "\n"))
+               (("require \"concourse\"") "")
+               (("Concourse\\.new.*") "task :concourse do\n"))
              #t)))))
     (native-inputs
      `(("ruby-hoe" ,ruby-hoe)
@@ -6231,14 +6393,14 @@ documents and fragments.  It's built on top of Nokogiri and libxml2.")
 (define-public ruby-activesupport
   (package
     (name "ruby-activesupport")
-    (version "5.2.2.1")
+    (version "6.1.3")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "activesupport" version))
        (sha256
         (base32
-         "161bp4p01v1a1lvszrhd1a02zf9x1p1l1yhw79a3rix1kvzkkdqb"))))
+         "00a4db64g8w5yyk6hzak2nqrmdfvyh5zc9cvnm9gglwbi87ss28h"))))
     (build-system ruby-build-system)
     (arguments
      `(#:phases
@@ -6252,12 +6414,13 @@ documents and fragments.  It's built on top of Nokogiri and libxml2.")
        ("ruby-i18n" ,ruby-i18n)
        ("ruby-minitest" ,ruby-minitest)
        ("ruby-tzinfo" ,ruby-tzinfo)
-       ("ruby-tzinfo-data" ,ruby-tzinfo-data)))
+       ("ruby-tzinfo-data" ,ruby-tzinfo-data)
+       ("ruby-zeitwerk" ,ruby-zeitwerk)))
     (synopsis "Ruby on Rails utility library")
     (description "ActiveSupport is a toolkit of support libraries and Ruby
 core extensions extracted from the Rails framework.  It includes support for
 multibyte strings, internationalization, time zones, and testing.")
-    (home-page "http://www.rubyonrails.org")
+    (home-page "https://www.rubyonrails.org")
     (license license:expat)))
 
 (define-public ruby-crass
@@ -6676,7 +6839,7 @@ differences (added or removed nodes) between two XML/HTML documents.")
     (description
      "Racc is a LALR(1) parser generator.  It is written in Ruby itself, and
 generates Ruby program.")
-    (home-page "http://i.loveruby.net/en/projects/racc/")
+    (home-page "https://i.loveruby.net/en/projects/racc/")
     (license (list
               ;; Generally licensed under the LGPL2.1, and some files also
               ;; available under the same license as Ruby.
@@ -6686,21 +6849,25 @@ generates Ruby program.")
 (define-public ruby-rack
   (package
     (name "ruby-rack")
-    (version "2.0.6")
+    (version "2.2.3")
     (source
      (origin
        (method git-fetch)
-       ;; Download from GitHub so that the patch can be applied.
+       ;; Download from GitHub so that the snippet can be applied and tests run.
        (uri (git-reference
               (url "https://github.com/rack/rack")
               (commit version)))
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1n7z4g1x6yxip096cdc04wq7yk7ywpinq28g2xjb46r4nlv5h0j6"))
+         "1qrm5z5v586738bnkr9188dvz0s25nryw6sgvx18jjlkizayw1g4"))
        ;; Ignore test which fails inside the build environment but works
        ;; outside.
-       (patches (search-patches "ruby-rack-ignore-failing-test.patch"))))
+       (modules '((guix build utils)))
+       (snippet
+        '(begin (substitute* "test/spec_files.rb"
+                  (("res.body.must_equal expected_body") ""))
+                #t))))
     (build-system ruby-build-system)
     (arguments
      '(#:phases
@@ -6714,30 +6881,19 @@ generates Ruby program.")
              ;; "/gnu/store".
              (let ((size-diff (- (string-length (which "ruby"))
                                  (string-length "/usr/bin/env ruby"))))
-               (substitute* '("test/spec_file.rb")
-                 (("193")
-                  (number->string (+ 193 size-diff)))
+               (substitute* '("test/spec_files.rb")
+                 (("208" bytes)
+                  (number->string (+ (string->number bytes) size-diff)))
                  (("bytes(.)22-33" all delimiter)
                   (string-append "bytes"
                                  delimiter
                                  (number->string (+ 22 size-diff))
                                  "-"
                                  (number->string (+ 33 size-diff))))))
-             #t))
-         (add-before 'reset-gzip-timestamps 'make-files-writable
-           (lambda* (#:key outputs #:allow-other-keys)
-             ;; Make sure .gz files are writable so that the
-             ;; 'reset-gzip-timestamps' phase can do its work.
-             (let ((out (assoc-ref outputs "out")))
-               (for-each make-file-writable
-                         (find-files out "\\.gz$"))
-               #t))))))
+             #t)))))
     (native-inputs
      `(("ruby-minitest" ,ruby-minitest)
-       ("ruby-minitest-sprint" ,ruby-minitest-sprint)
-       ("which" ,which)))
-    (propagated-inputs
-     `(("ruby-concurrent" ,ruby-concurrent)))
+       ("ruby-minitest-global-expectations" ,ruby-minitest-global-expectations)))
     (synopsis "Unified web application interface for Ruby")
     (description "Rack provides a minimal, modular and adaptable interface for
 developing web applications in Ruby.  By wrapping HTTP requests and responses,
@@ -6780,14 +6936,14 @@ testing libraries to build on.")
 (define-public ruby-rack-protection
   (package
     (name "ruby-rack-protection")
-    (version "2.0.5")
+    (version "2.0.8.1")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "rack-protection" version))
        (sha256
         (base32
-         "15167q25rmxipqwi6hjqj3i1byi9iwl3xq9b7mdar7qiz39pmjsk"))))
+         "1zyj97bfr1shfgwk4ddmdbw0mdkm4qdyh9s1hl0k7accf3kxx1yi"))))
     (build-system ruby-build-system)
     (arguments
      '(;; Tests missing from the gem.
@@ -6913,7 +7069,7 @@ inspired by the Sinatra microframework style of specifying actions:
 (define-public ruby-rubocop-ast
   (package
     (name "ruby-rubocop-ast")
-    (version "0.3.0")
+    (version "1.4.1")
     (source
      (origin
        (method git-fetch)               ;no test suite in distributed gem
@@ -6923,16 +7079,15 @@ inspired by the Sinatra microframework style of specifying actions:
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1ycf6qcj8nbzk2js72priim4642lkn56w5kbny1nlryjkckxgm04"))))
+         "1x2m7k4bn4zvvwmj7imzmv0dav6xnrbcvssad1m5lkprx7h5lzkq"))))
     (build-system ruby-build-system)
     (arguments
      `(#:test-target "spec"
        #:phases (modify-phases %standard-phases
-                  (add-after 'unpack 'disable-bundler
+                  (add-before 'build 'generate-lexer
                     (lambda _
-                      (substitute* "Rakefile"
-                        (("Bundler\\.setup.*") "nil\n"))
-                      #t))
+                      (setenv "RUBOCOP_VERSION" "none")
+                      (invoke "rake" "generate")))
                   (replace 'replace-git-ls-files
                     (lambda _
                       (substitute* "rubocop-ast.gemspec"
@@ -6941,7 +7096,12 @@ inspired by the Sinatra microframework style of specifying actions:
                       #t)))))
     (native-inputs
      `(("ruby-bump" ,ruby-bump)
-       ("ruby-rspec" ,ruby-rspec)))
+       ("ruby-oedipus-lex" ,ruby-oedipus-lex)
+       ("ruby-pry" ,ruby-pry)
+       ("ruby-racc" ,ruby-racc)
+       ("ruby-rake" ,ruby-rake)
+       ("ruby-rspec" ,ruby-rspec)
+       ("ruby-simplecov" ,ruby-simplecov)))
     (propagated-inputs
      `(("ruby-parser" ,ruby-parser)))
     (synopsis "RuboCop's AST extensions and NodePattern functionality")
@@ -7145,7 +7305,7 @@ run.")
 (define-public ruby-rubocop
   (package
     (name "ruby-rubocop")
-    (version "0.88.0")
+    (version "1.10.0")
     (source
      (origin
        (method git-fetch)               ;no tests in distributed gem
@@ -7155,42 +7315,25 @@ run.")
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1d06893jp8pd85fvgp5d16vqcf31bafi430v4f4y746ihyvhzz5r"))
-       (patches (search-patches "ruby-rubocop-break-dependency-cycle.patch"))))
+         "0wjw9vpzr4f3nf1zf010bag71w4hdi0haybdn7r5rlmw45pmim29"))))
     (build-system ruby-build-system)
     (arguments
      '(#: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))
+         ;; Rubocop depends on itself for tests, directly and indirectly. By
+         ;; regenerating the TODO list we test rubocop against itself and
+         ;; forgo adjusting the test suite to our environment each release.
+         (replace 'check
+           (lambda* (#:key tests? #:allow-other-keys)
+             (when tests?
+               (make-file-writable ".rubocop_todo.yml")
+               (invoke "./exe/rubocop" "--auto-gen-config"))
+             #t))
          (add-before 'check 'make-adoc-files-writable
            (lambda _
              (let ((adoc-files (find-files "docs/modules/ROOT/pages"
@@ -7199,10 +7342,17 @@ run.")
              #t)))))
     (native-inputs
      `(("ruby-bump" ,ruby-bump)
+       ("ruby-memory-profiler" ,ruby-memory-profiler)
        ("ruby-pry" ,ruby-pry)
+       ("ruby-rake" ,ruby-rake)
        ("ruby-rspec" ,ruby-rspec)
+       ("ruby-rubocop-minimal" ,ruby-rubocop-minimal)
+       ("ruby-rubocop-performance-minimal" ,ruby-rubocop-performance-minimal)
+       ("ruby-rubocop-rspec-minimal" ,ruby-rubocop-rspec-minimal)
+       ("ruby-simplecov" ,ruby-simplecov)
+       ("ruby-stackprof" ,ruby-stackprof)
        ("ruby-test-queue" ,ruby-test-queue)
-       ("ruby-webmock" ,ruby-webmock-2)
+       ("ruby-webmock" ,ruby-webmock)
        ("ruby-yard" ,ruby-yard)))
     (propagated-inputs
      `(("ruby-parallel" ,ruby-parallel)
@@ -7220,6 +7370,16 @@ the community-driven Ruby Style Guide.")
     (home-page "https://github.com/rubocop-hq/rubocop")
     (license license:expat)))
 
+(define-public ruby-rubocop-minimal
+  (hidden-package
+   (package
+     (inherit ruby-rubocop)
+     (arguments
+      (substitute-keyword-arguments (package-arguments ruby-rubocop)
+        ((#:tests? _ #f) #f)))
+     (propagated-inputs '())
+     (native-inputs '()))))
+
 (define-public ruby-contest
   (package
     (name "ruby-contest")
@@ -7488,6 +7648,28 @@ navigation capabilities to @code{pry}, using @code{byebug}.")
     (home-page "https://github.com/deivid-rodriguez/pry-byebug")
     (license license:expat)))
 
+(define-public ruby-stackprof
+  (package
+    (name "ruby-stackprof")
+    (version "0.2.16")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (rubygems-uri "stackprof" version))
+        (sha256
+         (base32
+          "147rb66p3n062vc433afqhkd99iazvkrqnghxgh871r62yhha93f"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("ruby-mocha" ,ruby-mocha)
+       ("ruby-rake-compiler" ,ruby-rake-compiler)))
+    (synopsis "Sampling profiler for Ruby code")
+    (description
+     "@code{stackprof} is a fast sampling profiler for Ruby code, with cpu,
+wallclock and object allocation samplers.")
+    (home-page "https://github.com/tmm1/stackprof")
+    (license license:expat)))
+
 (define-public ruby-binding-of-caller
   (package
     (name "ruby-binding-of-caller")
@@ -7610,6 +7792,29 @@ Profiling multiple threads simultaneously is supported.
     (home-page "https://github.com/ruby-prof/ruby-prof")
     (license license:bsd-2)))
 
+(define-public ruby-memory-profiler
+  (package
+    (name "ruby-memory-profiler")
+    (version "1.0.0")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               (url "https://github.com/SamSaffron/memory_profiler")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32
+          "07yqv11q68xg2fqkrhs6ysngryk8b9zq6qzh24rgx9xqv6qfnj0w"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("ruby-rake" ,ruby-rake)))
+    (synopsis "Memory profiling routines for Ruby")
+    (description
+     "This package provides memory profiling routines for Ruby.")
+    (home-page "https://github.com/SamSaffron/memory_profiler")
+    (license license:expat)))
+
 (define-public ruby-cucumber-messages
   (package
     (name "ruby-cucumber-messages")
@@ -8632,6 +8837,23 @@ definitions.")
     (home-page "https://github.com/mime-types/ruby-mime-types")
     (license license:expat)))
 
+(define-public ruby-mini-mime
+  (package
+    (name "ruby-mini-mime")
+    (version "1.0.2")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (rubygems-uri "mini_mime" version))
+        (sha256
+         (base32
+          "1axm0rxyx3ss93wbmfkm78a6x03l8y4qy60rhkkiq0aza0vwq3ha"))))
+    (build-system ruby-build-system)
+    (synopsis "Lightweight mime type lookup toy")
+    (description "This package provides a lightweight mime type lookup toy.")
+    (home-page "https://github.com/discourse/mini_mime")
+    (license license:expat)))
+
 (define-public ruby-fivemat
   (package
     (name "ruby-fivemat")
@@ -8893,17 +9115,17 @@ requests.")
     (home-page "https://github.com/opperator/warden-oauth2")
     (license license:expat)))
 
-(define-public ruby-webmock-2
+(define-public ruby-webmock
   (package
     (name "ruby-webmock")
-    (version "2.3.2")
+    (version "3.11.2")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "webmock" version))
        (sha256
         (base32
-         "04hkcqsmbfnp8g237pisnc834vpgildklicbjbyikqg0bg1rwcy5"))))
+         "1hdlbvfw316lkz251qnfk79drmaay7l51kidvicz41nhvw12xz8v"))))
     (build-system ruby-build-system)
     (native-inputs
      `(("bundler" ,bundler)
@@ -8919,6 +9141,19 @@ requests.  This is useful when testing software.")
     (home-page "https://github.com/bblimke/webmock")
     (license license:expat)))
 
+(define-public ruby-webmock-2
+  (package
+    (inherit ruby-webmock)
+    (name "ruby-webmock")
+    (version "2.3.2")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "webmock" version))
+       (sha256
+        (base32
+         "04hkcqsmbfnp8g237pisnc834vpgildklicbjbyikqg0bg1rwcy5"))))))
+
 (define-public ruby-unicode-display-width
   (package
     (name "ruby-unicode-display-width")
@@ -9856,21 +10091,19 @@ of the more insecure basic authentication scheme.")
 (define-public ruby-mail
   (package
     (name "ruby-mail")
-    (version "2.6.6")
+    (version "2.7.1")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "mail" version))
        (sha256
         (base32
-         "0d7lhj2dw52ycls6xigkfz6zvfhc6qggply9iycjmcyj9760yvz9"))))
+         "00wwz6ys0502dpk8xprwcqfwyf3hmnx6lgxaiq6vj43mkx43sapc"))))
     (build-system ruby-build-system)
     (propagated-inputs
-     `(("ruby-mime-types" ,ruby-mime-types)))
+     `(("ruby-mini-mime" ,ruby-mini-mime)))
     (arguments
-     ;; Tests require extra gems not included in the Gemfile.
-     ;; XXX: Try enabling this for the next version with mini_mime.
-     `(#:tests? #f))
+     '(#:tests? #f)) ; no rakefile
     (synopsis "Mail library for Ruby")
     (description
      "Mail is an internet library for Ruby that is designed to handle email
@@ -11754,20 +11987,23 @@ application.")
 (define-public ruby-solargraph
   (package
     (name "ruby-solargraph")
-    (version "0.36.0")
+    (version "0.40.3")
     (source
      (origin
        (method url-fetch)
        (uri (rubygems-uri "solargraph" version))
        (sha256
         (base32
-         "0b93xzkgd1h06da9gdnwivj1mzbil8lc072y2838dy6i7bxgpy9i"))))
+         "1gf049rm0yvw4r8r5yyi890idbfg8qh0dikqx5prvkh11srl73bz"))))
     (build-system ruby-build-system)
     (propagated-inputs
      `(("ruby-backport" ,ruby-backport)
        ("bundler" ,bundler)
-       ("ruby-htmlentities" ,ruby-htmlentities)
+       ("ruby-benchmark" ,ruby-benchmark)
+       ("ruby-e2mmap" ,ruby-e2mmap)
        ("ruby-jaro-winkler" ,ruby-jaro-winkler)
+       ("ruby-kramdown" ,ruby-kramdown)
+       ("ruby-kramdown-parser-gfm" ,ruby-kramdown-parser-gfm)
        ("ruby-maruku" ,ruby-maruku)
        ("ruby-nokogiri" ,ruby-nokogiri)
        ("ruby-parser" ,ruby-parser)
@@ -11780,7 +12016,7 @@ application.")
      `(("ruby-rspec" ,ruby-rspec)
        ("ruby-pry" ,ruby-pry)
        ("ruby-simplecov" ,ruby-simplecov)
-       ("ruby-webmock" ,ruby-webmock-2)))
+       ("ruby-webmock" ,ruby-webmock)))
     ;; FIXME: can't figure out how to run the tests properly:
 
     ;; An error occurred while loading spec_helper.
@@ -11831,6 +12067,35 @@ which snapshots to consider and what files to include.")
      "https://github.com/hartator/wayback-machine-downloader")
     (license license:expat)))
 
+(define-public ruby-zeitwerk
+  (package
+    (name "ruby-zeitwerk")
+    (version "2.4.2")
+    (source
+      (origin
+        (method git-fetch)
+        (uri (git-reference
+               ;; No tests in the released gem.
+               (url "https://github.com/fxn/zeitwerk")
+               (commit (string-append "v" version))))
+        (file-name (git-file-name name version))
+        (sha256
+         (base32
+          "119fgdyb57gmss2yvfwfr47wcy8nny38sai72446krpihyavpizw"))))
+    (build-system ruby-build-system)
+    (native-inputs
+     `(("ruby-minitest" ,ruby-minitest)
+       ("ruby-minitest-focus" ,ruby-minitest-focus)
+       ("ruby-minitest-reporters" ,ruby-minitest-reporters)))
+    (synopsis "Efficient and thread-safe code loader for Ruby")
+    (description
+     "Zeitwerk implements constant autoloading with Ruby semantics.  Each gem
+and application may have their own independent autoloader, with its own
+configuration, inflector, and logger.  Supports autoloading, reloading, and
+eager loading.")
+    (home-page "https://github.com/fxn/zeitwerk")
+    (license license:expat)))
+
 (define-public ruby-wwtd
   (package
     (name "ruby-wwtd")
@@ -11936,3 +12201,118 @@ multiple adapters, various log level combinations and message formatting
 options.")
     (home-page "https://github.com/rudionrails/yell")
     (license license:expat)))
+
+(define-public ruby-e2mmap
+  (package
+    (name "ruby-e2mmap")
+    (version "0.1.0")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "e2mmap" version))
+       (sha256
+        (base32
+         "0n8gxjb63dck3vrmsdcqqll7xs7f3wk78mw8w0gdk9wp5nx6pvj5"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #f)) ;; There is a rakefile but no tests
+    (synopsis
+     "Module for defining custom exceptions with specific messages")
+    (description
+     "Exception2MessageMapper (e2mmap) is a helper module for easily defining
+exceptions with predefined messages.")
+    (home-page "https://github.com/ruby/e2mmap")
+    (license license:bsd-2)))
+
+(define-public ruby-benchmark
+  (package
+    (name "ruby-benchmark")
+    (version "0.1.1")
+    (source
+     (origin
+       (method url-fetch)
+       (uri (rubygems-uri "benchmark" version))
+       (sha256
+        (base32
+         "1jvrl7400fv7v2jjri1r7ilj3sri36hzipwwgpn5psib4c9c59c6"))))
+    (build-system ruby-build-system)
+    (synopsis "Performance benchmarking library")
+    (description "This package provides methods for benchmarking Ruby code,
+giving detailed reports on the time taken for each task.")
+    (home-page "https://github.com/ruby/benchmark")
+    (license license:bsd-2)))
+
+(define-public ruby-jekyll-feed
+  (package
+    (name "ruby-jekyll-feed")
+    (version "0.15.1")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (rubygems-uri "jekyll-feed" version))
+        (sha256
+          (base32
+            "1zxqkrnix0xiw98531h5ga6h69jhzlx2jh9qhvcl67p8nq3sgza9"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #false))     ;there are none
+    (propagated-inputs
+      `(("jekyll" ,jekyll)))
+    (synopsis
+      "Jekyll plugin to generate an Atom feed of your Jekyll posts")
+    (description
+      "This package provides a Jekyll plugin to generate an Atom feed
+of your Jekyll posts.")
+    (home-page
+      "https://github.com/jekyll/jekyll-feed")
+    (license license:expat)))
+
+(define-public ruby-jekyll-sitemap
+  (package
+    (name "ruby-jekyll-sitemap")
+    (version "1.4.0")
+    (source
+      (origin
+        (method url-fetch)
+        (uri (rubygems-uri "jekyll-sitemap" version))
+        (sha256
+          (base32
+            "0622rwsn5i0m5xcyzdn86l68wgydqwji03lqixdfm1f1xdfqrq0d"))))
+    (build-system ruby-build-system)
+    (arguments
+     `(#:tests? #false))     ;there are none
+    (propagated-inputs
+      `(("jekyll" ,jekyll)))
+    (synopsis
+      "Automatically generate a sitemap.xml for your Jekyll site")
+    (description
+      "This package provides a Jekyll plugin to silently generate
+a sitemaps.org compliant sitemap for your Jekyll site.")
+    (home-page
+      "https://github.com/jekyll/jekyll-sitemap")
+    (license license:expat)))
+
+(define-public ruby-jekyll-seo-tag
+  (package
+   (name "ruby-jekyll-seo-tag")
+   (version "2.7.1")
+   (source
+    (origin
+     (method url-fetch)
+     (uri (rubygems-uri "jekyll-seo-tag" version))
+     (sha256
+      (base32
+       "0fsi75hymk2wswy216fs224p5ycrzjw1kshw1bsl5czhv42wr2w3"))))
+   (build-system ruby-build-system)
+   (arguments
+    `(#:tests? #false))
+   (propagated-inputs
+    `(("jekyll" ,jekyll)))
+   (synopsis
+    "Jekyll plugin to add metadata tags for search engines and social networks")
+   (description
+    "This package provides a Jekyll plugin to add metadata tags for search engines
+and social networks to better index and display your site's content.")
+   (home-page
+    "https://github.com/jekyll/jekyll-seo-tag")
+   (license license:expat)))