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:
parent
c2afa05561
commit
ccbba3ff50
2 changed files with 45 additions and 21 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue