actionview 7.1.3.4 → 7.2.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
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