diff options
author | João Britto <jabcalves@gmail.com> | 2013-12-21 22:14:07 -0200 |
---|---|---|
committer | João Britto <jabcalves@gmail.com> | 2014-01-09 20:37:00 -0200 |
commit | ccbba3ff50a7c2d6523f55f7821aabdb89fc5d45 (patch) | |
tree | ad9eb5a6d62d3b551b0f7fbb804412958cbdabc9 | |
parent | c2afa055614f15edfbd2f4c97f9254425286fc6e (diff) | |
download | rails-ccbba3ff50a7c2d6523f55f7821aabdb89fc5d45.tar.gz rails-ccbba3ff50a7c2d6523f55f7821aabdb89fc5d45.tar.bz2 rails-ccbba3ff50a7c2d6523f55f7821aabdb89fc5d45.zip |
Avoid scanning multiple render calls as a single match.
Each chunk of text coming after `render` is now handled individually as a possible list of arguments.
-rw-r--r-- | actionview/lib/action_view/dependency_tracker.rb | 36 | ||||
-rw-r--r-- | actionview/test/template/dependency_tracker_test.rb | 30 |
2 files changed, 45 insertions, 21 deletions
diff --git a/actionview/lib/action_view/dependency_tracker.rb b/actionview/lib/action_view/dependency_tracker.rb index 748fa81221..0ccf2515c5 100644 --- a/actionview/lib/action_view/dependency_tracker.rb +++ b/actionview/lib/action_view/dependency_tracker.rb @@ -54,21 +54,20 @@ module ActionView /x # Matches: - # render partial: "comments/comment", collection: commentable.comments - # render "comments/comments" - # render 'comments/comments' - # render('comments/comments') + # partial: "comments/comment", collection: @all_comments => "comments/comment" + # (object: @single_comment, partial: "comments/comment") => "comments/comment" # - # render(@topic) => render("topics/topic") - # render(topics) => render("topics/topic") - # render(message.topics) => render("topics/topic") - RENDER_DEPENDENCY = / - \brender\b # render, the whole word - \s*\(?\s* # optional opening paren surrounded by spaces - (?: - (?:.*?#{PARTIAL_HASH_KEY})? # optional hash, up to the partial key declaration - (?:#{STRING}|#{VARIABLE_OR_METHOD_CHAIN}) # finally, the dependency name of interest - ) + # "comments/comments" + # 'comments/comments' + # ('comments/comments') + # + # (@topic) => "topics/topic" + # topics => "topics/topic" + # (message.topics) => "topics/topic" + RENDER_ARGUMENTS = /\A + (?:\s*\(?\s*) # optional opening paren surrounded by spaces + (?:.*?#{PARTIAL_HASH_KEY})? # optional hash, up to the partial key declaration + (?:#{STRING}|#{VARIABLE_OR_METHOD_CHAIN}) # finally, the dependency name of interest /xm def self.call(name, template) @@ -98,10 +97,13 @@ module ActionView def render_dependencies render_dependencies = [] + render_calls = source.split(/\brender\b/).drop(1) - source.scan(RENDER_DEPENDENCY) do - add_dynamic_dependency(render_dependencies, Regexp.last_match[:dynamic]) - add_static_dependency(render_dependencies, Regexp.last_match[:static]) + render_calls.each do |arguments| + arguments.scan(RENDER_ARGUMENTS) do + add_dynamic_dependency(render_dependencies, Regexp.last_match[:dynamic]) + add_static_dependency(render_dependencies, Regexp.last_match[:static]) + end end render_dependencies.uniq diff --git a/actionview/test/template/dependency_tracker_test.rb b/actionview/test/template/dependency_tracker_test.rb index 6540394c14..df3a0602d1 100644 --- a/actionview/test/template/dependency_tracker_test.rb +++ b/actionview/test/template/dependency_tracker_test.rb @@ -147,12 +147,34 @@ class ERBTrackerTest < Minitest::Test end def test_finds_dependencies_with_quotes_within - template = FakeTemplate.new(" - <%# render \"single/quote's\" %> - <%# render 'double/quote\"s' %> - ", :erb) + template = FakeTemplate.new(%{ + <%# render "single/quote's" %> + <%# render 'double/quote"s' %> + }, :erb) + tracker = make_tracker("quotes/_single_and_double", template) assert_equal ["single/quote's", 'double/quote"s'], tracker.dependencies end + + def test_finds_dependencies_with_extra_spaces + template = FakeTemplate.new(%{ + <%= render "header" %> + <%= render partial: "form" %> + <%= render @message %> + <%= render ( @message.events ) %> + <%= render :collection => @message.comments, + :partial => "comments/comment" %> + }, :erb) + + tracker = make_tracker("spaces/_extra", template) + + assert_equal [ + "spaces/header", + "spaces/form", + "messages/message", + "events/event", + "comments/comment" + ], tracker.dependencies + end end |