actionpack 7.2.0 → 8.0.0.beta1

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.

Potentially problematic release.


This version of actionpack might be problematic. Click here for more details.

Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +86 -98
  3. data/lib/action_controller/api.rb +1 -0
  4. data/lib/action_controller/metal/conditional_get.rb +6 -3
  5. data/lib/action_controller/metal/http_authentication.rb +2 -2
  6. data/lib/action_controller/metal/instrumentation.rb +1 -2
  7. data/lib/action_controller/metal/live.rb +19 -8
  8. data/lib/action_controller/metal/rate_limiting.rb +13 -4
  9. data/lib/action_controller/metal/renderers.rb +2 -1
  10. data/lib/action_controller/metal/streaming.rb +5 -84
  11. data/lib/action_controller/metal/strong_parameters.rb +274 -73
  12. data/lib/action_controller/railtie.rb +1 -1
  13. data/lib/action_controller/test_case.rb +4 -3
  14. data/lib/action_dispatch/http/cache.rb +27 -10
  15. data/lib/action_dispatch/http/content_security_policy.rb +1 -0
  16. data/lib/action_dispatch/http/permissions_policy.rb +2 -0
  17. data/lib/action_dispatch/http/request.rb +26 -5
  18. data/lib/action_dispatch/journey/parser.rb +99 -196
  19. data/lib/action_dispatch/journey/scanner.rb +40 -42
  20. data/lib/action_dispatch/middleware/cookies.rb +4 -2
  21. data/lib/action_dispatch/middleware/debug_exceptions.rb +16 -3
  22. data/lib/action_dispatch/middleware/remote_ip.rb +5 -6
  23. data/lib/action_dispatch/middleware/request_id.rb +2 -1
  24. data/lib/action_dispatch/middleware/ssl.rb +14 -4
  25. data/lib/action_dispatch/railtie.rb +2 -0
  26. data/lib/action_dispatch/routing/inspector.rb +1 -1
  27. data/lib/action_dispatch/routing/mapper.rb +26 -17
  28. data/lib/action_dispatch/routing/route_set.rb +18 -6
  29. data/lib/action_dispatch/system_testing/browser.rb +12 -21
  30. data/lib/action_pack/gem_version.rb +3 -3
  31. metadata +16 -38
  32. data/lib/action_dispatch/journey/parser.y +0 -50
  33. data/lib/action_dispatch/journey/parser_extras.rb +0 -33
@@ -470,7 +470,6 @@ module ActionDispatch
470
470
  # When a pattern points to an internal route, the route's `:action` and
471
471
  # `:controller` should be set in options or hash shorthand. Examples:
472
472
  #
473
- # match 'photos/:id' => 'photos#show', via: :get
474
473
  # match 'photos/:id', to: 'photos#show', via: :get
475
474
  # match 'photos/:id', controller: 'photos', action: 'show', via: :get
476
475
  #
@@ -614,10 +613,6 @@ module ActionDispatch
614
613
  #
615
614
  # mount SomeRackApp, at: "some_route"
616
615
  #
617
- # Alternatively:
618
- #
619
- # mount(SomeRackApp => "some_route")
620
- #
621
616
  # For options, see `match`, as `mount` uses it internally.
622
617
  #
623
618
  # All mounted applications come with routing helpers to access them. These are
@@ -625,7 +620,7 @@ module ActionDispatch
625
620
  # `some_rack_app_path` or `some_rack_app_url`. To customize this helper's name,
626
621
  # use the `:as` option:
627
622
  #
628
- # mount(SomeRackApp => "some_route", as: "exciting")
623
+ # mount(SomeRackApp, at: "some_route", as: "exciting")
629
624
  #
630
625
  # This will generate the `exciting_path` and `exciting_url` helpers which can be
631
626
  # used to navigate to this mounted app.
@@ -773,6 +768,16 @@ module ActionDispatch
773
768
  map_method(:options, args, &block)
774
769
  end
775
770
 
771
+ # Define a route that recognizes HTTP CONNECT (and GET) requests. More
772
+ # specifically this recognizes HTTP/1 protocol upgrade requests and HTTP/2
773
+ # CONNECT requests with the protocol pseudo header. For supported arguments,
774
+ # see [match](rdoc-ref:Base#match)
775
+ #
776
+ # connect 'live', to: 'live#index'
777
+ def connect(*args, &block)
778
+ map_method([:get, :connect], args, &block)
779
+ end
780
+
776
781
  private
777
782
  def map_method(method, args, &block)
778
783
  options = args.extract_options!
@@ -1048,6 +1053,7 @@ module ActionDispatch
1048
1053
  end
1049
1054
 
1050
1055
  # Allows you to set default parameters for a route, such as this:
1056
+ #
1051
1057
  # defaults id: 'home' do
1052
1058
  # match 'scoped_pages/(:id)', to: 'pages#show'
1053
1059
  # end
@@ -1672,7 +1678,6 @@ module ActionDispatch
1672
1678
  # Matches a URL pattern to one or more routes. For more information, see
1673
1679
  # [match](rdoc-ref:Base#match).
1674
1680
  #
1675
- # match 'path' => 'controller#action', via: :patch
1676
1681
  # match 'path', to: 'controller#action', via: :post
1677
1682
  # match 'path', 'otherpath', on: :member, via: :get
1678
1683
  def match(path, *rest, &block)
@@ -1934,6 +1939,11 @@ module ActionDispatch
1934
1939
  end
1935
1940
 
1936
1941
  def map_match(paths, options)
1942
+ ActionDispatch.deprecator.warn(<<-MSG.squish) if paths.count > 1
1943
+ Mapping a route with multiple paths is deprecated and
1944
+ will be removed in Rails 8.1. Please use multiple method calls instead.
1945
+ MSG
1946
+
1937
1947
  if (on = options[:on]) && !VALID_ON_OPTIONS.include?(on)
1938
1948
  raise ArgumentError, "Unknown scope #{on.inspect} given to :on"
1939
1949
  end
@@ -2024,7 +2034,7 @@ module ActionDispatch
2024
2034
  name_for_action(options.delete(:as), action)
2025
2035
  end
2026
2036
 
2027
- path = Mapping.normalize_path URI::DEFAULT_PARSER.escape(path), formatted
2037
+ path = Mapping.normalize_path URI::RFC2396_PARSER.escape(path), formatted
2028
2038
  ast = Journey::Parser.parse path
2029
2039
 
2030
2040
  mapping = Mapping.build(@scope, @set, ast, controller, default_action, to, via, formatted, options_constraints, anchor, options)
@@ -2266,9 +2276,9 @@ module ActionDispatch
2266
2276
 
2267
2277
  attr_reader :parent, :scope_level
2268
2278
 
2269
- def initialize(hash, parent = NULL, scope_level = nil)
2270
- @hash = hash
2279
+ def initialize(hash, parent = ROOT, scope_level = nil)
2271
2280
  @parent = parent
2281
+ @hash = parent ? parent.frame.merge(hash) : hash
2272
2282
  @scope_level = scope_level
2273
2283
  end
2274
2284
 
@@ -2281,7 +2291,7 @@ module ActionDispatch
2281
2291
  end
2282
2292
 
2283
2293
  def root?
2284
- @parent.null?
2294
+ @parent == ROOT
2285
2295
  end
2286
2296
 
2287
2297
  def resources?
@@ -2326,23 +2336,22 @@ module ActionDispatch
2326
2336
  end
2327
2337
 
2328
2338
  def [](key)
2329
- scope = find { |node| node.frame.key? key }
2330
- scope && scope.frame[key]
2339
+ frame[key]
2331
2340
  end
2332
2341
 
2342
+ def frame; @hash; end
2343
+
2333
2344
  include Enumerable
2334
2345
 
2335
2346
  def each
2336
2347
  node = self
2337
- until node.equal? NULL
2348
+ until node.equal? ROOT
2338
2349
  yield node
2339
2350
  node = node.parent
2340
2351
  end
2341
2352
  end
2342
2353
 
2343
- def frame; @hash; end
2344
-
2345
- NULL = Scope.new(nil, nil)
2354
+ ROOT = Scope.new({}, nil)
2346
2355
  end
2347
2356
 
2348
2357
  def initialize(set) # :nodoc:
@@ -351,7 +351,7 @@ module ActionDispatch
351
351
  PATH = ->(options) { ActionDispatch::Http::URL.path_for(options) }
352
352
  UNKNOWN = ->(options) { ActionDispatch::Http::URL.url_for(options) }
353
353
 
354
- attr_accessor :formatter, :set, :named_routes, :default_scope, :router
354
+ attr_accessor :formatter, :set, :named_routes, :router
355
355
  attr_accessor :disable_clear_and_finalize, :resources_path_names
356
356
  attr_accessor :default_url_options, :draw_paths
357
357
  attr_reader :env_key, :polymorphic_mappings
@@ -363,7 +363,7 @@ module ActionDispatch
363
363
  end
364
364
 
365
365
  def self.new_with_config(config)
366
- route_set_config = DEFAULT_CONFIG
366
+ route_set_config = DEFAULT_CONFIG.dup
367
367
 
368
368
  # engines apparently don't have this set
369
369
  if config.respond_to? :relative_url_root
@@ -374,14 +374,18 @@ module ActionDispatch
374
374
  route_set_config.api_only = config.api_only
375
375
  end
376
376
 
377
+ if config.respond_to? :default_scope
378
+ route_set_config.default_scope = config.default_scope
379
+ end
380
+
377
381
  new route_set_config
378
382
  end
379
383
 
380
- Config = Struct.new :relative_url_root, :api_only
384
+ Config = Struct.new :relative_url_root, :api_only, :default_scope
381
385
 
382
- DEFAULT_CONFIG = Config.new(nil, false)
386
+ DEFAULT_CONFIG = Config.new(nil, false, nil)
383
387
 
384
- def initialize(config = DEFAULT_CONFIG)
388
+ def initialize(config = DEFAULT_CONFIG.dup)
385
389
  self.named_routes = NamedRouteCollection.new
386
390
  self.resources_path_names = self.class.default_resources_path_names
387
391
  self.default_url_options = {}
@@ -416,6 +420,14 @@ module ActionDispatch
416
420
  @config.api_only
417
421
  end
418
422
 
423
+ def default_scope
424
+ @config.default_scope
425
+ end
426
+
427
+ def default_scope=(new_default_scope)
428
+ @config.default_scope = new_default_scope
429
+ end
430
+
419
431
  def request_class
420
432
  ActionDispatch::Request
421
433
  end
@@ -917,7 +929,7 @@ module ActionDispatch
917
929
  params.each do |key, value|
918
930
  if value.is_a?(String)
919
931
  value = value.dup.force_encoding(Encoding::BINARY)
920
- params[key] = URI::DEFAULT_PARSER.unescape(value)
932
+ params[key] = URI::RFC2396_PARSER.unescape(value)
921
933
  end
922
934
  end
923
935
  req.path_parameters = params
@@ -9,7 +9,6 @@ module ActionDispatch
9
9
 
10
10
  def initialize(name)
11
11
  @name = name
12
- set_default_options
13
12
  end
14
13
 
15
14
  def type
@@ -27,9 +26,9 @@ module ActionDispatch
27
26
  @options ||=
28
27
  case type
29
28
  when :chrome
30
- ::Selenium::WebDriver::Chrome::Options.new
29
+ default_chrome_options
31
30
  when :firefox
32
- ::Selenium::WebDriver::Firefox::Options.new
31
+ default_firefox_options
33
32
  end
34
33
  end
35
34
 
@@ -49,26 +48,18 @@ module ActionDispatch
49
48
  end
50
49
 
51
50
  private
52
- def set_default_options
53
- case name
54
- when :headless_chrome
55
- set_headless_chrome_browser_options
56
- when :headless_firefox
57
- set_headless_firefox_browser_options
58
- end
51
+ def default_chrome_options
52
+ options = ::Selenium::WebDriver::Chrome::Options.new
53
+ options.add_argument("--disable-search-engine-choice-screen")
54
+ options.add_argument("--headless") if name == :headless_chrome
55
+ options.add_argument("--disable-gpu") if Gem.win_platform?
56
+ options
59
57
  end
60
58
 
61
- def set_headless_chrome_browser_options
62
- configure do |capabilities|
63
- capabilities.add_argument("--headless")
64
- capabilities.add_argument("--disable-gpu") if Gem.win_platform?
65
- end
66
- end
67
-
68
- def set_headless_firefox_browser_options
69
- configure do |capabilities|
70
- capabilities.add_argument("-headless")
71
- end
59
+ def default_firefox_options
60
+ options = ::Selenium::WebDriver::Firefox::Options.new
61
+ options.add_argument("-headless") if name == :headless_firefox
62
+ options
72
63
  end
73
64
 
74
65
  def resolve_driver_path(namespace)
@@ -9,10 +9,10 @@ module ActionPack
9
9
  end
10
10
 
11
11
  module VERSION
12
- MAJOR = 7
13
- MINOR = 2
12
+ MAJOR = 8
13
+ MINOR = 0
14
14
  TINY = 0
15
- PRE = nil
15
+ PRE = "beta1"
16
16
 
17
17
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
18
18
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: actionpack
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.2.0
4
+ version: 8.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-09 00:00:00.000000000 Z
11
+ date: 2024-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 7.2.0
19
+ version: 8.0.0.beta1
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.2.0
26
+ version: 8.0.0.beta1
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,20 +38,6 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: 1.8.5
41
- - !ruby/object:Gem::Dependency
42
- name: racc
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ">="
46
- - !ruby/object:Gem::Version
47
- version: '0'
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: rack
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -59,9 +45,6 @@ dependencies:
59
45
  - - ">="
60
46
  - !ruby/object:Gem::Version
61
47
  version: 2.2.4
62
- - - "<"
63
- - !ruby/object:Gem::Version
64
- version: '3.2'
65
48
  type: :runtime
66
49
  prerelease: false
67
50
  version_requirements: !ruby/object:Gem::Requirement
@@ -69,9 +52,6 @@ dependencies:
69
52
  - - ">="
70
53
  - !ruby/object:Gem::Version
71
54
  version: 2.2.4
72
- - - "<"
73
- - !ruby/object:Gem::Version
74
- version: '3.2'
75
55
  - !ruby/object:Gem::Dependency
76
56
  name: rack-session
77
57
  requirement: !ruby/object:Gem::Requirement
@@ -148,28 +128,28 @@ dependencies:
148
128
  requirements:
149
129
  - - '='
150
130
  - !ruby/object:Gem::Version
151
- version: 7.2.0
131
+ version: 8.0.0.beta1
152
132
  type: :runtime
153
133
  prerelease: false
154
134
  version_requirements: !ruby/object:Gem::Requirement
155
135
  requirements:
156
136
  - - '='
157
137
  - !ruby/object:Gem::Version
158
- version: 7.2.0
138
+ version: 8.0.0.beta1
159
139
  - !ruby/object:Gem::Dependency
160
140
  name: activemodel
161
141
  requirement: !ruby/object:Gem::Requirement
162
142
  requirements:
163
143
  - - '='
164
144
  - !ruby/object:Gem::Version
165
- version: 7.2.0
145
+ version: 8.0.0.beta1
166
146
  type: :development
167
147
  prerelease: false
168
148
  version_requirements: !ruby/object:Gem::Requirement
169
149
  requirements:
170
150
  - - '='
171
151
  - !ruby/object:Gem::Version
172
- version: 7.2.0
152
+ version: 8.0.0.beta1
173
153
  description: Web apps on Rails. Simple, battle-tested conventions for building and
174
154
  testing MVC web applications. Works with any Rack-compatible server.
175
155
  email: david@loudthinking.com
@@ -268,8 +248,6 @@ files:
268
248
  - lib/action_dispatch/journey/nfa/dot.rb
269
249
  - lib/action_dispatch/journey/nodes/node.rb
270
250
  - lib/action_dispatch/journey/parser.rb
271
- - lib/action_dispatch/journey/parser.y
272
- - lib/action_dispatch/journey/parser_extras.rb
273
251
  - lib/action_dispatch/journey/path/pattern.rb
274
252
  - lib/action_dispatch/journey/route.rb
275
253
  - lib/action_dispatch/journey/router.rb
@@ -369,12 +347,12 @@ licenses:
369
347
  - MIT
370
348
  metadata:
371
349
  bug_tracker_uri: https://github.com/rails/rails/issues
372
- changelog_uri: https://github.com/rails/rails/blob/v7.2.0/actionpack/CHANGELOG.md
373
- documentation_uri: https://api.rubyonrails.org/v7.2.0/
350
+ changelog_uri: https://github.com/rails/rails/blob/v8.0.0.beta1/actionpack/CHANGELOG.md
351
+ documentation_uri: https://api.rubyonrails.org/v8.0.0.beta1/
374
352
  mailing_list_uri: https://discuss.rubyonrails.org/c/rubyonrails-talk
375
- source_code_uri: https://github.com/rails/rails/tree/v7.2.0/actionpack
353
+ source_code_uri: https://github.com/rails/rails/tree/v8.0.0.beta1/actionpack
376
354
  rubygems_mfa_required: 'true'
377
- post_install_message:
355
+ post_install_message:
378
356
  rdoc_options: []
379
357
  require_paths:
380
358
  - lib
@@ -382,7 +360,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
382
360
  requirements:
383
361
  - - ">="
384
362
  - !ruby/object:Gem::Version
385
- version: 3.1.0
363
+ version: 3.2.0
386
364
  required_rubygems_version: !ruby/object:Gem::Requirement
387
365
  requirements:
388
366
  - - ">="
@@ -390,8 +368,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
390
368
  version: '0'
391
369
  requirements:
392
370
  - none
393
- rubygems_version: 3.5.11
394
- signing_key:
371
+ rubygems_version: 3.5.16
372
+ signing_key:
395
373
  specification_version: 4
396
374
  summary: Web-flow and rendering framework putting the VC in MVC (part of Rails).
397
375
  test_files: []
@@ -1,50 +0,0 @@
1
- class ActionDispatch::Journey::Parser
2
- options no_result_var
3
- token SLASH LITERAL SYMBOL LPAREN RPAREN DOT STAR OR
4
-
5
- rule
6
- expressions
7
- : expression expressions { Cat.new(val.first, val.last) }
8
- | expression { val.first }
9
- | or
10
- ;
11
- expression
12
- : terminal
13
- | group
14
- | star
15
- ;
16
- group
17
- : LPAREN expressions RPAREN { Group.new(val[1]) }
18
- ;
19
- or
20
- : expression OR expression { Or.new([val.first, val.last]) }
21
- | expression OR or { Or.new([val.first, val.last]) }
22
- ;
23
- star
24
- : STAR { Star.new(Symbol.new(val.last, Symbol::GREEDY_EXP)) }
25
- ;
26
- terminal
27
- : symbol
28
- | literal
29
- | slash
30
- | dot
31
- ;
32
- slash
33
- : SLASH { Slash.new(val.first) }
34
- ;
35
- symbol
36
- : SYMBOL { Symbol.new(val.first) }
37
- ;
38
- literal
39
- : LITERAL { Literal.new(val.first) }
40
- ;
41
- dot
42
- : DOT { Dot.new(val.first) }
43
- ;
44
-
45
- end
46
-
47
- ---- header
48
- # :stopdoc:
49
-
50
- require "action_dispatch/journey/parser_extras"
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # :markup: markdown
4
-
5
- require "action_dispatch/journey/scanner"
6
- require "action_dispatch/journey/nodes/node"
7
-
8
- module ActionDispatch
9
- # :stopdoc:
10
- module Journey
11
- class Parser < Racc::Parser
12
- include Journey::Nodes
13
-
14
- def self.parse(string)
15
- new.parse string
16
- end
17
-
18
- def initialize
19
- @scanner = Scanner.new
20
- end
21
-
22
- def parse(string)
23
- @scanner.scan_setup(string)
24
- do_parse
25
- end
26
-
27
- def next_token
28
- @scanner.next_token
29
- end
30
- end
31
- end
32
- # :startdoc:
33
- end