actionpack 8.0.0.1 → 8.0.2
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 +47 -0
- data/lib/action_controller/metal/data_streaming.rb +4 -2
- data/lib/action_controller/metal/live.rb +9 -4
- data/lib/action_controller/metal/params_wrapper.rb +3 -3
- data/lib/action_controller/metal/request_forgery_protection.rb +3 -1
- data/lib/action_controller/metal/strong_parameters.rb +11 -14
- data/lib/action_controller/test_case.rb +8 -0
- data/lib/action_dispatch/http/request.rb +4 -3
- data/lib/action_dispatch/journey/formatter.rb +8 -3
- data/lib/action_dispatch/middleware/executor.rb +5 -2
- data/lib/action_dispatch/request/session.rb +1 -0
- data/lib/action_dispatch/routing/mapper.rb +7 -6
- data/lib/action_dispatch/testing/assertions/routing.rb +12 -8
- data/lib/action_dispatch/testing/integration.rb +2 -2
- data/lib/action_dispatch/testing/test_process.rb +1 -2
- data/lib/action_pack/gem_version.rb +2 -2
- metadata +12 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14abb1a6b812efa40da31cf30c3171405982457ed80984d231dae2af352f43f4
|
4
|
+
data.tar.gz: 3e934fe98cf59aa4727eb76b0f13567861fe01c04dbc6cd9c4e313b165a0a64e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dde2e5f17a6d54ae692f64ec2d05a3dc8e54d4fb30d97dd4b1fa3e4c7363d1132facf04286c1b3f25ffdb78f8302eafa7a6c13d027b890589813e4e60e6f5e77
|
7
|
+
data.tar.gz: 773181339ec3539e73607f4e1588082893c3ac38d54e6c32a930ccf85bcffb41c95ad568a6bbe00bbc41967f98ed964d3200880a3c1f7b1dbfafeef405d8b1b5
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,50 @@
|
|
1
|
+
## Rails 8.0.2 (March 12, 2025) ##
|
2
|
+
|
3
|
+
* No changes.
|
4
|
+
|
5
|
+
|
6
|
+
## Rails 8.0.2 (March 12, 2025) ##
|
7
|
+
|
8
|
+
* Improve `with_routing` test helper to not rebuild the middleware stack.
|
9
|
+
|
10
|
+
Otherwise some middleware configuration could be lost.
|
11
|
+
|
12
|
+
*Édouard Chin*
|
13
|
+
|
14
|
+
* Add resource name to the `ArgumentError` that's raised when invalid `:only` or `:except` options are given to `#resource` or `#resources`
|
15
|
+
|
16
|
+
This makes it easier to locate the source of the problem, especially for routes drawn by gems.
|
17
|
+
|
18
|
+
Before:
|
19
|
+
```
|
20
|
+
:only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
|
21
|
+
```
|
22
|
+
|
23
|
+
After:
|
24
|
+
```
|
25
|
+
Route `resources :products` - :only and :except must include only [:index, :create, :new, :show, :update, :destroy, :edit], but also included [:foo, :bar]
|
26
|
+
```
|
27
|
+
|
28
|
+
*Jeremy Green*
|
29
|
+
|
30
|
+
* Fix `url_for` to handle `:path_params` gracefully when it's not a `Hash`.
|
31
|
+
|
32
|
+
Prevents various security scanners from causing exceptions.
|
33
|
+
|
34
|
+
*Martin Emde*
|
35
|
+
|
36
|
+
* Fix `ActionDispatch::Executor` to unwrap exceptions like other error reporting middlewares.
|
37
|
+
|
38
|
+
*Jean Boussier*
|
39
|
+
|
40
|
+
|
41
|
+
## Rails 8.0.1 (December 13, 2024) ##
|
42
|
+
|
43
|
+
* Add `ActionDispatch::Request::Session#store` method to conform Rack spec.
|
44
|
+
|
45
|
+
*Yaroslav*
|
46
|
+
|
47
|
+
|
1
48
|
## Rails 8.0.0.1 (December 10, 2024) ##
|
2
49
|
|
3
50
|
* Add validation to content security policies to disallow spaces and semicolons.
|
@@ -28,7 +28,8 @@ module ActionController # :nodoc:
|
|
28
28
|
# `send_file(params[:path])` allows a malicious user to download any file on
|
29
29
|
# your server.
|
30
30
|
#
|
31
|
-
# Options:
|
31
|
+
# #### Options:
|
32
|
+
#
|
32
33
|
# * `:filename` - suggests a filename for the browser to use. Defaults to
|
33
34
|
# `File.basename(path)`.
|
34
35
|
# * `:type` - specifies an HTTP content type. You can specify either a string
|
@@ -90,7 +91,8 @@ module ActionController # :nodoc:
|
|
90
91
|
# inline data. You may also set the content type, the file name, and other
|
91
92
|
# things.
|
92
93
|
#
|
93
|
-
# Options:
|
94
|
+
# #### Options:
|
95
|
+
#
|
94
96
|
# * `:filename` - suggests a filename for the browser to use.
|
95
97
|
# * `:type` - specifies an HTTP content type. Defaults to
|
96
98
|
# `application/octet-stream`. You can specify either a string or a symbol
|
@@ -58,7 +58,7 @@ module ActionController
|
|
58
58
|
|
59
59
|
module ClassMethods
|
60
60
|
def make_response!(request)
|
61
|
-
if request.get_header("HTTP_VERSION") == "HTTP/1.0"
|
61
|
+
if (request.get_header("SERVER_PROTOCOL") || request.get_header("HTTP_VERSION")) == "HTTP/1.0"
|
62
62
|
super
|
63
63
|
else
|
64
64
|
Live::Response.new.tap do |res|
|
@@ -307,9 +307,8 @@ module ActionController
|
|
307
307
|
error = e
|
308
308
|
end
|
309
309
|
ensure
|
310
|
-
# Ensure we clean up any thread locals we copied so that the thread can reused.
|
311
310
|
ActiveSupport::IsolatedExecutionState.clear
|
312
|
-
locals
|
311
|
+
clean_up_thread_locals(locals, t2)
|
313
312
|
|
314
313
|
@_response.commit!
|
315
314
|
end
|
@@ -332,7 +331,8 @@ module ActionController
|
|
332
331
|
# or other running data where you don't want the entire file buffered in memory
|
333
332
|
# first. Similar to send_data, but where the data is generated live.
|
334
333
|
#
|
335
|
-
# Options:
|
334
|
+
# #### Options:
|
335
|
+
#
|
336
336
|
# * `:filename` - suggests a filename for the browser to use.
|
337
337
|
# * `:type` - specifies an HTTP content type. You can specify either a string
|
338
338
|
# or a symbol for a registered type with `Mime::Type.register`, for example
|
@@ -382,6 +382,11 @@ module ActionController
|
|
382
382
|
end
|
383
383
|
end
|
384
384
|
|
385
|
+
# Ensure we clean up any thread locals we copied so that the thread can reused.
|
386
|
+
def clean_up_thread_locals(locals, thread) # :nodoc:
|
387
|
+
locals.each { |k, _| thread[k] = nil }
|
388
|
+
end
|
389
|
+
|
385
390
|
def self.live_thread_pool_executor
|
386
391
|
@live_thread_pool_executor ||= Concurrent::CachedThreadPool.new(name: "action_controller.live")
|
387
392
|
end
|
@@ -198,14 +198,14 @@ module ActionController
|
|
198
198
|
# # enables the parameter wrapper for XML format
|
199
199
|
#
|
200
200
|
# wrap_parameters :person
|
201
|
-
# # wraps parameters into
|
201
|
+
# # wraps parameters into params[:person] hash
|
202
202
|
#
|
203
203
|
# wrap_parameters Person
|
204
204
|
# # wraps parameters by determining the wrapper key from Person class
|
205
|
-
# # (
|
205
|
+
# # (:person, in this case) and the list of attribute names
|
206
206
|
#
|
207
207
|
# wrap_parameters include: [:username, :title]
|
208
|
-
# # wraps only
|
208
|
+
# # wraps only :username and :title attributes from parameters.
|
209
209
|
#
|
210
210
|
# wrap_parameters false
|
211
211
|
# # disables parameters wrapping for this controller altogether.
|
@@ -142,6 +142,7 @@ module ActionController # :nodoc:
|
|
142
142
|
#
|
143
143
|
#
|
144
144
|
# Built-in unverified request handling methods are:
|
145
|
+
#
|
145
146
|
# * `:exception` - Raises ActionController::InvalidAuthenticityToken
|
146
147
|
# exception.
|
147
148
|
# * `:reset_session` - Resets the session.
|
@@ -170,6 +171,7 @@ module ActionController # :nodoc:
|
|
170
171
|
#
|
171
172
|
#
|
172
173
|
# Built-in session token strategies are:
|
174
|
+
#
|
173
175
|
# * `:session` - Store the CSRF token in the session. Used as default if
|
174
176
|
# `:store` option is not specified.
|
175
177
|
# * `:cookie` - Store the CSRF token in an encrypted cookie.
|
@@ -498,7 +500,7 @@ module ActionController # :nodoc:
|
|
498
500
|
# Checks the client's masked token to see if it matches the session token.
|
499
501
|
# Essentially the inverse of `masked_authenticity_token`.
|
500
502
|
def valid_authenticity_token?(session, encoded_masked_token) # :doc:
|
501
|
-
if encoded_masked_token.
|
503
|
+
if !encoded_masked_token.is_a?(String) || encoded_masked_token.empty?
|
502
504
|
return false
|
503
505
|
end
|
504
506
|
|
@@ -513,7 +513,7 @@ module ActionController
|
|
513
513
|
# It is recommended to use `expect` instead:
|
514
514
|
#
|
515
515
|
# def person_params
|
516
|
-
#
|
516
|
+
# params.expect(person: :name).require(:name)
|
517
517
|
# end
|
518
518
|
#
|
519
519
|
def require(key)
|
@@ -621,7 +621,7 @@ module ActionController
|
|
621
621
|
# })
|
622
622
|
#
|
623
623
|
# params.permit(person: :contact).require(:person)
|
624
|
-
# # =>
|
624
|
+
# # => ActionController::ParameterMissing: param is missing or the value is empty or invalid: person
|
625
625
|
#
|
626
626
|
# params.permit(person: { contact: :phone }).require(:person)
|
627
627
|
# # => #<ActionController::Parameters {"contact"=>#<ActionController::Parameters {"phone"=>"555-1234"} permitted: true>} permitted: true>
|
@@ -726,19 +726,19 @@ module ActionController
|
|
726
726
|
# similar to the `.require.permit` pattern. If multiple root keys are
|
727
727
|
# expected, they will all be required.
|
728
728
|
#
|
729
|
-
#
|
730
|
-
#
|
731
|
-
#
|
732
|
-
#
|
729
|
+
# params = ActionController::Parameters.new(name: "Martin", pies: [{ type: "dessert", flavor: "pumpkin"}])
|
730
|
+
# name, pies = params.expect(:name, pies: [[:type, :flavor]])
|
731
|
+
# name # => "Martin"
|
732
|
+
# pies # => [#<ActionController::Parameters {"type"=>"dessert", "flavor"=>"pumpkin"} permitted: true>]
|
733
733
|
#
|
734
734
|
# When called with a hash with multiple keys, `expect` will permit the
|
735
735
|
# parameters and require the keys in the order they are given in the hash,
|
736
736
|
# returning an array of the permitted parameters.
|
737
737
|
#
|
738
|
-
#
|
739
|
-
#
|
740
|
-
#
|
741
|
-
#
|
738
|
+
# params = ActionController::Parameters.new(subject: { name: "Martin" }, object: { pie: "pumpkin" })
|
739
|
+
# subject, object = params.expect(subject: [:name], object: [:pie])
|
740
|
+
# subject # => #<ActionController::Parameters {"name"=>"Martin"} permitted: true>
|
741
|
+
# object # => #<ActionController::Parameters {"pie"=>"pumpkin"} permitted: true>
|
742
742
|
#
|
743
743
|
# Besides being more strict about array vs hash params, `expect` uses permit
|
744
744
|
# internally, so it will behave similarly.
|
@@ -765,7 +765,7 @@ module ActionController
|
|
765
765
|
#
|
766
766
|
# params = ActionController::Parameters.new(tags: ["rails", "parameters"])
|
767
767
|
# permitted = params.expect(tags: [])
|
768
|
-
# permitted
|
768
|
+
# permitted # => ["rails", "parameters"]
|
769
769
|
# permitted.is_a?(Array) # => true
|
770
770
|
# permitted.size # => 2
|
771
771
|
#
|
@@ -1287,9 +1287,6 @@ module ActionController
|
|
1287
1287
|
keys - params.keys - always_permitted_parameters
|
1288
1288
|
end
|
1289
1289
|
|
1290
|
-
#
|
1291
|
-
# --- Filtering ----------------------------------------------------------
|
1292
|
-
#
|
1293
1290
|
# This is a list of permitted scalar types that includes the ones supported in
|
1294
1291
|
# XML and JSON requests.
|
1295
1292
|
#
|
@@ -29,6 +29,14 @@ module ActionController
|
|
29
29
|
yield
|
30
30
|
end
|
31
31
|
|
32
|
+
# Because of the above, we need to prevent the clearing of thread locals, since
|
33
|
+
# no new thread is actually spawned in the test environment.
|
34
|
+
alias_method :original_clean_up_thread_locals, :clean_up_thread_locals
|
35
|
+
|
36
|
+
silence_redefinition_of_method :clean_up_thread_locals
|
37
|
+
def clean_up_thread_locals(*args) # :nodoc:
|
38
|
+
end
|
39
|
+
|
32
40
|
# Avoid a deadlock from the queue filling up
|
33
41
|
Buffer.queue_size = nil
|
34
42
|
end
|
@@ -139,7 +139,7 @@ module ActionDispatch
|
|
139
139
|
|
140
140
|
# Populate the HTTP method lookup cache.
|
141
141
|
HTTP_METHODS.each { |method|
|
142
|
-
HTTP_METHOD_LOOKUP[method] = method.underscore.to_sym
|
142
|
+
HTTP_METHOD_LOOKUP[method] = method.downcase.underscore.to_sym
|
143
143
|
}
|
144
144
|
|
145
145
|
alias raw_request_method request_method # :nodoc:
|
@@ -243,8 +243,9 @@ module ActionDispatch
|
|
243
243
|
#
|
244
244
|
# send_early_hints("link" => "</style.css>; rel=preload; as=style,</script.js>; rel=preload")
|
245
245
|
#
|
246
|
-
# If you are using
|
247
|
-
#
|
246
|
+
# If you are using {javascript_include_tag}[rdoc-ref:ActionView::Helpers::AssetTagHelper#javascript_include_tag]
|
247
|
+
# or {stylesheet_link_tag}[rdoc-ref:ActionView::Helpers::AssetTagHelper#stylesheet_link_tag]
|
248
|
+
# the Early Hints headers are included by default if supported.
|
248
249
|
def send_early_hints(links)
|
249
250
|
env["rack.early_hints"]&.call(links)
|
250
251
|
end
|
@@ -60,8 +60,13 @@ module ActionDispatch
|
|
60
60
|
|
61
61
|
def generate(name, options, path_parameters)
|
62
62
|
original_options = options.dup
|
63
|
-
path_params = options.delete(:path_params)
|
64
|
-
|
63
|
+
path_params = options.delete(:path_params)
|
64
|
+
if path_params.is_a?(Hash)
|
65
|
+
options = path_params.merge(options)
|
66
|
+
else
|
67
|
+
path_params = nil
|
68
|
+
options = options.dup
|
69
|
+
end
|
65
70
|
constraints = path_parameters.merge(options)
|
66
71
|
missing_keys = nil
|
67
72
|
|
@@ -79,7 +84,7 @@ module ActionDispatch
|
|
79
84
|
# top-level params' normal behavior of generating query_params should be
|
80
85
|
# preserved even if the same key is also a bind_param
|
81
86
|
parameterized_parts.key?(key) || route.defaults.key?(key) ||
|
82
|
-
(path_params
|
87
|
+
(path_params&.key?(key) && !original_options.key?(key))
|
83
88
|
end
|
84
89
|
|
85
90
|
defaults = route.defaults
|
@@ -21,8 +21,11 @@ module ActionDispatch
|
|
21
21
|
end
|
22
22
|
|
23
23
|
returned = response << ::Rack::BodyProxy.new(response.pop) { state.complete! }
|
24
|
-
rescue => error
|
25
|
-
|
24
|
+
rescue Exception => error
|
25
|
+
request = ActionDispatch::Request.new env
|
26
|
+
backtrace_cleaner = request.get_header("action_dispatch.backtrace_cleaner")
|
27
|
+
wrapper = ExceptionWrapper.new(backtrace_cleaner, error)
|
28
|
+
@executor.error_reporter.report(wrapper.unwrapped_exception, handled: false, source: "application.action_dispatch")
|
26
29
|
raise
|
27
30
|
ensure
|
28
31
|
state.complete! unless returned
|
@@ -840,7 +840,7 @@ module ActionDispatch
|
|
840
840
|
#
|
841
841
|
# Takes same options as `Base#match` and `Resources#resources`.
|
842
842
|
#
|
843
|
-
# # route /posts (without the prefix /admin) to
|
843
|
+
# # route /posts (without the prefix /admin) to Admin::PostsController
|
844
844
|
# scope module: "admin" do
|
845
845
|
# resources :posts
|
846
846
|
# end
|
@@ -850,7 +850,7 @@ module ActionDispatch
|
|
850
850
|
# resources :posts
|
851
851
|
# end
|
852
852
|
#
|
853
|
-
# # prefix the routing helper name:
|
853
|
+
# # prefix the routing helper name: sekret_posts_path instead of posts_path
|
854
854
|
# scope as: "sekret" do
|
855
855
|
# resources :posts
|
856
856
|
# end
|
@@ -949,12 +949,12 @@ module ActionDispatch
|
|
949
949
|
# resources :posts
|
950
950
|
# end
|
951
951
|
#
|
952
|
-
# # maps to
|
952
|
+
# # maps to Sekret::PostsController rather than Admin::PostsController
|
953
953
|
# namespace :admin, module: "sekret" do
|
954
954
|
# resources :posts
|
955
955
|
# end
|
956
956
|
#
|
957
|
-
# # generates
|
957
|
+
# # generates sekret_posts_path rather than admin_posts_path
|
958
958
|
# namespace :admin, as: "sekret" do
|
959
959
|
# resources :posts
|
960
960
|
# end
|
@@ -1181,7 +1181,8 @@ module ActionDispatch
|
|
1181
1181
|
|
1182
1182
|
valid_actions = self.class.default_actions(false) # ignore api_only for this validation
|
1183
1183
|
if invalid_actions = invalid_only_except_options(options, valid_actions).presence
|
1184
|
-
|
1184
|
+
error_prefix = "Route `resource#{"s" unless singleton?} :#{entities}`"
|
1185
|
+
raise ArgumentError, "#{error_prefix} - :only and :except must include only #{valid_actions}, but also included #{invalid_actions}"
|
1185
1186
|
end
|
1186
1187
|
|
1187
1188
|
@name = entities.to_s
|
@@ -1509,7 +1510,7 @@ module ActionDispatch
|
|
1509
1510
|
#
|
1510
1511
|
# ### Examples
|
1511
1512
|
#
|
1512
|
-
# # routes call
|
1513
|
+
# # routes call Admin::PostsController
|
1513
1514
|
# resources :posts, module: "admin"
|
1514
1515
|
#
|
1515
1516
|
# # resource actions are at /admin/posts.
|
@@ -5,6 +5,7 @@
|
|
5
5
|
require "uri"
|
6
6
|
require "active_support/core_ext/hash/indifferent_access"
|
7
7
|
require "active_support/core_ext/string/access"
|
8
|
+
require "active_support/core_ext/module/redefine_method"
|
8
9
|
require "action_controller/metal/exceptions"
|
9
10
|
|
10
11
|
module ActionDispatch
|
@@ -20,38 +21,43 @@ module ActionDispatch
|
|
20
21
|
module ClassMethods
|
21
22
|
def with_routing(&block)
|
22
23
|
old_routes = nil
|
24
|
+
old_routes_call_method = nil
|
23
25
|
old_integration_session = nil
|
24
26
|
|
25
27
|
setup do
|
26
28
|
old_routes = app.routes
|
29
|
+
old_routes_call_method = old_routes.method(:call)
|
27
30
|
old_integration_session = integration_session
|
28
31
|
create_routes(&block)
|
29
32
|
end
|
30
33
|
|
31
34
|
teardown do
|
32
|
-
reset_routes(old_routes, old_integration_session)
|
35
|
+
reset_routes(old_routes, old_routes_call_method, old_integration_session)
|
33
36
|
end
|
34
37
|
end
|
35
38
|
end
|
36
39
|
|
37
40
|
def with_routing(&block)
|
38
41
|
old_routes = app.routes
|
42
|
+
old_routes_call_method = old_routes.method(:call)
|
39
43
|
old_integration_session = integration_session
|
40
44
|
create_routes(&block)
|
41
45
|
ensure
|
42
|
-
reset_routes(old_routes, old_integration_session)
|
46
|
+
reset_routes(old_routes, old_routes_call_method, old_integration_session)
|
43
47
|
end
|
44
48
|
|
45
49
|
private
|
46
50
|
def create_routes
|
47
51
|
app = self.app
|
48
52
|
routes = ActionDispatch::Routing::RouteSet.new
|
49
|
-
|
53
|
+
|
54
|
+
@original_routes ||= app.routes
|
55
|
+
@original_routes.singleton_class.redefine_method(:call, &routes.method(:call))
|
56
|
+
|
50
57
|
https = integration_session.https?
|
51
58
|
host = integration_session.host
|
52
59
|
|
53
60
|
app.instance_variable_set(:@routes, routes)
|
54
|
-
app.instance_variable_set(:@app, rack_app)
|
55
61
|
@integration_session = Class.new(ActionDispatch::Integration::Session) do
|
56
62
|
include app.routes.url_helpers
|
57
63
|
include app.routes.mounted_helpers
|
@@ -63,11 +69,9 @@ module ActionDispatch
|
|
63
69
|
yield routes
|
64
70
|
end
|
65
71
|
|
66
|
-
def reset_routes(old_routes, old_integration_session)
|
67
|
-
old_rack_app = app.config.middleware.build(old_routes)
|
68
|
-
|
72
|
+
def reset_routes(old_routes, old_routes_call_method, old_integration_session)
|
69
73
|
app.instance_variable_set(:@routes, old_routes)
|
70
|
-
|
74
|
+
@original_routes.singleton_class.redefine_method(:call, &old_routes_call_method)
|
71
75
|
@integration_session = old_integration_session
|
72
76
|
@routes = old_routes
|
73
77
|
end
|
@@ -549,7 +549,7 @@ module ActionDispatch
|
|
549
549
|
# https!(false)
|
550
550
|
# get "/articles/all"
|
551
551
|
# assert_response :success
|
552
|
-
#
|
552
|
+
# assert_dom 'h1', 'Articles'
|
553
553
|
# end
|
554
554
|
# end
|
555
555
|
#
|
@@ -588,7 +588,7 @@ module ActionDispatch
|
|
588
588
|
# def browses_site
|
589
589
|
# get "/products/all"
|
590
590
|
# assert_response :success
|
591
|
-
#
|
591
|
+
# assert_dom 'h1', 'Products'
|
592
592
|
# end
|
593
593
|
# end
|
594
594
|
#
|
@@ -9,8 +9,7 @@ module ActionDispatch
|
|
9
9
|
module TestProcess
|
10
10
|
module FixtureFile
|
11
11
|
# Shortcut for
|
12
|
-
# `Rack::Test::UploadedFile.new(File.join(ActionDispatch::IntegrationTest.
|
13
|
-
# ixture_path, path), type)`:
|
12
|
+
# `Rack::Test::UploadedFile.new(File.join(ActionDispatch::IntegrationTest.file_fixture_path, path), type)`:
|
14
13
|
#
|
15
14
|
# post :change_avatar, params: { avatar: file_fixture_upload('david.png', 'image/png') }
|
16
15
|
#
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: actionpack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 8.0.
|
4
|
+
version: 8.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 2025-03-12 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: activesupport
|
@@ -16,14 +15,14 @@ dependencies:
|
|
16
15
|
requirements:
|
17
16
|
- - '='
|
18
17
|
- !ruby/object:Gem::Version
|
19
|
-
version: 8.0.
|
18
|
+
version: 8.0.2
|
20
19
|
type: :runtime
|
21
20
|
prerelease: false
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
23
22
|
requirements:
|
24
23
|
- - '='
|
25
24
|
- !ruby/object:Gem::Version
|
26
|
-
version: 8.0.
|
25
|
+
version: 8.0.2
|
27
26
|
- !ruby/object:Gem::Dependency
|
28
27
|
name: nokogiri
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,28 +127,28 @@ dependencies:
|
|
128
127
|
requirements:
|
129
128
|
- - '='
|
130
129
|
- !ruby/object:Gem::Version
|
131
|
-
version: 8.0.
|
130
|
+
version: 8.0.2
|
132
131
|
type: :runtime
|
133
132
|
prerelease: false
|
134
133
|
version_requirements: !ruby/object:Gem::Requirement
|
135
134
|
requirements:
|
136
135
|
- - '='
|
137
136
|
- !ruby/object:Gem::Version
|
138
|
-
version: 8.0.
|
137
|
+
version: 8.0.2
|
139
138
|
- !ruby/object:Gem::Dependency
|
140
139
|
name: activemodel
|
141
140
|
requirement: !ruby/object:Gem::Requirement
|
142
141
|
requirements:
|
143
142
|
- - '='
|
144
143
|
- !ruby/object:Gem::Version
|
145
|
-
version: 8.0.
|
144
|
+
version: 8.0.2
|
146
145
|
type: :development
|
147
146
|
prerelease: false
|
148
147
|
version_requirements: !ruby/object:Gem::Requirement
|
149
148
|
requirements:
|
150
149
|
- - '='
|
151
150
|
- !ruby/object:Gem::Version
|
152
|
-
version: 8.0.
|
151
|
+
version: 8.0.2
|
153
152
|
description: Web apps on Rails. Simple, battle-tested conventions for building and
|
154
153
|
testing MVC web applications. Works with any Rack-compatible server.
|
155
154
|
email: david@loudthinking.com
|
@@ -350,12 +349,11 @@ licenses:
|
|
350
349
|
- MIT
|
351
350
|
metadata:
|
352
351
|
bug_tracker_uri: https://github.com/rails/rails/issues
|
353
|
-
changelog_uri: https://github.com/rails/rails/blob/v8.0.
|
354
|
-
documentation_uri: https://api.rubyonrails.org/v8.0.
|
352
|
+
changelog_uri: https://github.com/rails/rails/blob/v8.0.2/actionpack/CHANGELOG.md
|
353
|
+
documentation_uri: https://api.rubyonrails.org/v8.0.2/
|
355
354
|
mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
|
356
|
-
source_code_uri: https://github.com/rails/rails/tree/v8.0.
|
355
|
+
source_code_uri: https://github.com/rails/rails/tree/v8.0.2/actionpack
|
357
356
|
rubygems_mfa_required: 'true'
|
358
|
-
post_install_message:
|
359
357
|
rdoc_options: []
|
360
358
|
require_paths:
|
361
359
|
- lib
|
@@ -371,8 +369,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
371
369
|
version: '0'
|
372
370
|
requirements:
|
373
371
|
- none
|
374
|
-
rubygems_version: 3.
|
375
|
-
signing_key:
|
372
|
+
rubygems_version: 3.6.2
|
376
373
|
specification_version: 4
|
377
374
|
summary: Web-flow and rendering framework putting the VC in MVC (part of Rails).
|
378
375
|
test_files: []
|