actionview 7.2.0 → 8.0.0.beta1

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: 00d61ae3c549bc7d1a9cff55cfa4f096b50878775309401644a1d6fe23032c8c
4
- data.tar.gz: 46dd30ccb2b17b5de7ac58dd981d616e3fbef55794c51a50865d68c10b6875ce
3
+ metadata.gz: dec233fd596879151b606bffdbf29f2f8c46fe41675eeb91744d352265254b9d
4
+ data.tar.gz: 3623f09bcc8011ac7e69c90d6839f3b8580f0c7c374fd3c2b1261ea4de7bd9d3
5
5
  SHA512:
6
- metadata.gz: 73a1ea9695efd725f3b50f547852f1c708cc1bc63de0f2a90c6d31c79fd2161c6eb8d08feb9e019c84012d224bd30bf63d4d1535f1e874e287328935141b1f30
7
- data.tar.gz: 818d59c9d7c22fa30695f1f1ad64d040f1187c686cf10d8f679f4f01e623bb809689acf212499cb6058314b2f4097c94b64a85d3e19aec9c708adef29ce38b39
6
+ metadata.gz: daaae5e335bf7ba563dcf6db84459ee1cdf02053b2f6ae1a9b6422174d338947c47b33cb595db8e641534064d47f1129f07ee4eb72945b933851ed0562a5fc81
7
+ data.tar.gz: 67fccc917c86e90ad9201ed67d98e45709c7433a84a80adcf126ecd9b1044ccd72aafa23587e4bada689f9ff2e41f3a21bc51ea8b7e9a11f1af7c6b57a5fee16
data/CHANGELOG.md CHANGED
@@ -1,108 +1,27 @@
1
- ## Rails 7.2.0 (August 09, 2024) ##
1
+ ## Rails 8.0.0.beta1 (September 26, 2024) ##
2
2
 
3
- * Fix templates with strict locals to also include `local_assigns`.
3
+ * Enable DependencyTracker to evaluate renders with trailing interpolation.
4
4
 
5
- Previously templates defining strict locals wouldn't receive the `local_assigns`
6
- hash.
7
-
8
- *Jean Boussier*
9
-
10
- * Add queries count to template rendering instrumentation.
11
-
12
- ```
13
- # Before
14
- Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms | Allocations: 112788)
15
-
16
- # After
17
- Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms (2 queries, 1 cached) | Allocations: 112788)
5
+ ```erb
6
+ <%= render "maintenance_tasks/runs/info/#{run.status}" %>
18
7
  ```
19
8
 
20
- *fatkodima*
21
-
22
- * Raise `ArgumentError` if `:renderable` object does not respond to `#render_in`.
23
-
24
- *Sean Doyle*
25
-
26
- * Add the `nonce: true` option for `stylesheet_link_tag` helper to support automatic nonce generation for Content Security Policy.
27
-
28
- Works the same way as `javascript_include_tag nonce: true` does.
29
-
30
- *Akhil G Krishnan*, *AJ Esler*
31
-
32
- * Parse `ActionView::TestCase#rendered` HTML content as `Nokogiri::XML::DocumentFragment` instead of `Nokogiri::XML::Document`.
33
-
34
- *Sean Doyle*
35
-
36
- * Rename `ActionView::TestCase::Behavior::Content` to `ActionView::TestCase::Behavior::RenderedViewContent`.
37
-
38
- Make `RenderedViewContent` inherit from `String`. Make private API with `:nodoc:`
39
-
40
- *Sean Doyle*
41
-
42
- * Deprecate passing `nil` as value for the `model:` argument to the `form_with` method.
43
-
44
- *Collin Jilbert*
45
-
46
- * Alias `field_set_tag` helper to `fieldset_tag` to match `<fieldset>` element.
47
-
48
- *Sean Doyle*
49
-
50
- * Deprecate passing content to void elements when using `tag.br` type tag builders.
9
+ Previously, the DependencyTracker would ignore this render, but now it will
10
+ mark all partials in the "maintenance_tasks/runs/info" folder as
11
+ dependencies.
51
12
 
52
13
  *Hartley McGuire*
53
14
 
54
- * Fix the `number_to_human_size` view helper to correctly work with negative numbers.
55
-
56
- *Earlopain*
57
-
58
- * Automatically discard the implicit locals injected by collection rendering for template that can't accept them.
59
-
60
- When rendering a collection, two implicit variables are injected, which breaks templates with strict locals.
15
+ * Rename `text_area` methods into `textarea`
61
16
 
62
- Now they are only passed if the template will actually accept them.
17
+ Old names are still available as aliases.
63
18
 
64
- *Yasha Krasnou*, *Jean Boussier*
65
-
66
- * Fix `@rails/ujs` calling `start()` an extra time when using bundlers.
67
-
68
- *Hartley McGuire*, *Ryunosuke Sato*
19
+ *Sean Doyle*
69
20
 
70
- * Fix the `capture` view helper compatibility with HAML and Slim.
21
+ * Rename `check_box*` methods into `checkbox*`.
71
22
 
72
- When a blank string was captured in HAML or Slim (and possibly other template engines)
73
- it would instead return the entire buffer.
23
+ Old names are still available as aliases.
74
24
 
75
25
  *Jean Boussier*
76
26
 
77
- * Updated `@rails/ujs` files to ignore certain data-* attributes when element is contenteditable.
78
-
79
- This fix was already landed in >= 7.0.4.3, < 7.1.0.
80
- [[CVE-2023-23913](https://github.com/advisories/GHSA-xp5h-f8jf-rc8q)]
81
-
82
- *Ryunosuke Sato*
83
-
84
- * Added validation for HTML tag names in the `tag` and `content_tag` helper method.
85
-
86
- The `tag` and `content_tag` method now checks that the provided tag name adheres to the HTML
87
- specification. If an invalid HTML tag name is provided, the method raises an `ArgumentError`
88
- with an appropriate error message.
89
-
90
- Examples:
91
-
92
- ```ruby
93
- # Raises ArgumentError: Invalid HTML5 tag name: 12p
94
- content_tag("12p") # Starting with a number
95
-
96
- # Raises ArgumentError: Invalid HTML5 tag name: ""
97
- content_tag("") # Empty tag name
98
-
99
- # Raises ArgumentError: Invalid HTML5 tag name: div/
100
- tag("div/") # Contains a solidus
101
-
102
- # Raises ArgumentError: Invalid HTML5 tag name: "image file"
103
- tag("image file") # Contains a space
104
- ```
105
-
106
- *Akhil G Krishnan*
107
-
108
- Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actionview/CHANGELOG.md) for previous changes.
27
+ 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,36 @@ 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
+ scanner.scan_until(/[{}]/)
131
+
132
+ case scanner.matched
133
+ when "{"
134
+ unmatched_brackets += 1
135
+ when "}"
136
+ unmatched_brackets -= 1
137
+ end
138
+ end
139
+
140
+ wildcard_dependency << "*"
141
+ else
142
+ wildcard_dependency << scanner.rest
143
+ scanner.terminate
144
+ end
145
+ end
123
146
 
124
- if dependency
147
+ dependencies << wildcard_dependency
148
+ elsif dependency
125
149
  if dependency.include?("/")
126
150
  dependencies << dependency
127
151
  else
@@ -130,24 +154,8 @@ module ActionView
130
154
  end
131
155
  end
132
156
 
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
157
  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
158
+ source.scan(EXPLICIT_DEPENDENCY).flatten.uniq
151
159
  end
152
160
  end
153
161
  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
10
+ MAJOR = 8
11
+ MINOR = 0
12
12
  TINY = 0
13
- PRE = nil
13
+ PRE = "beta1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  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