1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

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.
This commit is contained in:
João Britto 2013-12-21 22:14:07 -02:00
parent c2afa05561
commit ccbba3ff50
2 changed files with 45 additions and 21 deletions

View file

@ -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

View file

@ -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