actionview 7.1.3.4 → 7.2.0.beta1

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 (31) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +42 -422
  3. data/lib/action_view/base.rb +20 -3
  4. data/lib/action_view/cache_expiry.rb +9 -3
  5. data/lib/action_view/dependency_tracker/{ripper_tracker.rb → ruby_tracker.rb} +4 -3
  6. data/lib/action_view/dependency_tracker.rb +1 -1
  7. data/lib/action_view/gem_version.rb +3 -3
  8. data/lib/action_view/helpers/asset_tag_helper.rb +15 -3
  9. data/lib/action_view/helpers/cache_helper.rb +4 -4
  10. data/lib/action_view/helpers/csrf_helper.rb +1 -1
  11. data/lib/action_view/helpers/form_helper.rb +197 -192
  12. data/lib/action_view/helpers/form_tag_helper.rb +76 -43
  13. data/lib/action_view/helpers/output_safety_helper.rb +4 -4
  14. data/lib/action_view/helpers/tag_helper.rb +208 -18
  15. data/lib/action_view/helpers/url_helper.rb +4 -78
  16. data/lib/action_view/layouts.rb +2 -4
  17. data/lib/action_view/log_subscriber.rb +8 -4
  18. data/lib/action_view/railtie.rb +0 -1
  19. data/lib/action_view/render_parser/prism_render_parser.rb +127 -0
  20. data/lib/action_view/{ripper_ast_parser.rb → render_parser/ripper_render_parser.rb} +152 -9
  21. data/lib/action_view/render_parser.rb +21 -169
  22. data/lib/action_view/renderer/abstract_renderer.rb +1 -1
  23. data/lib/action_view/renderer/renderer.rb +32 -38
  24. data/lib/action_view/rendering.rb +4 -4
  25. data/lib/action_view/template/renderable.rb +7 -1
  26. data/lib/action_view/template/resolver.rb +0 -2
  27. data/lib/action_view/template.rb +28 -4
  28. data/lib/action_view/test_case.rb +12 -14
  29. data/lib/action_view/unbound_template.rb +4 -4
  30. data/lib/action_view.rb +1 -1
  31. metadata +16 -15
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '09f162e4b2d06ca4c87806e578bc29e446a6997be6bff24c0cce8de5a2e9098f'
4
- data.tar.gz: 5a9a9e61773b349b515943920d24365f9c463e9273675c756c2739504453e3b9
3
+ metadata.gz: e667c2e3d2154547c2f51d406d07515af42cc9074e21e8179fdab642126821e4
4
+ data.tar.gz: 26339190cf4ab15b06913451c1ea6a750d5399ba4f7963cdc55b7f59db818ada
5
5
  SHA512:
6
- metadata.gz: f6ce2a035c268470cfac9102cd560bc64d2331d1036464c70b57a8210e25fb1427ba27bfdf5f0dfea6fa2f1b822ea25ce23617647e61c519831f40ac27ccad89
7
- data.tar.gz: 6224d12f4e286e136b47a5c1f6711c7d17020b7367e8100f9ee1232fceaa3d076f955df290bdf7d7eadabb41113091965fceca06273dab9657acd752d5746209
6
+ metadata.gz: b7e494e368f95c7b398f30d88d15bcc9a6aa3cc033cd339c432447959ebf7cff2090c11bece1360303414228100a1a72a29c95aa7044ccd6861547693785f711
7
+ data.tar.gz: 732c61233f0a1c25291232981ef399afca94c0ebff7a8215b1f810696e24e8a72fa49afc2c65ce1bac92967bff1fe2aa4802c8c2bbd9cfaefd0cc8fbc8798210
data/CHANGELOG.md CHANGED
@@ -1,53 +1,54 @@
1
- ## Rails 7.1.3.4 (June 04, 2024) ##
1
+ ## Rails 7.2.0.beta1 (May 29, 2024) ##
2
2
 
3
- * No changes.
3
+ * Add queries count to template rendering instrumentation.
4
4
 
5
+ ```
6
+ # Before
7
+ Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms | Allocations: 112788)
5
8
 
6
- ## Rails 7.1.3.3 (May 16, 2024) ##
7
-
8
- * No changes.
9
-
10
-
11
- ## Rails 7.1.3.2 (February 21, 2024) ##
12
-
13
- * No changes.
14
-
9
+ # After
10
+ Completed 200 OK in 3804ms (Views: 41.0ms | ActiveRecord: 33.5ms (2 queries, 1 cached) | Allocations: 112788)
11
+ ```
15
12
 
16
- ## Rails 7.1.3.1 (February 21, 2024) ##
13
+ *fatkodima*
17
14
 
18
- * No changes.
15
+ * Raise `ArgumentError` if `:renderable` object does not respond to `#render_in`.
19
16
 
17
+ *Sean Doyle*
20
18
 
21
- ## Rails 7.1.3 (January 16, 2024) ##
19
+ * Add the `nonce: true` option for `stylesheet_link_tag` helper to support automatic nonce generation for Content Security Policy.
22
20
 
23
- * Better handle SyntaxError in Action View.
21
+ Works the same way as `javascript_include_tag nonce: true` does.
24
22
 
25
- *Mario Caropreso*
23
+ *Akhil G Krishnan*, *AJ Esler*
26
24
 
27
- * Fix `word_wrap` with empty string.
25
+ * Parse `ActionView::TestCase#rendered` HTML content as `Nokogiri::XML::DocumentFragment` instead of `Nokogiri::XML::Document`.
28
26
 
29
- *Jonathan Hefner*
27
+ *Sean Doyle*
30
28
 
31
29
  * Rename `ActionView::TestCase::Behavior::Content` to `ActionView::TestCase::Behavior::RenderedViewContent`.
32
30
 
33
- Make `RenderedViewContent` inherit from `String`. Make private API with `:nodoc:`.
31
+ Make `RenderedViewContent` inherit from `String`. Make private API with `:nodoc:`
34
32
 
35
33
  *Sean Doyle*
36
34
 
37
- * Fix detection of required strict locals.
35
+ * Deprecate passing `nil` as value for the `model:` argument to the `form_with` method.
38
36
 
39
- Further fix `render @collection` compatibility with strict locals
37
+ *Collin Jilbert*
40
38
 
41
- *Jean Boussier*
39
+ * Alias `field_set_tag` helper to `fieldset_tag` to match `<fieldset>` element.
40
+
41
+ *Sean Doyle*
42
42
 
43
+ * Deprecate passing content to void elements when using `tag.br` type tag builders.
43
44
 
44
- ## Rails 7.1.2 (November 10, 2023) ##
45
+ *Hartley McGuire*
45
46
 
46
47
  * Fix the `number_to_human_size` view helper to correctly work with negative numbers.
47
48
 
48
49
  *Earlopain*
49
50
 
50
- * Automatically discard the implicit locals injected by collection rendering for template that can't accept them
51
+ * Automatically discard the implicit locals injected by collection rendering for template that can't accept them.
51
52
 
52
53
  When rendering a collection, two implicit variables are injected, which breaks templates with strict locals.
53
54
 
@@ -55,20 +56,17 @@
55
56
 
56
57
  *Yasha Krasnou*, *Jean Boussier*
57
58
 
58
- * Fix `@rails/ujs` calling `start()` an extra time when using bundlers
59
+ * Fix `@rails/ujs` calling `start()` an extra time when using bundlers.
59
60
 
60
61
  *Hartley McGuire*, *Ryunosuke Sato*
61
62
 
62
- * Fix the `capture` view helper compatibility with HAML and Slim
63
+ * Fix the `capture` view helper compatibility with HAML and Slim.
63
64
 
64
65
  When a blank string was captured in HAML or Slim (and possibly other template engines)
65
66
  it would instead return the entire buffer.
66
67
 
67
68
  *Jean Boussier*
68
69
 
69
-
70
- ## Rails 7.1.1 (October 11, 2023) ##
71
-
72
70
  * Updated `@rails/ujs` files to ignore certain data-* attributes when element is contenteditable.
73
71
 
74
72
  This fix was already landed in >= 7.0.4.3, < 7.1.0.
@@ -76,406 +74,28 @@
76
74
 
77
75
  *Ryunosuke Sato*
78
76
 
77
+ * Added validation for HTML tag names in the `tag` and `content_tag` helper method.
79
78
 
80
- ## Rails 7.1.0 (October 05, 2023) ##
81
-
82
- * No changes.
83
-
84
-
85
- ## Rails 7.1.0.rc2 (October 01, 2023) ##
86
-
87
- * No changes.
88
-
89
-
90
- ## Rails 7.1.0.rc1 (September 27, 2023) ##
91
-
92
- * Introduce `ActionView::TestCase.register_parser`
93
-
94
- ```ruby
95
- register_parser :rss, -> rendered { RSS::Parser.parse(rendered) }
96
-
97
- test "renders RSS" do
98
- article = Article.create!(title: "Hello, world")
99
-
100
- render formats: :rss, partial: article
101
-
102
- assert_equal "Hello, world", rendered.rss.items.last.title
103
- end
104
- ```
105
-
106
- By default, register parsers for `:html` and `:json`.
107
-
108
- *Sean Doyle*
109
-
110
-
111
- ## Rails 7.1.0.beta1 (September 13, 2023) ##
112
-
113
- * Fix `simple_format` with blank `wrapper_tag` option returns plain html tag
114
-
115
- By default `simple_format` method returns the text wrapped with `<p>`. But if we explicitly specify
116
- the `wrapper_tag: nil` in the options, it returns the text wrapped with `<></>` tag.
117
-
118
- Before:
119
-
120
- ```ruby
121
- simple_format("Hello World", {}, { wrapper_tag: nil })
122
- # <>Hello World</>
123
- ```
124
-
125
- After:
126
-
127
- ```ruby
128
- simple_format("Hello World", {}, { wrapper_tag: nil })
129
- # <p>Hello World</p>
130
- ```
131
-
132
- *Akhil G Krishnan*, *Junichi Ito*
133
-
134
- * Don't double-encode nested `field_id` and `field_name` index values
135
-
136
- Pass `index: @options` as a default keyword argument to `field_id` and
137
- `field_name` view helper methods.
138
-
139
- *Sean Doyle*
140
-
141
- * Allow opting in/out of `Link preload` headers when calling `stylesheet_link_tag` or `javascript_include_tag`
142
-
143
- ```ruby
144
- # will exclude header, even if setting is enabled:
145
- javascript_include_tag("http://example.com/all.js", preload_links_header: false)
146
-
147
- # will include header, even if setting is disabled:
148
- stylesheet_link_tag("http://example.com/all.js", preload_links_header: true)
149
- ```
150
-
151
- *Alex Ghiculescu*
152
-
153
- * Stop generating `Link preload` headers once it has reached 1KB.
154
-
155
- Some proxies have trouble handling large headers, but more importantly preload links
156
- have diminishing returns so it's preferable not to go overboard with them.
157
-
158
- If tighter control is needed, it's recommended to disable automatic generation of preloads
159
- and to generate them manually from the controller or from a middleware.
160
-
161
- *Jean Boussier*
162
-
163
- * `simple_format` helper now handles a `:sanitize_options` - any extra options you want appending to the sanitize.
164
-
165
- Before:
166
- ```ruby
167
- simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>")
168
- # => "<p><a href=\"http://example.com\">Continue</a></p>"
169
- ```
170
-
171
- After:
172
- ```ruby
173
- simple_format("<a target=\"_blank\" href=\"http://example.com\">Continue</a>", {}, { sanitize_options: { attributes: %w[target href] } })
174
- # => "<p><a target=\"_blank\" href=\"http://example.com\">Continue</a></p>"
175
- ```
176
-
177
- *Andrei Andriichuk*
178
-
179
- * Add support for HTML5 standards-compliant sanitizers, and default to `Rails::HTML5::Sanitizer`
180
- in the Rails 7.1 configuration if it is supported.
181
-
182
- Action View's HTML sanitizers can be configured by setting
183
- `config.action_view.sanitizer_vendor`. Supported values are `Rails::HTML4::Sanitizer` or
184
- `Rails::HTML5::Sanitizer`.
185
-
186
- The Rails 7.1 configuration will set this to `Rails::HTML5::Sanitizer` when it is supported, and
187
- fall back to `Rails::HTML4::Sanitizer`. Previous configurations default to
188
- `Rails::HTML4::Sanitizer`.
189
-
190
- *Mike Dalessio*
191
-
192
- * `config.dom_testing_default_html_version` controls the HTML parser used by
193
- `ActionView::TestCase#document_root_element`, which creates the DOM used by the assertions in
194
- Rails::Dom::Testing.
195
-
196
- The Rails 7.1 default configuration opts into the HTML5 parser when it is supported, to better
197
- represent what the DOM would be in a browser user agent. Previously this test helper always used
198
- Nokogiri's HTML4 parser.
199
-
200
- *Mike Dalessio*
201
-
202
- * Add support for the HTML picture tag. It supports passing a String, an Array or a Block.
203
- Supports passing properties directly to the img tag via the `:image` key.
204
- Since the picture tag requires an img tag, the last element you provide will be used for the img tag.
205
- For complete control over the picture tag, a block can be passed, which will populate the contents of the tag accordingly.
206
-
207
- Can be used like this for a single source:
208
- ```erb
209
- <%= picture_tag("picture.webp") %>
210
- ```
211
- which will generate the following:
212
- ```html
213
- <picture>
214
- <img src="/images/picture.webp" />
215
- </picture>
216
- ```
217
-
218
- For multiple sources:
219
- ```erb
220
- <%= picture_tag("picture.webp", "picture.png", :class => "mt-2", :image => { alt: "Image", class: "responsive-img" }) %>
221
- ```
222
- will generate:
223
- ```html
224
- <picture class="mt-2">
225
- <source srcset="/images/picture.webp" />
226
- <source srcset="/images/picture.png" />
227
- <img alt="Image" class="responsive-img" src="/images/picture.png" />
228
- </picture>
229
- ```
230
-
231
- Full control via a block:
232
- ```erb
233
- <%= picture_tag(:class => "my-class") do %>
234
- <%= tag(:source, :srcset => image_path("picture.webp")) %>
235
- <%= tag(:source, :srcset => image_path("picture.png")) %>
236
- <%= image_tag("picture.png", :alt => "Image") %>
237
- <% end %>
238
- ```
239
- will generate:
240
- ```html
241
- <picture class="my-class">
242
- <source srcset="/images/picture.webp" />
243
- <source srcset="/images/picture.png" />
244
- <img alt="Image" src="/images/picture.png" />
245
- </picture>
246
- ```
247
-
248
- *Juan Pablo Balarini*
249
-
250
- * Remove deprecated support to passing instance variables as locals to partials.
251
-
252
- *Rafael Mendonça França*
253
-
254
- * Remove deprecated constant `ActionView::Path`.
255
-
256
- *Rafael Mendonça França*
257
-
258
- * Guard `token_list` calls from escaping HTML too often
259
-
260
- *Sean Doyle*
261
-
262
- * `select` can now be called with a single hash containing options and some HTML options
263
-
264
- Previously this would not work as expected:
265
-
266
- ```erb
267
- <%= select :post, :author, authors, required: true %>
268
- ```
269
-
270
- Instead you needed to do this:
271
-
272
- ```erb
273
- <%= select :post, :author, authors, {}, required: true %>
274
- ```
275
-
276
- Now, either form is accepted, for the following HTML attributes: `required`, `multiple`, `size`.
277
-
278
- *Alex Ghiculescu*
279
-
280
- * Datetime form helpers (`time_field`, `date_field`, `datetime_field`, `week_field`, `month_field`) now accept an instance of Time/Date/DateTime as `:value` option.
281
-
282
- Before:
283
- ```erb
284
- <%= form.datetime_field :written_at, value: Time.current.strftime("%Y-%m-%dT%T") %>
285
- ```
286
-
287
- After:
288
- ```erb
289
- <%= form.datetime_field :written_at, value: Time.current %>
290
- ```
291
-
292
- *Andrey Samsonov*
293
-
294
- * Choices of `select` can optionally contain html attributes as the last element
295
- of the child arrays when using grouped/nested collections
296
-
297
- ```erb
298
- <%= form.select :foo, [["North America", [["United States","US"],["Canada","CA"]], { disabled: "disabled" }]] %>
299
- # => <select><optgroup label="North America" disabled="disabled"><option value="US">United States</option><option value="CA">Canada</option></optgroup></select>
300
- ```
301
-
302
- *Chris Gunther*
303
-
304
- * `check_box_tag` and `radio_button_tag` now accept `checked` as a keyword argument
305
-
306
- This is to make the API more consistent with the `FormHelper` variants. You can now
307
- provide `checked` as a positional or keyword argument:
308
-
309
- ```erb
310
- = check_box_tag "admin", "1", false
311
- = check_box_tag "admin", "1", checked: false
312
-
313
- = radio_button_tag 'favorite_color', 'maroon', false
314
- = radio_button_tag 'favorite_color', 'maroon', checked: false
315
- ```
316
-
317
- *Alex Ghiculescu*
318
-
319
- * Allow passing a class to `dom_id`.
320
- You no longer need to call `new` when passing a class to `dom_id`.
321
- This makes `dom_id` behave like `dom_class` in this regard.
322
- Apart from saving a few keystrokes, it prevents Ruby from needing
323
- to instantiate a whole new object just to generate a string.
79
+ The `tag` and `content_tag` method now checks that the provided tag name adheres to the HTML
80
+ specification. If an invalid HTML tag name is provided, the method raises an `ArgumentError`
81
+ with an appropriate error message.
324
82
 
325
- Before:
326
- ```ruby
327
- dom_id(Post) # => NoMethodError: undefined method `to_key' for Post:Class
328
- ```
83
+ Examples:
329
84
 
330
- After:
331
85
  ```ruby
332
- dom_id(Post) # => "new_post"
333
- ```
86
+ # Raises ArgumentError: Invalid HTML5 tag name: 12p
87
+ content_tag("12p") # Starting with a number
334
88
 
335
- *Goulven Champenois*
89
+ # Raises ArgumentError: Invalid HTML5 tag name: ""
90
+ content_tag("") # Empty tag name
336
91
 
337
- * Report `:locals` as part of the data returned by ActionView render instrumentation.
92
+ # Raises ArgumentError: Invalid HTML5 tag name: div/
93
+ tag("div/") # Contains a solidus
338
94
 
339
- Before:
340
- ```ruby
341
- {
342
- identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
343
- layout: "layouts/application"
344
- }
345
- ```
346
-
347
- After:
348
- ```ruby
349
- {
350
- identifier: "/Users/adam/projects/notifications/app/views/posts/index.html.erb",
351
- layout: "layouts/application",
352
- locals: {foo: "bar"}
353
- }
95
+ # Raises ArgumentError: Invalid HTML5 tag name: "image file"
96
+ tag("image file") # Contains a space
354
97
  ```
355
98
 
356
- *Aaron Gough*
357
-
358
- * Strip `break_sequence` at the end of `word_wrap`.
359
-
360
- This fixes a bug where `word_wrap` didn't properly strip off break sequences that had printable characters.
361
-
362
- For example, compare the outputs of this template:
363
-
364
- ```erb
365
- # <%= word_wrap("11 22\n33 44", line_width: 2, break_sequence: "\n# ") %>
366
- ```
367
-
368
- Before:
369
-
370
- ```
371
- # 11
372
- # 22
373
- #
374
- # 33
375
- # 44
376
- #
377
- ```
378
-
379
- After:
380
-
381
- ```
382
- # 11
383
- # 22
384
- # 33
385
- # 44
386
- ```
387
-
388
- *Max Chernyak*
389
-
390
- * Allow templates to set strict `locals`.
391
-
392
- By default, templates will accept any `locals` as keyword arguments. To define what `locals` a template accepts, add a `locals` magic comment:
393
-
394
- ```erb
395
- <%# locals: (message:) -%>
396
- <%= message %>
397
- ```
398
-
399
- Default values can also be provided:
400
-
401
- ```erb
402
- <%# locals: (message: "Hello, world!") -%>
403
- <%= message %>
404
- ```
405
-
406
- Or `locals` can be disabled entirely:
407
-
408
- ```erb
409
- <%# locals: () %>
410
- ```
411
-
412
- *Joel Hawksley*
413
-
414
- * Add `include_seconds` option for `datetime_local_field`
415
-
416
- This allows to omit seconds part in the input field, by passing `include_seconds: false`
417
-
418
- *Wojciech Wnętrzak*
419
-
420
- * Guard against `ActionView::Helpers::FormTagHelper#field_name` calls with nil
421
- `object_name` arguments. For example:
422
-
423
- ```erb
424
- <%= fields do |f| %>
425
- <%= f.field_name :body %>
426
- <% end %>
427
- ```
428
-
429
- *Sean Doyle*
430
-
431
- * Strings returned from `strip_tags` are correctly tagged `html_safe?`
432
-
433
- Because these strings contain no HTML elements and the basic entities are escaped, they are safe
434
- to be included as-is as PCDATA in HTML content. Tagging them as html-safe avoids double-escaping
435
- entities when being concatenated to a SafeBuffer during rendering.
436
-
437
- Fixes [rails/rails-html-sanitizer#124](https://github.com/rails/rails-html-sanitizer/issues/124)
438
-
439
- *Mike Dalessio*
440
-
441
- * Move `convert_to_model` call from `form_for` into `form_with`
442
-
443
- Now that `form_for` is implemented in terms of `form_with`, remove the
444
- `convert_to_model` call from `form_for`.
445
-
446
- *Sean Doyle*
447
-
448
- * Fix and add protections for XSS in `ActionView::Helpers` and `ERB::Util`.
449
-
450
- Escape dangerous characters in names of tags and names of attributes in the
451
- tag helpers, following the XML specification. Rename the option
452
- `:escape_attributes` to `:escape`, to simplify by applying the option to the
453
- whole tag.
454
-
455
- *Álvaro Martín Fraguas*
456
-
457
- * Extend audio_tag and video_tag to accept Active Storage attachments.
458
-
459
- Now it's possible to write
460
-
461
- ```ruby
462
- audio_tag(user.audio_file)
463
- video_tag(user.video_file)
464
- ```
465
-
466
- Instead of
467
-
468
- ```ruby
469
- audio_tag(polymorphic_path(user.audio_file))
470
- video_tag(polymorphic_path(user.video_file))
471
- ```
472
-
473
- `image_tag` already supported that, so this follows the same pattern.
474
-
475
- *Matheus Richard*
476
-
477
- * Ensure models passed to `form_for` attempt to call `to_model`.
478
-
479
- *Sean Doyle*
99
+ *Akhil G Krishnan*
480
100
 
481
- Please check [7-0-stable](https://github.com/rails/rails/blob/7-0-stable/actionview/CHANGELOG.md) for previous changes.
101
+ Please check [7-1-stable](https://github.com/rails/rails/blob/7-1-stable/actionview/CHANGELOG.md) for previous changes.
@@ -80,6 +80,23 @@ module ActionView # :nodoc:
80
80
  # This is useful in cases where you aren't sure if the local variable has been assigned. Alternatively, you could also use
81
81
  # <tt>defined? headline</tt> to first check if the variable has been assigned before using it.
82
82
  #
83
+ # By default, templates will accept any <tt>locals</tt> as keyword arguments. To restrict what <tt>locals</tt> a template accepts, add a <tt>locals:</tt> magic comment:
84
+ #
85
+ # <%# locals: (headline:) %>
86
+ #
87
+ # Headline: <%= headline %>
88
+ #
89
+ # In cases where the local variables are optional, declare the keyword argument with a default value:
90
+ #
91
+ # <%# locals: (headline: nil) %>
92
+ #
93
+ # <% unless headline.nil? %>
94
+ # Headline: <%= headline %>
95
+ # <% end %>
96
+ #
97
+ # Read more about strict locals in {Action View Overview}[https://guides.rubyonrails.org/action_view_overview.html#strict-locals]
98
+ # in the guides.
99
+ #
83
100
  # === Template caching
84
101
  #
85
102
  # By default, \Rails will compile each template to a method in order to render it. When you alter a template,
@@ -136,8 +153,7 @@ module ActionView # :nodoc:
136
153
  # end
137
154
  # end
138
155
  #
139
- # For more information on Builder please consult the {source
140
- # code}[https://github.com/jimweirich/builder].
156
+ # For more information on Builder please consult the {source code}[https://github.com/rails/builder].
141
157
  class Base
142
158
  include Helpers, ::ERB::Util, Context
143
159
 
@@ -257,7 +273,8 @@ module ActionView # :nodoc:
257
273
  message.
258
274
  gsub("unknown keyword:", "unknown local:").
259
275
  gsub("missing keyword:", "missing local:").
260
- gsub("no keywords accepted", "no locals accepted")
276
+ gsub("no keywords accepted", "no locals accepted").
277
+ concat(" for #{@current_template.short_identifier}")
261
278
  )
262
279
  end
263
280
  else
@@ -10,16 +10,17 @@ module ActionView
10
10
  @watcher = nil
11
11
  @previous_change = false
12
12
 
13
- rebuild_watcher
14
-
15
13
  ActionView::PathRegistry.file_system_resolver_hooks << method(:rebuild_watcher)
16
14
  end
17
15
 
18
16
  def updated?
17
+ build_watcher unless @watcher
19
18
  @previous_change || @watcher.updated?
20
19
  end
21
20
 
22
21
  def execute
22
+ return unless @watcher
23
+
23
24
  watcher = nil
24
25
  @mutex.synchronize do
25
26
  @previous_change = false
@@ -33,7 +34,7 @@ module ActionView
33
34
  ActionView::LookupContext::DetailsKey.clear
34
35
  end
35
36
 
36
- def rebuild_watcher
37
+ def build_watcher
37
38
  @mutex.synchronize do
38
39
  old_watcher = @watcher
39
40
 
@@ -51,6 +52,11 @@ module ActionView
51
52
  end
52
53
  end
53
54
 
55
+ def rebuild_watcher
56
+ return unless @watcher
57
+ build_watcher
58
+ end
59
+
54
60
  def dirs_to_watch
55
61
  all_view_paths.uniq.sort
56
62
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module ActionView
4
4
  class DependencyTracker # :nodoc:
5
- class RipperTracker # :nodoc:
5
+ class RubyTracker # :nodoc:
6
6
  EXPLICIT_DEPENDENCY = /# Template Dependency: (\S+)/
7
7
 
8
8
  def self.call(name, template, view_paths = nil)
@@ -17,8 +17,9 @@ module ActionView
17
17
  true
18
18
  end
19
19
 
20
- def initialize(name, template, view_paths = nil)
20
+ def initialize(name, template, view_paths = nil, parser_class: RenderParser::Default)
21
21
  @name, @template, @view_paths = name, template, view_paths
22
+ @parser_class = parser_class
22
23
  end
23
24
 
24
25
  private
@@ -29,7 +30,7 @@ module ActionView
29
30
 
30
31
  compiled_source = template.handler.call(template, template.source)
31
32
 
32
- RenderParser.new(@name, compiled_source).render_calls.filter_map do |render_call|
33
+ @parser_class.new(@name, compiled_source).render_calls.filter_map do |render_call|
33
34
  next if render_call.end_with?("/_")
34
35
  render_call.gsub(%r|/_|, "/")
35
36
  end
@@ -9,7 +9,7 @@ module ActionView
9
9
  extend ActiveSupport::Autoload
10
10
 
11
11
  autoload :ERBTracker
12
- autoload :RipperTracker
12
+ autoload :RubyTracker
13
13
 
14
14
  @trackers = Concurrent::Map.new
15
15
 
@@ -8,9 +8,9 @@ module ActionView
8
8
 
9
9
  module VERSION
10
10
  MAJOR = 7
11
- MINOR = 1
12
- TINY = 3
13
- PRE = "4"
11
+ MINOR = 2
12
+ TINY = 0
13
+ PRE = "beta1"
14
14
 
15
15
  STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
16
16
  end