actionview 7.2.1.1 → 8.0.0.rc1
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 +18 -98
- data/lib/action_view/dependency_tracker/erb_tracker.rb +36 -27
- data/lib/action_view/dependency_tracker/ruby_tracker.rb +2 -19
- data/lib/action_view/dependency_tracker/wildcard_resolver.rb +32 -0
- data/lib/action_view/dependency_tracker.rb +1 -0
- data/lib/action_view/gem_version.rb +4 -4
- data/lib/action_view/helpers/atom_feed_helper.rb +0 -2
- data/lib/action_view/helpers/cache_helper.rb +8 -0
- data/lib/action_view/helpers/date_helper.rb +3 -3
- data/lib/action_view/helpers/form_helper.rb +76 -76
- data/lib/action_view/helpers/form_options_helper.rb +23 -21
- data/lib/action_view/helpers/form_tag_helper.rb +18 -16
- data/lib/action_view/helpers/rendering_helper.rb +160 -50
- data/lib/action_view/helpers/tag_helper.rb +26 -39
- data/lib/action_view/helpers/tags/collection_check_boxes.rb +4 -3
- data/lib/action_view/helpers/url_helper.rb +3 -3
- data/lib/action_view/layouts.rb +1 -1
- data/lib/action_view/record_identifier.rb +1 -1
- data/lib/action_view/render_parser/prism_render_parser.rb +13 -1
- data/lib/action_view/render_parser/ripper_render_parser.rb +10 -1
- data/lib/action_view/renderer/streaming_template_renderer.rb +0 -1
- data/lib/action_view/rendering.rb +2 -3
- data/lib/action_view/template/resolver.rb +0 -1
- data/lib/action_view/template.rb +13 -4
- metadata +13 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae04c8b816193c85245238b5e74ed2ead2c2e237993a1017004585fc7fa8115e
|
4
|
+
data.tar.gz: 1200ecf14fdf372d98cebb1fa733be76cacd57be0a4f0b645f3f8fb2b08d9f56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a6993c1423b21898cb19acd2f45cc776ae06614da27821d2bb1ef0796ba358ba4e97c3001dfc5b8f72e36079c6114f0f832f9f6c16201832859b633f8ad6106
|
7
|
+
data.tar.gz: c3424f17a5ca9c0405ae70ed85197ad016d13d2f399e4d08cad73fd29c899be3d5e24616a7d5ba7407091412f6839e6fe77195aed26308f2f78ad709a1423c1f
|
data/CHANGELOG.md
CHANGED
@@ -1,118 +1,38 @@
|
|
1
|
-
## Rails
|
1
|
+
## Rails 8.0.0.rc1 (October 19, 2024) ##
|
2
2
|
|
3
|
-
*
|
3
|
+
* Remove deprecated support to passing a content to void tag elements on the `tag` builder.
|
4
4
|
|
5
|
+
*Rafael Mendonça França*
|
5
6
|
|
6
|
-
|
7
|
+
* Remove deprecated support to passing `nil` to the `model:` argument of `form_with`.
|
7
8
|
|
8
|
-
*
|
9
|
+
*Rafael Mendonça França*
|
9
10
|
|
10
11
|
|
11
|
-
## Rails
|
12
|
+
## Rails 8.0.0.beta1 (September 26, 2024) ##
|
12
13
|
|
13
|
-
*
|
14
|
+
* Enable DependencyTracker to evaluate renders with trailing interpolation.
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
*Jean Boussier*
|
19
|
-
|
20
|
-
* Add queries count to template rendering instrumentation.
|
21
|
-
|
22
|
-
```
|
23
|
-
# Before
|
24
|
-
Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms | Allocations: 112788)
|
25
|
-
|
26
|
-
# After
|
27
|
-
Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms (2 queries, 1 cached) | Allocations: 112788)
|
16
|
+
```erb
|
17
|
+
<%= render "maintenance_tasks/runs/info/#{run.status}" %>
|
28
18
|
```
|
29
19
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
*Sean Doyle*
|
35
|
-
|
36
|
-
* Add the `nonce: true` option for `stylesheet_link_tag` helper to support automatic nonce generation for Content Security Policy.
|
37
|
-
|
38
|
-
Works the same way as `javascript_include_tag nonce: true` does.
|
39
|
-
|
40
|
-
*Akhil G Krishnan*, *AJ Esler*
|
41
|
-
|
42
|
-
* Parse `ActionView::TestCase#rendered` HTML content as `Nokogiri::XML::DocumentFragment` instead of `Nokogiri::XML::Document`.
|
43
|
-
|
44
|
-
*Sean Doyle*
|
45
|
-
|
46
|
-
* Rename `ActionView::TestCase::Behavior::Content` to `ActionView::TestCase::Behavior::RenderedViewContent`.
|
47
|
-
|
48
|
-
Make `RenderedViewContent` inherit from `String`. Make private API with `:nodoc:`
|
49
|
-
|
50
|
-
*Sean Doyle*
|
51
|
-
|
52
|
-
* Deprecate passing `nil` as value for the `model:` argument to the `form_with` method.
|
53
|
-
|
54
|
-
*Collin Jilbert*
|
55
|
-
|
56
|
-
* Alias `field_set_tag` helper to `fieldset_tag` to match `<fieldset>` element.
|
57
|
-
|
58
|
-
*Sean Doyle*
|
59
|
-
|
60
|
-
* Deprecate passing content to void elements when using `tag.br` type tag builders.
|
20
|
+
Previously, the DependencyTracker would ignore this render, but now it will
|
21
|
+
mark all partials in the "maintenance_tasks/runs/info" folder as
|
22
|
+
dependencies.
|
61
23
|
|
62
24
|
*Hartley McGuire*
|
63
25
|
|
64
|
-
*
|
65
|
-
|
66
|
-
*Earlopain*
|
67
|
-
|
68
|
-
* Automatically discard the implicit locals injected by collection rendering for template that can't accept them.
|
69
|
-
|
70
|
-
When rendering a collection, two implicit variables are injected, which breaks templates with strict locals.
|
26
|
+
* Rename `text_area` methods into `textarea`
|
71
27
|
|
72
|
-
|
28
|
+
Old names are still available as aliases.
|
73
29
|
|
74
|
-
*
|
75
|
-
|
76
|
-
* Fix `@rails/ujs` calling `start()` an extra time when using bundlers.
|
77
|
-
|
78
|
-
*Hartley McGuire*, *Ryunosuke Sato*
|
30
|
+
*Sean Doyle*
|
79
31
|
|
80
|
-
*
|
32
|
+
* Rename `check_box*` methods into `checkbox*`.
|
81
33
|
|
82
|
-
|
83
|
-
it would instead return the entire buffer.
|
34
|
+
Old names are still available as aliases.
|
84
35
|
|
85
36
|
*Jean Boussier*
|
86
37
|
|
87
|
-
|
88
|
-
|
89
|
-
This fix was already landed in >= 7.0.4.3, < 7.1.0.
|
90
|
-
[[CVE-2023-23913](https://github.com/advisories/GHSA-xp5h-f8jf-rc8q)]
|
91
|
-
|
92
|
-
*Ryunosuke Sato*
|
93
|
-
|
94
|
-
* Added validation for HTML tag names in the `tag` and `content_tag` helper method.
|
95
|
-
|
96
|
-
The `tag` and `content_tag` method now checks that the provided tag name adheres to the HTML
|
97
|
-
specification. If an invalid HTML tag name is provided, the method raises an `ArgumentError`
|
98
|
-
with an appropriate error message.
|
99
|
-
|
100
|
-
Examples:
|
101
|
-
|
102
|
-
```ruby
|
103
|
-
# Raises ArgumentError: Invalid HTML5 tag name: 12p
|
104
|
-
content_tag("12p") # Starting with a number
|
105
|
-
|
106
|
-
# Raises ArgumentError: Invalid HTML5 tag name: ""
|
107
|
-
content_tag("") # Empty tag name
|
108
|
-
|
109
|
-
# Raises ArgumentError: Invalid HTML5 tag name: div/
|
110
|
-
tag("div/") # Contains a solidus
|
111
|
-
|
112
|
-
# Raises ArgumentError: Invalid HTML5 tag name: "image file"
|
113
|
-
tag("image file") # Contains a space
|
114
|
-
```
|
115
|
-
|
116
|
-
*Akhil G Krishnan*
|
117
|
-
|
118
|
-
Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actionview/CHANGELOG.md) for previous changes.
|
38
|
+
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
|
-
|
93
|
+
dependencies = []
|
94
94
|
render_calls = source.split(/\brender\b/).drop(1)
|
95
95
|
|
96
96
|
render_calls.each do |arguments|
|
97
|
-
add_dependencies(
|
98
|
-
add_dependencies(
|
97
|
+
add_dependencies(dependencies, arguments, LAYOUT_DEPENDENCY)
|
98
|
+
add_dependencies(dependencies, arguments, RENDER_ARGUMENTS)
|
99
99
|
end
|
100
100
|
|
101
|
-
|
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
|
-
|
121
|
-
|
122
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
@@ -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 "maintenace_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
|
@@ -1228,7 +1228,7 @@ module ActionView
|
|
1228
1228
|
class FormBuilder
|
1229
1229
|
# Wraps ActionView::Helpers::DateHelper#date_select for form builders:
|
1230
1230
|
#
|
1231
|
-
# <%=
|
1231
|
+
# <%= form_with model: @person do |f| %>
|
1232
1232
|
# <%= f.date_select :birth_date %>
|
1233
1233
|
# <%= f.submit %>
|
1234
1234
|
# <% end %>
|
@@ -1240,7 +1240,7 @@ module ActionView
|
|
1240
1240
|
|
1241
1241
|
# Wraps ActionView::Helpers::DateHelper#time_select for form builders:
|
1242
1242
|
#
|
1243
|
-
# <%=
|
1243
|
+
# <%= form_with model: @race do |f| %>
|
1244
1244
|
# <%= f.time_select :average_lap %>
|
1245
1245
|
# <%= f.submit %>
|
1246
1246
|
# <% end %>
|
@@ -1252,7 +1252,7 @@ module ActionView
|
|
1252
1252
|
|
1253
1253
|
# Wraps ActionView::Helpers::DateHelper#datetime_select for form builders:
|
1254
1254
|
#
|
1255
|
-
# <%=
|
1255
|
+
# <%= form_with model: @person do |f| %>
|
1256
1256
|
# <%= f.datetime_select :last_request_at %>
|
1257
1257
|
# <%= f.submit %>
|
1258
1258
|
# <% end %>
|