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
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class DummyConfig # :nodoc:
4
+ def initialize(config)
5
+ @config = config
6
+ end
7
+
8
+ def to_s
9
+ "DummyConfig"
10
+ end
11
+
12
+ def method_missing(selector, *args, &blk)
13
+ if @config.respond_to?(selector)
14
+ @config.send(selector, *args, &blk)
15
+ else
16
+ self
17
+ end
18
+ end
19
+ end
@@ -1,7 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "set"
3
4
  require "active_support/core_ext/string/inflections"
4
5
  require "active_support/core_ext/array/conversions"
6
+ require "active_support/descendants_tracker"
7
+ require "active_support/dependencies"
5
8
 
6
9
  module Rails
7
10
  class Application
@@ -9,80 +12,38 @@ module Rails
9
12
  include Initializable
10
13
 
11
14
  initializer :add_generator_templates do
12
- config.generators.templates.unshift(*paths["lib/templates"].existent)
15
+ ensure_generator_templates_added
13
16
  end
14
17
 
15
- initializer :ensure_autoload_once_paths_as_subset do
16
- extra = ActiveSupport::Dependencies.autoload_once_paths -
17
- ActiveSupport::Dependencies.autoload_paths
18
+ initializer :setup_main_autoloader do
19
+ autoloader = Rails.autoloaders.main
18
20
 
19
- unless extra.empty?
20
- abort <<-end_error
21
- autoload_once_paths must be a subset of the autoload_paths.
22
- Extra items in autoload_once_paths: #{extra * ','}
23
- end_error
24
- end
25
- end
21
+ # Normally empty, but if the user already defined some, we won't
22
+ # override them. Important if there are custom namespaces associated.
23
+ already_configured_dirs = Set.new(autoloader.dirs)
26
24
 
27
- # This will become an error if/when we remove classic mode. The plan is
28
- # autoloaders won't be configured up to this point in the finisher, so
29
- # constants just won't be found, raising regular NameError exceptions.
30
- initializer :warn_if_autoloaded, before: :let_zeitwerk_take_over do
31
- next if config.cache_classes
32
- next if ActiveSupport::Dependencies.autoloaded_constants.empty?
33
-
34
- autoloaded = ActiveSupport::Dependencies.autoloaded_constants
35
- constants = "constant".pluralize(autoloaded.size)
36
- enum = autoloaded.to_sentence
37
- have = autoloaded.size == 1 ? "has" : "have"
38
- these = autoloaded.size == 1 ? "This" : "These"
39
- example = autoloaded.first
40
- example_klass = example.constantize.class
41
-
42
- if config.autoloader == :zeitwerk
43
- ActiveSupport::DescendantsTracker.clear
44
- ActiveSupport::Dependencies.clear
25
+ ActiveSupport::Dependencies.autoload_paths.freeze
26
+ ActiveSupport::Dependencies.autoload_paths.uniq.each do |path|
27
+ # Zeitwerk only accepts existing directories in `push_dir`.
28
+ next unless File.directory?(path)
29
+ next if already_configured_dirs.member?(path.to_s)
45
30
 
46
- unload_message = "#{these} autoloaded #{constants} #{have} been unloaded."
47
- else
48
- unload_message = "`config.autoloader` is set to `#{config.autoloader}`. #{these} autoloaded #{constants} would have been unloaded if `config.autoloader` had been set to `:zeitwerk`."
31
+ autoloader.push_dir(path)
32
+ autoloader.do_not_eager_load(path) unless ActiveSupport::Dependencies.eager_load?(path)
49
33
  end
50
34
 
51
- ActiveSupport::Deprecation.warn(<<~WARNING)
52
- Initialization autoloaded the #{constants} #{enum}.
53
-
54
- Being able to do this is deprecated. Autoloading during initialization is going
55
- to be an error condition in future versions of Rails.
56
-
57
- Reloading does not reboot the application, and therefore code executed during
58
- initialization does not run again. So, if you reload #{example}, for example,
59
- the expected changes won't be reflected in that stale #{example_klass} object.
60
-
61
- #{unload_message}
62
-
63
- Please, check the "Autoloading and Reloading Constants" guide for solutions.
64
- WARNING
65
- end
66
-
67
- initializer :let_zeitwerk_take_over do
68
- if config.autoloader == :zeitwerk
69
- require "active_support/dependencies/zeitwerk_integration"
70
- ActiveSupport::Dependencies::ZeitwerkIntegration.take_over(enable_reloading: !config.cache_classes)
71
- end
72
- end
35
+ if config.reloading_enabled?
36
+ autoloader.enable_reloading
37
+ ActiveSupport::Dependencies.autoloader = autoloader
73
38
 
74
- initializer :add_builtin_route do |app|
75
- if Rails.env.development?
76
- app.routes.prepend do
77
- get "/rails/info/properties" => "rails/info#properties", internal: true
78
- get "/rails/info/routes" => "rails/info#routes", internal: true
79
- get "/rails/info" => "rails/info#index", internal: true
80
- end
81
-
82
- app.routes.append do
83
- get "/" => "rails/welcome#index", internal: true
39
+ autoloader.on_load do |_cpath, value, _abspath|
40
+ if value.is_a?(Class) && value.singleton_class < ActiveSupport::DescendantsTracker
41
+ ActiveSupport::Dependencies._autoloaded_tracked_classes << value
42
+ end
84
43
  end
85
44
  end
45
+
46
+ autoloader.setup
86
47
  end
87
48
 
88
49
  # Setup default session store if not already set in config/application.rb
@@ -113,14 +74,17 @@ module Rails
113
74
  app.reloader.prepare!
114
75
  end
115
76
 
116
- initializer :eager_load! do
77
+ initializer :eager_load! do |app|
117
78
  if config.eager_load
118
79
  ActiveSupport.run_load_hooks(:before_eager_load, self)
119
- # Checks defined?(Zeitwerk) instead of zeitwerk_enabled? because we
120
- # want to eager load any dependency managed by Zeitwerk regardless of
121
- # the autoloading mode of the application.
122
- Zeitwerk::Loader.eager_load_all if defined?(Zeitwerk)
80
+ Zeitwerk::Loader.eager_load_all
123
81
  config.eager_load_namespaces.each(&:eager_load!)
82
+
83
+ if config.reloading_enabled?
84
+ app.reloader.after_class_unload do
85
+ Rails.autoloaders.main.eager_load
86
+ end
87
+ end
124
88
  end
125
89
  end
126
90
 
@@ -129,21 +93,21 @@ module Rails
129
93
  ActiveSupport.run_load_hooks(:after_initialize, self)
130
94
  end
131
95
 
132
- class MutexHook
133
- def initialize(mutex = Mutex.new)
134
- @mutex = mutex
96
+ class MonitorHook # :nodoc:
97
+ def initialize(monitor = Monitor.new)
98
+ @monitor = monitor
135
99
  end
136
100
 
137
101
  def run
138
- @mutex.lock
102
+ @monitor.enter
139
103
  end
140
104
 
141
105
  def complete(_state)
142
- @mutex.unlock
106
+ @monitor.exit
143
107
  end
144
108
  end
145
109
 
146
- module InterlockHook
110
+ module InterlockHook # :nodoc:
147
111
  def self.run
148
112
  ActiveSupport::Dependencies.interlock.start_running
149
113
  end
@@ -158,7 +122,7 @@ module Rails
158
122
  # User has explicitly opted out of concurrent request
159
123
  # handling: presumably their code is not threadsafe
160
124
 
161
- app.executor.register_hook(MutexHook.new, outer: true)
125
+ app.executor.register_hook(MonitorHook.new, outer: true)
162
126
 
163
127
  elsif config.allow_concurrency == :unsafe
164
128
  # Do nothing, even if we know this is dangerous. This is the
@@ -167,15 +131,28 @@ module Rails
167
131
  else
168
132
  # Default concurrency setting: enabled, but safe
169
133
 
170
- unless config.cache_classes && config.eager_load
171
- # Without cache_classes + eager_load, the load interlock
172
- # is required for proper operation
173
-
134
+ if config.reloading_enabled?
174
135
  app.executor.register_hook(InterlockHook, outer: true)
175
136
  end
176
137
  end
177
138
  end
178
139
 
140
+ initializer :add_internal_routes do |app|
141
+ if Rails.env.development?
142
+ app.routes.prepend do
143
+ get "/rails/info/properties" => "rails/info#properties", internal: true
144
+ get "/rails/info/routes" => "rails/info#routes", internal: true
145
+ get "/rails/info" => "rails/info#index", internal: true
146
+ end
147
+
148
+ routes_reloader.run_after_load_paths = -> do
149
+ app.routes.append do
150
+ get "/" => "rails/welcome#index", internal: true
151
+ end
152
+ end
153
+ end
154
+ end
155
+
179
156
  # Set routes reload after the finisher hook to ensure routes added in
180
157
  # the hook are taken into account.
181
158
  initializer :set_routes_reloader_hook do |app|
@@ -183,6 +160,7 @@ module Rails
183
160
  reloader.eager_load = app.config.eager_load
184
161
  reloader.execute
185
162
  reloaders << reloader
163
+
186
164
  app.reloader.to_run do
187
165
  # We configure #execute rather than #execute_if_updated because if
188
166
  # autoloaded constants are cleared we need to reload routes also in
@@ -195,54 +173,57 @@ module Rails
195
173
  # some sort of reloaders dependency support, to be added.
196
174
  require_unload_lock!
197
175
  reloader.execute
176
+ ActiveSupport.run_load_hooks(:after_routes_loaded, self)
198
177
  end
178
+
179
+ ActiveSupport.run_load_hooks(:after_routes_loaded, self)
199
180
  end
200
181
 
201
182
  # Set clearing dependencies after the finisher hook to ensure paths
202
183
  # added in the hook are taken into account.
203
184
  initializer :set_clear_dependencies_hook, group: :all do |app|
204
185
  callback = lambda do
205
- ActiveSupport::DescendantsTracker.clear
186
+ # Order matters.
187
+ ActiveSupport::DescendantsTracker.clear(ActiveSupport::Dependencies._autoloaded_tracked_classes)
206
188
  ActiveSupport::Dependencies.clear
207
189
  end
208
190
 
209
- if config.cache_classes
210
- app.reloader.check = lambda { false }
211
- elsif config.reload_classes_only_on_change
212
- app.reloader.check = lambda do
213
- app.reloaders.map(&:updated?).any?
214
- end
215
- else
216
- app.reloader.check = lambda { true }
217
- end
218
-
219
- if config.reload_classes_only_on_change
220
- reloader = config.file_watcher.new(*watchable_args, &callback)
221
- reloaders << reloader
222
-
223
- # Prepend this callback to have autoloaded constants cleared before
224
- # any other possible reloading, in case they need to autoload fresh
225
- # constants.
226
- app.reloader.to_run(prepend: true) do
227
- # In addition to changes detected by the file watcher, if routes
228
- # or i18n have been updated we also need to clear constants,
229
- # that's why we run #execute rather than #execute_if_updated, this
230
- # callback has to clear autoloaded constants after any update.
231
- class_unload! do
232
- reloader.execute
191
+ if config.reloading_enabled?
192
+ if config.reload_classes_only_on_change
193
+ app.reloader.check = lambda do
194
+ app.reloaders.map(&:updated?).any?
233
195
  end
196
+ else
197
+ app.reloader.check = lambda { true }
234
198
  end
235
199
  else
236
- app.reloader.to_complete do
237
- class_unload!(&callback)
238
- end
200
+ app.reloader.check = lambda { false }
239
201
  end
240
- end
241
202
 
242
- # Disable dependency loading during request cycle
243
- initializer :disable_dependency_loading do
244
- if config.eager_load && config.cache_classes && !config.enable_dependency_loading
245
- ActiveSupport::Dependencies.unhook!
203
+ if config.reloading_enabled?
204
+ if config.reload_classes_only_on_change
205
+ reloader = config.file_watcher.new(*watchable_args, &callback)
206
+ reloaders << reloader
207
+
208
+ # Prepend this callback to have autoloaded constants cleared before
209
+ # any other possible reloading, in case they need to autoload fresh
210
+ # constants.
211
+ app.reloader.to_run(prepend: true) do
212
+ # In addition to changes detected by the file watcher, if routes
213
+ # or i18n have been updated we also need to clear constants,
214
+ # that's why we run #execute rather than #execute_if_updated, this
215
+ # callback has to clear autoloaded constants after any update.
216
+ class_unload! do
217
+ reloader.execute
218
+ end
219
+ end
220
+ else
221
+ app.reloader.to_complete do
222
+ class_unload!(&callback)
223
+ end
224
+ end
225
+ else
226
+ ActiveSupport::DescendantsTracker.disable_clear!
246
227
  end
247
228
  end
248
229
  end
@@ -5,13 +5,17 @@ require "active_support/core_ext/module/delegation"
5
5
  module Rails
6
6
  class Application
7
7
  class RoutesReloader
8
- attr_reader :route_sets, :paths
8
+ include ActiveSupport::Callbacks
9
+
10
+ attr_reader :route_sets, :paths, :external_routes
9
11
  attr_accessor :eager_load
12
+ attr_writer :run_after_load_paths # :nodoc:
10
13
  delegate :execute_if_updated, :execute, :updated?, to: :updater
11
14
 
12
15
  def initialize
13
16
  @paths = []
14
17
  @route_sets = []
18
+ @external_routes = []
15
19
  @eager_load = false
16
20
  end
17
21
 
@@ -25,9 +29,14 @@ module Rails
25
29
  end
26
30
 
27
31
  private
28
-
29
32
  def updater
30
- @updater ||= ActiveSupport::FileUpdateChecker.new(paths) { reload! }
33
+ @updater ||= begin
34
+ dirs = @external_routes.each_with_object({}) do |dir, hash|
35
+ hash[dir.to_s] = %w(rb)
36
+ end
37
+
38
+ ActiveSupport::FileUpdateChecker.new(paths, dirs) { reload! }
39
+ end
31
40
  end
32
41
 
33
42
  def clear!
@@ -39,6 +48,11 @@ module Rails
39
48
 
40
49
  def load_paths
41
50
  paths.each { |path| load(path) }
51
+ run_after_load_paths.call
52
+ end
53
+
54
+ def run_after_load_paths
55
+ @run_after_load_paths ||= -> { }
42
56
  end
43
57
 
44
58
  def finalize!