From 1e25f021359b360a5b9a46ee67fedd01034922f8 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Mon, 27 Apr 2020 09:33:51 -0700 Subject: [PATCH] Ignore interpolated strings in DependencyTracker ActionView::DependencyTracker looks through ERB templates using a regex to find render calls. Previously this would incorrectly pick up interpolated strings, like `render "foo/#{bar}"`. This does not attempt to completely correct DependencyTracker, we can't parse Ruby accurately with a regex, but should avoid a relatively common case that previously was generating warnings. --- actionview/lib/action_view/dependency_tracker.rb | 12 +++++++++--- actionview/test/template/dependency_tracker_test.rb | 10 ++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/actionview/lib/action_view/dependency_tracker.rb b/actionview/lib/action_view/dependency_tracker.rb index 182f6e2eef..db347f8396 100644 --- a/actionview/lib/action_view/dependency_tracker.rb +++ b/actionview/lib/action_view/dependency_tracker.rb @@ -130,8 +130,9 @@ module ActionView def add_dependencies(render_dependencies, arguments, pattern) arguments.scan(pattern) do - add_dynamic_dependency(render_dependencies, Regexp.last_match[:dynamic]) - add_static_dependency(render_dependencies, Regexp.last_match[:static]) + match = Regexp.last_match + add_dynamic_dependency(render_dependencies, match[:dynamic]) + add_static_dependency(render_dependencies, match[:static], match[:quote]) end end @@ -141,7 +142,12 @@ module ActionView end end - def add_static_dependency(dependencies, dependency) + def add_static_dependency(dependencies, dependency, quote_type) + if quote_type == '"' + # Ignore if there is interpolation + return if dependency.include?('#{') + end + if dependency if dependency.include?("/") dependencies << dependency diff --git a/actionview/test/template/dependency_tracker_test.rb b/actionview/test/template/dependency_tracker_test.rb index 42cb14a18a..ec389d30c6 100644 --- a/actionview/test/template/dependency_tracker_test.rb +++ b/actionview/test/template/dependency_tracker_test.rb @@ -192,4 +192,14 @@ class ERBTrackerTest < Minitest::Test "comments/comment" ], tracker.dependencies end + + def test_dependencies_with_interpolation + template = FakeTemplate.new(%q{ + <%# render "double/#{quote}" %> + <%# render 'single/#{quote}' %> + }, :erb) + tracker = make_tracker("interpolation/_string", template) + + assert_equal ["single/\#{quote}"], tracker.dependencies + end end