actionview 7.2.2.1 → 8.0.5

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 (51) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +111 -70
  3. data/README.rdoc +1 -1
  4. data/lib/action_view/base.rb +6 -9
  5. data/lib/action_view/dependency_tracker/erb_tracker.rb +36 -27
  6. data/lib/action_view/dependency_tracker/ruby_tracker.rb +2 -19
  7. data/lib/action_view/dependency_tracker/wildcard_resolver.rb +32 -0
  8. data/lib/action_view/dependency_tracker.rb +1 -0
  9. data/lib/action_view/digestor.rb +6 -2
  10. data/lib/action_view/gem_version.rb +4 -4
  11. data/lib/action_view/helpers/asset_tag_helper.rb +4 -4
  12. data/lib/action_view/helpers/atom_feed_helper.rb +1 -3
  13. data/lib/action_view/helpers/cache_helper.rb +10 -2
  14. data/lib/action_view/helpers/date_helper.rb +11 -4
  15. data/lib/action_view/helpers/form_helper.rb +104 -103
  16. data/lib/action_view/helpers/form_options_helper.rb +31 -25
  17. data/lib/action_view/helpers/form_tag_helper.rb +20 -17
  18. data/lib/action_view/helpers/output_safety_helper.rb +1 -2
  19. data/lib/action_view/helpers/rendering_helper.rb +160 -50
  20. data/lib/action_view/helpers/sanitize_helper.rb +6 -0
  21. data/lib/action_view/helpers/tag_helper.rb +31 -41
  22. data/lib/action_view/helpers/tags/base.rb +11 -9
  23. data/lib/action_view/helpers/tags/check_box.rb +2 -2
  24. data/lib/action_view/helpers/tags/collection_check_boxes.rb +4 -3
  25. data/lib/action_view/helpers/tags/collection_helpers.rb +2 -1
  26. data/lib/action_view/helpers/tags/file_field.rb +4 -1
  27. data/lib/action_view/helpers/tags/label.rb +3 -10
  28. data/lib/action_view/helpers/tags/radio_button.rb +1 -1
  29. data/lib/action_view/helpers/tags/select_renderer.rb +1 -1
  30. data/lib/action_view/helpers/tags/text_area.rb +1 -1
  31. data/lib/action_view/helpers/tags/text_field.rb +1 -1
  32. data/lib/action_view/helpers/text_helper.rb +10 -3
  33. data/lib/action_view/helpers/url_helper.rb +2 -4
  34. data/lib/action_view/layouts.rb +7 -7
  35. data/lib/action_view/record_identifier.rb +1 -1
  36. data/lib/action_view/render_parser/prism_render_parser.rb +13 -1
  37. data/lib/action_view/render_parser/ripper_render_parser.rb +10 -1
  38. data/lib/action_view/renderer/partial_renderer/collection_caching.rb +5 -1
  39. data/lib/action_view/renderer/partial_renderer.rb +2 -2
  40. data/lib/action_view/renderer/streaming_template_renderer.rb +8 -2
  41. data/lib/action_view/renderer/template_renderer.rb +3 -3
  42. data/lib/action_view/rendering.rb +2 -3
  43. data/lib/action_view/template/error.rb +11 -0
  44. data/lib/action_view/template/handlers/erb/erubi.rb +1 -1
  45. data/lib/action_view/template/handlers/erb.rb +45 -37
  46. data/lib/action_view/template/raw_file.rb +4 -0
  47. data/lib/action_view/template/resolver.rb +0 -1
  48. data/lib/action_view/template.rb +9 -4
  49. data/lib/action_view/test_case.rb +0 -1
  50. data/lib/action_view.rb +1 -0
  51. metadata +14 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 129f00c083e1a4443010be161169e51eea090543c6618289968ed2cdb1c65c76
4
- data.tar.gz: 568d88d12f7fc363958af2f8bf45308199dc0c221a05fafb9415a96b3eaddc8a
3
+ metadata.gz: 37987aa62646838570a7a8167d4f913d4b8019e7c03a756c34d6fb394f76ab5f
4
+ data.tar.gz: 22d8090b406f2bca0b4049b85df4d66740ef778a2d58f699d205154247fd7b03
5
5
  SHA512:
6
- metadata.gz: de08bd40788b58e9ba6be2169a5ebbc39c6b4f1122d1564b64cf0a6af066f855d4a1ad2d1721ab849fde78ee87c496c61579afd59d1a3062dba6135b6652bee4
7
- data.tar.gz: cf2f5461be068f0d96d287bbdabe2daf9b3d76a4e80c9db31041d9242f77986b1d5d6774d6db95f5f2b068cbce2161b13335891bfd86d271994d49321bc88733
6
+ metadata.gz: c140a8cf5c4ceed7879f29df22dbfb90adde9b111f3bf34c85f447e60b05841e819ceb0c7c699683505079368013570e336a7318cf6cca4174e1851606d1c542
7
+ data.tar.gz: 63ccdfbe1489d624b520aaf070f1b16c17b4f3a8c85b1f1f76dec9f0d51c74e7cb9868c6792fbebd9629251da14a7defd128f9754d6b849b262fc1a5d7174531
data/CHANGELOG.md CHANGED
@@ -1,133 +1,174 @@
1
- ## Rails 7.2.2.1 (December 10, 2024) ##
1
+ ## Rails 8.0.5 (March 24, 2026) ##
2
2
 
3
- * No changes.
3
+ * Fix encoding errors for string locals containing non-ASCII characters.
4
4
 
5
+ *Kataoka Katsuki*
5
6
 
6
- ## Rails 7.2.2 (October 30, 2024) ##
7
+ * Fix collection caching to only forward `expires_in` argument if explicitly set.
7
8
 
8
- * No changes.
9
+ *Pieter Visser*
9
10
 
11
+ * Fix `file_field` to join mime types with a comma when provided as Array
10
12
 
11
- ## Rails 7.2.1.2 (October 23, 2024) ##
13
+ ```ruby
14
+ file_field(:article, :image, accept: ['image/png', 'image/gif', 'image/jpeg'])
15
+ ```
12
16
 
13
- * No changes.
17
+ Now behaves likes:
14
18
 
19
+ ```
20
+ file_field(:article, :image, accept: 'image/png,image/gif,image/jpeg')
21
+ ```
15
22
 
16
- ## Rails 7.2.1.1 (October 15, 2024) ##
23
+ *Bogdan Gusiev*
17
24
 
18
- * No changes.
25
+ * Fix strict locals parsing to handle multiline definitions.
19
26
 
27
+ *Said Kaldybaev*
20
28
 
21
- ## Rails 7.2.1 (August 22, 2024) ##
22
29
 
23
- * No changes.
30
+ ## Rails 8.0.4.1 (March 23, 2026) ##
24
31
 
32
+ * Skip blank attribute names in tag helpers to avoid generating invalid HTML.
25
33
 
26
- ## Rails 7.2.0 (August 09, 2024) ##
34
+ [CVE-2026-33168]
27
35
 
28
- * Fix templates with strict locals to also include `local_assigns`.
36
+ *Mike Dalessio*
29
37
 
30
- Previously templates defining strict locals wouldn't receive the `local_assigns`
31
- hash.
32
38
 
33
- *Jean Boussier*
39
+ ## Rails 8.0.4 (October 28, 2025) ##
34
40
 
35
- * Add queries count to template rendering instrumentation.
41
+ * Restore `add_default_name_and_id` method.
42
+
43
+ *Hartley McGuire*
36
44
 
37
- ```
38
- # Before
39
- Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms | Allocations: 112788)
40
45
 
41
- # After
42
- Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms (2 queries, 1 cached) | Allocations: 112788)
46
+ ## Rails 8.0.3 (September 22, 2025) ##
47
+
48
+ * Fix label with `for` option not getting prefixed by form `namespace` value
49
+
50
+ *Abeid Ahmed*, *Hartley McGuire*
51
+
52
+ * Fix `javascript_include_tag` `type` option to accept either strings and symbols.
53
+
54
+ ```ruby
55
+ javascript_include_tag "application", type: :module
56
+ javascript_include_tag "application", type: "module"
43
57
  ```
44
58
 
45
- *fatkodima*
59
+ Previously, only the string value was recognized.
46
60
 
47
- * Raise `ArgumentError` if `:renderable` object does not respond to `#render_in`.
61
+ *Jean Boussier*
48
62
 
49
- *Sean Doyle*
63
+ * Fix `excerpt` helper with non-whitespace separator.
50
64
 
51
- * Add the `nonce: true` option for `stylesheet_link_tag` helper to support automatic nonce generation for Content Security Policy.
65
+ *Jonathan Hefner*
52
66
 
53
- Works the same way as `javascript_include_tag nonce: true` does.
54
67
 
55
- *Akhil G Krishnan*, *AJ Esler*
68
+ ## Rails 8.0.2.1 (August 13, 2025) ##
56
69
 
57
- * Parse `ActionView::TestCase#rendered` HTML content as `Nokogiri::XML::DocumentFragment` instead of `Nokogiri::XML::Document`.
70
+ * No changes.
58
71
 
59
- *Sean Doyle*
60
72
 
61
- * Rename `ActionView::TestCase::Behavior::Content` to `ActionView::TestCase::Behavior::RenderedViewContent`.
73
+ ## Rails 8.0.2 (March 12, 2025) ##
62
74
 
63
- Make `RenderedViewContent` inherit from `String`. Make private API with `:nodoc:`
75
+ * Respect `html_options[:form]` when `collection_checkboxes` generates the
76
+ hidden `<input>`.
64
77
 
65
- *Sean Doyle*
78
+ *Riccardo Odone*
66
79
 
67
- * Deprecate passing `nil` as value for the `model:` argument to the `form_with` method.
80
+ * Layouts have access to local variables passed to `render`.
68
81
 
69
- *Collin Jilbert*
82
+ This fixes #31680 which was a regression in Rails 5.1.
70
83
 
71
- * Alias `field_set_tag` helper to `fieldset_tag` to match `<fieldset>` element.
84
+ *Mike Dalessio*
72
85
 
73
- *Sean Doyle*
86
+ * Argument errors related to strict locals in templates now raise an
87
+ `ActionView::StrictLocalsError`, and all other argument errors are reraised as-is.
74
88
 
75
- * Deprecate passing content to void elements when using `tag.br` type tag builders.
89
+ Previously, any `ArgumentError` raised during template rendering was swallowed during strict
90
+ local error handling, so that an `ArgumentError` unrelated to strict locals (e.g., a helper
91
+ method invoked with incorrect arguments) would be replaced by a similar `ArgumentError` with an
92
+ unrelated backtrace, making it difficult to debug templates.
76
93
 
77
- *Hartley McGuire*
94
+ Now, any `ArgumentError` unrelated to strict locals is reraised, preserving the original
95
+ backtrace for developers.
78
96
 
79
- * Fix the `number_to_human_size` view helper to correctly work with negative numbers.
97
+ Also note that `ActionView::StrictLocalsError` is a subclass of `ArgumentError`, so any existing
98
+ code that rescues `ArgumentError` will continue to work.
80
99
 
81
- *Earlopain*
100
+ Fixes #52227.
82
101
 
83
- * Automatically discard the implicit locals injected by collection rendering for template that can't accept them.
102
+ *Mike Dalessio*
84
103
 
85
- When rendering a collection, two implicit variables are injected, which breaks templates with strict locals.
104
+ * Fix stack overflow error in dependency tracker when dealing with circular dependencies
86
105
 
87
- Now they are only passed if the template will actually accept them.
106
+ *Jean Boussier*
88
107
 
89
- *Yasha Krasnou*, *Jean Boussier*
108
+ ## Rails 8.0.1 (December 13, 2024) ##
90
109
 
91
- * Fix `@rails/ujs` calling `start()` an extra time when using bundlers.
110
+ * Fix a crash in ERB template error highlighting when the error occurs on a
111
+ line in the compiled template that is past the end of the source template.
92
112
 
93
- *Hartley McGuire*, *Ryunosuke Sato*
113
+ *Martin Emde*
94
114
 
95
- * Fix the `capture` view helper compatibility with HAML and Slim.
115
+ * Improve reliability of ERB template error highlighting.
116
+ Fix infinite loops and crashes in highlighting and
117
+ improve tolerance for alternate ERB handlers.
96
118
 
97
- When a blank string was captured in HAML or Slim (and possibly other template engines)
98
- it would instead return the entire buffer.
119
+ *Martin Emde*
99
120
 
100
- *Jean Boussier*
101
121
 
102
- * Updated `@rails/ujs` files to ignore certain data-* attributes when element is contenteditable.
122
+ ## Rails 8.0.0.1 (December 10, 2024) ##
123
+
124
+ * No changes.
103
125
 
104
- This fix was already landed in >= 7.0.4.3, < 7.1.0.
105
- [[CVE-2023-23913](https://github.com/advisories/GHSA-xp5h-f8jf-rc8q)]
106
126
 
107
- *Ryunosuke Sato*
127
+ ## Rails 8.0.0 (November 07, 2024) ##
108
128
 
109
- * Added validation for HTML tag names in the `tag` and `content_tag` helper method.
129
+ * No changes.
110
130
 
111
- The `tag` and `content_tag` method now checks that the provided tag name adheres to the HTML
112
- specification. If an invalid HTML tag name is provided, the method raises an `ArgumentError`
113
- with an appropriate error message.
114
131
 
115
- Examples:
132
+ ## Rails 8.0.0.rc2 (October 30, 2024) ##
116
133
 
117
- ```ruby
118
- # Raises ArgumentError: Invalid HTML5 tag name: 12p
119
- content_tag("12p") # Starting with a number
134
+ * No changes.
135
+
136
+
137
+ ## Rails 8.0.0.rc1 (October 19, 2024) ##
138
+
139
+ * Remove deprecated support to passing a content to void tag elements on the `tag` builder.
140
+
141
+ *Rafael Mendonça França*
142
+
143
+ * Remove deprecated support to passing `nil` to the `model:` argument of `form_with`.
120
144
 
121
- # Raises ArgumentError: Invalid HTML5 tag name: ""
122
- content_tag("") # Empty tag name
145
+ *Rafael Mendonça França*
123
146
 
124
- # Raises ArgumentError: Invalid HTML5 tag name: div/
125
- tag("div/") # Contains a solidus
126
147
 
127
- # Raises ArgumentError: Invalid HTML5 tag name: "image file"
128
- tag("image file") # Contains a space
148
+ ## Rails 8.0.0.beta1 (September 26, 2024) ##
149
+
150
+ * Enable DependencyTracker to evaluate renders with trailing interpolation.
151
+
152
+ ```erb
153
+ <%= render "maintenance_tasks/runs/info/#{run.status}" %>
129
154
  ```
130
155
 
131
- *Akhil G Krishnan*
156
+ Previously, the DependencyTracker would ignore this render, but now it will
157
+ mark all partials in the "maintenance_tasks/runs/info" folder as
158
+ dependencies.
159
+
160
+ *Hartley McGuire*
161
+
162
+ * Rename `text_area` methods into `textarea`
163
+
164
+ Old names are still available as aliases.
165
+
166
+ *Sean Doyle*
167
+
168
+ * Rename `check_box*` methods into `checkbox*`.
169
+
170
+ Old names are still available as aliases.
171
+
172
+ *Jean Boussier*
132
173
 
133
- Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actionview/CHANGELOG.md) for previous changes.
174
+ Please check [7-2-stable](https://github.com/rails/rails/blob/7-2-stable/actionview/CHANGELOG.md) for previous changes.
data/README.rdoc CHANGED
@@ -35,6 +35,6 @@ Bug reports for the Ruby on \Rails project can be filed here:
35
35
 
36
36
  * https://github.com/rails/rails/issues
37
37
 
38
- Feature requests should be discussed on the rails-core mailing list here:
38
+ Feature requests should be discussed on the rubyonrails-core forum here:
39
39
 
40
40
  * https://discuss.rubyonrails.org/c/rubyonrails-core
@@ -267,15 +267,12 @@ module ActionView # :nodoc:
267
267
  begin
268
268
  public_send(method, locals, buffer, **locals, &block)
269
269
  rescue ArgumentError => argument_error
270
- raise(
271
- ArgumentError,
272
- argument_error.
273
- message.
274
- gsub("unknown keyword:", "unknown local:").
275
- gsub("missing keyword:", "missing local:").
276
- gsub("no keywords accepted", "no locals accepted").
277
- concat(" for #{@current_template.short_identifier}")
278
- )
270
+ public_send_line = __LINE__ - 2
271
+ frame = argument_error.backtrace_locations[1]
272
+ if frame.path == __FILE__ && frame.lineno == public_send_line
273
+ raise StrictLocalsError.new(argument_error, @current_template)
274
+ end
275
+ raise
279
276
  end
280
277
  else
281
278
  public_send(method, locals, buffer, &block)
@@ -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
 
@@ -107,8 +107,12 @@ module ActionView
107
107
  end.join("-")
108
108
  end
109
109
 
110
- def to_dep_map
111
- children.any? ? { name => children.map(&:to_dep_map) } : name
110
+ def to_dep_map(seen = Set.new.compare_by_identity)
111
+ if seen.add?(self)
112
+ children.any? ? { name => children.map { |c| c.to_dep_map(seen) } } : name
113
+ else # the tree has a cycle
114
+ name
115
+ end
112
116
  end
113
117
  end
114
118
 
@@ -7,10 +7,10 @@ module ActionView
7
7
  end
8
8
 
9
9
  module VERSION
10
- MAJOR = 7
11
- MINOR = 2
12
- TINY = 2
13
- PRE = "1"
10
+ MAJOR = 8
11
+ MINOR = 0
12
+ TINY = 5
13
+ PRE = nil
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end
@@ -115,11 +115,11 @@ module ActionView
115
115
  path_options = options.extract!("protocol", "extname", "host", "skip_pipeline").symbolize_keys
116
116
  preload_links = []
117
117
  use_preload_links_header = options["preload_links_header"].nil? ? preload_links_header : options.delete("preload_links_header")
118
- nopush = options["nopush"].nil? ? true : options.delete("nopush")
118
+ nopush = options["nopush"].nil? || options.delete("nopush")
119
119
  crossorigin = options.delete("crossorigin")
120
120
  crossorigin = "anonymous" if crossorigin == true
121
121
  integrity = options["integrity"]
122
- rel = options["type"] == "module" ? "modulepreload" : "preload"
122
+ rel = options["type"] == "module" || options["type"] == :module ? "modulepreload" : "preload"
123
123
 
124
124
  sources_tags = sources.uniq.map { |source|
125
125
  href = path_to_javascript(source, path_options)
@@ -206,7 +206,7 @@ module ActionView
206
206
  preload_links = []
207
207
  crossorigin = options.delete("crossorigin")
208
208
  crossorigin = "anonymous" if crossorigin == true
209
- nopush = options["nopush"].nil? ? true : options.delete("nopush")
209
+ nopush = options["nopush"].nil? || options.delete("nopush")
210
210
  integrity = options["integrity"]
211
211
 
212
212
  sources_tags = sources.uniq.map { |source|
@@ -361,7 +361,7 @@ module ActionView
361
361
  crossorigin = "anonymous" if crossorigin == true || (crossorigin.blank? && as_type == "font")
362
362
  integrity = options[:integrity]
363
363
  nopush = options.delete(:nopush) || false
364
- rel = mime_type == "module" ? "modulepreload" : "preload"
364
+ rel = mime_type == "module" || mime_type == :module ? "modulepreload" : "preload"
365
365
 
366
366
  link_tag = tag.link(
367
367
  rel: rel,
@@ -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
@@ -172,7 +170,7 @@ module ActionView
172
170
 
173
171
  # Creates an entry tag for a specific record and prefills the id using class and id.
174
172
  #
175
- # Options:
173
+ # ==== Options
176
174
  #
177
175
  # * <tt>:published</tt>: Time first published. Defaults to the created_at attribute on the record if one such exists.
178
176
  # * <tt>:updated</tt>: Time of update. Defaults to the updated_at attribute on the record if one such exists.
@@ -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
@@ -189,7 +197,7 @@ module ActionView
189
197
  CachingRegistry.caching?
190
198
  end
191
199
 
192
- # Raises +UncacheableFragmentError+ when called from within a +cache+ block.
200
+ # Raises UncacheableFragmentError when called from within a +cache+ block.
193
201
  #
194
202
  # Useful to denote helper methods that can't participate in fragment caching:
195
203
  #
@@ -198,7 +206,7 @@ module ActionView
198
206
  # "#{project.name} - #{Time.now}"
199
207
  # end
200
208
  #
201
- # # Which will then raise if used within a +cache+ block:
209
+ # # Which will then raise if used within a `cache` block:
202
210
  # <% cache project do %>
203
211
  # <%= project_name_with_time(project) %>
204
212
  # <% end %>
@@ -136,8 +136,15 @@ module ActionView
136
136
  from_year += 1 if from_time.month >= 3
137
137
  to_year = to_time.year
138
138
  to_year -= 1 if to_time.month < 3
139
- leap_years = (from_year > to_year) ? 0 : (from_year..to_year).count { |x| Date.leap?(x) }
139
+
140
+ leap_years = if from_year > to_year
141
+ 0
142
+ else
143
+ fyear = from_year - 1
144
+ (to_year / 4 - to_year / 100 + to_year / 400) - (fyear / 4 - fyear / 100 + fyear / 400)
145
+ end
140
146
  minute_offset_for_leap_year = leap_years * 1440
147
+
141
148
  # Discount the leap year days when calculating year distance.
142
149
  # e.g. if there are 20 leap year days between 2 dates having the same day
143
150
  # and month then based on 365 days calculation
@@ -1228,7 +1235,7 @@ module ActionView
1228
1235
  class FormBuilder
1229
1236
  # Wraps ActionView::Helpers::DateHelper#date_select for form builders:
1230
1237
  #
1231
- # <%= form_for @person do |f| %>
1238
+ # <%= form_with model: @person do |f| %>
1232
1239
  # <%= f.date_select :birth_date %>
1233
1240
  # <%= f.submit %>
1234
1241
  # <% end %>
@@ -1240,7 +1247,7 @@ module ActionView
1240
1247
 
1241
1248
  # Wraps ActionView::Helpers::DateHelper#time_select for form builders:
1242
1249
  #
1243
- # <%= form_for @race do |f| %>
1250
+ # <%= form_with model: @race do |f| %>
1244
1251
  # <%= f.time_select :average_lap %>
1245
1252
  # <%= f.submit %>
1246
1253
  # <% end %>
@@ -1252,7 +1259,7 @@ module ActionView
1252
1259
 
1253
1260
  # Wraps ActionView::Helpers::DateHelper#datetime_select for form builders:
1254
1261
  #
1255
- # <%= form_for @person do |f| %>
1262
+ # <%= form_with model: @person do |f| %>
1256
1263
  # <%= f.datetime_select :last_request_at %>
1257
1264
  # <%= f.submit %>
1258
1265
  # <% end %>