railties 6.1.6 → 7.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +626 -259
  3. data/MIT-LICENSE +1 -1
  4. data/RDOC_MAIN.md +99 -0
  5. data/README.rdoc +5 -6
  6. data/lib/minitest/rails_plugin.rb +64 -1
  7. data/lib/rails/all.rb +0 -1
  8. data/lib/rails/api/task.rb +35 -4
  9. data/lib/rails/app_updater.rb +9 -6
  10. data/lib/rails/application/bootstrap.rb +41 -7
  11. data/lib/rails/application/configuration.rb +262 -88
  12. data/lib/rails/application/default_middleware_stack.rb +29 -4
  13. data/lib/rails/application/dummy_config.rb +19 -0
  14. data/lib/rails/application/finisher.rb +89 -124
  15. data/lib/rails/application/routes_reloader.rb +8 -0
  16. data/lib/rails/application.rb +200 -125
  17. data/lib/rails/application_controller.rb +3 -3
  18. data/lib/rails/autoloaders/inflector.rb +21 -0
  19. data/lib/rails/autoloaders.rb +42 -42
  20. data/lib/rails/backtrace_cleaner.rb +1 -1
  21. data/lib/rails/cli.rb +5 -2
  22. data/lib/rails/code_statistics.rb +2 -2
  23. data/lib/rails/code_statistics_calculator.rb +10 -1
  24. data/lib/rails/command/actions.rb +10 -12
  25. data/lib/rails/command/base.rb +61 -45
  26. data/lib/rails/command/behavior.rb +1 -1
  27. data/lib/rails/command/environment_argument.rb +33 -17
  28. data/lib/rails/command/helpers/editor.rb +17 -12
  29. data/lib/rails/command.rb +90 -36
  30. data/lib/rails/commands/about/about_command.rb +14 -0
  31. data/lib/rails/commands/application/application_command.rb +2 -0
  32. data/lib/rails/commands/console/console_command.rb +17 -13
  33. data/lib/rails/commands/credentials/USAGE +53 -53
  34. data/lib/rails/commands/credentials/credentials_command/diffing.rb +31 -19
  35. data/lib/rails/commands/credentials/credentials_command.rb +67 -69
  36. data/lib/rails/commands/db/system/change/change_command.rb +2 -1
  37. data/lib/rails/commands/dbconsole/dbconsole_command.rb +26 -117
  38. data/lib/rails/commands/destroy/destroy_command.rb +3 -2
  39. data/lib/rails/commands/dev/dev_command.rb +1 -6
  40. data/lib/rails/commands/encrypted/USAGE +15 -20
  41. data/lib/rails/commands/encrypted/encrypted_command.rb +46 -35
  42. data/lib/rails/commands/gem_help/USAGE +16 -0
  43. data/lib/rails/commands/gem_help/gem_help_command.rb +13 -0
  44. data/lib/rails/commands/generate/generate_command.rb +2 -2
  45. data/lib/rails/commands/help/USAGE +15 -14
  46. data/lib/rails/commands/help/help_command.rb +21 -2
  47. data/lib/rails/commands/initializers/initializers_command.rb +1 -4
  48. data/lib/rails/commands/middleware/middleware_command.rb +17 -0
  49. data/lib/rails/commands/new/new_command.rb +2 -0
  50. data/lib/rails/commands/notes/notes_command.rb +2 -1
  51. data/lib/rails/commands/plugin/plugin_command.rb +2 -0
  52. data/lib/rails/commands/rake/rake_command.rb +25 -22
  53. data/lib/rails/commands/restart/restart_command.rb +14 -0
  54. data/lib/rails/commands/routes/routes_command.rb +13 -1
  55. data/lib/rails/commands/runner/USAGE +14 -12
  56. data/lib/rails/commands/runner/runner_command.rb +34 -21
  57. data/lib/rails/commands/secret/secret_command.rb +13 -0
  58. data/lib/rails/commands/secrets/USAGE +44 -49
  59. data/lib/rails/commands/secrets/secrets_command.rb +20 -38
  60. data/lib/rails/commands/server/server_command.rb +33 -30
  61. data/lib/rails/commands/test/USAGE +14 -0
  62. data/lib/rails/commands/test/test_command.rb +56 -14
  63. data/lib/rails/commands/unused_routes/unused_routes_command.rb +75 -0
  64. data/lib/rails/commands/version/version_command.rb +1 -0
  65. data/lib/rails/configuration.rb +23 -28
  66. data/lib/rails/console/app.rb +1 -4
  67. data/lib/rails/console/helpers.rb +2 -2
  68. data/lib/rails/deprecator.rb +7 -0
  69. data/lib/rails/engine/configuration.rb +53 -9
  70. data/lib/rails/engine.rb +63 -48
  71. data/lib/rails/gem_version.rb +3 -3
  72. data/lib/rails/generators/actions/create_migration.rb +2 -4
  73. data/lib/rails/generators/actions.rb +231 -73
  74. data/lib/rails/generators/active_model.rb +28 -14
  75. data/lib/rails/generators/app_base.rb +476 -176
  76. data/lib/rails/generators/app_name.rb +3 -14
  77. data/lib/rails/generators/base.rb +24 -20
  78. data/lib/rails/generators/database.rb +39 -1
  79. data/lib/rails/generators/erb/mailer/templates/layout.html.erb.tt +1 -1
  80. data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +2 -0
  81. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +8 -8
  82. data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +8 -4
  83. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +11 -28
  84. data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +7 -3
  85. data/lib/rails/generators/erb/scaffold/templates/partial.html.erb.tt +17 -0
  86. data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +8 -17
  87. data/lib/rails/generators/erb.rb +1 -1
  88. data/lib/rails/generators/generated_attribute.rb +57 -9
  89. data/lib/rails/generators/migration.rb +2 -7
  90. data/lib/rails/generators/model_helpers.rb +3 -2
  91. data/lib/rails/generators/named_base.rb +13 -13
  92. data/lib/rails/generators/rails/app/USAGE +22 -6
  93. data/lib/rails/generators/rails/app/app_generator.rb +113 -114
  94. data/lib/rails/generators/rails/app/templates/Dockerfile.tt +103 -0
  95. data/lib/rails/generators/rails/app/templates/Gemfile.tt +43 -53
  96. data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css.tt +2 -2
  97. data/lib/rails/generators/rails/app/templates/app/mailers/application_mailer.rb.tt +2 -2
  98. data/lib/rails/generators/rails/app/templates/app/models/application_record.rb.tt +1 -1
  99. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +3 -9
  100. data/lib/rails/generators/rails/app/templates/app/views/layouts/mailer.html.erb.tt +1 -1
  101. data/lib/rails/generators/rails/app/templates/bin/rails.tt +1 -4
  102. data/lib/rails/generators/rails/app/templates/bin/rake.tt +0 -3
  103. data/lib/rails/generators/rails/app/templates/bin/setup.tt +16 -12
  104. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +6 -18
  105. data/lib/rails/generators/rails/app/templates/config/boot.rb.tt +1 -1
  106. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +2 -2
  107. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +3 -3
  108. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +7 -7
  109. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +5 -5
  110. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +3 -3
  111. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +2 -2
  112. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +7 -9
  113. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +4 -4
  114. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +5 -5
  115. data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +59 -0
  116. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +16 -12
  117. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +38 -61
  118. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +14 -15
  119. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +3 -5
  120. data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +21 -28
  121. data/lib/rails/generators/rails/app/templates/config/initializers/cors.rb.tt +3 -3
  122. data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +3 -1
  123. data/lib/rails/generators/rails/app/templates/config/initializers/inflections.rb.tt +4 -4
  124. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt +283 -0
  125. data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +11 -9
  126. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +13 -15
  127. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +12 -20
  128. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +8 -1
  129. data/lib/rails/generators/rails/app/templates/config/storage.yml.tt +5 -5
  130. data/lib/rails/generators/rails/app/templates/db/seeds.rb.tt +6 -4
  131. data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +10 -0
  132. data/lib/rails/generators/rails/app/templates/dockerignore.tt +43 -0
  133. data/lib/rails/generators/rails/app/templates/gitattributes.tt +0 -5
  134. data/lib/rails/generators/rails/app/templates/gitignore.tt +7 -9
  135. data/lib/rails/generators/rails/app/templates/node-version.tt +1 -0
  136. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +10 -8
  137. data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +10 -8
  138. data/lib/rails/generators/rails/application_record/application_record_generator.rb +4 -0
  139. data/lib/rails/generators/rails/benchmark/benchmark_generator.rb +2 -1
  140. data/lib/rails/generators/rails/controller/USAGE +12 -4
  141. data/lib/rails/generators/rails/controller/controller_generator.rb +6 -2
  142. data/lib/rails/generators/rails/controller/templates/controller.rb.tt +1 -5
  143. data/lib/rails/generators/rails/credentials/credentials_generator.rb +29 -24
  144. data/lib/rails/generators/rails/credentials/templates/credentials.yml.tt +8 -0
  145. data/lib/rails/generators/rails/db/system/change/change_generator.rb +31 -1
  146. data/lib/rails/generators/rails/encryption_key_file/encryption_key_file_generator.rb +1 -2
  147. data/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt +1 -1
  148. data/lib/rails/generators/rails/migration/USAGE +21 -11
  149. data/lib/rails/generators/rails/model/model_generator.rb +4 -0
  150. data/lib/rails/generators/rails/plugin/USAGE +17 -6
  151. data/lib/rails/generators/rails/plugin/plugin_generator.rb +69 -30
  152. data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +7 -3
  153. data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +9 -31
  154. data/lib/rails/generators/rails/plugin/templates/MIT-LICENSE.tt +1 -1
  155. data/lib/rails/generators/rails/plugin/templates/README.md.tt +1 -1
  156. data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +2 -2
  157. data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +0 -3
  158. data/lib/rails/generators/rails/plugin/templates/bin/rails.tt +5 -20
  159. data/lib/rails/generators/rails/plugin/templates/gitignore.tt +0 -7
  160. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +2 -2
  161. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/version.rb.tt +1 -1
  162. data/lib/rails/generators/rails/plugin/templates/rails/boot.rb.tt +2 -2
  163. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +6 -11
  164. data/lib/rails/generators/rails/resource/resource_generator.rb +6 -0
  165. data/lib/rails/generators/rails/scaffold/scaffold_generator.rb +2 -20
  166. data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +1 -1
  167. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +1 -5
  168. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +6 -10
  169. data/lib/rails/generators/resource_helpers.rb +2 -2
  170. data/lib/rails/generators/test_case.rb +2 -2
  171. data/lib/rails/generators/test_unit/generator/templates/generator_test.rb.tt +1 -1
  172. data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +2 -2
  173. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +4 -4
  174. data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +5 -5
  175. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +7 -7
  176. data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +9 -11
  177. data/lib/rails/generators/testing/{behaviour.rb → behavior.rb} +7 -5
  178. data/lib/rails/generators.rb +14 -29
  179. data/lib/rails/health_controller.rb +55 -0
  180. data/lib/rails/info.rb +2 -2
  181. data/lib/rails/info_controller.rb +31 -13
  182. data/lib/rails/initializable.rb +1 -1
  183. data/lib/rails/mailers_controller.rb +17 -9
  184. data/lib/rails/paths.rb +14 -11
  185. data/lib/rails/rack/logger.rb +16 -15
  186. data/lib/rails/rackup/server.rb +15 -0
  187. data/lib/rails/railtie/configuration.rb +15 -3
  188. data/lib/rails/railtie.rb +54 -31
  189. data/lib/rails/ruby_version_check.rb +5 -3
  190. data/lib/rails/secrets.rb +10 -8
  191. data/lib/rails/source_annotation_extractor.rb +68 -19
  192. data/lib/rails/tasks/engine.rake +8 -8
  193. data/lib/rails/tasks/framework.rake +4 -12
  194. data/lib/rails/tasks/log.rake +1 -1
  195. data/lib/rails/tasks/misc.rake +3 -14
  196. data/lib/rails/tasks/statistics.rake +8 -5
  197. data/lib/rails/tasks/tmp.rake +13 -6
  198. data/lib/rails/tasks/yarn.rake +8 -9
  199. data/lib/rails/tasks/zeitwerk.rake +14 -42
  200. data/lib/rails/tasks.rb +0 -2
  201. data/lib/rails/templates/layouts/application.html.erb +15 -0
  202. data/lib/rails/templates/rails/mailers/email.html.erb +45 -11
  203. data/lib/rails/templates/rails/mailers/index.html.erb +14 -7
  204. data/lib/rails/templates/rails/mailers/mailer.html.erb +11 -5
  205. data/lib/rails/templates/rails/welcome/index.html.erb +65 -48
  206. data/lib/rails/test_help.rb +13 -14
  207. data/lib/rails/test_unit/line_filtering.rb +1 -1
  208. data/lib/rails/test_unit/railtie.rb +0 -4
  209. data/lib/rails/test_unit/reporter.rb +6 -2
  210. data/lib/rails/test_unit/runner.rb +45 -20
  211. data/lib/rails/test_unit/test_parser.rb +88 -0
  212. data/lib/rails/test_unit/testing.rake +18 -43
  213. data/lib/rails/testing/maintain_test_schema.rb +16 -0
  214. data/lib/rails/version.rb +1 -1
  215. data/lib/rails/welcome_controller.rb +1 -0
  216. data/lib/rails/zeitwerk_checker.rb +15 -0
  217. data/lib/rails.rb +26 -15
  218. metadata +74 -42
  219. data/RDOC_MAIN.rdoc +0 -97
  220. data/lib/rails/.DS_Store +0 -0
  221. data/lib/rails/application/dummy_erb_compiler.rb +0 -18
  222. data/lib/rails/command/spellchecker.rb +0 -57
  223. data/lib/rails/generators/css/assets/assets_generator.rb +0 -15
  224. data/lib/rails/generators/css/assets/templates/stylesheet.css +0 -4
  225. data/lib/rails/generators/css/scaffold/scaffold_generator.rb +0 -18
  226. data/lib/rails/generators/rails/app/templates/app/javascript/channels/consumer.js +0 -6
  227. data/lib/rails/generators/rails/app/templates/app/javascript/channels/index.js +0 -5
  228. data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +0 -23
  229. data/lib/rails/generators/rails/app/templates/bin/spring.tt +0 -13
  230. data/lib/rails/generators/rails/app/templates/bin/yarn.tt +0 -16
  231. data/lib/rails/generators/rails/app/templates/config/initializers/application_controller_renderer.rb.tt +0 -8
  232. data/lib/rails/generators/rails/app/templates/config/initializers/backtrace_silencers.rb.tt +0 -8
  233. data/lib/rails/generators/rails/app/templates/config/initializers/cookies_serializer.rb.tt +0 -5
  234. data/lib/rails/generators/rails/app/templates/config/initializers/mime_types.rb.tt +0 -4
  235. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_1.rb.tt +0 -67
  236. data/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt +0 -16
  237. data/lib/rails/generators/rails/app/templates/config/spring.rb.tt +0 -6
  238. data/lib/rails/generators/rails/app/templates/package.json.tt +0 -11
  239. data/lib/rails/generators/rails/assets/USAGE +0 -16
  240. data/lib/rails/generators/rails/assets/assets_generator.rb +0 -26
  241. data/lib/rails/generators/rails/assets/templates/stylesheet.css +0 -4
  242. data/lib/rails/generators/rails/model/USAGE +0 -113
  243. data/lib/rails/generators/rails/scaffold/templates/scaffold.css +0 -80
  244. data/lib/rails/tasks/middleware.rake +0 -9
  245. data/lib/rails/tasks/restart.rake +0 -9
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2004-2022 David Heinemeier Hansson
1
+ Copyright (c) David Heinemeier Hansson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/RDOC_MAIN.md ADDED
@@ -0,0 +1,99 @@
1
+ # Welcome to \Rails
2
+
3
+ ## What's \Rails?
4
+
5
+ \Rails is a web-application framework that includes everything needed to
6
+ create database-backed web applications according to the
7
+ [Model-View-Controller (MVC)](https://en.wikipedia.org/wiki/Model-view-controller)
8
+ pattern.
9
+
10
+ Understanding the MVC pattern is key to understanding \Rails. MVC divides your
11
+ application into three layers: Model, View, and Controller, each with a specific responsibility.
12
+
13
+ ## Model layer
14
+
15
+ The _**Model layer**_ represents the domain model (such as Account, Product,
16
+ Person, Post, etc.) and encapsulates the business logic specific to
17
+ your application. In \Rails, database-backed model classes are derived from
18
+ `ActiveRecord::Base`. [Active Record](files/activerecord/README.rdoc) allows you to present the data from
19
+ database rows as objects and embellish these data objects with business logic
20
+ methods.
21
+ Although most \Rails models are backed by a database, models can also be ordinary
22
+ Ruby classes, or Ruby classes that implement a set of interfaces as provided by
23
+ the [Active Model](files/activemodel/README.rdoc) module.
24
+
25
+ ## View layer
26
+
27
+ The _**View layer**_ is composed of "templates" that are responsible for providing
28
+ appropriate representations of your application's resources. Templates can
29
+ come in a variety of formats, but most view templates are HTML with embedded
30
+ Ruby code (\ERB files). Views are typically rendered to generate a controller response
31
+ or to generate the body of an email. In \Rails, View generation is handled by [Action View](files/actionview/README.rdoc).
32
+
33
+ ## Controller layer
34
+
35
+ The _**Controller layer**_ is responsible for handling incoming HTTP requests and
36
+ providing a suitable response. Usually, this means returning HTML, but \Rails controllers
37
+ can also generate XML, JSON, PDFs, mobile-specific views, and more. Controllers load and
38
+ manipulate models, and render view templates in order to generate the appropriate HTTP response.
39
+ In \Rails, incoming requests are routed by Action Dispatch to an appropriate controller, and
40
+ controller classes are derived from `ActionController::Base`. Action Dispatch and Action Controller
41
+ are bundled together in [Action Pack](files/actionpack/README.rdoc).
42
+
43
+ ## Frameworks and libraries
44
+
45
+ [Active Record](files/activerecord/README.rdoc), [Active Model](files/activemodel/README.rdoc), [Action Pack](files/actionpack/README.rdoc), and [Action View](files/actionview/README.rdoc) can each be used independently outside \Rails.
46
+
47
+ In addition to that, \Rails also comes with:
48
+
49
+ - [Action Mailer](files/actionmailer/README.rdoc), a library to generate and send emails
50
+ - [Action Mailbox](files/actionmailbox/README.md), a library to receive emails within a \Rails application
51
+ - [Active Job](files/activejob/README.md), a framework for declaring jobs and making them run on a variety of queuing backends
52
+ - [Action Cable](files/actioncable/README.md), a framework to integrate WebSockets with a \Rails application
53
+ - [Active Storage](files/activestorage/README.md), a library to attach cloud and local files to \Rails applications
54
+ - [Action Text](files/actiontext/README.md), a library to handle rich text content
55
+ - [Active Support](files/activesupport/README.rdoc), a collection of utility classes and standard library extensions that are useful for \Rails, and may also be used independently outside \Rails
56
+
57
+ ## Getting Started
58
+
59
+ 1. Install \Rails at the command prompt if you haven't yet:
60
+
61
+ $ gem install rails
62
+
63
+ 2. At the command prompt, create a new \Rails application:
64
+
65
+ $ rails new myapp
66
+
67
+ where "myapp" is the application name.
68
+
69
+ 3. Change directory to `myapp` and start the web server:
70
+
71
+ $ cd myapp
72
+ $ bin/rails server
73
+
74
+ Run with `--help` or `-h` for options.
75
+
76
+ 4. Go to `http://localhost:3000` and you'll see the \Rails bootscreen with your
77
+ \Rails and Ruby versions.
78
+
79
+ 5. Follow the guidelines to start developing your application. You may find the
80
+ following resources handy:
81
+
82
+ * [Getting Started with Rails](https://guides.rubyonrails.org/getting_started.html)
83
+ * [Ruby on Rails Guides](https://guides.rubyonrails.org)
84
+ * [The API Documentation](https://api.rubyonrails.org)
85
+
86
+ ## Contributing
87
+
88
+ We encourage you to contribute to Ruby on \Rails! Please check out the
89
+ [Contributing to Ruby on Rails guide](https://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html) for guidelines about how to proceed. [Join us!](https://contributors.rubyonrails.org)
90
+
91
+ Trying to report a possible security vulnerability in \Rails? Please
92
+ check out our [security policy](https://rubyonrails.org/security) for
93
+ guidelines about how to proceed.
94
+
95
+ Everyone interacting in \Rails and its sub-projects' codebases, issue trackers, chat rooms, and mailing lists is expected to follow the \Rails [code of conduct](https://rubyonrails.org/conduct).
96
+
97
+ ## License
98
+
99
+ Ruby on \Rails is released under the [MIT License](https://opensource.org/licenses/MIT).
data/README.rdoc CHANGED
@@ -1,13 +1,12 @@
1
- = Railties -- Gluing the Engine to the Rails
1
+ = Railties -- Gluing the Engine to the \Rails
2
2
 
3
3
  Railties is responsible for gluing all frameworks together. Overall, it:
4
4
 
5
- * handles the bootstrapping process for a Rails application;
5
+ * handles the bootstrapping process for a \Rails application;
6
6
 
7
7
  * manages the +rails+ command line interface;
8
8
 
9
- * and provides the Rails generators core.
10
-
9
+ * and provides the \Rails generators core.
11
10
 
12
11
  == Download
13
12
 
@@ -15,7 +14,7 @@ The latest version of Railties can be installed with RubyGems:
15
14
 
16
15
  * gem install railties
17
16
 
18
- Source code can be downloaded as part of the Rails project on GitHub
17
+ Source code can be downloaded as part of the \Rails project on GitHub
19
18
 
20
19
  * https://github.com/rails/rails/tree/main/railties
21
20
 
@@ -31,7 +30,7 @@ API documentation is at
31
30
 
32
31
  * https://api.rubyonrails.org
33
32
 
34
- Bug reports can be filed for the Ruby on Rails project here:
33
+ Bug reports can be filed for the Ruby on \Rails project here:
35
34
 
36
35
  * https://github.com/rails/rails/issues
37
36
 
@@ -25,6 +25,46 @@ module Minitest
25
25
  end
26
26
  end
27
27
 
28
+ class ProfileReporter < StatisticsReporter
29
+ def initialize(io = $stdout, options = {})
30
+ super
31
+ @results = []
32
+ @count = options[:profile]
33
+ end
34
+
35
+ def record(result)
36
+ @results << result
37
+ end
38
+
39
+ def report
40
+ total_time = @results.sum(&:time)
41
+
42
+ @results.sort! { |a, b| b.time <=> a.time }
43
+ slow_results = @results.take(@count)
44
+ slow_tests_total_time = slow_results.sum(&:time)
45
+
46
+ ratio = (total_time == 0) ? 0.0 : (slow_tests_total_time / total_time) * 100
47
+
48
+ io.puts("\nTop %d slowest tests (%.2f seconds, %.1f%% of total time):\n" % [slow_results.size, slow_tests_total_time, ratio])
49
+ slow_results.each do |result|
50
+ io.puts(" %s\n %.4f seconds %s\n" % [result.location, result.time, source_location(result)])
51
+ end
52
+ io.puts("\n")
53
+ end
54
+
55
+ private
56
+ def source_location(result)
57
+ filename, line = result.source_location
58
+ return "" unless filename
59
+
60
+ pwd = Dir.pwd
61
+ if filename.start_with?(pwd)
62
+ filename = Pathname.new(filename).relative_path_from(pwd)
63
+ end
64
+ "#{filename}:#{line}"
65
+ end
66
+ end
67
+
28
68
  def self.plugin_rails_options(opts, options)
29
69
  ::Rails::TestUnit::Runner.attach_before_load_options(opts)
30
70
 
@@ -44,12 +84,30 @@ module Minitest
44
84
  options[:color] = value
45
85
  end
46
86
 
87
+ opts.on("--profile [COUNT]", "Enable profiling of tests and list the slowest test cases (default: 10)") do |value|
88
+ default_count = 10
89
+
90
+ if value.nil?
91
+ count = default_count
92
+ else
93
+ count = Integer(value, exception: false)
94
+ if count.nil?
95
+ warn("Non integer specified as profile count, separate " \
96
+ "your path from options with -- e.g. " \
97
+ "`bin/test --profile -- #{value}`")
98
+ count = default_count
99
+ end
100
+ end
101
+
102
+ options[:profile] = count
103
+ end
104
+
47
105
  options[:color] = true
48
106
  options[:output_inline] = true
49
107
  end
50
108
 
51
109
  # Owes great inspiration to test runner trailblazers like RSpec,
52
- # minitest-reporters, maxitest and others.
110
+ # minitest-reporters, maxitest, and others.
53
111
  def self.plugin_rails_init(options)
54
112
  unless options[:full_backtrace] || ENV["BACKTRACE"]
55
113
  # Plugin can run without Rails loaded, check before filtering.
@@ -67,6 +125,11 @@ module Minitest
67
125
  if reporter.reporters.reject! { |reporter| reporter.kind_of?(ProgressReporter) }
68
126
  reporter << ::Rails::TestUnitReporter.new(options[:io], options)
69
127
  end
128
+
129
+ # Add slowest tests reporter at the end.
130
+ if options[:profile]
131
+ reporter << ProfileReporter.new(options[:io], options)
132
+ end
70
133
  end
71
134
 
72
135
  # Backwards compatibility with Rails 5.0 generated plugin test scripts
data/lib/rails/all.rb CHANGED
@@ -15,7 +15,6 @@ require "rails"
15
15
  action_mailbox/engine
16
16
  action_text/engine
17
17
  rails/test_unit/railtie
18
- sprockets/railtie
19
18
  ).each do |railtie|
20
19
  begin
21
20
  require railtie
@@ -10,6 +10,7 @@ module Rails
10
10
  "activesupport" => {
11
11
  include: %w(
12
12
  README.rdoc
13
+ lib/active_support.rb
13
14
  lib/active_support/**/*.rb
14
15
  )
15
16
  },
@@ -17,6 +18,7 @@ module Rails
17
18
  "activerecord" => {
18
19
  include: %w(
19
20
  README.rdoc
21
+ lib/active_record.rb
20
22
  lib/active_record/**/*.rb
21
23
  lib/arel.rb
22
24
  )
@@ -25,6 +27,7 @@ module Rails
25
27
  "activemodel" => {
26
28
  include: %w(
27
29
  README.rdoc
30
+ lib/active_model.rb
28
31
  lib/active_model/**/*.rb
29
32
  )
30
33
  },
@@ -33,7 +36,9 @@ module Rails
33
36
  include: %w(
34
37
  README.rdoc
35
38
  lib/abstract_controller/**/*.rb
39
+ lib/action_controller.rb
36
40
  lib/action_controller/**/*.rb
41
+ lib/action_dispatch.rb
37
42
  lib/action_dispatch/**/*.rb
38
43
  )
39
44
  },
@@ -41,6 +46,7 @@ module Rails
41
46
  "actionview" => {
42
47
  include: %w(
43
48
  README.rdoc
49
+ lib/action_view.rb
44
50
  lib/action_view/**/*.rb
45
51
  ),
46
52
  exclude: "lib/action_view/vendor/*"
@@ -49,6 +55,7 @@ module Rails
49
55
  "actionmailer" => {
50
56
  include: %w(
51
57
  README.rdoc
58
+ lib/action_mailer.rb
52
59
  lib/action_mailer/**/*.rb
53
60
  )
54
61
  },
@@ -56,6 +63,7 @@ module Rails
56
63
  "activejob" => {
57
64
  include: %w(
58
65
  README.md
66
+ lib/active_job.rb
59
67
  lib/active_job/**/*.rb
60
68
  )
61
69
  },
@@ -63,6 +71,7 @@ module Rails
63
71
  "actioncable" => {
64
72
  include: %w(
65
73
  README.md
74
+ lib/action_cable.rb
66
75
  lib/action_cable/**/*.rb
67
76
  )
68
77
  },
@@ -71,6 +80,7 @@ module Rails
71
80
  include: %w(
72
81
  README.md
73
82
  app/**/active_storage/**/*.rb
83
+ lib/active_storage.rb
74
84
  lib/active_storage/**/*.rb
75
85
  )
76
86
  },
@@ -79,6 +89,7 @@ module Rails
79
89
  include: %w(
80
90
  README.md
81
91
  app/**/action_mailbox/**/*.rb
92
+ lib/action_mailbox.rb
82
93
  lib/action_mailbox/**/*.rb
83
94
  )
84
95
  },
@@ -87,6 +98,7 @@ module Rails
87
98
  include: %w(
88
99
  README.md
89
100
  app/**/action_text/**/*.rb
101
+ lib/action_text.rb
90
102
  lib/action_text/**/*.rb
91
103
  )
92
104
  },
@@ -150,8 +162,8 @@ module Rails
150
162
 
151
163
  # Only generate documentation for files that have been
152
164
  # changed since the API was generated.
153
- if Dir.exist?("doc/rdoc") && !ENV["ALL"]
154
- last_generation = DateTime.rfc2822(File.open("doc/rdoc/created.rid", &:readline))
165
+ if Dir.exist?(api_dir) && !ENV["ALL"]
166
+ last_generation = DateTime.rfc2822(File.open("#{api_dir}/created.rid", &:readline))
155
167
 
156
168
  rdoc_files.keep_if do |file|
157
169
  File.mtime(file).to_datetime > last_generation
@@ -162,13 +174,16 @@ module Rails
162
174
  end
163
175
  end
164
176
 
165
- def setup_horo_variables
177
+ # These variables are used by the sdoc template
178
+ def setup_horo_variables # :nodoc:
166
179
  ENV["HORO_PROJECT_NAME"] = "Ruby on Rails"
167
180
  ENV["HORO_PROJECT_VERSION"] = rails_version
181
+ ENV["HORO_BADGE_VERSION"] = badge_version
182
+ ENV["HORO_CANONICAL_URL"] = canonical_url
168
183
  end
169
184
 
170
185
  def api_main
171
- component_root_dir("railties") + "/RDOC_MAIN.rdoc"
186
+ component_root_dir("railties") + "/RDOC_MAIN.md"
172
187
  end
173
188
  end
174
189
 
@@ -191,12 +206,28 @@ module Rails
191
206
  def rails_version
192
207
  "main@#{`git rev-parse HEAD`[0, 7]}"
193
208
  end
209
+
210
+ def badge_version
211
+ "edge"
212
+ end
213
+
214
+ def canonical_url
215
+ "https://edgeapi.rubyonrails.org"
216
+ end
194
217
  end
195
218
 
196
219
  class StableTask < RepoTask
197
220
  def rails_version
198
221
  File.read("RAILS_VERSION").strip
199
222
  end
223
+
224
+ def badge_version
225
+ "v#{rails_version}"
226
+ end
227
+
228
+ def canonical_url
229
+ "https://api.rubyonrails.org/#{badge_version}"
230
+ end
200
231
  end
201
232
  end
202
233
  end
@@ -13,7 +13,7 @@ module Rails
13
13
  def app_generator
14
14
  @app_generator ||= begin
15
15
  gen = Rails::Generators::AppGenerator.new ["rails"], generator_options, destination_root: Rails.root
16
- File.exist?(Rails.root.join("config", "application.rb")) ? gen.send(:app_const) : gen.send(:valid_const?)
16
+ gen.send(:valid_const?) unless File.exist?(Rails.root.join("config", "application.rb"))
17
17
  gen
18
18
  end
19
19
  end
@@ -21,15 +21,18 @@ module Rails
21
21
  private
22
22
  def generator_options
23
23
  options = { api: !!Rails.application.config.api_only, update: true }
24
- options[:skip_javascript] = !File.exist?(Rails.root.join("bin", "yarn"))
24
+ options[:name] = Rails.application.class.name.chomp("::Application").underscore
25
+ options[:skip_active_job] = !defined?(ActiveJob::Railtie)
25
26
  options[:skip_active_record] = !defined?(ActiveRecord::Railtie)
26
- options[:skip_active_storage] = !defined?(ActiveStorage::Engine) || !defined?(ActiveRecord::Railtie)
27
+ options[:skip_active_storage] = !defined?(ActiveStorage::Engine)
27
28
  options[:skip_action_mailer] = !defined?(ActionMailer::Railtie)
29
+ options[:skip_action_mailbox] = !defined?(ActionMailbox::Engine)
30
+ options[:skip_action_text] = !defined?(ActionText::Engine)
28
31
  options[:skip_action_cable] = !defined?(ActionCable::Engine)
29
- options[:skip_sprockets] = !defined?(Sprockets::Railtie)
30
- options[:skip_puma] = !defined?(Puma)
32
+ options[:skip_test] = !defined?(Rails::TestUnitRailtie)
33
+ options[:skip_system_test] = Rails.application.config.generators.system_tests.nil?
34
+ options[:skip_asset_pipeline] = !defined?(Sprockets::Railtie) && !defined?(Propshaft::Railtie)
31
35
  options[:skip_bootsnap] = !defined?(Bootsnap)
32
- options[:skip_spring] = !defined?(Spring)
33
36
  options
34
37
  end
35
38
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "fileutils"
4
+ require "set"
4
5
  require "active_support/notifications"
5
6
  require "active_support/dependencies"
6
7
  require "active_support/descendants_tracker"
@@ -27,14 +28,18 @@ module Rails
27
28
  * production - set it to true
28
29
 
29
30
  INFO
30
- config.eager_load = config.cache_classes
31
+ config.eager_load = !config.reloading_enabled?
31
32
  end
32
33
  end
33
34
 
34
35
  # Initialize the logger early in the stack in case we need to log some deprecation.
35
36
  initializer :initialize_logger, group: :all do
36
37
  Rails.logger ||= config.logger || begin
37
- logger = ActiveSupport::Logger.new(config.default_log_file)
38
+ logger = if config.log_file_size
39
+ ActiveSupport::Logger.new(config.default_log_file, 1, config.log_file_size)
40
+ else
41
+ ActiveSupport::Logger.new(config.default_log_file)
42
+ end
38
43
  logger.formatter = config.log_formatter
39
44
  logger = ActiveSupport::TaggedLogging.new(logger)
40
45
  logger
@@ -44,17 +49,29 @@ module Rails
44
49
  logger.level = ActiveSupport::Logger::WARN
45
50
  logger.warn(
46
51
  "Rails Error: Unable to access log file. Please ensure that #{path} exists and is writable " \
47
- "(ie, make it writable for user and group: chmod 0664 #{path}). " \
52
+ "(i.e. make it writable for user and group: chmod 0664 #{path}). " \
48
53
  "The log level has been raised to WARN and the output directed to STDERR until the problem is fixed."
49
54
  )
50
55
  logger
51
56
  end
52
57
 
53
- Rails.logger.level = ActiveSupport::Logger.const_get(config.log_level.to_s.upcase)
58
+ unless Rails.logger.is_a?(ActiveSupport::BroadcastLogger)
59
+ Rails.logger.level = ActiveSupport::Logger.const_get(config.log_level.to_s.upcase)
60
+ broadcast_logger = ActiveSupport::BroadcastLogger.new(Rails.logger)
61
+ broadcast_logger.formatter = Rails.logger.formatter
62
+ Rails.logger = broadcast_logger
63
+ end
64
+
65
+ unless config.consider_all_requests_local
66
+ Rails.error.logger = Rails.logger
67
+ end
54
68
  end
55
69
 
56
70
  # Initialize cache early in the stack so railties can make use of it.
57
71
  initializer :initialize_cache, group: :all do
72
+ cache_format_version = config.active_support.delete(:cache_format_version)
73
+ ActiveSupport.cache_format_version = cache_format_version if cache_format_version
74
+
58
75
  unless Rails.cache
59
76
  Rails.cache = ActiveSupport::Cache.lookup_store(*config.cache_store)
60
77
 
@@ -64,9 +81,26 @@ module Rails
64
81
  end
65
82
  end
66
83
 
67
- # Sets the dependency loading mechanism.
68
- initializer :initialize_dependency_mechanism, group: :all do
69
- ActiveSupport::Dependencies.mechanism = config.cache_classes ? :require : :load
84
+ # We setup the once autoloader this early so that engines and applications
85
+ # are able to autoload from these paths during initialization.
86
+ initializer :setup_once_autoloader, after: :set_eager_load_paths, before: :bootstrap_hook do
87
+ autoloader = Rails.autoloaders.once
88
+
89
+ # Normally empty, but if the user already defined some, we won't
90
+ # override them. Important if there are custom namespaces associated.
91
+ already_configured_dirs = Set.new(autoloader.dirs)
92
+
93
+ ActiveSupport::Dependencies.autoload_once_paths.freeze
94
+ ActiveSupport::Dependencies.autoload_once_paths.uniq.each do |path|
95
+ # Zeitwerk only accepts existing directories in `push_dir`.
96
+ next unless File.directory?(path)
97
+ next if already_configured_dirs.member?(path.to_s)
98
+
99
+ autoloader.push_dir(path)
100
+ autoloader.do_not_eager_load(path) unless ActiveSupport::Dependencies.eager_load?(path)
101
+ end
102
+
103
+ autoloader.setup
70
104
  end
71
105
 
72
106
  initializer :bootstrap_hook, group: :all do |app|