aboutsummaryrefslogtreecommitdiffstats
path: root/actionview
diff options
context:
space:
mode:
authorJoão Britto <jabcalves@gmail.com>2013-12-21 22:14:07 -0200
committerJoão Britto <jabcalves@gmail.com>2014-01-09 20:37:00 -0200
commitccbba3ff50a7c2d6523f55f7821aabdb89fc5d45 (patch)
treead9eb5a6d62d3b551b0f7fbb804412958cbdabc9 /actionview
parentc2afa055614f15edfbd2f4c97f9254425286fc6e (diff)
downloadrails-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.
Diffstat (limited to 'actionview')
-rw-r--r--actionview/lib/action_view/dependency_tracker.rb36
-rw-r--r--actionview/test/template/dependency_tracker_test.rb30
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