gnu: Remove unneeded uses of 'libiconv'.
[jackhill/guix/guix.git] / gnu / packages / rails.scm
1 ;;; GNU Guix --- Functional package management for GNU
2 ;;; Copyright © 2016 Matthew Jordan <matthewjordandevops@yandex.com>
3 ;;; Copyright © 2018 Tobias Geerinckx-Rice <me@tobias.gr>
4 ;;; Copyright © 2019, 2021 Efraim Flashner <efraim@flashner.co.il>
5 ;;;
6 ;;; This file is part of GNU Guix.
7 ;;;
8 ;;; GNU Guix is free software; you can redistribute it and/or modify it
9 ;;; under the terms of the GNU General Public License as published by
10 ;;; the Free Software Foundation; either version 3 of the License, or (at
11 ;;; your option) any later version.
12 ;;;
13 ;;; GNU Guix is distributed in the hope that it will be useful, but
14 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ;;; GNU General Public License for more details.
17 ;;;
18 ;;; You should have received a copy of the GNU General Public License
19 ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
20
21 (define-module (gnu packages rails)
22 #:use-module ((guix licenses) #:prefix license:)
23 #:use-module (guix download)
24 #:use-module (guix git-download)
25 #:use-module (guix packages)
26 #:use-module (gnu packages node)
27 #:use-module (gnu packages ruby)
28 #:use-module (guix build-system ruby))
29
30 (define-public ruby-spring
31 (package
32 (name "ruby-spring")
33 (version "1.7.2")
34 (source
35 (origin
36 (method git-fetch)
37 (uri (git-reference
38 (url "https://github.com/rails/spring")
39 (commit (string-append "v" version))))
40 (file-name (git-file-name name version))
41 (sha256
42 (base32
43 "0smwrndjmnr7g7jjskw05zin3gh6kx5db6yrkiqi6i9wl5mrn9n5"))))
44 (build-system ruby-build-system)
45 (arguments
46 `(#:test-target "test:unit"
47 #:phases
48 (modify-phases %standard-phases
49 (add-before 'check 'remove-bump
50 (lambda _
51 (substitute* "spring.gemspec"
52 (("gem.add_development_dependency 'bump'") "")
53 (("gem.add_development_dependency 'activesupport'.*")
54 "gem.add_development_dependency 'activesupport'\n"))
55 (substitute* "Rakefile"
56 (("require \\\"bump/tasks\\\"") ""))
57 #t)))))
58 (native-inputs
59 (list bundler ruby-activesupport))
60 (synopsis "Ruby on Rails application preloader")
61 (description
62 "Spring is a Ruby on Rails application preloader. It speeds up
63 development by keeping your application running in the background so the
64 application does need to boot it every time you run a test, rake task or
65 migration.")
66 (home-page "https://github.com/rails/spring")
67 (license license:expat)))
68
69 (define-public ruby-sass-rails
70 (package
71 (name "ruby-sass-rails")
72 (version "5.0.7")
73 (source
74 (origin
75 (method url-fetch)
76 (uri (rubygems-uri "sass-rails" version))
77 (sha256
78 (base32
79 "1wa63sbsimrsf7nfm8h0m1wbsllkfxvd7naph5d1j6pbc555ma7s"))))
80 (build-system ruby-build-system)
81 (arguments
82 '(#:tests? #f)) ; No included tests
83 (propagated-inputs
84 (list ruby-railties ruby-sass ruby-sprockets ruby-sprockets-rails
85 ruby-tilt))
86 (synopsis "Sass adapter for the Rails asset pipeline")
87 (description
88 "This library integrates the SASS stylesheet language into Ruby on
89 Rails.")
90 (home-page "https://github.com/rails/sass-rails")
91 (license license:expat)))
92
93 (define-public ruby-debug-inspector
94 (package
95 (name "ruby-debug-inspector")
96 (version "0.0.3")
97 (source
98 (origin
99 (method url-fetch)
100 (uri (rubygems-uri "debug_inspector" version))
101 (sha256
102 (base32
103 "0vxr0xa1mfbkfcrn71n7c4f2dj7la5hvphn904vh20j3x4j5lrx0"))))
104 (build-system ruby-build-system)
105 (arguments
106 `(#:phases
107 (modify-phases %standard-phases
108 (replace 'check
109 (lambda _
110 (invoke "rake" "compile")
111 (invoke "ruby" "-Ilib" "-e"
112 (string-append
113 "require 'debug_inspector'; RubyVM::DebugInspector."
114 "open{|dc| p dc.backtrace_locations}")))))))
115 (synopsis "Ruby wrapper for the MRI 2.0 debug_inspector API")
116 (description
117 "This package provides a Ruby wrapper for the MRI 2.0 debug_inspector
118 API.")
119 (home-page
120 "https://github.com/banister/debug_inspector")
121 (license license:expat)))
122
123 (define-public ruby-autoprefixer-rails
124 (package
125 (name "ruby-autoprefixer-rails")
126 (version "9.4.7")
127 (source
128 (origin
129 (method url-fetch)
130 (uri (rubygems-uri "autoprefixer-rails" version))
131 (sha256
132 (base32
133 "0fxbfl3xrrjj84n98x24yzxbz4nvm6c492dxj41kkrl9z97ga13i"))))
134 (build-system ruby-build-system)
135 (arguments
136 '(#:test-target "spec"
137 #:phases
138 (modify-phases %standard-phases
139 (add-after 'extract-gemspec 'remove-unnecessary-dependencies
140 (lambda _
141 ;; Remove the testing of compass, as its use is deprecated, and
142 ;; it's unpackaged for Guix.
143 (substitute* "autoprefixer-rails.gemspec"
144 ((".*%q<compass>.*") "\n")
145 (("\"spec/compass_spec\\.rb\"\\.freeze, ") ""))
146 (delete-file "spec/compass_spec.rb")
147
148 (substitute* "Gemfile"
149 ;; Remove overly strict requirement on sprockets
150 ((", '>= 4\\.0\\.0\\.beta1'") "")
151 ;; The mini_racer gem isn't packaged yet, and it's not directly
152 ;; required, as other backends for ruby-execjs can be used.
153 (("gem 'mini_racer'") "")
154 ;; For some reason, this is required for the gems to be picked
155 ;; up
156 (("gemspec") "gemspec\ngem 'tzinfo-data'\ngem 'sass'"))
157 #t)))))
158 (native-inputs
159 (list bundler
160 ruby-rails
161 ruby-rspec-rails
162 ;; This is needed for a test, but I'm unsure why
163 ruby-sass
164 ;; This is used as the ruby-execjs runtime
165 node))
166 (propagated-inputs
167 (list ruby-execjs))
168 (synopsis "Parse CSS and add vendor prefixes to CSS rules")
169 (description
170 "This gem provides Ruby and Ruby on Rails integration with Autoprefixer,
171 which can parse CSS and add vendor prefixes to CSS rules using values from the
172 Can I Use website.")
173 (home-page "https://github.com/ai/autoprefixer-rails")
174 (license license:expat)))
175
176 (define-public ruby-activemodel
177 (package
178 (name "ruby-activemodel")
179 (version "6.1.3")
180 (source
181 (origin
182 (method url-fetch)
183 (uri (rubygems-uri "activemodel" version))
184 (sha256
185 (base32
186 "07m85r00cd1dzxg65zr9wjrdqppw51b5ka9c5mrz92vnw18kfb70"))))
187 (build-system ruby-build-system)
188 (arguments
189 '(;; No included tests
190 #:tests? #f))
191 (propagated-inputs
192 (list ruby-activesupport))
193 (synopsis "Toolkit for building modeling frameworks like Active Record")
194 (description
195 "This package provides a toolkit for building modeling frameworks like
196 Active Record. ActiveSupport handles attributes, callbacks, validations,
197 serialization, internationalization, and testing.")
198 (home-page "https://rubyonrails.org/")
199 (license license:expat)))
200
201 (define-public ruby-activerecord
202 (package
203 (name "ruby-activerecord")
204 (version "6.1.3")
205 (source
206 (origin
207 (method url-fetch)
208 (uri (rubygems-uri "activerecord" version))
209 (sha256
210 (base32
211 "03kr6vslwd9iw89jidjpjlp7prr2rf7kpsfa4fz03g9by0kliivs"))))
212 (build-system ruby-build-system)
213 (arguments
214 '(;; No included tests
215 #:tests? #f))
216 (propagated-inputs
217 (list ruby-activemodel ruby-activesupport ruby-arel))
218 (synopsis "Ruby library to connect to relational databases")
219 (description
220 "Active Record connects classes to relational database table to establish
221 an almost zero-configuration persistence layer for applications.")
222 (home-page "https://rubyonrails.org")
223 (license license:expat)))
224
225 (define-public ruby-rspec-rails
226 (package
227 (name "ruby-rspec-rails")
228 (version "3.8.2")
229 (source
230 (origin
231 (method url-fetch)
232 (uri (rubygems-uri "rspec-rails" version))
233 (sha256
234 (base32
235 "1pf6n9l4sw1arlax1bdbm1znsvl8cgna2n6k6yk1bi8vz2n73ls1"))))
236 (build-system ruby-build-system)
237 (arguments
238 '(#:tests? #f)) ; No included tests
239 (propagated-inputs
240 (list ruby-actionpack
241 ruby-activesupport
242 ruby-railties
243 ruby-rspec-core
244 ruby-rspec-expectations
245 ruby-rspec-mocks
246 ruby-rspec-support))
247 (synopsis "Use RSpec to test Ruby on Rails applications")
248 (description
249 "This package provides support for using RSpec to test Ruby on Rails
250 applications, in pace of the default Minitest testing library.")
251 (home-page "https://github.com/rspec/rspec-rails")
252 (license license:expat)))
253
254 (define-public ruby-rails-html-sanitizer
255 (package
256 (name "ruby-rails-html-sanitizer")
257 (version "1.3.0")
258 (source
259 (origin
260 (method url-fetch)
261 (uri (rubygems-uri "rails-html-sanitizer" version))
262 (sha256
263 (base32
264 "1icpqmxbppl4ynzmn6dx7wdil5hhq6fz707m9ya6d86c7ys8sd4f"))))
265 (build-system ruby-build-system)
266 (arguments
267 '(;; No included tests
268 #:tests? #f))
269 (propagated-inputs
270 (list ruby-loofah))
271 (synopsis "HTML sanitization for Rails applications")
272 (description
273 "This gem is used to handle HTML sanitization in Rails applications. If
274 you need similar functionality in non Rails apps consider using Loofah
275 directly.")
276 (home-page "https://github.com/rails/rails-html-sanitizer")
277 (license license:expat)))
278
279 (define-public ruby-rails-dom-testing
280 (package
281 (name "ruby-rails-dom-testing")
282 (version "2.0.3")
283 (source
284 (origin
285 (method git-fetch)
286 (uri (git-reference
287 (url "https://github.com/rails/rails-dom-testing")
288 (commit (string-append "v" version))))
289 (file-name (git-file-name name version))
290 (sha256
291 (base32
292 "17vdh273cmmfpzy5m546dd13zqmimv54jjx0f7sl0zi5lwz0gnck"))))
293 (build-system ruby-build-system)
294 (native-inputs
295 (list bundler))
296 (propagated-inputs
297 (list ruby-activesupport ruby-nokogiri))
298 (synopsis "Compare HTML DOMs and assert certain elements exists")
299 (description
300 "This gem can compare HTML and assert certain elements exists. This is
301 useful when writing tests.")
302 (home-page "https://github.com/rails/rails-dom-testing")
303 (license license:expat)))
304
305 (define-public ruby-actiontext
306 (package
307 (name "ruby-actiontext")
308 (version "6.1.3")
309 (source
310 (origin
311 (method url-fetch)
312 (uri (rubygems-uri "actiontext" version))
313 (sha256
314 (base32
315 "04k4z4xj40sbzbgx0x9m6i8k0nc22jb6dkrlslj16p2z2dfnwhqg"))))
316 (build-system ruby-build-system)
317 (arguments
318 '(;; No included tests
319 #:tests? #f))
320 (propagated-inputs
321 (list ruby-actionpack ruby-activerecord ruby-activestorage
322 ruby-activesupport ruby-nokogiri))
323 (synopsis "Edit and display rich text in Rails applications")
324 (description
325 "ActionText edits and displays rich text in Rails applications.")
326 (home-page "https://rubyonrails.org")
327 (license license:expat)))
328
329 (define-public ruby-actionview
330 (package
331 (name "ruby-actionview")
332 (version "6.1.3")
333 (source
334 (origin
335 (method url-fetch)
336 (uri (rubygems-uri "actionview" version))
337 (sha256
338 (base32
339 "1s5kc1abi7id1g54lz1npgc42zl7pbz172wp8pi7j3s7qljafzw5"))))
340 (build-system ruby-build-system)
341 (arguments
342 '(;; No included tests
343 #:tests? #f))
344 (propagated-inputs
345 (list ruby-activesupport ruby-builder ruby-erubi
346 ruby-rails-dom-testing ruby-rails-html-sanitizer))
347 (synopsis "Conventions and helpers for building web pages")
348 (description
349 "ActionView provides conventions and helpers for building web pages in
350 Ruby.")
351 (home-page "https://rubyonrails.org/")
352 (license license:expat)))
353
354 (define-public ruby-actionpack
355 (package
356 (name "ruby-actionpack")
357 (version "6.1.3")
358 (source
359 (origin
360 (method url-fetch)
361 (uri (rubygems-uri "actionpack" version))
362 (sha256
363 (base32
364 "030yyaskzlic5cp4d9zbwwr3rhf4k6hsls44a7ihsfd6r8mlivq5"))))
365 (build-system ruby-build-system)
366 (arguments
367 '(;; No included tests
368 #:tests? #f))
369 (propagated-inputs
370 (list ruby-actionview
371 ruby-activesupport
372 ruby-rack
373 ruby-rack-test
374 ruby-rails-dom-testing
375 ruby-rails-html-sanitizer))
376 (synopsis "Conventions for building and testing MVC web applications")
377 (description
378 "ActionPack provides conventions for building and testing MVC web
379 applications. These work with any Rack-compatible server.")
380 (home-page "https://rubyonrails.org/")
381 (license license:expat)))
382
383 (define-public ruby-actioncable
384 (package
385 (name "ruby-actioncable")
386 (version "6.1.3")
387 (source
388 (origin
389 (method url-fetch)
390 (uri (rubygems-uri "actioncable" version))
391 (sha256
392 (base32
393 "1cgb1l0gml1vklxka2djpi5q5b4bgzgm5pahzfjvvgm5vzvrvi9v"))))
394 (build-system ruby-build-system)
395 (arguments
396 '(;; No included tests
397 #:tests? #f))
398 (propagated-inputs
399 (list ruby-actionpack ruby-activesupport ruby-nio4r
400 ruby-websocket-driver))
401 (synopsis "Integrate integrates WebSockets with Rails applications")
402 (description
403 "Action Cable integrates WebSockets with Rails applications. Through
404 WebSockets it allows for real-time features in web applications.")
405 (home-page "https://rubyonrails.org/")
406 (license license:expat)))
407
408 (define-public ruby-activejob
409 (package
410 (name "ruby-activejob")
411 (version "6.1.3")
412 (source
413 (origin
414 (method url-fetch)
415 (uri (rubygems-uri "activejob" version))
416 (sha256
417 (base32
418 "175d8q0achdlsxjsvq0w9znvfqfkgbj75kbmdrvg4fb277wwplmf"))))
419 (build-system ruby-build-system)
420 (arguments
421 '(;; No included tests
422 #:tests? #f))
423 (propagated-inputs
424 (list ruby-activesupport ruby-globalid))
425 (synopsis "Declare job classes for multiple backends")
426 (description
427 "ActiveJob allows declaring job classes in a common way across Rails
428 applications.")
429 (home-page "https://rubyonrails.org/")
430 (license license:expat)))
431
432 (define-public ruby-activestorage
433 (package
434 (name "ruby-activestorage")
435 (version "6.1.3")
436 (source
437 (origin
438 (method url-fetch)
439 (uri (rubygems-uri "activestorage" version))
440 (sha256
441 (base32
442 "0gkxvbi5w8zmdxpiyz3b10kzz8cxqqh9bj81sjl3fp8wa3v2ld4i"))))
443 (build-system ruby-build-system)
444 (arguments
445 '(;; No included tests
446 #:tests? #f))
447 (propagated-inputs
448 (list ruby-actionpack
449 ruby-activejob
450 ruby-activerecord
451 ruby-activesupport
452 ruby-marcel
453 ruby-mimemagic))
454 (synopsis "Integrate file storage services in to Rails applications")
455 (description
456 "ActiveStorage integrates file storage services with Rails applications,
457 allowing files to be attached to ActiveRecord models.")
458 (home-page "https://rubyonrails.org/")
459 (license license:expat)))
460
461 (define-public ruby-actionmailbox
462 (package
463 (name "ruby-actionmailbox")
464 (version "6.1.3")
465 (source
466 (origin
467 (method url-fetch)
468 (uri (rubygems-uri "actionmailbox" version))
469 (sha256
470 (base32
471 "0wv2p24xn4f0kj8kiyagkn934hzrcp98vzjqxwd4r75qq0cijadp"))))
472 (build-system ruby-build-system)
473 (arguments
474 '(;; No included tests
475 #:tests? #f))
476 (propagated-inputs
477 (list ruby-actionpack
478 ruby-activejob
479 ruby-activerecord
480 ruby-activestorage
481 ruby-activesupport
482 ruby-mail))
483 (synopsis "Receive and process incoming emails in Rails applications")
484 (description
485 "ActionMailbox receives and processes incoming emails in Rails applications.")
486 (home-page "https://rubyonrails.org")
487 (license license:expat)))
488
489 (define-public ruby-actionmailer
490 (package
491 (name "ruby-actionmailer")
492 (version "6.1.3")
493 (source
494 (origin
495 (method url-fetch)
496 (uri (rubygems-uri "actionmailer" version))
497 (sha256
498 (base32
499 "0lic4mc6wqi3p9ipdqljl64vd9ndabm0k8hww0m07sfdhwsl5ba9"))))
500 (build-system ruby-build-system)
501 (arguments
502 '(;; No included tests
503 #:tests? #f))
504 (propagated-inputs
505 (list ruby-actionpack
506 ruby-actionview
507 ruby-activejob
508 ruby-activesupport
509 ruby-mail
510 ruby-rails-dom-testing))
511 (synopsis "Work with emails using the controller/view pattern")
512 (description
513 "Compose, deliver, receive, and test emails using the controller/view
514 pattern. Including support for multipart email and attachments.")
515 (home-page "https://rubyonrails.org/")
516 (license license:expat)))
517
518 (define-public ruby-railties
519 (package
520 (name "ruby-railties")
521 (version "6.1.3")
522 (source
523 (origin
524 (method url-fetch)
525 (uri (rubygems-uri "railties" version))
526 (sha256
527 (base32
528 "1685y5dcfgcq0b38j13vrpkhiiblmrl64wa9w065669bkgmkw4ra"))))
529 (build-system ruby-build-system)
530 (arguments
531 '(;; No included tests
532 #:tests? #f))
533 (propagated-inputs
534 (list ruby-actionpack ruby-activesupport ruby-method-source ruby-rake
535 ruby-thor))
536 (synopsis "Rails internals, including application bootup and generators")
537 (description
538 "@code{railties} provides the core Rails internals including handling
539 application bootup, plugins, generators, and Rake tasks.")
540 (home-page "https://rubyonrails.org/")
541 (license license:expat)))
542
543 (define-public ruby-sprockets-rails
544 (package
545 (name "ruby-sprockets-rails")
546 (version "3.2.1")
547 (source
548 (origin
549 (method url-fetch)
550 (uri (rubygems-uri "sprockets-rails" version))
551 (sha256
552 (base32
553 "0ab42pm8p5zxpv3sfraq45b9lj39cz9mrpdirm30vywzrwwkm5p1"))))
554 (build-system ruby-build-system)
555 (arguments
556 '(;; No included tests
557 #:tests? #f))
558 (propagated-inputs
559 (list ruby-actionpack ruby-activesupport ruby-sprockets))
560 (synopsis "Sprockets Rails integration")
561 (description
562 "Provides Sprockets implementation for the Rails Asset Pipeline.")
563 (home-page
564 "https://github.com/rails/sprockets-rails")
565 (license license:expat)))
566
567 (define-public ruby-web-console
568 (package
569 (name "ruby-web-console")
570 (version "4.1.0")
571 (source
572 (origin
573 ;; Download from GitHub as test files are not provided in the gem.
574 (method git-fetch)
575 (uri (git-reference
576 (url "https://github.com/rails/web-console")
577 (commit (string-append "v" version))))
578 (file-name (git-file-name name version))
579 (sha256
580 (base32
581 "0azk8nmimnjbh74vxgwcj9jr588rj7kb5rrlclcjfjsw9jqjzckc"))))
582 (build-system ruby-build-system)
583 (arguments
584 '(#:phases
585 (modify-phases %standard-phases
586 (add-after 'unpack 'patch-Gemfile
587 (lambda _
588 (substitute* "Gemfile"
589 ;; Remove the github bit from the Gemfile, so that the Guix
590 ;; packages are used.
591 ((", github: .*") "\n")
592 ;; The usual methods of not loading this group don't work, so
593 ;; patch the Gemfile.
594 (("group :development") "[].each")
595 ;; tzinfo-data is propagated by ruby-activesupport, but it
596 ;; needs to be in the Gemfile to become available.
597 (("group :test do") "group :test do\n gem 'tzinfo-data'"))
598 #t)))))
599 (propagated-inputs
600 (list ruby-actionview ruby-activemodel ruby-bindex ruby-railties))
601 (native-inputs
602 (list bundler ruby-rails ruby-mocha ruby-simplecov))
603 (synopsis "Debugging tool for your Ruby on Rails applications")
604 (description
605 "This package allows you to create an interactive Ruby session in your
606 browser. Those sessions are launched automatically in case of an error and
607 can also be launched manually in any page.")
608 (home-page "https://github.com/rails/web-console")
609 (license license:expat)))
610
611 (define-public ruby-with-advisory-lock
612 (package
613 (name "ruby-with-advisory-lock")
614 (version "4.0.0")
615 (source
616 (origin
617 (method url-fetch)
618 (uri (rubygems-uri "with_advisory_lock" version))
619 (sha256
620 (base32
621 "1k37hxgmaqgsd54gplm5xim9nw3ghvqsbzaw7q4q64ha1nbd9a41"))))
622 (build-system ruby-build-system)
623 (arguments
624 '(#:tests? #f)) ; TODO Tests require a running MySQL service
625 (propagated-inputs
626 (list ruby-activerecord))
627 (native-inputs
628 (list bundler ruby-yard ruby-mysql2))
629 (synopsis "Advisory locking for ActiveRecord")
630 (description
631 "The With advisory lock gem adds advisory locking to ActiveRecord for
632 PostgreSQL and MySQL. SQLite is also supported, but this uses the file system
633 for locks.")
634 (home-page "https://closuretree.github.io/with_advisory_lock/")
635 (license license:expat)))
636
637 (define-public ruby-rails
638 (package
639 (name "ruby-rails")
640 (version "6.1.3")
641 (source
642 (origin
643 (method url-fetch)
644 (uri (rubygems-uri "rails" version))
645 (sha256
646 (base32
647 "0hdancysa617lzyy5gmrcmnpgyb1mz1lawy0l34ycz2wary7y2bz"))))
648 (build-system ruby-build-system)
649 (arguments
650 '(#:phases
651 (modify-phases %standard-phases
652 ;; This gem acts as glue between the gems that actually make up
653 ;; Rails. The important thing to check is that the gemspec matches up
654 ;; with the Guix packages and Rubygems can successfully activate the
655 ;; Rails gem.
656 ;;
657 ;; The following check phase tests this.
658 (delete 'check)
659 (add-after 'install 'check
660 (lambda* (#:key tests? outputs #:allow-other-keys)
661 (setenv "GEM_PATH"
662 (string-append
663 (getenv "GEM_PATH")
664 ":"
665 (assoc-ref outputs "out") "/lib/ruby/vendor_ruby"))
666 (when tests?
667 (invoke "ruby" "-e" "gem 'rails'"))
668 #t)))))
669 (propagated-inputs
670 (list ruby-actioncable
671 ruby-actionmailbox
672 ruby-actionmailer
673 ruby-actionpack
674 ruby-actiontext
675 ruby-actionview
676 ruby-activejob
677 ruby-activemodel
678 ruby-activerecord
679 ruby-activestorage
680 ruby-activesupport
681 bundler
682 ruby-railties
683 ruby-sprockets-rails))
684 (synopsis "Full-stack web framework optimized for programmer happiness")
685 (description
686 "Ruby on Rails is a full-stack web framework optimized for programmer
687 happiness and sustainable productivity. It encourages beautiful code by
688 favoring convention over configuration.")
689 (home-page "https://rubyonrails.org/")
690 (license license:expat)))