actionview 7.2.1.1 → 8.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cdf3b514c234a4bbe7057f87b4836790bb41bf32c5a7c32c3ab07a4f7524b410
4
- data.tar.gz: 77f665dea46b0a5883d6b21f9d8246eaeefe3dc13bcdf423aef21e8de50f6c40
3
+ metadata.gz: ae04c8b816193c85245238b5e74ed2ead2c2e237993a1017004585fc7fa8115e
4
+ data.tar.gz: 1200ecf14fdf372d98cebb1fa733be76cacd57be0a4f0b645f3f8fb2b08d9f56
5
5
  SHA512:
6
- metadata.gz: 9a1b5e3d5635f97ccff0102403899935e0284d218e3b15235f75eb3d4dbc50c9e9ff228758fe10fd22d3061930387329434791a97c808f09ddaff3883741f8ac
7
- data.tar.gz: c6570e81f3a64d76db72b26c9c03bc7d069568c11a88073f6077ca14d30fbf772fedcc6bf40f4e74f8d0520c6ad5bd172c43eb899e702a46008d3eac2ad608e0
6
+ metadata.gz: 7a6993c1423b21898cb19acd2f45cc776ae06614da27821d2bb1ef0796ba358ba4e97c3001dfc5b8f72e36079c6114f0f832f9f6c16201832859b633f8ad6106
7
+ data.tar.gz: c3424f17a5ca9c0405ae70ed85197ad016d13d2f399e4d08cad73fd29c899be3d5e24616a7d5ba7407091412f6839e6fe77195aed26308f2f78ad709a1423c1f
data/CHANGELOG.md CHANGED
@@ -1,118 +1,38 @@
1
- ## Rails 7.2.1.1 (October 15, 2024) ##
1
+ ## Rails 8.0.0.rc1 (October 19, 2024) ##
2
2
 
3
- * No changes.
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
- ## Rails 7.2.1 (August 22, 2024) ##
7
+ * Remove deprecated support to passing `nil` to the `model:` argument of `form_with`.
7
8
 
8
- * No changes.
9
+ *Rafael Mendonça França*
9
10
 
10
11
 
11
- ## Rails 7.2.0 (August 09, 2024) ##
12
+ ## Rails 8.0.0.beta1 (September 26, 2024) ##
12
13
 
13
- * Fix templates with strict locals to also include `local_assigns`.
14
+ * Enable DependencyTracker to evaluate renders with trailing interpolation.
14
15
 
15
- Previously templates defining strict locals wouldn't receive the `local_assigns`
16
- hash.
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
- *fatkodima*
31
-
32
- * Raise `ArgumentError` if `:renderable` object does not respond to `#render_in`.
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
- * Fix the `number_to_human_size` view helper to correctly work with negative numbers.
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
- Now they are only passed if the template will actually accept them.
28
+ Old names are still available as aliases.
73
29
 
74
- *Yasha Krasnou*, *Jean Boussier*
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
- * Fix the `capture` view helper compatibility with HAML and Slim.
32
+ * Rename `check_box*` methods into `checkbox*`.
81
33
 
82
- When a blank string was captured in HAML or Slim (and possibly other template engines)
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
- * Updated `@rails/ujs` files to ignore certain data-* attributes when element is contenteditable.
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
- 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,10 +7,10 @@ module ActionView
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 7
11
- MINOR = 2
12
- TINY = 1
13
- PRE = "1"
10
+ MAJOR = 8
11
+ MINOR = 0
12
+ TINY = 0
13
+ PRE = "rc1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -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 "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
- # <%= form_for @person do |f| %>
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
- # <%= form_for @race do |f| %>
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
- # <%= form_for @person do |f| %>
1255
+ # <%= form_with model: @person do |f| %>
1256
1256
  # <%= f.datetime_select :last_request_at %>
1257
1257
  # <%= f.submit %>
1258
1258
  # <% end %>