railties 7.1.6 → 7.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +206 -769
  3. data/README.rdoc +1 -1
  4. data/lib/minitest/rails_plugin.rb +6 -3
  5. data/lib/rails/all.rb +1 -3
  6. data/lib/rails/api/task.rb +6 -4
  7. data/lib/rails/application/bootstrap.rb +6 -9
  8. data/lib/rails/application/configuration.rb +66 -33
  9. data/lib/rails/application/dummy_config.rb +2 -2
  10. data/lib/rails/application/finisher.rb +7 -0
  11. data/lib/rails/application.rb +32 -96
  12. data/lib/rails/backtrace_cleaner.rb +15 -2
  13. data/lib/rails/cli.rb +0 -1
  14. data/lib/rails/command.rb +1 -1
  15. data/lib/rails/commands/app/update_command.rb +102 -0
  16. data/lib/rails/commands/boot/boot_command.rb +14 -0
  17. data/lib/rails/commands/console/console_command.rb +2 -21
  18. data/lib/rails/commands/console/irb_console.rb +133 -0
  19. data/lib/rails/commands/credentials/credentials_command.rb +2 -2
  20. data/lib/rails/commands/dbconsole/dbconsole_command.rb +21 -30
  21. data/lib/rails/commands/devcontainer/devcontainer_command.rb +39 -0
  22. data/lib/rails/commands/rake/rake_command.rb +1 -1
  23. data/lib/rails/commands/runner/runner_command.rb +14 -3
  24. data/lib/rails/commands/server/server_command.rb +5 -3
  25. data/lib/rails/configuration.rb +10 -1
  26. data/lib/rails/console/app.rb +5 -32
  27. data/lib/rails/console/helpers.rb +5 -16
  28. data/lib/rails/console/methods.rb +23 -0
  29. data/lib/rails/engine.rb +7 -7
  30. data/lib/rails/gem_version.rb +2 -2
  31. data/lib/rails/generators/actions.rb +9 -5
  32. data/lib/rails/generators/app_base.rb +76 -51
  33. data/lib/rails/generators/base.rb +5 -1
  34. data/lib/rails/generators/database.rb +227 -69
  35. data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +2 -0
  36. data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +2 -0
  37. data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +2 -0
  38. data/lib/rails/generators/generated_attribute.rb +26 -1
  39. data/lib/rails/generators/rails/app/app_generator.rb +56 -28
  40. data/lib/rails/generators/rails/app/templates/Dockerfile.tt +22 -15
  41. data/lib/rails/generators/rails/app/templates/Gemfile.tt +17 -17
  42. data/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb.tt +4 -0
  43. data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +8 -1
  44. data/lib/rails/generators/rails/app/templates/app/views/pwa/manifest.json.erb.tt +22 -0
  45. data/lib/rails/generators/rails/app/templates/app/views/pwa/service-worker.js +26 -0
  46. data/lib/rails/generators/rails/app/templates/bin/brakeman.tt +6 -0
  47. data/lib/rails/generators/rails/app/templates/bin/rubocop.tt +7 -0
  48. data/lib/rails/generators/rails/app/templates/bin/setup.tt +6 -2
  49. data/lib/rails/generators/rails/app/templates/config/application.rb.tt +1 -1
  50. data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +3 -3
  51. data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +7 -0
  52. data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +8 -1
  53. data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +3 -3
  54. data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +14 -7
  55. data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +8 -0
  56. data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +8 -5
  57. data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +1 -1
  58. data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +1 -1
  59. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_2.rb.tt +70 -0
  60. data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +25 -35
  61. data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +6 -0
  62. data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +5 -0
  63. data/lib/rails/generators/rails/app/templates/dockerignore.tt +13 -0
  64. data/lib/rails/generators/rails/app/templates/github/ci.yml.tt +140 -0
  65. data/lib/rails/generators/rails/app/templates/github/dependabot.yml +12 -0
  66. data/lib/rails/generators/rails/app/templates/gitignore.tt +3 -3
  67. data/lib/rails/generators/rails/app/templates/public/406-unsupported-browser.html +66 -0
  68. data/lib/rails/generators/rails/app/templates/public/icon.png +0 -0
  69. data/lib/rails/generators/rails/app/templates/public/icon.svg +3 -0
  70. data/lib/rails/generators/rails/app/templates/rubocop.yml.tt +8 -0
  71. data/lib/rails/generators/rails/app/templates/test/application_system_test_case.rb.tt +1 -1
  72. data/lib/rails/generators/rails/controller/controller_generator.rb +1 -1
  73. data/lib/rails/generators/rails/db/system/change/change_generator.rb +131 -20
  74. data/lib/rails/generators/rails/devcontainer/devcontainer_generator.rb +166 -0
  75. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/Dockerfile.tt +3 -0
  76. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/compose.yaml.tt +47 -0
  77. data/lib/rails/generators/rails/devcontainer/templates/devcontainer/devcontainer.json.tt +37 -0
  78. data/lib/rails/generators/rails/migration/migration_generator.rb +4 -0
  79. data/lib/rails/generators/rails/plugin/plugin_generator.rb +40 -7
  80. data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +2 -2
  81. data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +5 -1
  82. data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +2 -0
  83. data/lib/rails/generators/rails/plugin/templates/bin/rubocop.tt +7 -0
  84. data/lib/rails/generators/rails/plugin/templates/github/ci.yml.tt +104 -0
  85. data/lib/rails/generators/rails/plugin/templates/github/dependabot.yml +12 -0
  86. data/lib/rails/generators/rails/plugin/templates/rubocop.yml.tt +8 -0
  87. data/lib/rails/generators/rails/plugin/templates/test/application_system_test_case.rb.tt +1 -1
  88. data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +2 -2
  89. data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +2 -2
  90. data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +2 -2
  91. data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb.tt +6 -4
  92. data/lib/rails/generators/test_unit/mailer/templates/preview.rb.tt +3 -2
  93. data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +15 -1
  94. data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +2 -2
  95. data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +2 -2
  96. data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +2 -0
  97. data/lib/rails/generators/test_unit/system/templates/application_system_test_case.rb.tt +1 -1
  98. data/lib/rails/generators/testing/assertions.rb +20 -0
  99. data/lib/rails/generators/testing/behavior.rb +7 -6
  100. data/lib/rails/generators.rb +10 -6
  101. data/lib/rails/health_controller.rb +1 -1
  102. data/lib/rails/info.rb +2 -2
  103. data/lib/rails/mailers_controller.rb +14 -1
  104. data/lib/rails/paths.rb +2 -2
  105. data/lib/rails/pwa_controller.rb +15 -0
  106. data/lib/rails/rack/logger.rb +15 -7
  107. data/lib/rails/railtie/configurable.rb +2 -2
  108. data/lib/rails/railtie.rb +2 -3
  109. data/lib/rails/tasks/framework.rake +0 -26
  110. data/lib/rails/tasks/tmp.rake +1 -1
  111. data/lib/rails/templates/layouts/application.html.erb +1 -1
  112. data/lib/rails/templates/rails/mailers/email.html.erb +12 -8
  113. data/lib/rails/templates/rails/welcome/index.html.erb +4 -2
  114. data/lib/rails/test_help.rb +2 -4
  115. data/lib/rails/test_unit/reporter.rb +8 -2
  116. data/lib/rails/test_unit/runner.rb +30 -2
  117. data/lib/rails/test_unit/test_parser.rb +48 -0
  118. data/lib/rails.rb +6 -3
  119. metadata +40 -30
  120. data/lib/rails/app_updater.rb +0 -52
  121. data/lib/rails/commands/secrets/USAGE +0 -61
  122. data/lib/rails/commands/secrets/secrets_command.rb +0 -47
  123. data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +0 -68
  124. data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +0 -54
  125. data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +0 -70
  126. data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +0 -24
  127. data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +0 -62
  128. data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +0 -53
  129. data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt +0 -280
  130. data/lib/rails/generators/rails/app/templates/public/apple-touch-icon-precomposed.png +0 -0
  131. data/lib/rails/generators/rails/app/templates/public/apple-touch-icon.png +0 -0
  132. data/lib/rails/generators/rails/app/templates/public/favicon.ico +0 -0
  133. data/lib/rails/ruby_version_check.rb +0 -17
  134. data/lib/rails/secrets.rb +0 -110
data/README.rdoc CHANGED
@@ -34,6 +34,6 @@ Bug reports can be filed for the Ruby on \Rails project here:
34
34
 
35
35
  * https://github.com/rails/rails/issues
36
36
 
37
- Feature requests should be discussed on the rails-core mailing list here:
37
+ Feature requests should be discussed on the rubyonrails-core forum here:
38
38
 
39
39
  * https://discuss.rubyonrails.org/c/rubyonrails-core
@@ -25,7 +25,7 @@ module Minitest
25
25
  end
26
26
  end
27
27
 
28
- class ProfileReporter < StatisticsReporter
28
+ class ProfileReporter < Reporter
29
29
  def initialize(io = $stdout, options = {})
30
30
  super
31
31
  @results = []
@@ -94,7 +94,7 @@ module Minitest
94
94
  if count.nil?
95
95
  warn("Non integer specified as profile count, separate " \
96
96
  "your path from options with -- e.g. " \
97
- "`bin/test --profile -- #{value}`")
97
+ "`#{::Rails::TestUnitReporter.executable} --profile -- #{value}`")
98
98
  count = default_count
99
99
  end
100
100
  end
@@ -109,7 +109,10 @@ module Minitest
109
109
  # Owes great inspiration to test runner trailblazers like RSpec,
110
110
  # minitest-reporters, maxitest, and others.
111
111
  def self.plugin_rails_init(options)
112
- unless options[:full_backtrace] || ENV["BACKTRACE"]
112
+ # Don't mess with Minitest unless RAILS_ENV is set
113
+ return unless ENV["RAILS_ENV"]
114
+
115
+ unless options[:full_backtrace]
113
116
  # Plugin can run without Rails loaded, check before filtering.
114
117
  if ::Rails.respond_to?(:backtrace_cleaner)
115
118
  Minitest.backtrace_filter = BacktraceFilterWithFallback.new(::Rails.backtrace_cleaner, Minitest.backtrace_filter)
data/lib/rails/all.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # rubocop:disable Style/RedundantBegin
4
-
5
3
  require "rails"
6
4
 
7
5
  %w(
@@ -16,7 +14,7 @@ require "rails"
16
14
  action_text/engine
17
15
  rails/test_unit/railtie
18
16
  ).each do |railtie|
19
- begin
17
+ begin # rubocop:disable Style/RedundantBegin
20
18
  require railtie
21
19
  rescue LoadError
22
20
  end
@@ -146,8 +146,6 @@ module Rails
146
146
  end
147
147
 
148
148
  def configure_rdoc_files
149
- rdoc_files.include(api_main)
150
-
151
149
  RDOC_FILES.each do |component, cfg|
152
150
  cdr = component_root_dir(component)
153
151
 
@@ -162,8 +160,9 @@ module Rails
162
160
 
163
161
  # Only generate documentation for files that have been
164
162
  # changed since the API was generated.
165
- if Dir.exist?(api_dir) && !ENV["ALL"]
166
- last_generation = DateTime.rfc2822(File.open("#{api_dir}/created.rid", &:readline))
163
+ timestamp_path = "#{api_dir}/created.rid"
164
+ if File.exist?(timestamp_path) && !File.zero?(timestamp_path) && !ENV["ALL"]
165
+ last_generation = DateTime.rfc2822(File.open(timestamp_path, &:readline))
167
166
 
168
167
  rdoc_files.keep_if do |file|
169
168
  File.mtime(file).to_datetime > last_generation
@@ -172,6 +171,9 @@ module Rails
172
171
  # Nothing to do
173
172
  exit(0) if rdoc_files.empty?
174
173
  end
174
+
175
+ # This must come after the mtime comparison to ensure the main page is not excluded.
176
+ rdoc_files.include(api_main)
175
177
  end
176
178
 
177
179
  # These variables are used by the sdoc template
@@ -5,7 +5,6 @@ require "set"
5
5
  require "active_support/notifications"
6
6
  require "active_support/dependencies"
7
7
  require "active_support/descendants_tracker"
8
- require "rails/secrets"
9
8
 
10
9
  module Rails
11
10
  class Application
@@ -61,12 +60,14 @@ module Rails
61
60
  end
62
61
  else
63
62
  Rails.logger.level = ActiveSupport::Logger.const_get(config.log_level.to_s.upcase)
64
- broadcast_logger = ActiveSupport::BroadcastLogger.new(Rails.logger)
65
- broadcast_logger.formatter = Rails.logger.formatter
66
- Rails.logger = broadcast_logger
63
+ Rails.logger = ActiveSupport::BroadcastLogger.new(Rails.logger)
67
64
  end
65
+ end
68
66
 
69
- unless config.consider_all_requests_local
67
+ initializer :initialize_error_reporter, group: :all do
68
+ if config.consider_all_requests_local
69
+ Rails.error.debug_mode = true
70
+ else
70
71
  Rails.error.logger = Rails.logger
71
72
  end
72
73
  end
@@ -110,10 +111,6 @@ module Rails
110
111
  initializer :bootstrap_hook, group: :all do |app|
111
112
  ActiveSupport.run_load_hooks(:before_initialize, app)
112
113
  end
113
-
114
- initializer :set_secrets_root, group: :all do
115
- Rails::Secrets.root = root
116
- end
117
114
  end
118
115
  end
119
116
  end
@@ -15,15 +15,15 @@ module Rails
15
15
  :cache_classes, :cache_store, :consider_all_requests_local, :console,
16
16
  :eager_load, :exceptions_app, :file_watcher, :filter_parameters, :precompile_filter_parameters,
17
17
  :force_ssl, :helpers_paths, :hosts, :host_authorization, :logger, :log_formatter,
18
- :log_tags, :railties_order, :relative_url_root, :secret_key_base,
18
+ :log_tags, :railties_order, :relative_url_root,
19
19
  :ssl_options, :public_file_server,
20
20
  :session_options, :time_zone, :reload_classes_only_on_change,
21
21
  :beginning_of_week, :filter_redirect, :x,
22
- :read_encrypted_secrets, :content_security_policy_report_only,
22
+ :content_security_policy_report_only,
23
23
  :content_security_policy_nonce_generator, :content_security_policy_nonce_directives,
24
24
  :require_master_key, :credentials, :disable_sandbox, :sandbox_by_default,
25
25
  :add_autoload_paths_to_load_path, :rake_eager_load, :server_timing, :log_file_size,
26
- :dom_testing_default_html_version
26
+ :dom_testing_default_html_version, :yjit
27
27
 
28
28
  attr_reader :encoding, :api_only, :loaded_config_version, :log_level
29
29
 
@@ -67,8 +67,6 @@ module Rails
67
67
  @api_only = false
68
68
  @debug_exception_response_format = nil
69
69
  @x = Custom.new
70
- @enable_dependency_loading = false
71
- @read_encrypted_secrets = false
72
70
  @content_security_policy = nil
73
71
  @content_security_policy_report_only = false
74
72
  @content_security_policy_nonce_generator = nil
@@ -83,6 +81,7 @@ module Rails
83
81
  @rake_eager_load = false
84
82
  @server_timing = false
85
83
  @dom_testing_default_html_version = :html4
84
+ @yjit = false
86
85
  end
87
86
 
88
87
  # Loads default configuration values for a target version. This includes
@@ -279,8 +278,6 @@ module Rails
279
278
 
280
279
  if respond_to?(:active_record)
281
280
  active_record.run_commit_callbacks_on_first_saved_instances_in_transaction = false
282
- active_record.commit_transaction_on_non_local_return = true
283
- active_record.allow_deprecated_singular_associations_name = false
284
281
  active_record.sqlite3_adapter_strict_strings_by_default = true
285
282
  active_record.query_log_tags_format = :sqlcommenter
286
283
  active_record.raise_on_assign_to_attr_readonly = true
@@ -305,10 +302,6 @@ module Rails
305
302
  action_dispatch.debug_exception_log_level = :error
306
303
  end
307
304
 
308
- if respond_to?(:active_job)
309
- active_job.use_big_decimal_serializer = true
310
- end
311
-
312
305
  if respond_to?(:active_support)
313
306
  active_support.cache_format_version = 7.1
314
307
  active_support.message_serializer = :json_allow_marshal
@@ -316,10 +309,6 @@ module Rails
316
309
  active_support.raise_on_invalid_cache_expiration_time = true
317
310
  end
318
311
 
319
- if respond_to?(:action_controller)
320
- action_controller.allow_deprecated_parameters_hash_equality = false
321
- end
322
-
323
312
  if respond_to?(:action_view)
324
313
  require "action_view/helpers"
325
314
  action_view.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor
@@ -329,6 +318,23 @@ module Rails
329
318
  require "action_view/helpers"
330
319
  action_text.sanitizer_vendor = Rails::HTML::Sanitizer.best_supported_vendor
331
320
  end
321
+ when "7.2"
322
+ load_defaults "7.1"
323
+
324
+ self.yjit = true
325
+
326
+ if respond_to?(:active_job)
327
+ active_job.enqueue_after_transaction_commit = :default
328
+ end
329
+
330
+ if respond_to?(:active_storage)
331
+ active_storage.web_image_content_types = %w( image/png image/jpeg image/gif image/webp )
332
+ end
333
+
334
+ if respond_to?(:active_record)
335
+ active_record.postgresql_adapter_decode_dates = true
336
+ active_record.validate_migration_timestamps = true
337
+ end
332
338
  else
333
339
  raise "Unknown version #{target_version.to_s.inspect}"
334
340
  end
@@ -348,20 +354,12 @@ module Rails
348
354
  self.cache_classes = !value
349
355
  end
350
356
 
351
- ENABLE_DEPENDENCY_LOADING_WARNING = <<~MSG
352
- This flag addressed a limitation of the `classic` autoloader and has no effect nowadays.
353
- To fix this deprecation, please just delete the reference.
354
- MSG
355
- private_constant :ENABLE_DEPENDENCY_LOADING_WARNING
356
-
357
- def enable_dependency_loading
358
- Rails.deprecator.warn(ENABLE_DEPENDENCY_LOADING_WARNING)
359
- @enable_dependency_loading
357
+ def read_encrypted_secrets
358
+ Rails.deprecator.warn("'config.read_encrypted_secrets' is deprecated and will be removed in Rails 8.0.")
360
359
  end
361
360
 
362
- def enable_dependency_loading=(value)
363
- Rails.deprecator.warn(ENABLE_DEPENDENCY_LOADING_WARNING)
364
- @enable_dependency_loading = value
361
+ def read_encrypted_secrets=(value)
362
+ Rails.deprecator.warn("'config.read_encrypted_secrets=' is deprecated and will be removed in Rails 8.0.")
365
363
  end
366
364
 
367
365
  def encoding=(value)
@@ -384,9 +382,7 @@ module Rails
384
382
  @broadcast_log_level = level
385
383
  end
386
384
 
387
- def broadcast_log_level # :nodoc:
388
- defined?(@broadcast_log_level) ? @broadcast_log_level : nil
389
- end
385
+ attr_reader :broadcast_log_level # :nodoc:
390
386
 
391
387
  def debug_exception_response_format
392
388
  @debug_exception_response_format || :default
@@ -398,7 +394,6 @@ module Rails
398
394
  @paths ||= begin
399
395
  paths = super
400
396
  paths.add "config/database", with: "config/database.yml"
401
- paths.add "config/secrets", with: "config", glob: "secrets.yml{,.enc}"
402
397
  paths.add "config/environment", with: "config/environment.rb"
403
398
  paths.add "lib/templates"
404
399
  paths.add "log", with: "log/#{Rails.env}.log"
@@ -503,6 +498,30 @@ module Rails
503
498
  generators.colorize_logging = val
504
499
  end
505
500
 
501
+ def secret_key_base
502
+ @secret_key_base || begin
503
+ self.secret_key_base = if ENV["SECRET_KEY_BASE_DUMMY"]
504
+ generate_local_secret
505
+ else
506
+ ENV["SECRET_KEY_BASE"] ||
507
+ Rails.application.credentials.secret_key_base ||
508
+ (Rails.env.local? && generate_local_secret)
509
+ end
510
+ end
511
+ end
512
+
513
+ def secret_key_base=(new_secret_key_base)
514
+ if new_secret_key_base.nil? && Rails.env.local?
515
+ @secret_key_base = generate_local_secret
516
+ elsif new_secret_key_base.is_a?(String) && new_secret_key_base.present?
517
+ @secret_key_base = new_secret_key_base
518
+ elsif new_secret_key_base
519
+ raise ArgumentError, "`secret_key_base` for #{Rails.env} environment must be a type of String`"
520
+ else
521
+ raise ArgumentError, "Missing `secret_key_base` for '#{Rails.env}' environment, set this string with `bin/rails credentials:edit`"
522
+ end
523
+ end
524
+
506
525
  # Specifies what class to use to store the session. Possible values
507
526
  # are +:cache_store+, +:cookie_store+, +:mem_cache_store+, a custom
508
527
  # store, or +:disabled+. +:disabled+ tells \Rails not to deal with
@@ -584,14 +603,16 @@ module Rails
584
603
  def method_missing(method, *args)
585
604
  if method.end_with?("=")
586
605
  @configurations[:"#{method[0..-2]}"] = args.first
587
- else
606
+ elsif args.empty?
588
607
  @configurations.fetch(method) {
589
608
  @configurations[method] = ActiveSupport::OrderedOptions.new
590
609
  }
610
+ else
611
+ raise ArgumentError, "wrong number of arguments (given #{args.length}, expected 0) when reading configuration `#{method}`"
591
612
  end
592
613
  end
593
614
 
594
- def respond_to_missing?(symbol, *)
615
+ def respond_to_missing?(symbol, _)
595
616
  true
596
617
  end
597
618
  end
@@ -606,6 +627,18 @@ module Rails
606
627
 
607
628
  { content_path: content_path, key_path: key_path }
608
629
  end
630
+
631
+ def generate_local_secret
632
+ key_file = root.join("tmp/local_secret.txt")
633
+
634
+ unless File.exist?(key_file)
635
+ random_key = SecureRandom.hex(64)
636
+ FileUtils.mkdir_p(key_file.dirname)
637
+ File.binwrite(key_file, random_key)
638
+ end
639
+
640
+ File.binread(key_file)
641
+ end
609
642
  end
610
643
  end
611
644
  end
@@ -9,9 +9,9 @@ class DummyConfig # :nodoc:
9
9
  "DummyConfig"
10
10
  end
11
11
 
12
- def method_missing(selector, *args, &blk)
12
+ def method_missing(selector, ...)
13
13
  if @config.respond_to?(selector)
14
- @config.send(selector, *args, &blk)
14
+ @config.send(selector, ...)
15
15
  else
16
16
  self
17
17
  end
@@ -78,6 +78,7 @@ module Rails
78
78
  if config.eager_load
79
79
  ActiveSupport.run_load_hooks(:before_eager_load, self)
80
80
  Zeitwerk::Loader.eager_load_all
81
+ Rails.eager_load!
81
82
  config.eager_load_namespaces.each(&:eager_load!)
82
83
 
83
84
  if config.reloading_enabled?
@@ -226,6 +227,12 @@ module Rails
226
227
  ActiveSupport::DescendantsTracker.disable_clear!
227
228
  end
228
229
  end
230
+
231
+ initializer :enable_yjit do
232
+ if config.yjit && defined?(RubyVM::YJIT.enable)
233
+ RubyVM::YJIT.enable
234
+ end
235
+ end
229
236
  end
230
237
  end
231
238
  end
@@ -10,7 +10,6 @@ require "active_support/encrypted_configuration"
10
10
  require "active_support/hash_with_indifferent_access"
11
11
  require "active_support/configuration_file"
12
12
  require "rails/engine"
13
- require "rails/secrets"
14
13
  require "rails/autoloaders"
15
14
 
16
15
  module Rails
@@ -104,7 +103,7 @@ module Rails
104
103
  delegate :default_url_options, :default_url_options=, to: :routes
105
104
 
106
105
  INITIAL_VARIABLES = [:config, :railties, :routes_reloader, :reloaders,
107
- :routes, :helpers, :app_env_config, :secrets] # :nodoc:
106
+ :routes, :helpers, :app_env_config] # :nodoc:
108
107
 
109
108
  def initialize(initial_variable_values = {}, &block)
110
109
  super()
@@ -135,6 +134,13 @@ module Rails
135
134
  @initialized
136
135
  end
137
136
 
137
+ # Returns the dasherized application name.
138
+ #
139
+ # MyApp::Application.new.name => "my-app"
140
+ def name
141
+ self.class.name.underscore.dasherize.delete_suffix("/application")
142
+ end
143
+
138
144
  def run_load_hooks! # :nodoc:
139
145
  return self if @ran_load_hooks
140
146
  @ran_load_hooks = true
@@ -208,17 +214,20 @@ module Rails
208
214
  # It is recommended not to use the same verifier for different things, so you can get different
209
215
  # verifiers passing the +verifier_name+ argument.
210
216
  #
217
+ # For instance, +ActiveStorage::Blob.signed_id_verifier+ is implemented using this feature, which assures that
218
+ # the IDs strings haven't been tampered with and are safe to use in a finder.
219
+ #
220
+ # See the ActiveSupport::MessageVerifier documentation for more information.
221
+ #
211
222
  # ==== Parameters
212
223
  #
213
224
  # * +verifier_name+ - the name of the message verifier.
214
225
  #
215
226
  # ==== Examples
216
227
  #
217
- # message = Rails.application.message_verifier('sensitive_data').generate('my sensible data')
218
- # Rails.application.message_verifier('sensitive_data').verify(message)
219
- # # => 'my sensible data'
220
- #
221
- # See the ActiveSupport::MessageVerifier documentation for more information.
228
+ # message = Rails.application.message_verifier('my_purpose').generate('data to sign against tampering')
229
+ # Rails.application.message_verifier('my_purpose').verify(message)
230
+ # # => 'data to sign against tampering'
222
231
  def message_verifier(verifier_name)
223
232
  message_verifiers[verifier_name]
224
233
  end
@@ -412,8 +421,8 @@ module Rails
412
421
  def watchable_args # :nodoc:
413
422
  files, dirs = config.watchable_files.dup, config.watchable_dirs.dup
414
423
 
415
- ActiveSupport::Dependencies.autoload_paths.each do |path|
416
- File.file?(path) ? files << path.to_s : dirs[path.to_s] = [:rb]
424
+ Rails.autoloaders.main.dirs.each do |path|
425
+ dirs[path] = [:rb]
417
426
  end
418
427
 
419
428
  [files, dirs]
@@ -439,67 +448,29 @@ module Rails
439
448
  end
440
449
 
441
450
  attr_writer :config
442
-
443
- def secrets
444
- Rails.deprecator.warn(<<~MSG.squish)
445
- `Rails.application.secrets` is deprecated in favor of `Rails.application.credentials` and will be removed in Rails 7.2.
446
- MSG
447
- @secrets ||= begin
448
- secrets = ActiveSupport::OrderedOptions.new
449
- files = config.paths["config/secrets"].existent
450
- files = files.reject { |path| path.end_with?(".enc") } unless config.read_encrypted_secrets
451
- secrets.merge! Rails::Secrets.parse(files, env: Rails.env)
452
-
453
- # Fallback to config.secret_key_base if secrets.secret_key_base isn't set
454
- secrets.secret_key_base ||= config.secret_key_base
455
-
456
- secrets
457
- end
458
- end
459
-
460
- attr_writer :secrets, :credentials
451
+ attr_writer :credentials
461
452
 
462
453
  # The secret_key_base is used as the input secret to the application's key generator, which in turn
463
454
  # is used to create all ActiveSupport::MessageVerifier and ActiveSupport::MessageEncryptor instances,
464
455
  # including the ones that sign and encrypt cookies.
465
456
  #
466
- # In development and test, this is randomly generated and stored in a
467
- # temporary file in <tt>tmp/local_secret.txt</tt>.
457
+ # We look for it first in <tt>ENV["SECRET_KEY_BASE"]</tt>, then in
458
+ # +credentials.secret_key_base+. For most applications, the correct place
459
+ # to store it is in the encrypted credentials file.
468
460
  #
469
- # You can also set <tt>ENV["SECRET_KEY_BASE_DUMMY"]</tt> to trigger the use of a randomly generated
470
- # secret_key_base that's stored in a temporary file. This is useful when precompiling assets for
471
- # production as part of a build step that otherwise does not need access to the production secrets.
461
+ # In development and test, if the secret_key_base is still empty, it is
462
+ # randomly generated and stored in a temporary file in
463
+ # <tt>tmp/local_secret.txt</tt>.
472
464
  #
473
- # Dockerfile example: <tt>RUN SECRET_KEY_BASE_DUMMY=1 bundle exec rails assets:precompile</tt>.
465
+ # Generating a random secret_key_base and storing it in
466
+ # <tt>tmp/local_secret.txt</tt> can also be triggered by setting
467
+ # <tt>ENV["SECRET_KEY_BASE_DUMMY"]</tt>. This is useful when precompiling
468
+ # assets for production as part of a build step that otherwise does not
469
+ # need access to the production secrets.
474
470
  #
475
- # In all other environments, we look for it first in <tt>ENV["SECRET_KEY_BASE"]</tt>,
476
- # then +credentials.secret_key_base+, and finally +secrets.secret_key_base+. For most applications,
477
- # the correct place to store it is in the encrypted credentials file.
471
+ # Dockerfile example: <tt>RUN SECRET_KEY_BASE_DUMMY=1 bundle exec rails assets:precompile</tt>.
478
472
  def secret_key_base
479
- config.secret_key_base ||=
480
- if ENV["SECRET_KEY_BASE_DUMMY"]
481
- generate_local_secret
482
- else
483
- validate_secret_key_base(
484
- ENV["SECRET_KEY_BASE"] || credentials.secret_key_base || begin
485
- secret_skb = secrets_secret_key_base
486
-
487
- if secret_skb && secret_skb.equal?(config.secret_key_base)
488
- config.secret_key_base
489
- elsif secret_skb
490
- Rails.deprecator.warn(<<~MSG.squish)
491
- Your `secret_key_base` is configured in `Rails.application.secrets`,
492
- which is deprecated in favor of `Rails.application.credentials` and
493
- will be removed in Rails 7.2.
494
- MSG
495
-
496
- secret_skb
497
- elsif Rails.env.local?
498
- generate_local_secret
499
- end
500
- end
501
- )
502
- end
473
+ config.secret_key_base
503
474
  end
504
475
 
505
476
  # Returns an ActiveSupport::EncryptedConfiguration instance for the
@@ -652,47 +623,12 @@ module Rails
652
623
  default_stack.build_stack
653
624
  end
654
625
 
655
- def validate_secret_key_base(secret_key_base)
656
- if secret_key_base.is_a?(String) && secret_key_base.present?
657
- secret_key_base
658
- elsif secret_key_base
659
- raise ArgumentError, "`secret_key_base` for #{Rails.env} environment must be a type of String`"
660
- else
661
- raise ArgumentError, "Missing `secret_key_base` for '#{Rails.env}' environment, set this string with `bin/rails credentials:edit`"
662
- end
663
- end
664
-
665
626
  def ensure_generator_templates_added
666
627
  configured_paths = config.generators.templates
667
628
  configured_paths.unshift(*(paths["lib/templates"].existent - configured_paths))
668
629
  end
669
630
 
670
631
  private
671
- def generate_local_secret
672
- if config.secret_key_base.nil?
673
- key_file = Rails.root.join("tmp/local_secret.txt")
674
-
675
- if File.exist?(key_file)
676
- config.secret_key_base = File.binread(key_file)
677
- elsif secrets_secret_key_base
678
- config.secret_key_base = secrets_secret_key_base
679
- else
680
- random_key = SecureRandom.hex(64)
681
- FileUtils.mkdir_p(key_file.dirname)
682
- File.binwrite(key_file, random_key)
683
- config.secret_key_base = File.binread(key_file)
684
- end
685
- end
686
-
687
- config.secret_key_base
688
- end
689
-
690
- def secrets_secret_key_base
691
- Rails.deprecator.silence do
692
- secrets.secret_key_base
693
- end
694
- end
695
-
696
632
  def build_request(env)
697
633
  req = super
698
634
  env["ORIGINAL_FULLPATH"] = req.fullpath
@@ -5,8 +5,8 @@ require "active_support/core_ext/string/access"
5
5
 
6
6
  module Rails
7
7
  class BacktraceCleaner < ActiveSupport::BacktraceCleaner # :nodoc:
8
- APP_DIRS_PATTERN = /\A(?:\.\/)?(?:app|config|lib|test|\(\w*\))/
9
- RENDER_TEMPLATE_PATTERN = /:in `.*_\w+_{2,3}\d+_\d+'/
8
+ APP_DIRS_PATTERN = /\A(?:\.\/)?(?:app|config|lib|test|\(\w+(?:-\w+)*\))/
9
+ RENDER_TEMPLATE_PATTERN = /:in [`'].*_\w+_{2,3}\d+_\d+'/
10
10
 
11
11
  def initialize
12
12
  super
@@ -25,5 +25,18 @@ module Rails
25
25
  end
26
26
  add_silencer { |line| !APP_DIRS_PATTERN.match?(line) }
27
27
  end
28
+
29
+ def clean(backtrace, kind = :silent)
30
+ kind = nil if ENV["BACKTRACE"]
31
+
32
+ super(backtrace, kind)
33
+ end
34
+ alias_method :filter, :clean
35
+
36
+ def clean_frame(frame, kind = :silent)
37
+ kind = nil if ENV["BACKTRACE"]
38
+
39
+ super(frame, kind)
40
+ end
28
41
  end
29
42
  end
data/lib/rails/cli.rb CHANGED
@@ -6,7 +6,6 @@ require "rails/app_loader"
6
6
  # the rest of this script is not run.
7
7
  Rails::AppLoader.exec_app
8
8
 
9
- require "rails/ruby_version_check"
10
9
  Signal.trap("INT") { puts; exit(1) }
11
10
 
12
11
  require "rails/command"
data/lib/rails/command.rb CHANGED
@@ -23,7 +23,7 @@ module Rails
23
23
  super(message)
24
24
  end
25
25
 
26
- if !Exception.method_defined?(:detailed_message)
26
+ if !Exception.method_defined?(:detailed_message) # Ruby 3.2+
27
27
  def detailed_message(...)
28
28
  message
29
29
  end