actionview 6.1.4.4 → 7.0.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of actionview might be problematic. Click here for more details.

Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +93 -297
  3. data/MIT-LICENSE +1 -1
  4. data/lib/action_view/base.rb +3 -3
  5. data/lib/action_view/buffers.rb +2 -2
  6. data/lib/action_view/cache_expiry.rb +46 -32
  7. data/lib/action_view/dependency_tracker/erb_tracker.rb +154 -0
  8. data/lib/action_view/dependency_tracker/ripper_tracker.rb +59 -0
  9. data/lib/action_view/dependency_tracker.rb +6 -147
  10. data/lib/action_view/digestor.rb +7 -4
  11. data/lib/action_view/flows.rb +4 -4
  12. data/lib/action_view/gem_version.rb +4 -4
  13. data/lib/action_view/helpers/active_model_helper.rb +1 -1
  14. data/lib/action_view/helpers/asset_tag_helper.rb +84 -29
  15. data/lib/action_view/helpers/asset_url_helper.rb +7 -7
  16. data/lib/action_view/helpers/atom_feed_helper.rb +3 -4
  17. data/lib/action_view/helpers/cache_helper.rb +51 -3
  18. data/lib/action_view/helpers/capture_helper.rb +2 -2
  19. data/lib/action_view/helpers/controller_helper.rb +2 -2
  20. data/lib/action_view/helpers/csp_helper.rb +1 -1
  21. data/lib/action_view/helpers/csrf_helper.rb +1 -1
  22. data/lib/action_view/helpers/date_helper.rb +5 -5
  23. data/lib/action_view/helpers/debug_helper.rb +3 -1
  24. data/lib/action_view/helpers/form_helper.rb +72 -12
  25. data/lib/action_view/helpers/form_options_helper.rb +65 -33
  26. data/lib/action_view/helpers/form_tag_helper.rb +73 -30
  27. data/lib/action_view/helpers/javascript_helper.rb +3 -5
  28. data/lib/action_view/helpers/number_helper.rb +3 -4
  29. data/lib/action_view/helpers/output_safety_helper.rb +2 -2
  30. data/lib/action_view/helpers/rendering_helper.rb +1 -1
  31. data/lib/action_view/helpers/sanitize_helper.rb +2 -2
  32. data/lib/action_view/helpers/tag_helper.rb +17 -4
  33. data/lib/action_view/helpers/tags/base.rb +2 -14
  34. data/lib/action_view/helpers/tags/check_box.rb +1 -1
  35. data/lib/action_view/helpers/tags/collection_select.rb +1 -1
  36. data/lib/action_view/helpers/tags/time_field.rb +10 -1
  37. data/lib/action_view/helpers/tags/weekday_select.rb +27 -0
  38. data/lib/action_view/helpers/tags.rb +3 -2
  39. data/lib/action_view/helpers/text_helper.rb +24 -13
  40. data/lib/action_view/helpers/translation_helper.rb +1 -2
  41. data/lib/action_view/helpers/url_helper.rb +110 -81
  42. data/lib/action_view/helpers.rb +25 -25
  43. data/lib/action_view/lookup_context.rb +33 -52
  44. data/lib/action_view/model_naming.rb +1 -1
  45. data/lib/action_view/path_set.rb +16 -22
  46. data/lib/action_view/railtie.rb +15 -2
  47. data/lib/action_view/render_parser.rb +188 -0
  48. data/lib/action_view/renderer/abstract_renderer.rb +2 -2
  49. data/lib/action_view/renderer/partial_renderer.rb +0 -34
  50. data/lib/action_view/renderer/renderer.rb +4 -4
  51. data/lib/action_view/renderer/streaming_template_renderer.rb +3 -3
  52. data/lib/action_view/renderer/template_renderer.rb +6 -2
  53. data/lib/action_view/rendering.rb +2 -2
  54. data/lib/action_view/ripper_ast_parser.rb +198 -0
  55. data/lib/action_view/routing_url_for.rb +1 -1
  56. data/lib/action_view/template/error.rb +108 -13
  57. data/lib/action_view/template/handlers/erb.rb +6 -0
  58. data/lib/action_view/template/handlers.rb +3 -3
  59. data/lib/action_view/template/html.rb +3 -3
  60. data/lib/action_view/template/inline.rb +3 -3
  61. data/lib/action_view/template/raw_file.rb +3 -3
  62. data/lib/action_view/template/resolver.rb +84 -311
  63. data/lib/action_view/template/text.rb +3 -3
  64. data/lib/action_view/template/types.rb +14 -12
  65. data/lib/action_view/template.rb +10 -1
  66. data/lib/action_view/template_details.rb +66 -0
  67. data/lib/action_view/template_path.rb +64 -0
  68. data/lib/action_view/test_case.rb +6 -2
  69. data/lib/action_view/testing/resolvers.rb +11 -12
  70. data/lib/action_view/unbound_template.rb +33 -7
  71. data/lib/action_view.rb +3 -4
  72. metadata +22 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 387bd8d08e6af201d473326d4d972a48d7244995692c876956406601f8e1858f
4
- data.tar.gz: 432ffe6943d15da1bd7de66b67212b75e740320ac94f4fc6e85ed206c7691de5
3
+ metadata.gz: 488edff5bf41873248138efbc0c8ee4ecd1809793a99ebe520870d35e2a6e459
4
+ data.tar.gz: 429fd7c60ef3fb02df47871d05a7289cfda25e21586928dc1accebaa45678a7d
5
5
  SHA512:
6
- metadata.gz: 2d4bb0e10b81266b4494e312de36a1a569b161b274517788e9cff8fb6971ad8b62a68a659eb2f126c1761133f9729e368184a46d8097408179faa7081895e6cb
7
- data.tar.gz: 706097f519124b1252d986bdfc5d9fb58888541afac259610bec620ca6b430a93ec0b928292a3be12ddbfe24832d9e76b70847282a42efd131fe5001b2d19104
6
+ metadata.gz: 3db204604fb84ce3ab96976aad76fffb4938a2ec6ad7f965b2dc59a785622888867f92df3282ae560d6fb594fecc215a1c18340329ea912bed58c74d457e6824
7
+ data.tar.gz: 7eb29f984ea723f25728f8ae0c06127b7728501e18e690b0b73972d34a3bd467783760c293d50bc474f1fba9ddc824c02678af7653edcab8a5703766a572b96f
data/CHANGELOG.md CHANGED
@@ -1,77 +1,109 @@
1
- ## Rails 6.1.4.4 (December 15, 2021) ##
1
+ ## Rails 7.0.0.alpha1 (September 15, 2021) ##
2
2
 
3
- * No changes.
3
+ * Improves the performance of ActionView::Helpers::NumberHelper formatters by avoiding the use of
4
+ exceptions as flow control.
4
5
 
6
+ *Mike Dalessio*
5
7
 
6
- ## Rails 6.1.4.3 (December 14, 2021) ##
8
+ * `preload_link_tag` properly inserts `as` attributes for files with `image` MIME types, such as JPG or SVG.
7
9
 
8
- * No changes.
10
+ *Nate Berkopec*
9
11
 
12
+ * Add `weekday_options_for_select` and `weekday_select` helper methods. Also adds `weekday_select` to `FormBuilder`.
10
13
 
11
- ## Rails 6.1.4.2 (December 14, 2021) ##
14
+ *Drew Bragg*, *Dana Kashubeck*, *Kasper Timm Hansen*
12
15
 
13
- * No changes.
16
+ * Add `caching?` helper that returns whether the current code path is being cached and `uncacheable!` to denote helper methods that can't participate in fragment caching.
14
17
 
18
+ *Ben Toews*, *John Hawthorn*, *Kasper Timm Hansen*, *Joel Hawksley*
15
19
 
16
- ## Rails 6.1.4.1 (August 19, 2021) ##
20
+ * Add `include_seconds` option for `time_field`.
17
21
 
18
- * No changes.
22
+ <%= form.time_field :foo, include_seconds: false %>
23
+ # => <input value="16:22" type="time" />
19
24
 
25
+ Default includes seconds:
20
26
 
21
- ## Rails 6.1.4 (June 24, 2021) ##
27
+ <%= form.time_field :foo %>
28
+ # => <input value="16:22:01.440" type="time" />
22
29
 
23
- * The `translate` helper now passes `default` values that aren't
24
- translation keys through `I18n.translate` for interpolation.
25
-
26
- *Jonathan Hefner*
30
+ This allows you to take advantage of [different rendering options](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/time#time_value_format) in some browsers.
27
31
 
28
- * Don't attach UJS form submission handlers to Turbo forms.
32
+ *Alex Ghiculescu*
29
33
 
30
- *David Heinemeier Hansson*
34
+ * Improve error messages when template file does not exist at absolute filepath.
31
35
 
32
- * Allow both `current_page?(url_hash)` and `current_page?(**url_hash)` on Ruby 2.7.
36
+ *Ted Whang*
33
37
 
34
- *Ryuta Kamizono*
38
+ * Add `:country_code` option to `sms_to` for consistency with `phone_to`.
35
39
 
40
+ *Jonathan Hefner*
36
41
 
37
- ## Rails 6.1.3.2 (May 05, 2021) ##
38
-
39
- * No changes.
42
+ * OpenSSL constants are now used for Digest computations.
40
43
 
44
+ *Dirkjan Bussink*
41
45
 
42
- ## Rails 6.1.3.1 (March 26, 2021) ##
46
+ * The `translate` helper now passes `default` values that aren't
47
+ translation keys through `I18n.translate` for interpolation.
43
48
 
44
- * No changes.
49
+ *Jonathan Hefner*
45
50
 
51
+ * Adds option `extname` to `stylesheet_link_tag` to skip default
52
+ `.css` extension appended to the stylesheet path.
46
53
 
47
- ## Rails 6.1.3 (February 17, 2021) ##
54
+ Before:
48
55
 
49
- * No changes.
56
+ ```ruby
57
+ stylesheet_link_tag "style.less"
58
+ # <link href="/stylesheets/style.less.scss" rel="stylesheet">
59
+ ```
50
60
 
61
+ After:
51
62
 
52
- ## Rails 6.1.2.1 (February 10, 2021) ##
63
+ ```ruby
64
+ stylesheet_link_tag "style.less", extname: false, skip_pipeline: true, rel: "stylesheet/less"
65
+ # <link href="/stylesheets/style.less" rel="stylesheet/less">
66
+ ```
53
67
 
54
- * No changes.
68
+ *Abhay Nikam*
55
69
 
70
+ * Deprecate `render` locals to be assigned to instance variables.
56
71
 
57
- ## Rails 6.1.2 (February 09, 2021) ##
72
+ *Petrik de Heus*
58
73
 
59
- * No changes.
74
+ * Remove legacy default `media=screen` from `stylesheet_link_tag`.
60
75
 
76
+ *André Luis Leal Cardoso Junior*
61
77
 
62
- ## Rails 6.1.1 (January 07, 2021) ##
78
+ * Change `ActionView::Helpers::FormBuilder#button` to transform `formmethod`
79
+ attributes into `_method="$VERB"` Form Data to enable varied same-form actions:
63
80
 
64
- * Fix lazy translation in partial with block.
81
+ <%= form_with model: post, method: :put do %>
82
+ <%= form.button "Update" %>
83
+ <%= form.button "Delete", formmethod: :delete %>
84
+ <% end %>
85
+ <%# => <form action="posts/1">
86
+ => <input type="hidden" name="_method" value="put">
87
+ => <button type="submit">Update</button>
88
+ => <button type="submit" formmethod="post" name="_method" value="delete">Delete</button>
89
+ => </form>
90
+ %>
65
91
 
66
- *Marek Kasztelnik*
92
+ *Sean Doyle*
67
93
 
68
- * Avoid extra `SELECT COUNT` queries when rendering Active Record collections.
94
+ * Change `ActionView::Helpers::UrlHelper#button_to` to *always* render a
95
+ `<button>` element, regardless of whether or not the content is passed as
96
+ the first argument or as a block.
69
97
 
70
- *aar0nr*
98
+ <%= button_to "Delete", post_path(@post), method: :delete %>
99
+ # => <form action="/posts/1"><input type="hidden" name="_method" value="delete"><button type="submit">Delete</button></form>
71
100
 
72
- * Link preloading keep integrity hashes in the header.
101
+ <%= button_to post_path(@post), method: :delete do %>
102
+ Delete
103
+ <% end %>
104
+ # => <form action="/posts/1"><input type="hidden" name="_method" value="delete"><button type="submit">Delete</button></form>
73
105
 
74
- *Étienne Barrié*
106
+ *Sean Doyle*, *Dusan Orlovic*
75
107
 
76
108
  * Add `config.action_view.preload_links_header` to allow disabling of
77
109
  the `Link` header being added by default when using `stylesheet_link_tag`
@@ -84,282 +116,46 @@
84
116
 
85
117
  *Jonathan Hefner*
86
118
 
119
+ * Add `config.action_view.image_loading` to configure the default value of
120
+ the `image_tag` `:loading` option.
87
121
 
88
- ## Rails 6.1.0 (December 09, 2020) ##
89
-
90
- * SanitizeHelper.sanitized_allowed_attributes and SanitizeHelper.sanitized_allowed_tags
91
- call safe_list_sanitizer's class method
92
-
93
- Fixes #39586
94
-
95
- *Taufiq Muhammadi*
96
-
97
- * Change form_with to generate non-remote forms by default.
98
-
99
- `form_with` would generate a remote form by default. This would confuse
100
- users because they were forced to handle remote requests.
101
-
102
- All new 6.1 applications will generate non-remote forms by default.
103
- When upgrading a 6.0 application you can enable remote forms by default by
104
- setting `config.action_view.form_with_generates_remote_forms` to `true`.
105
-
106
- *Petrik de Heus*
107
-
108
- * Yield translated strings to calls of `ActionView::FormBuilder#button`
109
- when a block is given.
110
-
111
- *Sean Doyle*
112
-
113
- * Alias `ActionView::Helpers::Tags::Label::LabelBuilder#translation` to
114
- `#to_s` so that `form.label` calls can yield that value to their blocks.
115
-
116
- *Sean Doyle*
122
+ By setting `config.action_view.image_loading = "lazy"`, an application can opt in to
123
+ lazy loading images sitewide, without changing view code.
117
124
 
118
- * Rename the new `TagHelper#class_names` method to `TagHelper#token_list`,
119
- and make the original available as an alias.
125
+ *Jonathan Hefner*
120
126
 
121
- token_list("foo", "foo bar")
122
- # => "foo bar"
127
+ * `ActionView::Helpers::FormBuilder#id` returns the value
128
+ of the `<form>` element's `id` attribute. With a `method` argument, returns
129
+ the `id` attribute for a form field with that name.
123
130
 
124
- *Sean Doyle*
131
+ <%= form_for @post do |f| %>
132
+ <%# ... %>
125
133
 
126
- * ARIA Array and Hash attributes are treated as space separated `DOMTokenList`
127
- values. This is useful when declaring lists of label text identifiers in
128
- `aria-labelledby` or `aria-describedby`.
129
-
130
- tag.input type: 'checkbox', name: 'published', aria: {
131
- invalid: @post.errors[:published].any?,
132
- labelledby: ['published_context', 'published_label'],
133
- describedby: { published_errors: @post.errors[:published].any? }
134
- }
135
- #=> <input
136
- type="checkbox" name="published" aria-invalid="true"
137
- aria-labelledby="published_context published_label"
138
- aria-describedby="published_errors"
139
- >
134
+ <% content_for :sticky_footer do %>
135
+ <%= form.button(form: f.id) %>
136
+ <% end %>
137
+ <% end %>
140
138
 
141
139
  *Sean Doyle*
142
140
 
143
- * Remove deprecated `escape_whitelist` from `ActionView::Template::Handlers::ERB`.
144
-
145
- *Rafael Mendonça França*
146
-
147
- * Remove deprecated `find_all_anywhere` from `ActionView::Resolver`.
148
-
149
- *Rafael Mendonça França*
150
-
151
- * Remove deprecated `formats` from `ActionView::Template::HTML`.
152
-
153
- *Rafael Mendonça França*
154
-
155
- * Remove deprecated `formats` from `ActionView::Template::RawFile`.
156
-
157
- *Rafael Mendonça França*
158
-
159
- * Remove deprecated `formats` from `ActionView::Template::Text`.
160
-
161
- *Rafael Mendonça França*
162
-
163
- * Remove deprecated `find_file` from `ActionView::PathSet`.
164
-
165
- *Rafael Mendonça França*
166
-
167
- * Remove deprecated `rendered_format` from `ActionView::LookupContext`.
168
-
169
- *Rafael Mendonça França*
170
-
171
- * Remove deprecated `find_file` from `ActionView::ViewPaths`.
172
-
173
- *Rafael Mendonça França*
174
-
175
- * Require that `ActionView::Base` subclasses implement `#compiled_method_container`.
176
-
177
- *Rafael Mendonça França*
178
-
179
- * Remove deprecated support to pass an object that is not a `ActionView::LookupContext` as the first argument
180
- in `ActionView::Base#initialize`.
181
-
182
- *Rafael Mendonça França*
183
-
184
- * Remove deprecated `format` argument `ActionView::Base#initialize`.
185
-
186
- *Rafael Mendonça França*
187
-
188
- * Remove deprecated `ActionView::Template#refresh`.
189
-
190
- *Rafael Mendonça França*
191
-
192
- * Remove deprecated `ActionView::Template#original_encoding`.
193
-
194
- *Rafael Mendonça França*
195
-
196
- * Remove deprecated `ActionView::Template#variants`.
197
-
198
- *Rafael Mendonça França*
199
-
200
- * Remove deprecated `ActionView::Template#formats`.
141
+ * `ActionView::Helpers::FormBuilder#field_id` returns the value generated by
142
+ the FormBuilder for the given attribute name.
201
143
 
202
- *Rafael Mendonça França*
203
-
204
- * Remove deprecated `ActionView::Template#virtual_path=`.
205
-
206
- *Rafael Mendonça França*
207
-
208
- * Remove deprecated `ActionView::Template#updated_at`.
209
-
210
- *Rafael Mendonça França*
211
-
212
- * Remove deprecated `updated_at` argument required on `ActionView::Template#initialize`.
213
-
214
- *Rafael Mendonça França*
215
-
216
- * Make `locals` argument required on `ActionView::Template#initialize`.
217
-
218
- *Rafael Mendonça França*
219
-
220
- * Remove deprecated `ActionView::Template.finalize_compiled_template_methods`.
221
-
222
- *Rafael Mendonça França*
223
-
224
- * Remove deprecated `config.action_view.finalize_compiled_template_methods`
225
-
226
- *Rafael Mendonça França*
227
-
228
- * Remove deprecated support to calling `ActionView::ViewPaths#with_fallback` with a block.
229
-
230
- *Rafael Mendonça França*
231
-
232
- * Remove deprecated support to passing absolute paths to `render template:`.
233
-
234
- *Rafael Mendonça França*
235
-
236
- * Remove deprecated support to passing relative paths to `render file:`.
237
-
238
- *Rafael Mendonça França*
239
-
240
- * Remove support to template handlers that don't accept two arguments.
241
-
242
- *Rafael Mendonça França*
243
-
244
- * Remove deprecated pattern argument in `ActionView::Template::PathResolver`.
245
-
246
- *Rafael Mendonça França*
247
-
248
- * Remove deprecated support to call private methods from object in some view helpers.
249
-
250
- *Rafael Mendonça França*
251
-
252
- * `ActionView::Helpers::TranslationHelper#translate` accepts a block, yielding
253
- the translated text and the fully resolved translation key:
254
-
255
- <%= translate(".relative_key") do |translation, resolved_key| %>
256
- <span title="<%= resolved_key %>"><%= translation %></span>
144
+ <%= form_for @post do |f| %>
145
+ <%= f.label :title %>
146
+ <%= f.text_field :title, aria: { describedby: f.field_id(:title, :error) } %>
147
+ <%= tag.span("is blank", id: f.field_id(:title, :error) %>
257
148
  <% end %>
258
149
 
259
150
  *Sean Doyle*
260
151
 
261
- * Ensure cache fragment digests include all relevant template dependencies when
262
- fragments are contained in a block passed to the render helper. Remove the
263
- virtual_path keyword arguments found in CacheHelper as they no longer possess
264
- any function following 1581cab.
265
-
266
- Fixes #38984.
267
-
268
- *Aaron Lipman*
269
-
270
- * Deprecate `config.action_view.raise_on_missing_translations` in favor of
271
- `config.i18n.raise_on_missing_translations`.
272
-
273
- New generalized configuration option now determines whether an error should be raised
274
- for missing translations in controllers and views.
275
-
276
- *fatkodima*
152
+ * Add `tag.attributes` to transform a Hash into HTML Attributes, ready to be
153
+ interpolated into ERB.
277
154
 
278
- * Instrument layout rendering in `TemplateRenderer#render_with_layout` as `render_layout.action_view`,
279
- and include (when necessary) the layout's virtual path in notification payloads for collection and partial renders.
155
+ <input <%= tag.attributes(type: :text, aria: { label: "Search" }) %> >
156
+ # => <input type="text" aria-label="Search">
280
157
 
281
- *Zach Kemp*
282
-
283
- * `ActionView::Base.annotate_rendered_view_with_filenames` annotates HTML output with template file names.
284
-
285
- *Joel Hawksley*, *Aaron Patterson*
286
-
287
- * `ActionView::Helpers::TranslationHelper#translate` returns nil when
288
- passed `default: nil` without a translation matching `I18n#translate`.
289
-
290
- *Stefan Wrobel*
291
-
292
- * `OptimizedFileSystemResolver` prefers template details in order of locale,
293
- formats, variants, handlers.
294
-
295
- *Iago Pimenta*
296
-
297
- * Added `class_names` helper to create a CSS class value with conditional classes.
298
-
299
- *Joel Hawksley*, *Aaron Patterson*
300
-
301
- * Add support for conditional values to TagBuilder.
302
-
303
- *Joel Hawksley*
304
-
305
- * `ActionView::Helpers::FormOptionsHelper#select` should mark option for `nil` as selected.
306
-
307
- ```ruby
308
- @post = Post.new
309
- @post.category = nil
310
-
311
- # Before
312
- select("post", "category", none: nil, programming: 1, economics: 2)
313
- # =>
314
- # <select name="post[category]" id="post_category">
315
- # <option value="">none</option>
316
- # <option value="1">programming</option>
317
- # <option value="2">economics</option>
318
- # </select>
319
-
320
- # After
321
- select("post", "category", none: nil, programming: 1, economics: 2)
322
- # =>
323
- # <select name="post[category]" id="post_category">
324
- # <option selected="selected" value="">none</option>
325
- # <option value="1">programming</option>
326
- # <option value="2">economics</option>
327
- # </select>
328
- ```
329
-
330
- *bogdanvlviv*
331
-
332
- * Log lines for partial renders and started template renders are now
333
- emitted at the `DEBUG` level instead of `INFO`.
334
-
335
- Completed template renders are still logged at the `INFO` level.
336
-
337
- *DHH*
338
-
339
- * ActionView::Helpers::SanitizeHelper: support rails-html-sanitizer 1.1.0.
340
-
341
- *Juanito Fatas*
342
-
343
- * Added `phone_to` helper method to create a link from mobile numbers.
344
-
345
- *Pietro Moro*
346
-
347
- * annotated_source_code returns an empty array so TemplateErrors without a
348
- template in the backtrace are surfaced properly by DebugExceptions.
349
-
350
- *Guilherme Mansur*, *Kasper Timm Hansen*
351
-
352
- * Add autoload for SyntaxErrorInTemplate so syntax errors are correctly raised by DebugExceptions.
353
-
354
- *Guilherme Mansur*, *Gannon McGibbon*
355
-
356
- * `RenderingHelper` supports rendering objects that `respond_to?` `:render_in`.
357
-
358
- *Joel Hawksley*, *Natasha Umer*, *Aaron Patterson*, *Shawn Allen*, *Emily Plummer*, *Diana Mounter*, *John Hawthorn*, *Nathan Herald*, *Zaid Zawaideh*, *Zach Ahn*
359
-
360
- * Fix `select_tag` so that it doesn't change `options` when `include_blank` is present.
361
-
362
- *Younes SERRAJ*
158
+ *Sean Doyle*
363
159
 
364
160
 
365
- Please check [6-0-stable](https://github.com/rails/rails/blob/6-0-stable/actionview/CHANGELOG.md) for previous changes.
161
+ Please check [6-1-stable](https://github.com/rails/rails/blob/6-1-stable/actionview/CHANGELOG.md) for previous changes.
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2004-2020 David Heinemeier Hansson
1
+ Copyright (c) 2004-2021 David Heinemeier Hansson
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -9,7 +9,7 @@ require "action_view/context"
9
9
  require "action_view/template"
10
10
  require "action_view/lookup_context"
11
11
 
12
- module ActionView #:nodoc:
12
+ module ActionView # :nodoc:
13
13
  # = Action View Base
14
14
  #
15
15
  # Action View templates can be written in several ways.
@@ -179,7 +179,7 @@ module ActionView #:nodoc:
179
179
  ActionView::Resolver.caching = value
180
180
  end
181
181
 
182
- def xss_safe? #:nodoc:
182
+ def xss_safe? # :nodoc:
183
183
  true
184
184
  end
185
185
 
@@ -227,7 +227,7 @@ module ActionView #:nodoc:
227
227
 
228
228
  # :startdoc:
229
229
 
230
- def initialize(lookup_context, assigns, controller) #:nodoc:
230
+ def initialize(lookup_context, assigns, controller) # :nodoc:
231
231
  @_config = ActiveSupport::InheritableOptions.new
232
232
 
233
233
  @lookup_context = lookup_context
@@ -18,7 +18,7 @@ module ActionView
18
18
  # sbuf << 5
19
19
  # puts sbuf # => "hello\u0005"
20
20
  #
21
- class OutputBuffer < ActiveSupport::SafeBuffer #:nodoc:
21
+ class OutputBuffer < ActiveSupport::SafeBuffer # :nodoc:
22
22
  def initialize(*)
23
23
  super
24
24
  encode!
@@ -38,7 +38,7 @@ module ActionView
38
38
  alias :safe_append= :safe_concat
39
39
  end
40
40
 
41
- class StreamingBuffer #:nodoc:
41
+ class StreamingBuffer # :nodoc:
42
42
  def initialize(block)
43
43
  @block = block
44
44
  end
@@ -4,49 +4,63 @@ module ActionView
4
4
  class CacheExpiry
5
5
  class Executor
6
6
  def initialize(watcher:)
7
- @cache_expiry = CacheExpiry.new(watcher: watcher)
7
+ @execution_lock = Concurrent::ReadWriteLock.new
8
+ @cache_expiry = ViewModificationWatcher.new(watcher: watcher) do
9
+ clear_cache
10
+ end
8
11
  end
9
12
 
10
- def before(target)
11
- @cache_expiry.clear_cache_if_necessary
13
+ def run
14
+ ActiveSupport::Dependencies.interlock.permit_concurrent_loads do
15
+ @cache_expiry.execute_if_updated
16
+ @execution_lock.acquire_read_lock
17
+ end
12
18
  end
13
- end
14
-
15
- def initialize(watcher:)
16
- @watched_dirs = nil
17
- @watcher_class = watcher
18
- @watcher = nil
19
- @mutex = Mutex.new
20
- end
21
19
 
22
- def clear_cache_if_necessary
23
- @mutex.synchronize do
24
- watched_dirs = dirs_to_watch
25
- return if watched_dirs.empty?
20
+ def complete(_)
21
+ @execution_lock.release_read_lock
22
+ end
26
23
 
27
- if watched_dirs != @watched_dirs
28
- @watched_dirs = watched_dirs
29
- @watcher = @watcher_class.new([], watched_dirs) do
30
- clear_cache
24
+ private
25
+ def clear_cache
26
+ @execution_lock.with_write_lock do
27
+ ActionView::LookupContext::DetailsKey.clear
31
28
  end
32
- @watcher.execute
33
- else
34
- @watcher.execute_if_updated
35
29
  end
36
- end
37
- end
38
-
39
- def clear_cache
40
- ActionView::LookupContext::DetailsKey.clear
41
30
  end
42
31
 
43
- private
44
- def dirs_to_watch
45
- all_view_paths.grep(FileSystemResolver).map!(&:path).tap(&:uniq!).sort!
32
+ class ViewModificationWatcher
33
+ def initialize(watcher:, &block)
34
+ @watched_dirs = nil
35
+ @watcher_class = watcher
36
+ @watcher = nil
37
+ @mutex = Mutex.new
38
+ @block = block
46
39
  end
47
40
 
48
- def all_view_paths
49
- ActionView::ViewPaths.all_view_paths.flat_map(&:paths)
41
+ def execute_if_updated
42
+ @mutex.synchronize do
43
+ watched_dirs = dirs_to_watch
44
+ return if watched_dirs.empty?
45
+
46
+ if watched_dirs != @watched_dirs
47
+ @watched_dirs = watched_dirs
48
+ @watcher = @watcher_class.new([], watched_dirs, &@block)
49
+ @watcher.execute
50
+ else
51
+ @watcher.execute_if_updated
52
+ end
53
+ end
50
54
  end
55
+
56
+ private
57
+ def dirs_to_watch
58
+ all_view_paths.grep(FileSystemResolver).map!(&:path).tap(&:uniq!).sort!
59
+ end
60
+
61
+ def all_view_paths
62
+ ActionView::ViewPaths.all_view_paths.flat_map(&:paths)
63
+ end
64
+ end
51
65
  end
52
66
  end