railties 6.0.0 → 7.1.3.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (286) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +699 -245
  3. data/MIT-LICENSE +1 -1
  4. data/RDOC_MAIN.md +99 -0
  5. data/README.rdoc +7 -8
  6. data/lib/minitest/rails_plugin.rb +80 -2
  7. data/lib/rails/all.rb +0 -1
  8. data/lib/rails/api/task.rb +37 -5
  9. data/lib/rails/app_updater.rb +9 -6
  10. data/lib/rails/application/bootstrap.rb +52 -14
  11. data/lib/rails/application/configuration.rb +327 -86
  12. data/lib/rails/application/default_middleware_stack.rb +33 -7
  13. data/lib/rails/application/dummy_config.rb +19 -0
  14. data/lib/rails/application/finisher.rb +94 -113
  15. data/lib/rails/application/routes_reloader.rb +17 -3
  16. data/lib/rails/application.rb +258 -201
  17. data/lib/rails/application_controller.rb +3 -4
  18. data/lib/rails/autoloaders/inflector.rb +21 -0
  19. data/lib/rails/autoloaders.rb +42 -42
  20. data/lib/rails/backtrace_cleaner.rb +13 -8
  21. data/lib/rails/cli.rb +5 -2
  22. data/lib/rails/code_statistics.rb +6 -4
  23. data/lib/rails/code_statistics_calculator.rb +16 -7
  24. data/lib/rails/command/actions.rb +10 -12
  25. data/lib/rails/command/base.rb +66 -46
  26. data/lib/rails/command/behavior.rb +3 -3
  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 -32
  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 +54 -39
  34. data/lib/rails/commands/credentials/credentials_command/diffing.rb +53 -0
  35. data/lib/rails/commands/credentials/credentials_command.rb +83 -60
  36. data/lib/rails/commands/db/system/change/change_command.rb +8 -2
  37. data/lib/rails/commands/dbconsole/dbconsole_command.rb +39 -124
  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 +3 -3
  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 +5 -14
  51. data/lib/rails/commands/plugin/plugin_command.rb +2 -0
  52. data/lib/rails/commands/rake/rake_command.rb +27 -23
  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 -43
  59. data/lib/rails/commands/secrets/secrets_command.rb +20 -38
  60. data/lib/rails/commands/server/server_command.rb +40 -64
  61. data/lib/rails/commands/test/USAGE +14 -0
  62. data/lib/rails/commands/test/test_command.rb +58 -16
  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 +53 -23
  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 +54 -9
  70. data/lib/rails/engine/updater.rb +1 -1
  71. data/lib/rails/engine.rb +105 -81
  72. data/lib/rails/gem_version.rb +5 -5
  73. data/lib/rails/generators/actions/create_migration.rb +9 -5
  74. data/lib/rails/generators/actions.rb +275 -97
  75. data/lib/rails/generators/active_model.rb +28 -14
  76. data/lib/rails/generators/app_base.rb +487 -165
  77. data/lib/rails/generators/app_name.rb +3 -14
  78. data/lib/rails/generators/base.rb +42 -31
  79. data/lib/rails/generators/database.rb +41 -4
  80. data/lib/rails/generators/erb/mailer/mailer_generator.rb +0 -1
  81. data/lib/rails/generators/erb/mailer/templates/layout.html.erb.tt +1 -1
  82. data/lib/rails/generators/erb/scaffold/scaffold_generator.rb +2 -1
  83. data/lib/rails/generators/erb/scaffold/templates/_form.html.erb.tt +11 -11
  84. data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +8 -4
  85. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +11 -28
  86. data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +7 -3
  87. data/lib/rails/generators/erb/scaffold/templates/partial.html.erb.tt +17 -0
  88. data/lib/rails/generators/erb/scaffold/templates/show.html.erb.tt +8 -17
  89. data/lib/rails/generators/erb.rb +1 -2
  90. data/lib/rails/generators/generated_attribute.rb +60 -19
  91. data/lib/rails/generators/migration.rb +4 -8
  92. data/lib/rails/generators/model_helpers.rb +29 -4
  93. data/lib/rails/generators/named_base.rb +15 -15
  94. data/lib/rails/generators/rails/app/USAGE +23 -6
  95. data/lib/rails/generators/rails/app/app_generator.rb +151 -80
  96. data/lib/rails/generators/rails/app/templates/Dockerfile.tt +103 -0
  97. data/lib/rails/generators/rails/app/templates/Gemfile.tt +44 -54
  98. data/lib/rails/generators/rails/app/templates/Rakefile.tt +1 -1
  99. data/lib/rails/generators/rails/app/templates/app/assets/stylesheets/application.css.tt +2 -2
  100. data/lib/rails/generators/rails/app/templates/app/mailers/application_mailer.rb.tt +2 -2
  101. data/lib/rails/generators/rails/app/templates/app/models/application_record.rb.tt +1 -1
  102. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +4 -9
  103. data/lib/rails/generators/rails/app/templates/app/views/layouts/mailer.html.erb.tt +1 -1
  104. data/lib/rails/generators/rails/app/templates/bin/rails.tt +3 -3
  105. data/lib/rails/generators/rails/app/templates/bin/rake.tt +2 -2
  106. data/lib/rails/generators/rails/app/templates/bin/setup.tt +19 -15
  107. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +18 -23
  108. data/lib/rails/generators/rails/app/templates/config/boot.rb.tt +3 -3
  109. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +5 -6
  110. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +12 -11
  111. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +17 -16
  112. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +5 -5
  113. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +12 -11
  114. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +12 -11
  115. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +17 -18
  116. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +4 -4
  117. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +14 -13
  118. data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +59 -0
  119. data/lib/rails/generators/rails/app/templates/config/environment.rb.tt +1 -1
  120. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +32 -14
  121. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +42 -55
  122. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +27 -15
  123. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +3 -5
  124. data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +21 -28
  125. data/lib/rails/generators/rails/app/templates/config/initializers/cors.rb.tt +3 -3
  126. data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +6 -2
  127. data/lib/rails/generators/rails/app/templates/config/initializers/inflections.rb.tt +4 -4
  128. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt +284 -0
  129. data/lib/rails/generators/rails/app/templates/config/initializers/permissions_policy.rb.tt +13 -0
  130. data/lib/rails/generators/rails/app/templates/config/locales/en.yml +13 -15
  131. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +17 -20
  132. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +8 -1
  133. data/lib/rails/generators/rails/app/templates/config/storage.yml.tt +5 -5
  134. data/lib/rails/generators/rails/app/templates/config.ru.tt +2 -1
  135. data/lib/rails/generators/rails/app/templates/db/seeds.rb.tt +7 -5
  136. data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +10 -0
  137. data/lib/rails/generators/rails/app/templates/dockerignore.tt +43 -0
  138. data/lib/rails/generators/rails/app/templates/gitattributes.tt +9 -0
  139. data/lib/rails/generators/rails/app/templates/gitignore.tt +12 -9
  140. data/lib/rails/generators/rails/app/templates/node-version.tt +1 -0
  141. data/lib/rails/generators/rails/app/templates/test/channels/application_cable/connection_test.rb.tt +10 -8
  142. data/lib/rails/generators/rails/app/templates/test/test_helper.rb.tt +13 -11
  143. data/lib/rails/generators/rails/application_record/application_record_generator.rb +4 -0
  144. data/lib/rails/generators/rails/benchmark/USAGE +19 -0
  145. data/lib/rails/generators/rails/benchmark/benchmark_generator.rb +30 -0
  146. data/lib/rails/generators/rails/benchmark/templates/benchmark.rb.tt +15 -0
  147. data/lib/rails/generators/rails/controller/USAGE +13 -5
  148. data/lib/rails/generators/rails/controller/controller_generator.rb +7 -42
  149. data/lib/rails/generators/rails/controller/templates/controller.rb.tt +1 -5
  150. data/lib/rails/generators/rails/credentials/credentials_generator.rb +30 -25
  151. data/lib/rails/generators/rails/credentials/templates/credentials.yml.tt +8 -0
  152. data/lib/rails/generators/rails/db/system/change/change_generator.rb +31 -1
  153. data/lib/rails/generators/rails/encrypted_file/encrypted_file_generator.rb +6 -2
  154. data/lib/rails/generators/rails/encryption_key_file/encryption_key_file_generator.rb +1 -2
  155. data/lib/rails/generators/rails/generator/USAGE +2 -2
  156. data/lib/rails/generators/rails/generator/generator_generator.rb +0 -1
  157. data/lib/rails/generators/rails/generator/templates/%file_name%_generator.rb.tt +1 -1
  158. data/lib/rails/generators/rails/generator/templates/USAGE.tt +1 -1
  159. data/lib/rails/generators/rails/helper/USAGE +2 -3
  160. data/lib/rails/generators/rails/integration_test/USAGE +2 -2
  161. data/lib/rails/generators/rails/migration/USAGE +22 -12
  162. data/lib/rails/generators/rails/model/model_generator.rb +4 -0
  163. data/lib/rails/generators/rails/plugin/USAGE +17 -6
  164. data/lib/rails/generators/rails/plugin/plugin_generator.rb +86 -46
  165. data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +15 -20
  166. data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +10 -39
  167. data/lib/rails/generators/rails/plugin/templates/MIT-LICENSE.tt +1 -1
  168. data/lib/rails/generators/rails/plugin/templates/README.md.tt +1 -1
  169. data/lib/rails/generators/rails/plugin/templates/Rakefile.tt +4 -18
  170. data/lib/rails/generators/rails/plugin/templates/app/controllers/%namespaced_name%/application_controller.rb.tt +0 -1
  171. data/lib/rails/generators/rails/plugin/templates/app/mailers/%namespaced_name%/application_mailer.rb.tt +2 -2
  172. data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +0 -3
  173. data/lib/rails/generators/rails/plugin/templates/bin/rails.tt +7 -22
  174. data/lib/rails/generators/rails/plugin/templates/gitignore.tt +10 -14
  175. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/engine.rb.tt +2 -2
  176. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%/version.rb.tt +1 -1
  177. data/lib/rails/generators/rails/plugin/templates/lib/%namespaced_name%.rb.tt +1 -0
  178. data/lib/rails/generators/rails/plugin/templates/rails/boot.rb.tt +3 -3
  179. data/lib/rails/generators/rails/plugin/templates/test/%namespaced_name%_test.rb.tt +4 -4
  180. data/lib/rails/generators/rails/plugin/templates/test/integration/navigation_test.rb.tt +1 -1
  181. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +6 -14
  182. data/lib/rails/generators/rails/resource/USAGE +4 -4
  183. data/lib/rails/generators/rails/resource/resource_generator.rb +6 -0
  184. data/lib/rails/generators/rails/resource_route/resource_route_generator.rb +2 -27
  185. data/lib/rails/generators/rails/scaffold/USAGE +5 -5
  186. data/lib/rails/generators/rails/scaffold/scaffold_generator.rb +2 -20
  187. data/lib/rails/generators/rails/scaffold_controller/USAGE +2 -2
  188. data/lib/rails/generators/rails/scaffold_controller/scaffold_controller_generator.rb +7 -2
  189. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +2 -6
  190. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +7 -11
  191. data/lib/rails/generators/rails/system_test/USAGE +2 -2
  192. data/lib/rails/generators/rails/task/USAGE +3 -3
  193. data/lib/rails/generators/resource_helpers.rb +2 -2
  194. data/lib/rails/generators/test_case.rb +3 -3
  195. data/lib/rails/generators/test_unit/controller/controller_generator.rb +2 -0
  196. data/lib/rails/generators/test_unit/controller/templates/functional_test.rb.tt +3 -3
  197. data/lib/rails/generators/test_unit/generator/generator_generator.rb +0 -1
  198. data/lib/rails/generators/test_unit/generator/templates/generator_test.rb.tt +3 -3
  199. data/lib/rails/generators/test_unit/integration/integration_generator.rb +0 -1
  200. data/lib/rails/generators/test_unit/integration/templates/integration_test.rb.tt +1 -1
  201. data/lib/rails/generators/test_unit/job/templates/unit_test.rb.tt +1 -1
  202. data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb.tt +1 -1
  203. data/lib/rails/generators/test_unit/model/templates/fixtures.yml.tt +3 -3
  204. data/lib/rails/generators/test_unit/model/templates/unit_test.rb.tt +1 -1
  205. data/lib/rails/generators/test_unit/plugin/templates/%file_name%_test.rb.tt +1 -1
  206. data/lib/rails/generators/test_unit/plugin/templates/test_helper.rb +2 -2
  207. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +4 -5
  208. data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +6 -6
  209. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +8 -8
  210. data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +9 -11
  211. data/lib/rails/generators/testing/assertions.rb +2 -2
  212. data/lib/rails/generators/testing/{behaviour.rb → behavior.rb} +8 -7
  213. data/lib/rails/generators.rb +43 -45
  214. data/lib/rails/health_controller.rb +55 -0
  215. data/lib/rails/info.rb +4 -4
  216. data/lib/rails/info_controller.rb +30 -13
  217. data/lib/rails/initializable.rb +1 -1
  218. data/lib/rails/mailers_controller.rb +18 -9
  219. data/lib/rails/paths.rb +28 -19
  220. data/lib/rails/rack/logger.rb +17 -17
  221. data/lib/rails/rackup/server.rb +15 -0
  222. data/lib/rails/railtie/configurable.rb +0 -1
  223. data/lib/rails/railtie/configuration.rb +15 -3
  224. data/lib/rails/railtie.rb +80 -37
  225. data/lib/rails/ruby_version_check.rb +5 -3
  226. data/lib/rails/secrets.rb +14 -9
  227. data/lib/rails/source_annotation_extractor.rb +69 -34
  228. data/lib/rails/tasks/engine.rake +8 -11
  229. data/lib/rails/tasks/framework.rake +4 -6
  230. data/lib/rails/tasks/log.rake +1 -1
  231. data/lib/rails/tasks/misc.rake +4 -15
  232. data/lib/rails/tasks/statistics.rake +9 -6
  233. data/lib/rails/tasks/tmp.rake +13 -6
  234. data/lib/rails/tasks/yarn.rake +17 -6
  235. data/lib/rails/tasks/zeitwerk.rake +16 -41
  236. data/lib/rails/tasks.rb +0 -6
  237. data/lib/rails/templates/layouts/application.html.erb +15 -0
  238. data/lib/rails/templates/rails/mailers/email.html.erb +46 -11
  239. data/lib/rails/templates/rails/mailers/index.html.erb +14 -7
  240. data/lib/rails/templates/rails/mailers/mailer.html.erb +11 -5
  241. data/lib/rails/templates/rails/welcome/index.html.erb +65 -48
  242. data/lib/rails/test_help.rb +13 -14
  243. data/lib/rails/test_unit/line_filtering.rb +1 -1
  244. data/lib/rails/test_unit/railtie.rb +0 -4
  245. data/lib/rails/test_unit/reporter.rb +8 -3
  246. data/lib/rails/test_unit/runner.rb +61 -19
  247. data/lib/rails/test_unit/test_parser.rb +88 -0
  248. data/lib/rails/test_unit/testing.rake +17 -36
  249. data/lib/rails/testing/maintain_test_schema.rb +16 -0
  250. data/lib/rails/version.rb +1 -1
  251. data/lib/rails/welcome_controller.rb +1 -0
  252. data/lib/rails/zeitwerk_checker.rb +15 -0
  253. data/lib/rails.rb +31 -23
  254. metadata +89 -58
  255. data/RDOC_MAIN.rdoc +0 -98
  256. data/lib/rails/application/dummy_erb_compiler.rb +0 -18
  257. data/lib/rails/command/spellchecker.rb +0 -58
  258. data/lib/rails/generators/css/assets/assets_generator.rb +0 -15
  259. data/lib/rails/generators/css/assets/templates/stylesheet.css +0 -4
  260. data/lib/rails/generators/css/scaffold/scaffold_generator.rb +0 -18
  261. data/lib/rails/generators/rails/app/templates/app/javascript/channels/consumer.js +0 -6
  262. data/lib/rails/generators/rails/app/templates/app/javascript/channels/index.js +0 -5
  263. data/lib/rails/generators/rails/app/templates/app/javascript/packs/application.js.tt +0 -23
  264. data/lib/rails/generators/rails/app/templates/bin/yarn.tt +0 -10
  265. data/lib/rails/generators/rails/app/templates/config/databases/frontbase.yml.tt +0 -50
  266. data/lib/rails/generators/rails/app/templates/config/databases/ibm_db.yml.tt +0 -86
  267. data/lib/rails/generators/rails/app/templates/config/initializers/application_controller_renderer.rb.tt +0 -8
  268. data/lib/rails/generators/rails/app/templates/config/initializers/backtrace_silencers.rb.tt +0 -7
  269. data/lib/rails/generators/rails/app/templates/config/initializers/cookies_serializer.rb.tt +0 -5
  270. data/lib/rails/generators/rails/app/templates/config/initializers/mime_types.rb.tt +0 -4
  271. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_6_0.rb.tt +0 -45
  272. data/lib/rails/generators/rails/app/templates/config/initializers/wrap_parameters.rb.tt +0 -16
  273. data/lib/rails/generators/rails/app/templates/config/spring.rb.tt +0 -6
  274. data/lib/rails/generators/rails/app/templates/package.json.tt +0 -11
  275. data/lib/rails/generators/rails/assets/USAGE +0 -17
  276. data/lib/rails/generators/rails/assets/assets_generator.rb +0 -26
  277. data/lib/rails/generators/rails/assets/templates/stylesheet.css +0 -4
  278. data/lib/rails/generators/rails/model/USAGE +0 -114
  279. data/lib/rails/generators/rails/plugin/templates/rails/application.rb.tt +0 -23
  280. data/lib/rails/generators/rails/scaffold/templates/scaffold.css +0 -80
  281. data/lib/rails/tasks/annotations.rake +0 -22
  282. data/lib/rails/tasks/dev.rake +0 -11
  283. data/lib/rails/tasks/initializers.rake +0 -9
  284. data/lib/rails/tasks/middleware.rake +0 -9
  285. data/lib/rails/tasks/restart.rake +0 -9
  286. data/lib/rails/tasks/routes.rake +0 -9
data/lib/rails/engine.rb CHANGED
@@ -2,18 +2,21 @@
2
2
 
3
3
  require "rails/railtie"
4
4
  require "rails/engine/railties"
5
+ require "active_support/callbacks"
5
6
  require "active_support/core_ext/module/delegation"
7
+ require "active_support/core_ext/object/try"
6
8
  require "pathname"
7
9
  require "thread"
8
10
 
9
11
  module Rails
10
- # <tt>Rails::Engine</tt> allows you to wrap a specific Rails application or subset of
12
+ # +Rails::Engine+ allows you to wrap a specific \Rails application or subset of
11
13
  # functionality and share it with other applications or within a larger packaged application.
12
- # Every <tt>Rails::Application</tt> is just an engine, which allows for simple
14
+ # Every Rails::Application is just an engine, which allows for simple
13
15
  # feature and application sharing.
14
16
  #
15
- # Any <tt>Rails::Engine</tt> is also a <tt>Rails::Railtie</tt>, so the same
16
- # methods (like <tt>rake_tasks</tt> and +generators+) and configuration
17
+ # Any +Rails::Engine+ is also a Rails::Railtie, so the same
18
+ # methods (like {rake_tasks}[rdoc-ref:Rails::Railtie::rake_tasks] and
19
+ # {generators}[rdoc-ref:Rails::Railtie::generators]) and configuration
17
20
  # options that are available in railties can also be used in engines.
18
21
  #
19
22
  # == Creating an Engine
@@ -29,16 +32,16 @@ module Rails
29
32
  # end
30
33
  #
31
34
  # Then ensure that this file is loaded at the top of your <tt>config/application.rb</tt>
32
- # (or in your +Gemfile+) and it will automatically load models, controllers and helpers
35
+ # (or in your +Gemfile+), and it will automatically load models, controllers, and helpers
33
36
  # inside +app+, load routes at <tt>config/routes.rb</tt>, load locales at
34
- # <tt>config/locales/*</tt>, and load tasks at <tt>lib/tasks/*</tt>.
37
+ # <tt>config/locales/**/*</tt>, and load tasks at <tt>lib/tasks/**/*</tt>.
35
38
  #
36
39
  # == Configuration
37
40
  #
38
- # Besides the +Railtie+ configuration which is shared across the application, in a
39
- # <tt>Rails::Engine</tt> you can access <tt>autoload_paths</tt>, <tt>eager_load_paths</tt>
40
- # and <tt>autoload_once_paths</tt>, which, differently from a <tt>Railtie</tt>, are scoped to
41
- # the current engine.
41
+ # Like railties, engines can access a config object which contains configuration shared by
42
+ # all railties and the application.
43
+ # Additionally, each engine can access <tt>autoload_paths</tt>, <tt>eager_load_paths</tt> and
44
+ # <tt>autoload_once_paths</tt> settings which are scoped to that engine.
42
45
  #
43
46
  # class MyEngine < Rails::Engine
44
47
  # # Add a load path for this specific Engine
@@ -112,9 +115,9 @@ module Rails
112
115
  # == Endpoint
113
116
  #
114
117
  # An engine can also be a Rack application. It can be useful if you have a Rack application that
115
- # you would like to wrap with +Engine+ and provide with some of the +Engine+'s features.
118
+ # you would like to provide with some of the +Engine+'s features.
116
119
  #
117
- # To do that, use the +endpoint+ method:
120
+ # To do that, use the ::endpoint method:
118
121
  #
119
122
  # module MyEngine
120
123
  # class Engine < Rails::Engine
@@ -122,7 +125,7 @@ module Rails
122
125
  # end
123
126
  # end
124
127
  #
125
- # Now you can mount your engine in application's routes just like that:
128
+ # Now you can mount your engine in application's routes:
126
129
  #
127
130
  # Rails.application.routes.draw do
128
131
  # mount MyEngine::Engine => "/engine"
@@ -179,7 +182,7 @@ module Rails
179
182
  # it's used as default <tt>:as</tt> option
180
183
  # * rake task for installing migrations <tt>my_engine:install:migrations</tt>
181
184
  #
182
- # Engine name is set by default based on class name. For <tt>MyEngine::Engine</tt> it will be
185
+ # Engine name is set by default based on class name. For +MyEngine::Engine+ it will be
183
186
  # <tt>my_engine_engine</tt>. You can change it manually using the <tt>engine_name</tt> method:
184
187
  #
185
188
  # module MyEngine
@@ -190,13 +193,13 @@ module Rails
190
193
  #
191
194
  # == Isolated Engine
192
195
  #
193
- # Normally when you create controllers, helpers and models inside an engine, they are treated
196
+ # Normally when you create controllers, helpers, and models inside an engine, they are treated
194
197
  # as if they were created inside the application itself. This means that all helpers and
195
198
  # named routes from the application will be available to your engine's controllers as well.
196
199
  #
197
200
  # However, sometimes you want to isolate your engine from the application, especially if your engine
198
- # has its own router. To do that, you simply need to call +isolate_namespace+. This method requires
199
- # you to pass a module where all your controllers, helpers and models should be nested to:
201
+ # has its own router. To do that, you simply need to call ::isolate_namespace. This method requires
202
+ # you to pass a module where all your controllers, helpers, and models should be nested to:
200
203
  #
201
204
  # module MyEngine
202
205
  # class Engine < Rails::Engine
@@ -228,15 +231,15 @@ module Rails
228
231
  # resources :articles
229
232
  # end
230
233
  #
231
- # If +MyEngine+ is isolated, The routes above will point to
232
- # <tt>MyEngine::ArticlesController</tt>. You also don't need to use longer
234
+ # If +MyEngine+ is isolated, the routes above will point to
235
+ # +MyEngine::ArticlesController+. You also don't need to use longer
233
236
  # URL helpers like +my_engine_articles_path+. Instead, you should simply use
234
237
  # +articles_path+, like you would do with your main application.
235
238
  #
236
239
  # To make this behavior consistent with other parts of the framework,
237
- # isolated engines also have an effect on <tt>ActiveModel::Naming</tt>. In a
238
- # normal Rails app, when you use a namespaced model such as
239
- # <tt>Namespace::Article</tt>, <tt>ActiveModel::Naming</tt> will generate
240
+ # isolated engines also have an effect on ActiveModel::Naming. In a
241
+ # normal \Rails app, when you use a namespaced model such as
242
+ # +Namespace::Article+, ActiveModel::Naming will generate
240
243
  # names with the prefix "namespace". In an isolated engine, the prefix will
241
244
  # be omitted in URL helpers and form fields, for convenience.
242
245
  #
@@ -250,7 +253,7 @@ module Rails
250
253
  # Additionally, an isolated engine will set its own name according to its
251
254
  # namespace, so <tt>MyEngine::Engine.engine_name</tt> will return
252
255
  # "my_engine". It will also set +MyEngine.table_name_prefix+ to "my_engine_",
253
- # meaning for example that <tt>MyEngine::Article</tt> will use the
256
+ # meaning for example that +MyEngine::Article+ will use the
254
257
  # +my_engine_articles+ database table by default.
255
258
  #
256
259
  # == Using Engine's routes outside Engine
@@ -298,7 +301,7 @@ module Rails
298
301
  #
299
302
  # == Isolated engine's helpers
300
303
  #
301
- # Sometimes you may want to isolate engine, but use helpers that are defined for it.
304
+ # Sometimes you may want to isolate an engine, but use helpers that are defined for it.
302
305
  # If you want to share just a few specific helpers you can add them to application's
303
306
  # helpers in ApplicationController:
304
307
  #
@@ -313,7 +316,7 @@ module Rails
313
316
  # helper MyEngine::Engine.helpers
314
317
  # end
315
318
  #
316
- # It will include all of the helpers from engine's directory. Take into account that this does
319
+ # It will include all of the helpers from engine's directory. Take into account this does
317
320
  # not include helpers defined in controllers with helper_method or other similar solutions,
318
321
  # only helpers defined in the helpers directory will be included.
319
322
  #
@@ -325,7 +328,7 @@ module Rails
325
328
  # To use engine's migrations in application you can use the rake task below, which copies them to
326
329
  # application's dir:
327
330
  #
328
- # rake ENGINE_NAME:install:migrations
331
+ # $ rake ENGINE_NAME:install:migrations
329
332
  #
330
333
  # Note that some of the migrations may be skipped if a migration with the same name already exists
331
334
  # in application. In such a situation you must decide whether to leave that migration or rename the
@@ -362,7 +365,7 @@ module Rails
362
365
  base.called_from = begin
363
366
  call_stack = caller_locations.map { |l| l.absolute_path || l.path }
364
367
 
365
- File.dirname(call_stack.detect { |p| p !~ %r[railties[\w.-]*/lib/rails|rack[\w.-]*/lib/rack] })
368
+ File.dirname(call_stack.detect { |p| !p.match?(%r[railties[\w.-]*/lib/rails|rack[\w.-]*/lib/rack]) })
366
369
  end
367
370
  end
368
371
 
@@ -393,6 +396,12 @@ module Rails
393
396
 
394
397
  unless mod.respond_to?(:table_name_prefix)
395
398
  define_method(:table_name_prefix) { "#{name}_" }
399
+
400
+ ActiveSupport.on_load(:active_record) do
401
+ mod.singleton_class.redefine_method(:table_name_prefix) do
402
+ "#{ActiveRecord::Base.table_name_prefix}#{name}_"
403
+ end
404
+ end
396
405
  end
397
406
 
398
407
  unless mod.respond_to?(:use_relative_model_naming?)
@@ -421,6 +430,9 @@ module Rails
421
430
  end
422
431
  end
423
432
 
433
+ include ActiveSupport::Callbacks
434
+ define_callbacks :load_seed
435
+
424
436
  delegate :middleware, :root, :paths, to: :config
425
437
  delegate :engine_name, :isolated?, to: :class
426
438
 
@@ -437,7 +449,7 @@ module Rails
437
449
  end
438
450
 
439
451
  # Load console and invoke the registered hooks.
440
- # Check <tt>Rails::Railtie.console</tt> for more info.
452
+ # Check Rails::Railtie.console for more info.
441
453
  def load_console(app = self)
442
454
  require "rails/console/app"
443
455
  require "rails/console/helpers"
@@ -445,23 +457,23 @@ module Rails
445
457
  self
446
458
  end
447
459
 
448
- # Load Rails runner and invoke the registered hooks.
449
- # Check <tt>Rails::Railtie.runner</tt> for more info.
460
+ # Load \Rails runner and invoke the registered hooks.
461
+ # Check Rails::Railtie.runner for more info.
450
462
  def load_runner(app = self)
451
463
  run_runner_blocks(app)
452
464
  self
453
465
  end
454
466
 
455
- # Load Rake, railties tasks and invoke the registered hooks.
456
- # Check <tt>Rails::Railtie.rake_tasks</tt> for more info.
467
+ # Load Rake and railties tasks, and invoke the registered hooks.
468
+ # Check Rails::Railtie.rake_tasks for more info.
457
469
  def load_tasks(app = self)
458
470
  require "rake"
459
471
  run_tasks_blocks(app)
460
472
  self
461
473
  end
462
474
 
463
- # Load Rails generators and invoke the registered hooks.
464
- # Check <tt>Rails::Railtie.generators</tt> for more info.
475
+ # Load \Rails generators and invoke the registered hooks.
476
+ # Check Rails::Railtie.generators for more info.
465
477
  def load_generators(app = self)
466
478
  require "rails/generators"
467
479
  run_generators_blocks(app)
@@ -469,17 +481,16 @@ module Rails
469
481
  self
470
482
  end
471
483
 
484
+ # Invoke the server registered hooks.
485
+ # Check Rails::Railtie.server for more info.
486
+ def load_server(app = self)
487
+ run_server_blocks(app)
488
+ self
489
+ end
490
+
472
491
  def eager_load!
473
- # Already done by Zeitwerk::Loader.eager_load_all in the finisher.
474
- return if Rails.autoloaders.zeitwerk_enabled?
475
-
476
- config.eager_load_paths.each do |load_path|
477
- # Starts after load_path plus a slash, ends before ".rb".
478
- relname_range = (load_path.to_s.length + 1)...-3
479
- Dir.glob("#{load_path}/**/*.rb").sort.each do |file|
480
- require_dependency file[relname_range]
481
- end
482
- end
492
+ # Already done by Zeitwerk::Loader.eager_load_all. By now, we leave the
493
+ # method as a no-op for backwards compatibility.
483
494
  end
484
495
 
485
496
  def railties
@@ -490,8 +501,7 @@ module Rails
490
501
  def helpers
491
502
  @helpers ||= begin
492
503
  helpers = Module.new
493
- all = ActionController::Base.all_helpers_from_path(helpers_paths)
494
- ActionController::Base.modules_for_helpers(all).each do |mod|
504
+ AbstractController::Helpers.helper_modules_from_paths(helpers_paths).each do |mod|
495
505
  helpers.include(mod)
496
506
  end
497
507
  helpers
@@ -550,12 +560,12 @@ module Rails
550
560
  # Blog::Engine.load_seed
551
561
  def load_seed
552
562
  seed_file = paths["db/seeds.rb"].existent.first
553
- return unless seed_file
563
+ run_callbacks(:load_seed) { load(seed_file) } if seed_file
564
+ end
554
565
 
555
- if config.try(:active_job)&.queue_adapter == :async
556
- with_inline_jobs { load(seed_file) }
557
- else
558
- load(seed_file)
566
+ initializer :load_environment_config, before: :load_environment_hook, group: :all do
567
+ paths["config/environments"].existent.each do |environment|
568
+ require environment
559
569
  end
560
570
  end
561
571
 
@@ -566,11 +576,6 @@ module Rails
566
576
  $LOAD_PATH.uniq!
567
577
  end
568
578
 
569
- # Set the paths from which Rails will automatically load source files,
570
- # and the load_once paths.
571
- #
572
- # This needs to be an initializer, since it needs to run once
573
- # per engine and get the engine as a block parameter.
574
579
  initializer :set_autoload_paths, before: :bootstrap_hook do
575
580
  ActiveSupport::Dependencies.autoload_paths.unshift(*_all_autoload_paths)
576
581
  ActiveSupport::Dependencies.autoload_once_paths.unshift(*_all_autoload_once_paths)
@@ -580,16 +585,20 @@ module Rails
580
585
  end
581
586
 
582
587
  initializer :set_eager_load_paths, before: :bootstrap_hook do
583
- ActiveSupport::Dependencies._eager_load_paths.merge(config.eager_load_paths)
588
+ ActiveSupport::Dependencies._eager_load_paths.merge(config.all_eager_load_paths)
584
589
  config.eager_load_paths.freeze
585
590
  end
586
591
 
587
592
  initializer :add_routing_paths do |app|
588
593
  routing_paths = paths["config/routes.rb"].existent
594
+ external_paths = self.paths["config/routes"].paths
595
+ routes.draw_paths.concat(external_paths)
596
+ app.routes.draw_paths.concat(external_paths)
589
597
 
590
598
  if routes? || routing_paths.any?
591
599
  app.routes_reloader.paths.unshift(*routing_paths)
592
600
  app.routes_reloader.route_sets << routes
601
+ app.routes_reloader.external_routes.unshift(*external_paths)
593
602
  end
594
603
  end
595
604
 
@@ -607,9 +616,19 @@ module Rails
607
616
  end
608
617
  end
609
618
 
610
- initializer :load_environment_config, before: :load_environment_hook, group: :all do
611
- paths["config/environments"].existent.each do |environment|
612
- require environment
619
+ initializer :add_mailer_preview_paths do
620
+ previews = paths["test/mailers/previews"].existent
621
+ unless previews.empty?
622
+ ActiveSupport.on_load(:action_mailer) { self.preview_paths |= previews }
623
+ end
624
+ end
625
+
626
+ initializer :add_fixture_paths do
627
+ next if is_a?(Rails::Application)
628
+
629
+ fixtures = config.root.join("test", "fixtures")
630
+ if fixtures_in_root_and_not_in_vendor?(fixtures)
631
+ ActiveSupport.on_load(:active_record_fixtures) { self.fixture_paths |= ["#{fixtures}/"] }
613
632
  end
614
633
  end
615
634
 
@@ -625,6 +644,12 @@ module Rails
625
644
  end
626
645
  end
627
646
 
647
+ initializer :wrap_executor_around_load_seed do |app|
648
+ self.class.set_callback(:load_seed, :around) do |engine, seeds_block|
649
+ app.executor.wrap(&seeds_block)
650
+ end
651
+ end
652
+
628
653
  initializer :engines_blank_point do
629
654
  # We need this initializer so all extra initializers added in engines are
630
655
  # consistently executed after all the initializers above across all engines.
@@ -649,42 +674,28 @@ module Rails
649
674
  end
650
675
  end
651
676
 
652
- def routes? #:nodoc:
677
+ def routes? # :nodoc:
653
678
  @routes
654
679
  end
655
680
 
656
681
  protected
657
-
658
- def run_tasks_blocks(*) #:nodoc:
682
+ def run_tasks_blocks(*) # :nodoc:
659
683
  super
660
684
  paths["lib/tasks"].existent.sort.each { |ext| load(ext) }
661
685
  end
662
686
 
663
687
  private
664
-
665
688
  def load_config_initializer(initializer) # :doc:
666
689
  ActiveSupport::Notifications.instrument("load_config_initializer.railties", initializer: initializer) do
667
690
  load(initializer)
668
691
  end
669
692
  end
670
693
 
671
- def with_inline_jobs
672
- queue_adapter = config.active_job.queue_adapter
673
- ActiveSupport.on_load(:active_job) do
674
- self.queue_adapter = :inline
675
- end
676
- yield
677
- ensure
678
- ActiveSupport.on_load(:active_job) do
679
- self.queue_adapter = queue_adapter
680
- end
681
- end
682
-
683
694
  def has_migrations?
684
695
  paths["db/migrate"].existent.any?
685
696
  end
686
697
 
687
- def self.find_root_with_flag(flag, root_path, default = nil) #:nodoc:
698
+ def self.find_root_with_flag(flag, root_path, default = nil) # :nodoc:
688
699
  while root_path && File.directory?(root_path) && !File.exist?("#{root_path}/#{flag}")
689
700
  parent = File.dirname(root_path)
690
701
  root_path = parent != root_path && parent
@@ -701,21 +712,34 @@ module Rails
701
712
  end
702
713
 
703
714
  def _all_autoload_once_paths
704
- config.autoload_once_paths
715
+ config.all_autoload_once_paths.uniq
705
716
  end
706
717
 
707
718
  def _all_autoload_paths
708
- @_all_autoload_paths ||= (config.autoload_paths + config.eager_load_paths + config.autoload_once_paths).uniq
719
+ @_all_autoload_paths ||= begin
720
+ autoload_paths = config.all_autoload_paths
721
+ autoload_paths += config.all_eager_load_paths
722
+ autoload_paths -= config.all_autoload_once_paths
723
+ autoload_paths.uniq
724
+ end
709
725
  end
710
726
 
711
727
  def _all_load_paths(add_autoload_paths_to_load_path)
712
728
  @_all_load_paths ||= begin
713
- load_paths = config.paths.load_paths
714
- load_paths += _all_autoload_paths if add_autoload_paths_to_load_path
729
+ load_paths = config.paths.load_paths
730
+ if add_autoload_paths_to_load_path
731
+ load_paths += _all_autoload_paths
732
+ load_paths += _all_autoload_once_paths
733
+ end
715
734
  load_paths.uniq
716
735
  end
717
736
  end
718
737
 
738
+ def fixtures_in_root_and_not_in_vendor?(fixtures)
739
+ fixtures.exist? && fixtures.to_s.start_with?(Rails.root.to_s) &&
740
+ !fixtures.to_s.start_with?(Rails.root.join("vendor").to_s)
741
+ end
742
+
719
743
  def build_request(env)
720
744
  env.merge!(env_config)
721
745
  req = ActionDispatch::Request.new env
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Rails
4
- # Returns the version of the currently loaded Rails as a <tt>Gem::Version</tt>
4
+ # Returns the currently loaded version of \Rails as a +Gem::Version+.
5
5
  def self.gem_version
6
6
  Gem::Version.new VERSION::STRING
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 6
11
- MINOR = 0
12
- TINY = 0
13
- PRE = nil
10
+ MAJOR = 7
11
+ MINOR = 1
12
+ TINY = 3
13
+ PRE = "2"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -6,7 +6,7 @@ require "thor/actions"
6
6
  module Rails
7
7
  module Generators
8
8
  module Actions
9
- class CreateMigration < Thor::Actions::CreateFile #:nodoc:
9
+ class CreateMigration < Thor::Actions::CreateFile # :nodoc:
10
10
  def migration_dir
11
11
  File.dirname(@destination)
12
12
  end
@@ -19,6 +19,13 @@ module Rails
19
19
  exists? && File.binread(existing_migration) == render
20
20
  end
21
21
 
22
+ def invoke!
23
+ return super if pretend?
24
+
25
+ invoked_file = super
26
+ File.exist?(@destination) ? invoked_file : relative_existing_migration
27
+ end
28
+
22
29
  def revoke!
23
30
  say_destination = exists? ? relative_existing_migration : relative_destination
24
31
  say_status :remove, :red, say_destination
@@ -32,15 +39,12 @@ module Rails
32
39
  end
33
40
 
34
41
  def existing_migration
35
- @existing_migration ||= begin
36
- @base.class.migration_exists?(migration_dir, migration_file_name) ||
42
+ @existing_migration ||= @base.class.migration_exists?(migration_dir, migration_file_name) ||
37
43
  File.exist?(@destination) && @destination
38
- end
39
44
  end
40
45
  alias :exists? :existing_migration
41
46
 
42
47
  private
43
-
44
48
  def on_conflict_behavior # :doc:
45
49
  options = base.options.merge(config)
46
50
  if identical?