From 1ee4eebb2b2da07e49bb7d467f5f9d5497bcf718 Mon Sep 17 00:00:00 2001 From: Javan Makhmali Date: Wed, 15 Jun 2016 17:56:17 -0400 Subject: [PATCH] Fix finding templates for digesting for */* requests that render a non-default (html) template --- actionview/lib/action_view/digestor.rb | 9 +++++--- .../digestor/api/comments/_comments.json.erb | 1 + .../digestor/messages/thread.json.erb | 1 + actionview/test/template/digestor_test.rb | 22 +++++++++++++++++++ 4 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 actionview/test/fixtures/digestor/api/comments/_comments.json.erb create mode 100644 actionview/test/fixtures/digestor/messages/thread.json.erb diff --git a/actionview/lib/action_view/digestor.rb b/actionview/lib/action_view/digestor.rb index 8d174955a1..f3c29d663c 100644 --- a/actionview/lib/action_view/digestor.rb +++ b/actionview/lib/action_view/digestor.rb @@ -38,10 +38,13 @@ def logger # Create a dependency tree for template named +name+. def tree(name, finder, partial = false, seen = {}) logical_name = name.gsub(%r|/_|, "/") - formats = [finder.rendered_format] - if finder.disable_cache { finder.exists?(logical_name, [], partial, [], formats: formats) } - template = finder.disable_cache { finder.find(logical_name, [], partial, [], formats: formats) } + options = {} + options[:formats] = [finder.rendered_format] if finder.rendered_format + + if finder.disable_cache { finder.exists?(logical_name, [], partial, [], options) } + template = finder.disable_cache { finder.find(logical_name, [], partial, [], options) } + finder.rendered_format ||= template.formats.first if node = seen[template.identifier] # handle cycles in the tree node diff --git a/actionview/test/fixtures/digestor/api/comments/_comments.json.erb b/actionview/test/fixtures/digestor/api/comments/_comments.json.erb new file mode 100644 index 0000000000..c28646a283 --- /dev/null +++ b/actionview/test/fixtures/digestor/api/comments/_comments.json.erb @@ -0,0 +1 @@ +<%= render partial: "comments/comment", collection: commentable.comments %> diff --git a/actionview/test/fixtures/digestor/messages/thread.json.erb b/actionview/test/fixtures/digestor/messages/thread.json.erb new file mode 100644 index 0000000000..e4c1ba97cd --- /dev/null +++ b/actionview/test/fixtures/digestor/messages/thread.json.erb @@ -0,0 +1 @@ +<%= render "comments/comments" %> diff --git a/actionview/test/template/digestor_test.rb b/actionview/test/template/digestor_test.rb index a06f681eda..e39d6ae810 100644 --- a/actionview/test/template/digestor_test.rb +++ b/actionview/test/template/digestor_test.rb @@ -22,6 +22,12 @@ def initialize(details = {}) end end +class ActionView::Digestor::Node + def flatten + [self] + children.flat_map(&:flatten) + end +end + class TemplateDigestorTest < ActionView::TestCase def setup @cwd = Dir.pwd @@ -148,6 +154,17 @@ def test_nested_template_deps assert_equal nested_deps, nested_dependencies("messages/show") end + def test_nested_template_deps_with_non_default_rendered_format + finder.rendered_format = nil + nested_deps = [{"comments/comments"=>["comments/comment"]}] + assert_equal nested_deps, nested_dependencies("messages/thread") + end + + def test_template_formats_of_nested_deps_with_non_default_rendered_format + finder.rendered_format = nil + assert_equal [:json, :json, :json], tree_template_formats("messages/thread") + end + def test_recursion_in_renders assert digest("level/recursion") # assert recursion is possible assert_not_nil digest("level/recursion") # assert digest is stored @@ -334,6 +351,11 @@ def nested_dependencies(template_name) tree.children.map(&:to_dep_map) end + def tree_template_formats(template_name) + tree = ActionView::Digestor.tree(template_name, finder) + tree.flatten.map(&:template).flat_map(&:formats) + end + def disable_resolver_caching old_caching, ActionView::Resolver.caching = ActionView::Resolver.caching, false yield -- GitLab