railties 7.0.2.4 → 7.0.4
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 +70 -0
- data/lib/minitest/rails_plugin.rb +1 -1
- data/lib/rails/app_updater.rb +6 -1
- data/lib/rails/application/bootstrap.rb +3 -0
- data/lib/rails/application/configuration.rb +24 -2
- data/lib/rails/application/default_middleware_stack.rb +15 -0
- data/lib/rails/application/finisher.rb +14 -12
- data/lib/rails/application.rb +21 -20
- data/lib/rails/command.rb +1 -1
- data/lib/rails/commands/server/server_command.rb +6 -1
- data/lib/rails/console/helpers.rb +2 -2
- data/lib/rails/engine.rb +13 -13
- data/lib/rails/gem_version.rb +3 -3
- data/lib/rails/generators/app_base.rb +10 -2
- data/lib/rails/generators/base.rb +3 -3
- data/lib/rails/generators/named_base.rb +2 -2
- data/lib/rails/generators/rails/app/app_generator.rb +6 -3
- data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt +4 -5
- data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_0.rb.tt +38 -20
- data/lib/rails/generators.rb +9 -3
- data/lib/rails/paths.rb +1 -1
- data/lib/rails/rack/logger.rb +7 -8
- data/lib/rails/railtie.rb +9 -3
- data/lib/rails/source_annotation_extractor.rb +1 -1
- data/lib/rails/version.rb +1 -1
- data/lib/rails.rb +7 -0
- metadata +12 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8426dae672be312fe1692dddb173520cb38cab1d146901da4e8321a731c4d309
|
4
|
+
data.tar.gz: '086173aa65cfba04c54b052ad3725f2cb55caafc7b2eef3255883f86a51dea3b'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a936aed24714e95363c55d50c008a2d85a4b22951647172b79b7d5faaaa2b49dce611f43bc6099001cc400b91614a49f003f5c68834c218596434c2d6e5ae71
|
7
|
+
data.tar.gz: b863940381ffc5819d6cd191735d30af40603d04946630781ab01ba6d0b6ab3ead22449b95f99fca4f84bbfa06b85b6aa9d3d05cce5ab1df0bd2a8841420d76e
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,73 @@
|
|
1
|
+
## Rails 7.0.4 (September 09, 2022) ##
|
2
|
+
|
3
|
+
* `config.allow_concurrency = false` now use a `Monitor` instead of a `Mutex`
|
4
|
+
|
5
|
+
This allows to enable `config.active_support.executor_around_test_case` even
|
6
|
+
when `config.allow_concurrency` is disabled.
|
7
|
+
|
8
|
+
*Jean Boussier*
|
9
|
+
|
10
|
+
* Skip Active Storage and Action Mailer if Active Job is skipped.
|
11
|
+
|
12
|
+
*Étienne Barrié*
|
13
|
+
|
14
|
+
* Correctly check if frameworks are disabled when running app:update.
|
15
|
+
|
16
|
+
*Étienne Barrié* and *Paulo Barros*
|
17
|
+
|
18
|
+
* Fixed `config.active_support.cache_format_version` never being applied.
|
19
|
+
|
20
|
+
Rails 7.0 shipped with a new serializer for Rails.cache, but the associated config
|
21
|
+
wasn't working properly. Note that even after this fix, it can only be applied from
|
22
|
+
the `application.rb` file.
|
23
|
+
|
24
|
+
*Alex Ghiculescu*
|
25
|
+
|
26
|
+
|
27
|
+
## Rails 7.0.3.1 (July 12, 2022) ##
|
28
|
+
|
29
|
+
* No changes.
|
30
|
+
|
31
|
+
|
32
|
+
## Rails 7.0.3 (May 09, 2022) ##
|
33
|
+
|
34
|
+
* If reloading and eager loading are both enabled, after a reload Rails eager loads again the application code.
|
35
|
+
|
36
|
+
*Xavier Noria*
|
37
|
+
|
38
|
+
* Use `controller_class_path` in `Rails::Generators::NamedBase#route_url`
|
39
|
+
|
40
|
+
The `route_url` method now returns the correct path when generating
|
41
|
+
a namespaced controller with a top-level model using `--model-name`.
|
42
|
+
|
43
|
+
Previously, when running this command:
|
44
|
+
|
45
|
+
``` sh
|
46
|
+
bin/rails generate scaffold_controller Admin/Post --model-name Post
|
47
|
+
```
|
48
|
+
|
49
|
+
the comments above the controller action would look like:
|
50
|
+
|
51
|
+
``` ruby
|
52
|
+
# GET /posts
|
53
|
+
def index
|
54
|
+
@posts = Post.all
|
55
|
+
end
|
56
|
+
```
|
57
|
+
|
58
|
+
afterwards, they now look like this:
|
59
|
+
|
60
|
+
``` ruby
|
61
|
+
# GET /admin/posts
|
62
|
+
def index
|
63
|
+
@posts = Post.all
|
64
|
+
end
|
65
|
+
```
|
66
|
+
|
67
|
+
Fixes #44662.
|
68
|
+
|
69
|
+
*Andrew White*
|
70
|
+
|
1
71
|
## Rails 7.0.2.4 (April 26, 2022) ##
|
2
72
|
|
3
73
|
* No changes.
|
@@ -49,7 +49,7 @@ module Minitest
|
|
49
49
|
end
|
50
50
|
|
51
51
|
# Owes great inspiration to test runner trailblazers like RSpec,
|
52
|
-
# minitest-reporters, maxitest and others.
|
52
|
+
# minitest-reporters, maxitest, and others.
|
53
53
|
def self.plugin_rails_init(options)
|
54
54
|
unless options[:full_backtrace] || ENV["BACKTRACE"]
|
55
55
|
# Plugin can run without Rails loaded, check before filtering.
|
data/lib/rails/app_updater.rb
CHANGED
@@ -21,10 +21,15 @@ module Rails
|
|
21
21
|
private
|
22
22
|
def generator_options
|
23
23
|
options = { api: !!Rails.application.config.api_only, update: true }
|
24
|
+
options[:skip_active_job] = !defined?(ActiveJob::Railtie)
|
24
25
|
options[:skip_active_record] = !defined?(ActiveRecord::Railtie)
|
25
|
-
options[:skip_active_storage] = !defined?(ActiveStorage::Engine)
|
26
|
+
options[:skip_active_storage] = !defined?(ActiveStorage::Engine)
|
26
27
|
options[:skip_action_mailer] = !defined?(ActionMailer::Railtie)
|
28
|
+
options[:skip_action_mailbox] = !defined?(ActionMailbox::Engine)
|
29
|
+
options[:skip_action_text] = !defined?(ActionText::Engine)
|
27
30
|
options[:skip_action_cable] = !defined?(ActionCable::Engine)
|
31
|
+
options[:skip_test] = !defined?(Rails::TestUnitRailtie)
|
32
|
+
options[:skip_system_test] = Rails.application.config.generators.system_tests.nil?
|
28
33
|
options[:skip_asset_pipeline] = !defined?(Sprockets::Railtie) && !defined?(Propshaft::Railtie)
|
29
34
|
options[:skip_bootsnap] = !defined?(Bootsnap)
|
30
35
|
options[:updating] = true
|
@@ -59,6 +59,9 @@ module Rails
|
|
59
59
|
|
60
60
|
# Initialize cache early in the stack so railties can make use of it.
|
61
61
|
initializer :initialize_cache, group: :all do
|
62
|
+
cache_format_version = config.active_support.delete(:cache_format_version)
|
63
|
+
ActiveSupport.cache_format_version = cache_format_version if cache_format_version
|
64
|
+
|
62
65
|
unless Rails.cache
|
63
66
|
Rails.cache = ActiveSupport::Cache.lookup_store(*config.cache_store)
|
64
67
|
|
@@ -334,8 +334,14 @@ module Rails
|
|
334
334
|
config = if yaml&.exist?
|
335
335
|
loaded_yaml = ActiveSupport::ConfigurationFile.parse(yaml)
|
336
336
|
if (shared = loaded_yaml.delete("shared"))
|
337
|
-
loaded_yaml.each do |
|
338
|
-
values.
|
337
|
+
loaded_yaml.each do |env, config|
|
338
|
+
if config.is_a?(Hash) && config.values.all?(Hash)
|
339
|
+
config.map do |name, sub_config|
|
340
|
+
sub_config.reverse_merge!(shared)
|
341
|
+
end
|
342
|
+
else
|
343
|
+
config.reverse_merge!(shared)
|
344
|
+
end
|
339
345
|
end
|
340
346
|
end
|
341
347
|
Hash.new(shared).merge(loaded_yaml)
|
@@ -361,6 +367,20 @@ module Rails
|
|
361
367
|
generators.colorize_logging = val
|
362
368
|
end
|
363
369
|
|
370
|
+
# Specifies what class to use to store the session. Possible values
|
371
|
+
# are +:cookie_store+, +:mem_cache_store+, a custom store, or
|
372
|
+
# +:disabled+. +:disabled+ tells Rails not to deal with sessions.
|
373
|
+
#
|
374
|
+
# Additional options will be set as +session_options+:
|
375
|
+
#
|
376
|
+
# config.session_store :cookie_store, key: "_your_app_session"
|
377
|
+
# config.session_options # => {key: "_your_app_session"}
|
378
|
+
#
|
379
|
+
# If a custom store is specified as a symbol, it will be resolved to
|
380
|
+
# the +ActionDispatch::Session+ namespace:
|
381
|
+
#
|
382
|
+
# # use ActionDispatch::Session::MyCustomStore as the session store
|
383
|
+
# config.session_store :my_custom_store
|
364
384
|
def session_store(new_session_store = nil, **options)
|
365
385
|
if new_session_store
|
366
386
|
if new_session_store == :active_record_store
|
@@ -396,6 +416,7 @@ module Rails
|
|
396
416
|
Rails::SourceAnnotationExtractor::Annotation
|
397
417
|
end
|
398
418
|
|
419
|
+
# Configures the ActionDispatch::ContentSecurityPolicy.
|
399
420
|
def content_security_policy(&block)
|
400
421
|
if block_given?
|
401
422
|
@content_security_policy = ActionDispatch::ContentSecurityPolicy.new(&block)
|
@@ -404,6 +425,7 @@ module Rails
|
|
404
425
|
end
|
405
426
|
end
|
406
427
|
|
428
|
+
# Configures the ActionDispatch::PermissionsPolicy.
|
407
429
|
def permissions_policy(&block)
|
408
430
|
if block_given?
|
409
431
|
@permissions_policy = ActionDispatch::PermissionsPolicy.new(&block)
|
@@ -81,6 +81,21 @@ module Rails
|
|
81
81
|
middleware.use ::Rack::ETag, "no-cache"
|
82
82
|
|
83
83
|
middleware.use ::Rack::TempfileReaper unless config.api_only
|
84
|
+
|
85
|
+
if config.respond_to?(:active_record)
|
86
|
+
if selector_options = config.active_record.database_selector
|
87
|
+
resolver = config.active_record.database_resolver
|
88
|
+
context = config.active_record.database_resolver_context
|
89
|
+
|
90
|
+
middleware.use ::ActiveRecord::Middleware::DatabaseSelector, resolver, context, selector_options
|
91
|
+
end
|
92
|
+
|
93
|
+
if shard_resolver = config.active_record.shard_resolver
|
94
|
+
options = config.active_record.shard_selector || {}
|
95
|
+
|
96
|
+
middleware.use ::ActiveRecord::Middleware::ShardSelector, shard_resolver, options
|
97
|
+
end
|
98
|
+
end
|
84
99
|
end
|
85
100
|
end
|
86
101
|
|
@@ -35,10 +35,6 @@ module Rails
|
|
35
35
|
ActiveSupport::Dependencies._autoloaded_tracked_classes << value
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
39
|
-
autoloader.on_unload do |_cpath, value, _abspath|
|
40
|
-
value.before_remove_const if value.respond_to?(:before_remove_const)
|
41
|
-
end
|
42
38
|
end
|
43
39
|
|
44
40
|
autoloader.setup
|
@@ -72,11 +68,17 @@ module Rails
|
|
72
68
|
app.reloader.prepare!
|
73
69
|
end
|
74
70
|
|
75
|
-
initializer :eager_load! do
|
71
|
+
initializer :eager_load! do |app|
|
76
72
|
if config.eager_load
|
77
73
|
ActiveSupport.run_load_hooks(:before_eager_load, self)
|
78
74
|
Zeitwerk::Loader.eager_load_all
|
79
75
|
config.eager_load_namespaces.each(&:eager_load!)
|
76
|
+
|
77
|
+
unless config.cache_classes
|
78
|
+
app.reloader.after_class_unload do
|
79
|
+
Rails.autoloaders.main.eager_load
|
80
|
+
end
|
81
|
+
end
|
80
82
|
end
|
81
83
|
end
|
82
84
|
|
@@ -85,21 +87,21 @@ module Rails
|
|
85
87
|
ActiveSupport.run_load_hooks(:after_initialize, self)
|
86
88
|
end
|
87
89
|
|
88
|
-
class
|
89
|
-
def initialize(
|
90
|
-
@
|
90
|
+
class MonitorHook # :nodoc:
|
91
|
+
def initialize(monitor = Monitor.new)
|
92
|
+
@monitor = monitor
|
91
93
|
end
|
92
94
|
|
93
95
|
def run
|
94
|
-
@
|
96
|
+
@monitor.enter
|
95
97
|
end
|
96
98
|
|
97
99
|
def complete(_state)
|
98
|
-
@
|
100
|
+
@monitor.exit
|
99
101
|
end
|
100
102
|
end
|
101
103
|
|
102
|
-
module InterlockHook
|
104
|
+
module InterlockHook # :nodoc:
|
103
105
|
def self.run
|
104
106
|
ActiveSupport::Dependencies.interlock.start_running
|
105
107
|
end
|
@@ -114,7 +116,7 @@ module Rails
|
|
114
116
|
# User has explicitly opted out of concurrent request
|
115
117
|
# handling: presumably their code is not threadsafe
|
116
118
|
|
117
|
-
app.executor.register_hook(
|
119
|
+
app.executor.register_hook(MonitorHook.new, outer: true)
|
118
120
|
|
119
121
|
elsif config.allow_concurrency == :unsafe
|
120
122
|
# Do nothing, even if we know this is dangerous. This is the
|
data/lib/rails/application.rb
CHANGED
@@ -22,12 +22,12 @@ module Rails
|
|
22
22
|
# Rails::Application::Bootstrap) and finishing initializers, after all the others
|
23
23
|
# are executed (check Rails::Application::Finisher).
|
24
24
|
#
|
25
|
-
# == Configuration
|
25
|
+
# == \Configuration
|
26
26
|
#
|
27
27
|
# Besides providing the same configuration as Rails::Engine and Rails::Railtie,
|
28
28
|
# the application object has several specific configurations, for example
|
29
|
-
#
|
30
|
-
#
|
29
|
+
# +cache_classes+, +consider_all_requests_local+, +filter_parameters+,
|
30
|
+
# +logger+, and so forth.
|
31
31
|
#
|
32
32
|
# Check Rails::Application::Configuration to see them all.
|
33
33
|
#
|
@@ -43,21 +43,21 @@ module Rails
|
|
43
43
|
# == Booting process
|
44
44
|
#
|
45
45
|
# The application is also responsible for setting up and executing the booting
|
46
|
-
# process. From the moment you require
|
46
|
+
# process. From the moment you require <tt>config/application.rb</tt> in your app,
|
47
47
|
# the booting process goes like this:
|
48
48
|
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
54
|
-
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
49
|
+
# 1. <tt>require "config/boot.rb"</tt> to set up load paths.
|
50
|
+
# 2. +require+ railties and engines.
|
51
|
+
# 3. Define +Rails.application+ as <tt>class MyApp::Application < Rails::Application</tt>.
|
52
|
+
# 4. Run +config.before_configuration+ callbacks.
|
53
|
+
# 5. Load <tt>config/environments/ENV.rb</tt>.
|
54
|
+
# 6. Run +config.before_initialize+ callbacks.
|
55
|
+
# 7. Run <tt>Railtie#initializer</tt> defined by railties, engines, and application.
|
56
|
+
# One by one, each engine sets up its load paths and routes, and runs its <tt>config/initializers/*</tt> files.
|
57
|
+
# 8. Custom <tt>Railtie#initializers</tt> added by railties, engines, and applications are executed.
|
58
|
+
# 9. Build the middleware stack and run +to_prepare+ callbacks.
|
59
|
+
# 10. Run +config.before_eager_load+ and +eager_load!+ if +eager_load+ is +true+.
|
60
|
+
# 11. Run +config.after_initialize+ callbacks.
|
61
61
|
class Application < Engine
|
62
62
|
autoload :Bootstrap, "rails/application/bootstrap"
|
63
63
|
autoload :Configuration, "rails/application/configuration"
|
@@ -175,7 +175,7 @@ module Rails
|
|
175
175
|
# Rails.application.message_verifier('sensitive_data').verify(message)
|
176
176
|
# # => 'my sensible data'
|
177
177
|
#
|
178
|
-
# See the
|
178
|
+
# See the ActiveSupport::MessageVerifier documentation for more information.
|
179
179
|
def message_verifier(verifier_name)
|
180
180
|
@message_verifiers[verifier_name] ||= begin
|
181
181
|
secret = key_generator.generate_key(verifier_name.to_s)
|
@@ -403,13 +403,14 @@ module Rails
|
|
403
403
|
attr_writer :secrets, :credentials
|
404
404
|
|
405
405
|
# The secret_key_base is used as the input secret to the application's key generator, which in turn
|
406
|
-
# is used to create all
|
406
|
+
# is used to create all ActiveSupport::MessageVerifier and ActiveSupport::MessageEncryptor instances,
|
407
|
+
# including the ones that sign and encrypt cookies.
|
407
408
|
#
|
408
409
|
# In development and test, this is randomly generated and stored in a
|
409
410
|
# temporary file in <tt>tmp/development_secret.txt</tt>.
|
410
411
|
#
|
411
|
-
# In all other environments, we look for it first in ENV["SECRET_KEY_BASE"]
|
412
|
-
# then credentials.secret_key_base
|
412
|
+
# In all other environments, we look for it first in <tt>ENV["SECRET_KEY_BASE"]</tt>,
|
413
|
+
# then +credentials.secret_key_base+, and finally +secrets.secret_key_base+. For most applications,
|
413
414
|
# the correct place to store it is in the encrypted credentials file.
|
414
415
|
def secret_key_base
|
415
416
|
if Rails.env.development? || Rails.env.test?
|
data/lib/rails/command.rb
CHANGED
@@ -26,7 +26,7 @@ module Rails
|
|
26
26
|
ENV["RAILS_ENV"].presence || ENV["RACK_ENV"].presence || "development"
|
27
27
|
end
|
28
28
|
|
29
|
-
# Receives a namespace, arguments and the behavior to invoke the command.
|
29
|
+
# Receives a namespace, arguments, and the behavior to invoke the command.
|
30
30
|
def invoke(full_namespace, args = [], **config)
|
31
31
|
namespace = full_namespace = full_namespace.to_s
|
32
32
|
|
@@ -263,8 +263,13 @@ module Rails
|
|
263
263
|
MSG
|
264
264
|
else
|
265
265
|
error = CorrectableError.new("Could not find server '#{server}'.", server, RACK_SERVERS)
|
266
|
+
if error.respond_to?(:detailed_message)
|
267
|
+
formatted_message = error.detailed_message
|
268
|
+
else
|
269
|
+
formatted_message = error.message
|
270
|
+
end
|
266
271
|
<<~MSG
|
267
|
-
#{
|
272
|
+
#{formatted_message}
|
268
273
|
Run `bin/rails server --help` for more options.
|
269
274
|
MSG
|
270
275
|
end
|
@@ -4,14 +4,14 @@ module Rails
|
|
4
4
|
module ConsoleMethods
|
5
5
|
# Gets the helper methods available to the controller.
|
6
6
|
#
|
7
|
-
# This method assumes an +ApplicationController+ exists, and it extends
|
7
|
+
# This method assumes an +ApplicationController+ exists, and that it extends ActionController::Base.
|
8
8
|
def helper
|
9
9
|
ApplicationController.helpers
|
10
10
|
end
|
11
11
|
|
12
12
|
# Gets a new instance of a controller object.
|
13
13
|
#
|
14
|
-
# This method assumes an +ApplicationController+ exists, and it extends
|
14
|
+
# This method assumes an +ApplicationController+ exists, and that it extends ActionController::Base.
|
15
15
|
def controller
|
16
16
|
@controller ||= ApplicationController.new
|
17
17
|
end
|
data/lib/rails/engine.rb
CHANGED
@@ -11,10 +11,10 @@ require "thread"
|
|
11
11
|
module Rails
|
12
12
|
# <tt>Rails::Engine</tt> allows you to wrap a specific Rails application or subset of
|
13
13
|
# functionality and share it with other applications or within a larger packaged application.
|
14
|
-
# Every
|
14
|
+
# Every Rails::Application is just an engine, which allows for simple
|
15
15
|
# feature and application sharing.
|
16
16
|
#
|
17
|
-
# Any <tt>Rails::Engine</tt> is also a
|
17
|
+
# Any <tt>Rails::Engine</tt> is also a Rails::Railtie, so the same
|
18
18
|
# methods (like <tt>rake_tasks</tt> and +generators+) and configuration
|
19
19
|
# options that are available in railties can also be used in engines.
|
20
20
|
#
|
@@ -31,7 +31,7 @@ module Rails
|
|
31
31
|
# end
|
32
32
|
#
|
33
33
|
# Then ensure that this file is loaded at the top of your <tt>config/application.rb</tt>
|
34
|
-
# (or in your +Gemfile+) and it will automatically load models, controllers and helpers
|
34
|
+
# (or in your +Gemfile+), and it will automatically load models, controllers, and helpers
|
35
35
|
# inside +app+, load routes at <tt>config/routes.rb</tt>, load locales at
|
36
36
|
# <tt>config/locales/**/*</tt>, and load tasks at <tt>lib/tasks/**/*</tt>.
|
37
37
|
#
|
@@ -192,13 +192,13 @@ module Rails
|
|
192
192
|
#
|
193
193
|
# == Isolated Engine
|
194
194
|
#
|
195
|
-
# Normally when you create controllers, helpers and models inside an engine, they are treated
|
195
|
+
# Normally when you create controllers, helpers, and models inside an engine, they are treated
|
196
196
|
# as if they were created inside the application itself. This means that all helpers and
|
197
197
|
# named routes from the application will be available to your engine's controllers as well.
|
198
198
|
#
|
199
199
|
# However, sometimes you want to isolate your engine from the application, especially if your engine
|
200
200
|
# has its own router. To do that, you simply need to call +isolate_namespace+. This method requires
|
201
|
-
# you to pass a module where all your controllers, helpers and models should be nested to:
|
201
|
+
# you to pass a module where all your controllers, helpers, and models should be nested to:
|
202
202
|
#
|
203
203
|
# module MyEngine
|
204
204
|
# class Engine < Rails::Engine
|
@@ -236,9 +236,9 @@ module Rails
|
|
236
236
|
# +articles_path+, like you would do with your main application.
|
237
237
|
#
|
238
238
|
# To make this behavior consistent with other parts of the framework,
|
239
|
-
# isolated engines also have an effect on
|
239
|
+
# isolated engines also have an effect on ActiveModel::Naming. In a
|
240
240
|
# normal Rails app, when you use a namespaced model such as
|
241
|
-
# <tt>Namespace::Article</tt>,
|
241
|
+
# <tt>Namespace::Article</tt>, ActiveModel::Naming will generate
|
242
242
|
# names with the prefix "namespace". In an isolated engine, the prefix will
|
243
243
|
# be omitted in URL helpers and form fields, for convenience.
|
244
244
|
#
|
@@ -442,7 +442,7 @@ module Rails
|
|
442
442
|
end
|
443
443
|
|
444
444
|
# Load console and invoke the registered hooks.
|
445
|
-
# Check
|
445
|
+
# Check Rails::Railtie.console for more info.
|
446
446
|
def load_console(app = self)
|
447
447
|
require "rails/console/app"
|
448
448
|
require "rails/console/helpers"
|
@@ -451,14 +451,14 @@ module Rails
|
|
451
451
|
end
|
452
452
|
|
453
453
|
# Load Rails runner and invoke the registered hooks.
|
454
|
-
# Check
|
454
|
+
# Check Rails::Railtie.runner for more info.
|
455
455
|
def load_runner(app = self)
|
456
456
|
run_runner_blocks(app)
|
457
457
|
self
|
458
458
|
end
|
459
459
|
|
460
|
-
# Load Rake
|
461
|
-
# Check
|
460
|
+
# Load Rake and railties tasks, and invoke the registered hooks.
|
461
|
+
# Check Rails::Railtie.rake_tasks for more info.
|
462
462
|
def load_tasks(app = self)
|
463
463
|
require "rake"
|
464
464
|
run_tasks_blocks(app)
|
@@ -466,7 +466,7 @@ module Rails
|
|
466
466
|
end
|
467
467
|
|
468
468
|
# Load Rails generators and invoke the registered hooks.
|
469
|
-
# Check
|
469
|
+
# Check Rails::Railtie.generators for more info.
|
470
470
|
def load_generators(app = self)
|
471
471
|
require "rails/generators"
|
472
472
|
run_generators_blocks(app)
|
@@ -475,7 +475,7 @@ module Rails
|
|
475
475
|
end
|
476
476
|
|
477
477
|
# Invoke the server registered hooks.
|
478
|
-
# Check
|
478
|
+
# Check Rails::Railtie.server for more info.
|
479
479
|
def load_server(app = self)
|
480
480
|
run_server_blocks(app)
|
481
481
|
self
|
data/lib/rails/gem_version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Rails
|
4
|
-
# Returns the version of
|
4
|
+
# Returns the currently loaded version of Rails as a <tt>Gem::Version</tt>.
|
5
5
|
def self.gem_version
|
6
6
|
Gem::Version.new VERSION::STRING
|
7
7
|
end
|
@@ -9,8 +9,8 @@ module Rails
|
|
9
9
|
module VERSION
|
10
10
|
MAJOR = 7
|
11
11
|
MINOR = 0
|
12
|
-
TINY =
|
13
|
-
PRE =
|
12
|
+
TINY = 4
|
13
|
+
PRE = nil
|
14
14
|
|
15
15
|
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
16
16
|
end
|
@@ -187,12 +187,12 @@ module Rails
|
|
187
187
|
[
|
188
188
|
options.values_at(
|
189
189
|
:skip_active_record,
|
190
|
-
:skip_action_mailer,
|
191
190
|
:skip_test,
|
192
191
|
:skip_action_cable,
|
193
192
|
:skip_active_job
|
194
193
|
),
|
195
194
|
skip_active_storage?,
|
195
|
+
skip_action_mailer?,
|
196
196
|
skip_action_mailbox?,
|
197
197
|
skip_action_text?
|
198
198
|
].flatten.none?
|
@@ -220,7 +220,11 @@ module Rails
|
|
220
220
|
end
|
221
221
|
|
222
222
|
def skip_active_storage? # :doc:
|
223
|
-
options[:skip_active_storage] || options[:skip_active_record]
|
223
|
+
options[:skip_active_storage] || options[:skip_active_record] || options[:skip_active_job]
|
224
|
+
end
|
225
|
+
|
226
|
+
def skip_action_mailer? # :doc:
|
227
|
+
options[:skip_action_mailer] || options[:skip_active_job]
|
224
228
|
end
|
225
229
|
|
226
230
|
def skip_action_mailbox? # :doc:
|
@@ -239,6 +243,10 @@ module Rails
|
|
239
243
|
options[:skip_asset_pipeline] || options[:asset_pipeline] != "sprockets"
|
240
244
|
end
|
241
245
|
|
246
|
+
def skip_propshaft?
|
247
|
+
options[:skip_asset_pipeline] || options[:asset_pipeline] != "propshaft"
|
248
|
+
end
|
249
|
+
|
242
250
|
|
243
251
|
class GemfileEntry < Struct.new(:name, :version, :comment, :options, :commented_out)
|
244
252
|
def initialize(name, version, comment, options = {}, commented_out = false)
|
@@ -94,7 +94,7 @@ module Rails
|
|
94
94
|
#
|
95
95
|
# The first and last part used to find the generator to be invoked are
|
96
96
|
# guessed based on class invokes hook_for, as noticed in the example above.
|
97
|
-
# This can be customized with two options:
|
97
|
+
# This can be customized with two options: +:in+ and +:as+.
|
98
98
|
#
|
99
99
|
# Let's suppose you are creating a generator that needs to invoke the
|
100
100
|
# controller generator from test unit. Your first attempt is:
|
@@ -108,7 +108,7 @@ module Rails
|
|
108
108
|
# "test_unit:awesome", "test_unit"
|
109
109
|
#
|
110
110
|
# Which is not the desired lookup. You can change it by providing the
|
111
|
-
#
|
111
|
+
# +:as+ option:
|
112
112
|
#
|
113
113
|
# class AwesomeGenerator < Rails::Generators::Base
|
114
114
|
# hook_for :test_framework, as: :controller
|
@@ -119,7 +119,7 @@ module Rails
|
|
119
119
|
# "test_unit:controller", "test_unit"
|
120
120
|
#
|
121
121
|
# Similarly, if you want it to also look up in the rails namespace, you
|
122
|
-
# just need to provide the
|
122
|
+
# just need to provide the +:in+ value:
|
123
123
|
#
|
124
124
|
# class AwesomeGenerator < Rails::Generators::Base
|
125
125
|
# hook_for :test_framework, in: :rails, as: :controller
|
@@ -127,7 +127,7 @@ module Rails
|
|
127
127
|
end
|
128
128
|
|
129
129
|
def route_url # :doc:
|
130
|
-
@route_url ||=
|
130
|
+
@route_url ||= controller_class_path.collect { |dname| "/" + dname }.join + "/" + plural_file_name
|
131
131
|
end
|
132
132
|
|
133
133
|
def url_helper_prefix # :doc:
|
@@ -202,7 +202,7 @@ module Rails
|
|
202
202
|
end
|
203
203
|
|
204
204
|
# Add a class collisions name to be checked on class initialization. You
|
205
|
-
# can supply a hash with a
|
205
|
+
# can supply a hash with a +:prefix+ or +:suffix+ to be tested.
|
206
206
|
#
|
207
207
|
# ==== Examples
|
208
208
|
#
|
@@ -138,7 +138,7 @@ module Rails
|
|
138
138
|
template "config/storage.yml"
|
139
139
|
end
|
140
140
|
|
141
|
-
if skip_sprockets? && !assets_config_exist
|
141
|
+
if skip_sprockets? && skip_propshaft? && !assets_config_exist
|
142
142
|
remove_file "config/initializers/assets.rb"
|
143
143
|
end
|
144
144
|
|
@@ -457,9 +457,12 @@ module Rails
|
|
457
457
|
end
|
458
458
|
end
|
459
459
|
|
460
|
-
def
|
461
|
-
if skip_sprockets?
|
460
|
+
def delete_assets_initializer_skipping_sprockets_and_propshaft
|
461
|
+
if skip_sprockets? && skip_propshaft?
|
462
462
|
remove_file "config/initializers/assets.rb"
|
463
|
+
end
|
464
|
+
|
465
|
+
if skip_sprockets?
|
463
466
|
remove_file "app/assets/config/manifest.js"
|
464
467
|
remove_dir "app/assets/config"
|
465
468
|
remove_file "app/assets/stylesheets/application.css"
|
data/lib/rails/generators/rails/app/templates/config/initializers/content_security_policy.rb.tt
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# Be sure to restart your server when you modify this file.
|
2
2
|
|
3
|
-
# Define an application-wide content security policy
|
4
|
-
#
|
5
|
-
# https://
|
3
|
+
# Define an application-wide content security policy.
|
4
|
+
# See the Securing Rails Applications Guide for more information:
|
5
|
+
# https://guides.rubyonrails.org/security.html#content-security-policy-header
|
6
6
|
|
7
7
|
# Rails.application.configure do
|
8
8
|
# config.content_security_policy do |policy|
|
@@ -20,7 +20,6 @@
|
|
20
20
|
# config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }
|
21
21
|
# config.content_security_policy_nonce_directives = %w(script-src)
|
22
22
|
#
|
23
|
-
# # Report
|
24
|
-
# # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
|
23
|
+
# # Report violations without enforcing the policy.
|
25
24
|
# # config.content_security_policy_report_only = true
|
26
25
|
# end
|
data/lib/rails/generators/rails/app/templates/config/initializers/new_framework_defaults_7_0.rb.tt
CHANGED
@@ -34,13 +34,6 @@
|
|
34
34
|
# implementation.
|
35
35
|
# Rails.application.config.active_support.remove_deprecated_time_with_zone_name = true
|
36
36
|
|
37
|
-
# Change the format of the cache entry.
|
38
|
-
# Changing this default means that all new cache entries added to the cache
|
39
|
-
# will have a different format that is not supported by Rails 6.1 applications.
|
40
|
-
# Only change this value after your application is fully deployed to Rails 7.0
|
41
|
-
# and you have no plans to rollback.
|
42
|
-
# Rails.application.config.active_support.cache_format_version = 7.0
|
43
|
-
|
44
37
|
# Calls `Rails.application.executor.wrap` around test cases.
|
45
38
|
# This makes test cases behave closer to an actual request or job.
|
46
39
|
# Several features that are normally disabled in test, such as Active Record query cache
|
@@ -71,7 +64,7 @@
|
|
71
64
|
# This default means that all columns will be referenced in INSERT queries
|
72
65
|
# regardless of whether they have a default or not.
|
73
66
|
# Rails.application.config.active_record.partial_inserts = false
|
74
|
-
|
67
|
+
|
75
68
|
# Protect from open redirect attacks in `redirect_back_or_to` and `redirect_to`.
|
76
69
|
# Rails.application.config.action_controller.raise_on_open_redirects = true
|
77
70
|
|
@@ -82,18 +75,6 @@
|
|
82
75
|
# The `:mini_magick` option is not deprecated; it's fine to keep using it.
|
83
76
|
# Rails.application.config.active_storage.variant_processor = :vips
|
84
77
|
|
85
|
-
# If you're upgrading and haven't set `cookies_serializer` previously, your cookie serializer
|
86
|
-
# was `:marshal`. Convert all cookies to JSON, using the `:hybrid` formatter.
|
87
|
-
#
|
88
|
-
# If you're confident all your cookies are JSON formatted, you can switch to the `:json` formatter.
|
89
|
-
#
|
90
|
-
# Continue to use `:marshal` for backward-compatibility with old cookies.
|
91
|
-
#
|
92
|
-
# If you have configured the serializer elsewhere, you can remove this.
|
93
|
-
#
|
94
|
-
# See https://guides.rubyonrails.org/action_controller_overview.html#cookies for more information.
|
95
|
-
# Rails.application.config.action_dispatch.cookies_serializer = :hybrid
|
96
|
-
|
97
78
|
# Enable parameter wrapping for JSON.
|
98
79
|
# Previously this was set in an initializer. It's fine to keep using that initializer if you've customized it.
|
99
80
|
# To disable parameter wrapping entirely, set this config to `false`.
|
@@ -115,3 +96,40 @@
|
|
115
96
|
# "X-Permitted-Cross-Domain-Policies" => "none",
|
116
97
|
# "Referrer-Policy" => "strict-origin-when-cross-origin"
|
117
98
|
# }
|
99
|
+
|
100
|
+
|
101
|
+
# ** Please read carefully, this must be configured in config/application.rb **
|
102
|
+
# Change the format of the cache entry.
|
103
|
+
# Changing this default means that all new cache entries added to the cache
|
104
|
+
# will have a different format that is not supported by Rails 6.1 applications.
|
105
|
+
# Only change this value after your application is fully deployed to Rails 7.0
|
106
|
+
# and you have no plans to rollback.
|
107
|
+
# When you're ready to change format, add this to `config/application.rb` (NOT this file):
|
108
|
+
# config.active_support.cache_format_version = 7.0
|
109
|
+
|
110
|
+
|
111
|
+
# Cookie serializer: 2 options
|
112
|
+
#
|
113
|
+
# If you're upgrading and haven't set `cookies_serializer` previously, your cookie serializer
|
114
|
+
# is `:marshal`. The default for new apps is `:json`.
|
115
|
+
#
|
116
|
+
# Rails.application.config.action_dispatch.cookies_serializer = :json
|
117
|
+
#
|
118
|
+
#
|
119
|
+
# To migrate an existing application to the `:json` serializer, use the `:hybrid` option.
|
120
|
+
#
|
121
|
+
# Rails transparently deserializes existing (Marshal-serialized) cookies on read and
|
122
|
+
# re-writes them in the JSON format.
|
123
|
+
#
|
124
|
+
# It is fine to use `:hybrid` long term; you should do that until you're confident *all* your cookies
|
125
|
+
# have been converted to JSON. To keep using `:hybrid` long term, move this config to its own
|
126
|
+
# initializer or to `config/application.rb`.
|
127
|
+
#
|
128
|
+
# Rails.application.config.action_dispatch.cookies_serializer = :hybrid
|
129
|
+
#
|
130
|
+
#
|
131
|
+
# If your cookies can't yet be serialized to JSON, keep using `:marshal` for backward-compatibility.
|
132
|
+
#
|
133
|
+
# If you have configured the serializer elsewhere, you can remove this section of the file.
|
134
|
+
#
|
135
|
+
# See https://guides.rubyonrails.org/action_controller_overview.html#cookies for more information.
|
data/lib/rails/generators.rb
CHANGED
@@ -253,8 +253,8 @@ module Rails
|
|
253
253
|
invoke_fallbacks_for(name, base) || invoke_fallbacks_for(context, name)
|
254
254
|
end
|
255
255
|
|
256
|
-
# Receives a namespace, arguments and the behavior to invoke the generator.
|
257
|
-
# It's used as the default entry point for generate, destroy and update
|
256
|
+
# Receives a namespace, arguments, and the behavior to invoke the generator.
|
257
|
+
# It's used as the default entry point for generate, destroy, and update
|
258
258
|
# commands.
|
259
259
|
def invoke(namespace, args = ARGV, config = {})
|
260
260
|
names = namespace.to_s.split(":")
|
@@ -266,8 +266,14 @@ module Rails
|
|
266
266
|
options = sorted_groups.flat_map(&:last)
|
267
267
|
error = Command::Base::CorrectableError.new("Could not find generator '#{namespace}'.", namespace, options)
|
268
268
|
|
269
|
+
if error.respond_to?(:detailed_message)
|
270
|
+
formatted_message = error.detailed_message
|
271
|
+
else
|
272
|
+
formatted_message = error.message
|
273
|
+
end
|
274
|
+
|
269
275
|
puts <<~MSG
|
270
|
-
#{
|
276
|
+
#{formatted_message}
|
271
277
|
Run `bin/rails generate --help` for more options.
|
272
278
|
MSG
|
273
279
|
end
|
data/lib/rails/paths.rb
CHANGED
@@ -12,7 +12,7 @@ module Rails
|
|
12
12
|
# root.add "app/controllers", eager_load: true
|
13
13
|
#
|
14
14
|
# The above command creates a new root object and adds "app/controllers" as a path.
|
15
|
-
# This means we can get a
|
15
|
+
# This means we can get a Rails::Paths::Path object back like below:
|
16
16
|
#
|
17
17
|
# path = root["app/controllers"]
|
18
18
|
# path.eager_load? # => true
|
data/lib/rails/rack/logger.rb
CHANGED
@@ -31,13 +31,17 @@ module Rails
|
|
31
31
|
private
|
32
32
|
def call_app(request, env) # :doc:
|
33
33
|
instrumenter = ActiveSupport::Notifications.instrumenter
|
34
|
-
instrumenter.start "request.action_dispatch", request: request
|
34
|
+
instrumenter_state = instrumenter.start "request.action_dispatch", request: request
|
35
|
+
instrumenter_finish = -> () {
|
36
|
+
instrumenter.finish_with_state(instrumenter_state, "request.action_dispatch", request: request)
|
37
|
+
}
|
38
|
+
|
35
39
|
logger.info { started_request_message(request) }
|
36
40
|
status, headers, body = @app.call(env)
|
37
|
-
body = ::Rack::BodyProxy.new(body
|
41
|
+
body = ::Rack::BodyProxy.new(body, &instrumenter_finish)
|
38
42
|
[status, headers, body]
|
39
43
|
rescue Exception
|
40
|
-
|
44
|
+
instrumenter_finish.call
|
41
45
|
raise
|
42
46
|
ensure
|
43
47
|
ActiveSupport::LogSubscriber.flush_all!
|
@@ -65,11 +69,6 @@ module Rails
|
|
65
69
|
end
|
66
70
|
end
|
67
71
|
|
68
|
-
def finish(request)
|
69
|
-
instrumenter = ActiveSupport::Notifications.instrumenter
|
70
|
-
instrumenter.finish "request.action_dispatch", request: request
|
71
|
-
end
|
72
|
-
|
73
72
|
def logger
|
74
73
|
Rails.logger
|
75
74
|
end
|
data/lib/rails/railtie.rb
CHANGED
@@ -24,7 +24,7 @@ module Rails
|
|
24
24
|
# * creating initializers
|
25
25
|
# * configuring a Rails framework for the application, like setting a generator
|
26
26
|
# * adding <tt>config.*</tt> keys to the environment
|
27
|
-
# * setting up a subscriber with
|
27
|
+
# * setting up a subscriber with ActiveSupport::Notifications
|
28
28
|
# * adding Rake tasks
|
29
29
|
#
|
30
30
|
# == Creating a Railtie
|
@@ -129,7 +129,7 @@ module Rails
|
|
129
129
|
# == Application and Engine
|
130
130
|
#
|
131
131
|
# An engine is nothing more than a railtie with some initializers already set. And since
|
132
|
-
#
|
132
|
+
# Rails::Application is an engine, the same configuration described here can be
|
133
133
|
# used in both.
|
134
134
|
#
|
135
135
|
# Be sure to look at the documentation of those specific classes for more information.
|
@@ -214,13 +214,15 @@ module Rails
|
|
214
214
|
end
|
215
215
|
|
216
216
|
def respond_to_missing?(name, _)
|
217
|
+
return super if abstract_railtie?
|
218
|
+
|
217
219
|
instance.respond_to?(name) || super
|
218
220
|
end
|
219
221
|
|
220
222
|
# If the class method does not have a method, then send the method call
|
221
223
|
# to the Railtie instance.
|
222
224
|
def method_missing(name, *args, &block)
|
223
|
-
if instance.respond_to?(name)
|
225
|
+
if !abstract_railtie? && instance.respond_to?(name)
|
224
226
|
instance.public_send(name, *args, &block)
|
225
227
|
else
|
226
228
|
super
|
@@ -247,6 +249,10 @@ module Rails
|
|
247
249
|
end
|
248
250
|
end
|
249
251
|
|
252
|
+
def inspect # :nodoc:
|
253
|
+
"#<#{self.class.name}>"
|
254
|
+
end
|
255
|
+
|
250
256
|
def configure(&block) # :nodoc:
|
251
257
|
instance_eval(&block)
|
252
258
|
end
|
@@ -70,7 +70,7 @@ module Rails
|
|
70
70
|
#
|
71
71
|
# If +options+ has a <tt>:tag</tt> flag, it will be passed to each annotation's +to_s+.
|
72
72
|
#
|
73
|
-
# See
|
73
|
+
# See SourceAnnotationExtractor#find_in for a list of file extensions that will be taken into account.
|
74
74
|
#
|
75
75
|
# This class method is the single entry point for the <tt>rails notes</tt> command.
|
76
76
|
def self.enumerate(tag = nil, options = {})
|
data/lib/rails/version.rb
CHANGED
data/lib/rails.rb
CHANGED
@@ -80,6 +80,13 @@ module Rails
|
|
80
80
|
@_env = ActiveSupport::EnvironmentInquirer.new(environment)
|
81
81
|
end
|
82
82
|
|
83
|
+
# Returns the ActiveSupport::ErrorReporter of the current Rails project,
|
84
|
+
# otherwise it returns +nil+ if there is no project.
|
85
|
+
#
|
86
|
+
# Rails.error.handle(IOError) do
|
87
|
+
# # ...
|
88
|
+
# end
|
89
|
+
# Rails.error.report(error)
|
83
90
|
def error
|
84
91
|
application && application.executor.error_reporter
|
85
92
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: railties
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 7.0.
|
4
|
+
version: 7.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 7.0.
|
19
|
+
version: 7.0.4
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 7.0.
|
26
|
+
version: 7.0.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: actionpack
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 7.0.
|
33
|
+
version: 7.0.4
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 7.0.
|
40
|
+
version: 7.0.4
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -100,14 +100,14 @@ dependencies:
|
|
100
100
|
requirements:
|
101
101
|
- - '='
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 7.0.
|
103
|
+
version: 7.0.4
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - '='
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: 7.0.
|
110
|
+
version: 7.0.4
|
111
111
|
description: 'Rails internals: application bootup, plugins, generators, and rake tasks.'
|
112
112
|
email: david@loudthinking.com
|
113
113
|
executables:
|
@@ -422,10 +422,10 @@ licenses:
|
|
422
422
|
- MIT
|
423
423
|
metadata:
|
424
424
|
bug_tracker_uri: https://github.com/rails/rails/issues
|
425
|
-
changelog_uri: https://github.com/rails/rails/blob/v7.0.
|
426
|
-
documentation_uri: https://api.rubyonrails.org/v7.0.
|
425
|
+
changelog_uri: https://github.com/rails/rails/blob/v7.0.4/railties/CHANGELOG.md
|
426
|
+
documentation_uri: https://api.rubyonrails.org/v7.0.4/
|
427
427
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
428
|
-
source_code_uri: https://github.com/rails/rails/tree/v7.0.
|
428
|
+
source_code_uri: https://github.com/rails/rails/tree/v7.0.4/railties
|
429
429
|
rubygems_mfa_required: 'true'
|
430
430
|
post_install_message:
|
431
431
|
rdoc_options:
|
@@ -444,7 +444,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
444
444
|
- !ruby/object:Gem::Version
|
445
445
|
version: '0'
|
446
446
|
requirements: []
|
447
|
-
rubygems_version: 3.
|
447
|
+
rubygems_version: 3.3.3
|
448
448
|
signing_key:
|
449
449
|
specification_version: 4
|
450
450
|
summary: Tools for creating, working with, and running Rails applications.
|