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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +206 -769
- data/README.rdoc +1 -1
- data/lib/minitest/rails_plugin.rb +6 -3
- data/lib/rails/all.rb +1 -3
- data/lib/rails/api/task.rb +6 -4
- data/lib/rails/application/bootstrap.rb +6 -9
- data/lib/rails/application/configuration.rb +66 -33
- data/lib/rails/application/dummy_config.rb +2 -2
- data/lib/rails/application/finisher.rb +7 -0
- data/lib/rails/application.rb +32 -96
- data/lib/rails/backtrace_cleaner.rb +15 -2
- data/lib/rails/cli.rb +0 -1
- data/lib/rails/command.rb +1 -1
- data/lib/rails/commands/app/update_command.rb +102 -0
- data/lib/rails/commands/boot/boot_command.rb +14 -0
- data/lib/rails/commands/console/console_command.rb +2 -21
- data/lib/rails/commands/console/irb_console.rb +133 -0
- data/lib/rails/commands/credentials/credentials_command.rb +2 -2
- data/lib/rails/commands/dbconsole/dbconsole_command.rb +21 -30
- data/lib/rails/commands/devcontainer/devcontainer_command.rb +39 -0
- data/lib/rails/commands/rake/rake_command.rb +1 -1
- data/lib/rails/commands/runner/runner_command.rb +14 -3
- data/lib/rails/commands/server/server_command.rb +5 -3
- data/lib/rails/configuration.rb +10 -1
- data/lib/rails/console/app.rb +5 -32
- data/lib/rails/console/helpers.rb +5 -16
- data/lib/rails/console/methods.rb +23 -0
- data/lib/rails/engine.rb +7 -7
- data/lib/rails/gem_version.rb +2 -2
- data/lib/rails/generators/actions.rb +9 -5
- data/lib/rails/generators/app_base.rb +76 -51
- data/lib/rails/generators/base.rb +5 -1
- data/lib/rails/generators/database.rb +227 -69
- data/lib/rails/generators/erb/scaffold/templates/edit.html.erb.tt +2 -0
- data/lib/rails/generators/erb/scaffold/templates/index.html.erb.tt +2 -0
- data/lib/rails/generators/erb/scaffold/templates/new.html.erb.tt +2 -0
- data/lib/rails/generators/generated_attribute.rb +26 -1
- data/lib/rails/generators/rails/app/app_generator.rb +56 -28
- data/lib/rails/generators/rails/app/templates/Dockerfile.tt +22 -15
- data/lib/rails/generators/rails/app/templates/Gemfile.tt +17 -17
- data/lib/rails/generators/rails/app/templates/app/controllers/application_controller.rb.tt +4 -0
- data/lib/rails/generators/rails/app/templates/app/views/layouts/application.html.erb.tt +8 -1
- data/lib/rails/generators/rails/app/templates/app/views/pwa/manifest.json.erb.tt +22 -0
- data/lib/rails/generators/rails/app/templates/app/views/pwa/service-worker.js +26 -0
- data/lib/rails/generators/rails/app/templates/bin/brakeman.tt +6 -0
- data/lib/rails/generators/rails/app/templates/bin/rubocop.tt +7 -0
- data/lib/rails/generators/rails/app/templates/bin/setup.tt +6 -2
- data/lib/rails/generators/rails/app/templates/config/application.rb.tt +1 -1
- data/lib/rails/generators/rails/app/templates/config/databases/mysql.yml.tt +3 -3
- data/lib/rails/generators/rails/app/templates/config/databases/postgresql.yml.tt +7 -0
- data/lib/rails/generators/rails/app/templates/config/databases/sqlite3.yml.tt +8 -1
- data/lib/rails/generators/rails/app/templates/config/databases/trilogy.yml.tt +3 -3
- data/lib/rails/generators/rails/app/templates/config/environments/development.rb.tt +14 -7
- data/lib/rails/generators/rails/app/templates/config/environments/production.rb.tt +8 -0
- data/lib/rails/generators/rails/app/templates/config/environments/test.rb.tt +8 -5
- data/lib/rails/generators/rails/app/templates/config/initializers/assets.rb.tt +1 -1
- data/lib/rails/generators/rails/app/templates/config/initializers/filter_parameter_logging.rb.tt +1 -1
- data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_2.rb.tt +70 -0
- data/lib/rails/generators/rails/app/templates/config/puma.rb.tt +25 -35
- data/lib/rails/generators/rails/app/templates/config/routes.rb.tt +6 -0
- data/lib/rails/generators/rails/app/templates/docker-entrypoint.tt +5 -0
- data/lib/rails/generators/rails/app/templates/dockerignore.tt +13 -0
- data/lib/rails/generators/rails/app/templates/github/ci.yml.tt +140 -0
- data/lib/rails/generators/rails/app/templates/github/dependabot.yml +12 -0
- data/lib/rails/generators/rails/app/templates/gitignore.tt +3 -3
- data/lib/rails/generators/rails/app/templates/public/406-unsupported-browser.html +66 -0
- data/lib/rails/generators/rails/app/templates/public/icon.png +0 -0
- data/lib/rails/generators/rails/app/templates/public/icon.svg +3 -0
- data/lib/rails/generators/rails/app/templates/rubocop.yml.tt +8 -0
- data/lib/rails/generators/rails/app/templates/test/application_system_test_case.rb.tt +1 -1
- data/lib/rails/generators/rails/controller/controller_generator.rb +1 -1
- data/lib/rails/generators/rails/db/system/change/change_generator.rb +131 -20
- data/lib/rails/generators/rails/devcontainer/devcontainer_generator.rb +166 -0
- data/lib/rails/generators/rails/devcontainer/templates/devcontainer/Dockerfile.tt +3 -0
- data/lib/rails/generators/rails/devcontainer/templates/devcontainer/compose.yaml.tt +47 -0
- data/lib/rails/generators/rails/devcontainer/templates/devcontainer/devcontainer.json.tt +37 -0
- data/lib/rails/generators/rails/migration/migration_generator.rb +4 -0
- data/lib/rails/generators/rails/plugin/plugin_generator.rb +40 -7
- data/lib/rails/generators/rails/plugin/templates/%name%.gemspec.tt +2 -2
- data/lib/rails/generators/rails/plugin/templates/Gemfile.tt +5 -1
- data/lib/rails/generators/rails/plugin/templates/app/views/layouts/%namespaced_name%/application.html.erb.tt +2 -0
- data/lib/rails/generators/rails/plugin/templates/bin/rubocop.tt +7 -0
- data/lib/rails/generators/rails/plugin/templates/github/ci.yml.tt +104 -0
- data/lib/rails/generators/rails/plugin/templates/github/dependabot.yml +12 -0
- data/lib/rails/generators/rails/plugin/templates/rubocop.yml.tt +8 -0
- data/lib/rails/generators/rails/plugin/templates/test/application_system_test_case.rb.tt +1 -1
- data/lib/rails/generators/rails/plugin/templates/test/test_helper.rb.tt +2 -2
- data/lib/rails/generators/rails/scaffold_controller/templates/api_controller.rb.tt +2 -2
- data/lib/rails/generators/rails/scaffold_controller/templates/controller.rb.tt +2 -2
- data/lib/rails/generators/test_unit/mailer/templates/functional_test.rb.tt +6 -4
- data/lib/rails/generators/test_unit/mailer/templates/preview.rb.tt +3 -2
- data/lib/rails/generators/test_unit/scaffold/scaffold_generator.rb +15 -1
- data/lib/rails/generators/test_unit/scaffold/templates/api_functional_test.rb.tt +2 -2
- data/lib/rails/generators/test_unit/scaffold/templates/functional_test.rb.tt +2 -2
- data/lib/rails/generators/test_unit/scaffold/templates/system_test.rb.tt +2 -0
- data/lib/rails/generators/test_unit/system/templates/application_system_test_case.rb.tt +1 -1
- data/lib/rails/generators/testing/assertions.rb +20 -0
- data/lib/rails/generators/testing/behavior.rb +7 -6
- data/lib/rails/generators.rb +10 -6
- data/lib/rails/health_controller.rb +1 -1
- data/lib/rails/info.rb +2 -2
- data/lib/rails/mailers_controller.rb +14 -1
- data/lib/rails/paths.rb +2 -2
- data/lib/rails/pwa_controller.rb +15 -0
- data/lib/rails/rack/logger.rb +15 -7
- data/lib/rails/railtie/configurable.rb +2 -2
- data/lib/rails/railtie.rb +2 -3
- data/lib/rails/tasks/framework.rake +0 -26
- data/lib/rails/tasks/tmp.rake +1 -1
- data/lib/rails/templates/layouts/application.html.erb +1 -1
- data/lib/rails/templates/rails/mailers/email.html.erb +12 -8
- data/lib/rails/templates/rails/welcome/index.html.erb +4 -2
- data/lib/rails/test_help.rb +2 -4
- data/lib/rails/test_unit/reporter.rb +8 -2
- data/lib/rails/test_unit/runner.rb +30 -2
- data/lib/rails/test_unit/test_parser.rb +48 -0
- data/lib/rails.rb +6 -3
- metadata +40 -30
- data/lib/rails/app_updater.rb +0 -52
- data/lib/rails/commands/secrets/USAGE +0 -61
- data/lib/rails/commands/secrets/secrets_command.rb +0 -47
- data/lib/rails/generators/rails/app/templates/config/databases/jdbc.yml.tt +0 -68
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcmysql.yml.tt +0 -54
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcpostgresql.yml.tt +0 -70
- data/lib/rails/generators/rails/app/templates/config/databases/jdbcsqlite3.yml.tt +0 -24
- data/lib/rails/generators/rails/app/templates/config/databases/oracle.yml.tt +0 -62
- data/lib/rails/generators/rails/app/templates/config/databases/sqlserver.yml.tt +0 -53
- data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_1.rb.tt +0 -280
- data/lib/rails/generators/rails/app/templates/public/apple-touch-icon-precomposed.png +0 -0
- data/lib/rails/generators/rails/app/templates/public/apple-touch-icon.png +0 -0
- data/lib/rails/generators/rails/app/templates/public/favicon.ico +0 -0
- data/lib/rails/ruby_version_check.rb +0 -17
- 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
|
|
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 <
|
|
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
|
-
"
|
|
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
|
|
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
|
data/lib/rails/api/task.rb
CHANGED
|
@@ -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
|
-
|
|
166
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
:
|
|
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
|
-
|
|
352
|
-
|
|
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
|
|
363
|
-
Rails.deprecator.warn(
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
12
|
+
def method_missing(selector, ...)
|
|
13
13
|
if @config.respond_to?(selector)
|
|
14
|
-
@config.send(selector,
|
|
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
|
data/lib/rails/application.rb
CHANGED
|
@@ -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
|
|
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('
|
|
218
|
-
# Rails.application.message_verifier('
|
|
219
|
-
# # => '
|
|
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
|
-
|
|
416
|
-
|
|
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
|
-
#
|
|
467
|
-
#
|
|
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
|
-
#
|
|
470
|
-
#
|
|
471
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
|
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