actionview 7.2.3.1 → 8.0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +79 -109
  3. data/lib/action_view/dependency_tracker/erb_tracker.rb +36 -27
  4. data/lib/action_view/dependency_tracker/ruby_tracker.rb +2 -19
  5. data/lib/action_view/dependency_tracker/wildcard_resolver.rb +32 -0
  6. data/lib/action_view/dependency_tracker.rb +1 -0
  7. data/lib/action_view/gem_version.rb +3 -3
  8. data/lib/action_view/helpers/atom_feed_helper.rb +0 -2
  9. data/lib/action_view/helpers/cache_helper.rb +8 -0
  10. data/lib/action_view/helpers/date_helper.rb +3 -3
  11. data/lib/action_view/helpers/form_helper.rb +76 -75
  12. data/lib/action_view/helpers/form_options_helper.rb +25 -22
  13. data/lib/action_view/helpers/form_tag_helper.rb +20 -17
  14. data/lib/action_view/helpers/rendering_helper.rb +160 -50
  15. data/lib/action_view/helpers/sanitize_helper.rb +6 -0
  16. data/lib/action_view/helpers/tag_helper.rb +26 -39
  17. data/lib/action_view/helpers/tags/base.rb +11 -9
  18. data/lib/action_view/helpers/tags/check_box.rb +2 -2
  19. data/lib/action_view/helpers/tags/collection_check_boxes.rb +4 -3
  20. data/lib/action_view/helpers/tags/file_field.rb +4 -1
  21. data/lib/action_view/helpers/tags/label.rb +3 -10
  22. data/lib/action_view/helpers/tags/radio_button.rb +1 -1
  23. data/lib/action_view/helpers/tags/select_renderer.rb +1 -1
  24. data/lib/action_view/helpers/tags/text_area.rb +1 -1
  25. data/lib/action_view/helpers/tags/text_field.rb +1 -1
  26. data/lib/action_view/helpers/url_helper.rb +2 -4
  27. data/lib/action_view/layouts.rb +1 -1
  28. data/lib/action_view/record_identifier.rb +1 -1
  29. data/lib/action_view/render_parser/prism_render_parser.rb +13 -1
  30. data/lib/action_view/render_parser/ripper_render_parser.rb +10 -1
  31. data/lib/action_view/renderer/partial_renderer/collection_caching.rb +5 -1
  32. data/lib/action_view/renderer/streaming_template_renderer.rb +8 -2
  33. data/lib/action_view/rendering.rb +2 -3
  34. data/lib/action_view/template/handlers/erb/erubi.rb +1 -1
  35. data/lib/action_view/template/raw_file.rb +4 -0
  36. data/lib/action_view/template/resolver.rb +0 -1
  37. data/lib/action_view/template.rb +9 -4
  38. metadata +13 -26
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 61f8e3426843a85e006134bb5d330f91e09457e3392025afab472d470d706929
4
- data.tar.gz: c066f5cc2718465d6f24a8c81ee5361c3c9fcbef2288a8d04b77334e9c724ad9
3
+ metadata.gz: e6becd57141c14751ac9c81523a74a89deeec51e5a78cefc6c1586867ff7a248
4
+ data.tar.gz: a862b25aeb7af37f1527e75eeff3e7f8fc849bb9dd1d292cbeb6126bdae5cbe5
5
5
  SHA512:
6
- metadata.gz: 0a9f2a3f39681a4687a4b8a42b10e00be43c0ee413037c9f236b3bbc04961c8d9993ee955bb0b940a5f05c0024c8f17abb3106d4420f0dea593dd020f038df55
7
- data.tar.gz: b259ce7c6e668708a25ca4e61551bbe65aee7c898cf6c2da3ba0d2c40f64e6ccc5adc2067f817e95ac1f913edbb34b9e75ec4de89e058899c7644ecf4fbf5fb5
6
+ metadata.gz: 2e1c60bbfcdd1890aa638dfb91d0d23c9dbb96e9e8e3cb25c0f5fcaf1a515aa8742533b1b1a7118e0fa72aedac4684b4983ffb9e7e0a9a15f0ba71a31e99d2e8
7
+ data.tar.gz: bcef9b6b3e9a471418abe8d92608ddee030953fd903a93c9fb3b2aba1c7e8e7da03f10fd927944961eb1fcd0cc4047afaac7f13f99a8dfa1f304a2bc8cdf9828
data/CHANGELOG.md CHANGED
@@ -1,4 +1,38 @@
1
- ## Rails 7.2.3.1 (March 23, 2026) ##
1
+ ## Rails 8.0.5.1 (July 29, 2026) ##
2
+
3
+ * No changes.
4
+
5
+
6
+ ## Rails 8.0.5 (March 24, 2026) ##
7
+
8
+ * Fix encoding errors for string locals containing non-ASCII characters.
9
+
10
+ *Kataoka Katsuki*
11
+
12
+ * Fix collection caching to only forward `expires_in` argument if explicitly set.
13
+
14
+ *Pieter Visser*
15
+
16
+ * Fix `file_field` to join mime types with a comma when provided as Array
17
+
18
+ ```ruby
19
+ file_field(:article, :image, accept: ['image/png', 'image/gif', 'image/jpeg'])
20
+ ```
21
+
22
+ Now behaves likes:
23
+
24
+ ```
25
+ file_field(:article, :image, accept: 'image/png,image/gif,image/jpeg')
26
+ ```
27
+
28
+ *Bogdan Gusiev*
29
+
30
+ * Fix strict locals parsing to handle multiline definitions.
31
+
32
+ *Said Kaldybaev*
33
+
34
+
35
+ ## Rails 8.0.4.1 (March 23, 2026) ##
2
36
 
3
37
  * Skip blank attribute names in tag helpers to avoid generating invalid HTML.
4
38
 
@@ -7,7 +41,18 @@
7
41
  *Mike Dalessio*
8
42
 
9
43
 
10
- ## Rails 7.2.3 (October 28, 2025) ##
44
+ ## Rails 8.0.4 (October 28, 2025) ##
45
+
46
+ * Restore `add_default_name_and_id` method.
47
+
48
+ *Hartley McGuire*
49
+
50
+
51
+ ## Rails 8.0.3 (September 22, 2025) ##
52
+
53
+ * Fix label with `for` option not getting prefixed by form `namespace` value
54
+
55
+ *Abeid Ahmed*, *Hartley McGuire*
11
56
 
12
57
  * Fix `javascript_include_tag` `type` option to accept either strings and symbols.
13
58
 
@@ -16,7 +61,7 @@
16
61
  javascript_include_tag "application", type: "module"
17
62
  ```
18
63
 
19
- Previously, only the string value was recoginized.
64
+ Previously, only the string value was recognized.
20
65
 
21
66
  *Jean Boussier*
22
67
 
@@ -24,6 +69,14 @@
24
69
 
25
70
  *Jonathan Hefner*
26
71
 
72
+
73
+ ## Rails 8.0.2.1 (August 13, 2025) ##
74
+
75
+ * No changes.
76
+
77
+
78
+ ## Rails 8.0.2 (March 12, 2025) ##
79
+
27
80
  * Respect `html_options[:form]` when `collection_checkboxes` generates the
28
81
  hidden `<input>`.
29
82
 
@@ -57,6 +110,8 @@
57
110
 
58
111
  *Jean Boussier*
59
112
 
113
+ ## Rails 8.0.1 (December 13, 2024) ##
114
+
60
115
  * Fix a crash in ERB template error highlighting when the error occurs on a
61
116
  line in the compiled template that is past the end of the source template.
62
117
 
@@ -69,141 +124,56 @@
69
124
  *Martin Emde*
70
125
 
71
126
 
72
- ## Rails 7.2.2.2 (August 13, 2025) ##
73
-
74
- * No changes.
75
-
76
-
77
- ## Rails 7.2.2.1 (December 10, 2024) ##
127
+ ## Rails 8.0.0.1 (December 10, 2024) ##
78
128
 
79
129
  * No changes.
80
130
 
81
131
 
82
- ## Rails 7.2.2 (October 30, 2024) ##
132
+ ## Rails 8.0.0 (November 07, 2024) ##
83
133
 
84
134
  * No changes.
85
135
 
86
136
 
87
- ## Rails 7.2.1.2 (October 23, 2024) ##
137
+ ## Rails 8.0.0.rc2 (October 30, 2024) ##
88
138
 
89
139
  * No changes.
90
140
 
91
141
 
92
- ## Rails 7.2.1.1 (October 15, 2024) ##
142
+ ## Rails 8.0.0.rc1 (October 19, 2024) ##
93
143
 
94
- * No changes.
144
+ * Remove deprecated support to passing a content to void tag elements on the `tag` builder.
95
145
 
146
+ *Rafael Mendonça França*
96
147
 
97
- ## Rails 7.2.1 (August 22, 2024) ##
148
+ * Remove deprecated support to passing `nil` to the `model:` argument of `form_with`.
98
149
 
99
- * No changes.
150
+ *Rafael Mendonça França*
100
151
 
101
152
 
102
- ## Rails 7.2.0 (August 09, 2024) ##
153
+ ## Rails 8.0.0.beta1 (September 26, 2024) ##
103
154
 
104
- * Fix templates with strict locals to also include `local_assigns`.
155
+ * Enable DependencyTracker to evaluate renders with trailing interpolation.
105
156
 
106
- Previously templates defining strict locals wouldn't receive the `local_assigns`
107
- hash.
108
-
109
- *Jean Boussier*
110
-
111
- * Add queries count to template rendering instrumentation.
112
-
113
- ```
114
- # Before
115
- Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms | Allocations: 112788)
116
-
117
- # After
118
- Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms (2 queries, 1 cached) | Allocations: 112788)
157
+ ```erb
158
+ <%= render "maintenance_tasks/runs/info/#{run.status}" %>
119
159
  ```
120
160
 
121
- *fatkodima*
122
-
123
- * Raise `ArgumentError` if `:renderable` object does not respond to `#render_in`.
124
-
125
- *Sean Doyle*
126
-
127
- * Add the `nonce: true` option for `stylesheet_link_tag` helper to support automatic nonce generation for Content Security Policy.
128
-
129
- Works the same way as `javascript_include_tag nonce: true` does.
130
-
131
- *Akhil G Krishnan*, *AJ Esler*
132
-
133
- * Parse `ActionView::TestCase#rendered` HTML content as `Nokogiri::XML::DocumentFragment` instead of `Nokogiri::XML::Document`.
134
-
135
- *Sean Doyle*
136
-
137
- * Rename `ActionView::TestCase::Behavior::Content` to `ActionView::TestCase::Behavior::RenderedViewContent`.
138
-
139
- Make `RenderedViewContent` inherit from `String`. Make private API with `:nodoc:`
140
-
141
- *Sean Doyle*
142
-
143
- * Deprecate passing `nil` as value for the `model:` argument to the `form_with` method.
144
-
145
- *Collin Jilbert*
146
-
147
- * Alias `field_set_tag` helper to `fieldset_tag` to match `<fieldset>` element.
148
-
149
- *Sean Doyle*
150
-
151
- * Deprecate passing content to void elements when using `tag.br` type tag builders.
161
+ Previously, the DependencyTracker would ignore this render, but now it will
162
+ mark all partials in the "maintenance_tasks/runs/info" folder as
163
+ dependencies.
152
164
 
153
165
  *Hartley McGuire*
154
166
 
155
- * Fix the `number_to_human_size` view helper to correctly work with negative numbers.
156
-
157
- *Earlopain*
158
-
159
- * Automatically discard the implicit locals injected by collection rendering for template that can't accept them.
160
-
161
- When rendering a collection, two implicit variables are injected, which breaks templates with strict locals.
162
-
163
- Now they are only passed if the template will actually accept them.
167
+ * Rename `text_area` methods into `textarea`
164
168
 
165
- *Yasha Krasnou*, *Jean Boussier*
169
+ Old names are still available as aliases.
166
170
 
167
- * Fix `@rails/ujs` calling `start()` an extra time when using bundlers.
168
-
169
- *Hartley McGuire*, *Ryunosuke Sato*
171
+ *Sean Doyle*
170
172
 
171
- * Fix the `capture` view helper compatibility with HAML and Slim.
173
+ * Rename `check_box*` methods into `checkbox*`.
172
174
 
173
- When a blank string was captured in HAML or Slim (and possibly other template engines)
174
- it would instead return the entire buffer.
175
+ Old names are still available as aliases.
175
176
 
176
177
  *Jean Boussier*
177
178
 
178
- * Updated `@rails/ujs` files to ignore certain data-* attributes when element is contenteditable.
179
-
180
- This fix was already landed in >= 7.0.4.3, < 7.1.0.
181
- [[CVE-2023-23913](https://github.com/advisories/GHSA-xp5h-f8jf-rc8q)]
182
-
183
- *Ryunosuke Sato*
184
-
185
- * Added validation for HTML tag names in the `tag` and `content_tag` helper method.
186
-
187
- The `tag` and `content_tag` method now checks that the provided tag name adheres to the HTML
188
- specification. If an invalid HTML tag name is provided, the method raises an `ArgumentError`
189
- with an appropriate error message.
190
-
191
- Examples:
192
-
193
- ```ruby
194
- # Raises ArgumentError: Invalid HTML5 tag name: 12p
195
- content_tag("12p") # Starting with a number
196
-
197
- # Raises ArgumentError: Invalid HTML5 tag name: ""
198
- content_tag("") # Empty tag name
199
-
200
- # Raises ArgumentError: Invalid HTML5 tag name: div/
201
- tag("div/") # Contains a solidus
202
-
203
- # Raises ArgumentError: Invalid HTML5 tag name: "image file"
204
- tag("image file") # Contains a space
205
- ```
206
-
207
- *Akhil G Krishnan*
208
-
209
- Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actionview/CHANGELOG.md) for previous changes.
179
+ Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/actionview/CHANGELOG.md) for previous changes.
@@ -74,7 +74,7 @@ module ActionView
74
74
  end
75
75
 
76
76
  def dependencies
77
- render_dependencies + explicit_dependencies
77
+ WildcardResolver.new(@view_paths, render_dependencies + explicit_dependencies).resolve
78
78
  end
79
79
 
80
80
  attr_reader :name, :template
@@ -90,15 +90,15 @@ module ActionView
90
90
  end
91
91
 
92
92
  def render_dependencies
93
- render_dependencies = []
93
+ dependencies = []
94
94
  render_calls = source.split(/\brender\b/).drop(1)
95
95
 
96
96
  render_calls.each do |arguments|
97
- add_dependencies(render_dependencies, arguments, LAYOUT_DEPENDENCY)
98
- add_dependencies(render_dependencies, arguments, RENDER_ARGUMENTS)
97
+ add_dependencies(dependencies, arguments, LAYOUT_DEPENDENCY)
98
+ add_dependencies(dependencies, arguments, RENDER_ARGUMENTS)
99
99
  end
100
100
 
101
- render_dependencies.uniq
101
+ dependencies
102
102
  end
103
103
 
104
104
  def add_dependencies(render_dependencies, arguments, pattern)
@@ -116,12 +116,37 @@ module ActionView
116
116
  end
117
117
 
118
118
  def add_static_dependency(dependencies, dependency, quote_type)
119
- if quote_type == '"'
120
- # Ignore if there is interpolation
121
- return if dependency.include?('#{')
122
- end
119
+ if quote_type == '"' && dependency.include?('#{')
120
+ scanner = StringScanner.new(dependency)
121
+
122
+ wildcard_dependency = +""
123
+
124
+ while !scanner.eos?
125
+ if scanner.scan_until(/\#{/)
126
+ unmatched_brackets = 1
127
+ wildcard_dependency << scanner.pre_match
128
+
129
+ while unmatched_brackets > 0 && !scanner.eos?
130
+ found = scanner.scan_until(/[{}]/)
131
+ return unless found
132
+
133
+ case scanner.matched
134
+ when "{"
135
+ unmatched_brackets += 1
136
+ when "}"
137
+ unmatched_brackets -= 1
138
+ end
139
+ end
140
+
141
+ wildcard_dependency << "*"
142
+ else
143
+ wildcard_dependency << scanner.rest
144
+ scanner.terminate
145
+ end
146
+ end
123
147
 
124
- if dependency
148
+ dependencies << wildcard_dependency
149
+ elsif dependency
125
150
  if dependency.include?("/")
126
151
  dependencies << dependency
127
152
  else
@@ -130,24 +155,8 @@ module ActionView
130
155
  end
131
156
  end
132
157
 
133
- def resolve_directories(wildcard_dependencies)
134
- return [] unless @view_paths
135
- return [] if wildcard_dependencies.empty?
136
-
137
- # Remove trailing "/*"
138
- prefixes = wildcard_dependencies.map { |query| query[0..-3] }
139
-
140
- @view_paths.flat_map(&:all_template_paths).uniq.filter_map { |path|
141
- path.to_s if prefixes.include?(path.prefix)
142
- }.sort
143
- end
144
-
145
158
  def explicit_dependencies
146
- dependencies = source.scan(EXPLICIT_DEPENDENCY).flatten.uniq
147
-
148
- wildcards, explicits = dependencies.partition { |dependency| dependency.end_with?("/*") }
149
-
150
- (explicits + resolve_directories(wildcards)).uniq
159
+ source.scan(EXPLICIT_DEPENDENCY).flatten.uniq
151
160
  end
152
161
  end
153
162
  end
@@ -10,7 +10,7 @@ module ActionView
10
10
  end
11
11
 
12
12
  def dependencies
13
- render_dependencies + explicit_dependencies
13
+ WildcardResolver.new(view_paths, render_dependencies + explicit_dependencies).resolve
14
14
  end
15
15
 
16
16
  def self.supports_view_paths? # :nodoc:
@@ -31,29 +31,12 @@ module ActionView
31
31
  compiled_source = template.handler.call(template, template.source)
32
32
 
33
33
  @parser_class.new(@name, compiled_source).render_calls.filter_map do |render_call|
34
- next if render_call.end_with?("/_")
35
34
  render_call.gsub(%r|/_|, "/")
36
35
  end
37
36
  end
38
37
 
39
38
  def explicit_dependencies
40
- dependencies = template.source.scan(EXPLICIT_DEPENDENCY).flatten.uniq
41
-
42
- wildcards, explicits = dependencies.partition { |dependency| dependency.end_with?("/*") }
43
-
44
- (explicits + resolve_directories(wildcards)).uniq
45
- end
46
-
47
- def resolve_directories(wildcard_dependencies)
48
- return [] unless view_paths
49
- return [] if wildcard_dependencies.empty?
50
-
51
- # Remove trailing "/*"
52
- prefixes = wildcard_dependencies.map { |query| query[0..-3] }
53
-
54
- view_paths.flat_map(&:all_template_paths).uniq.filter_map { |path|
55
- path.to_s if prefixes.include?(path.prefix)
56
- }.sort
39
+ template.source.scan(EXPLICIT_DEPENDENCY).flatten.uniq
57
40
  end
58
41
  end
59
42
  end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActionView
4
+ class DependencyTracker # :nodoc:
5
+ class WildcardResolver # :nodoc:
6
+ def initialize(view_paths, dependencies)
7
+ @view_paths = view_paths
8
+
9
+ @wildcard_dependencies, @explicit_dependencies =
10
+ dependencies.partition { |dependency| dependency.end_with?("/*") }
11
+ end
12
+
13
+ def resolve
14
+ return explicit_dependencies.uniq if !view_paths || wildcard_dependencies.empty?
15
+
16
+ (explicit_dependencies + resolved_wildcard_dependencies).uniq
17
+ end
18
+
19
+ private
20
+ attr_reader :explicit_dependencies, :wildcard_dependencies, :view_paths
21
+
22
+ def resolved_wildcard_dependencies
23
+ # Remove trailing "/*"
24
+ prefixes = wildcard_dependencies.map { |query| query[0..-3] }
25
+
26
+ view_paths.flat_map(&:all_template_paths).uniq.filter_map { |path|
27
+ path.to_s if prefixes.include?(path.prefix)
28
+ }.sort
29
+ end
30
+ end
31
+ end
32
+ end
@@ -10,6 +10,7 @@ module ActionView
10
10
 
11
11
  autoload :ERBTracker
12
12
  autoload :RubyTracker
13
+ autoload :WildcardResolver
13
14
 
14
15
  @trackers = Concurrent::Map.new
15
16
 
@@ -7,9 +7,9 @@ module ActionView
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 7
11
- MINOR = 2
12
- TINY = 3
10
+ MAJOR = 8
11
+ MINOR = 0
12
+ TINY = 5
13
13
  PRE = "1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "set"
4
-
5
3
  module ActionView
6
4
  module Helpers # :nodoc:
7
5
  # = Action View Atom Feed \Helpers
@@ -93,6 +93,14 @@ module ActionView
93
93
  # render partial: 'attachments/attachment', collection: group_of_attachments
94
94
  # render partial: 'documents/document', collection: @project.documents.where(published: true).order('created_at')
95
95
  #
96
+ # One last type of dependency can be determined implicitly:
97
+ #
98
+ # render "maintenance_tasks/runs/info/#{run.status}"
99
+ #
100
+ # Because the value passed to render ends in interpolation, Action View
101
+ # will mark all partials within the "maintenance_tasks/runs/info" folder as
102
+ # dependencies.
103
+ #
96
104
  # === Explicit dependencies
97
105
  #
98
106
  # Sometimes you'll have template dependencies that can't be derived at all. This is typically
@@ -1235,7 +1235,7 @@ module ActionView
1235
1235
  class FormBuilder
1236
1236
  # Wraps ActionView::Helpers::DateHelper#date_select for form builders:
1237
1237
  #
1238
- # <%= form_for @person do |f| %>
1238
+ # <%= form_with model: @person do |f| %>
1239
1239
  # <%= f.date_select :birth_date %>
1240
1240
  # <%= f.submit %>
1241
1241
  # <% end %>
@@ -1247,7 +1247,7 @@ module ActionView
1247
1247
 
1248
1248
  # Wraps ActionView::Helpers::DateHelper#time_select for form builders:
1249
1249
  #
1250
- # <%= form_for @race do |f| %>
1250
+ # <%= form_with model: @race do |f| %>
1251
1251
  # <%= f.time_select :average_lap %>
1252
1252
  # <%= f.submit %>
1253
1253
  # <% end %>
@@ -1259,7 +1259,7 @@ module ActionView
1259
1259
 
1260
1260
  # Wraps ActionView::Helpers::DateHelper#datetime_select for form builders:
1261
1261
  #
1262
- # <%= form_for @person do |f| %>
1262
+ # <%= form_with model: @person do |f| %>
1263
1263
  # <%= f.datetime_select :last_request_at %>
1264
1264
  # <%= f.submit %>
1265
1265
  # <% end %>