aboutsummaryrefslogtreecommitdiffstats
path: root/actionview
diff options
context:
space:
mode:
authorJohn Hawthorn <john@hawthorn.email>2019-04-12 10:20:04 -0700
committerJohn Hawthorn <john@hawthorn.email>2019-04-12 12:30:26 -0700
commit53e4055a75fc16bf31aeb295ec18c07a3059db57 (patch)
treee4937fa650c63a7e54bd5d01914459c7ae7d2dd3 /actionview
parent1fc735e5f584b481eba85670c519731271ac1796 (diff)
downloadrails-53e4055a75fc16bf31aeb295ec18c07a3059db57.tar.gz
rails-53e4055a75fc16bf31aeb295ec18c07a3059db57.tar.bz2
rails-53e4055a75fc16bf31aeb295ec18c07a3059db57.zip
Support disabling cache for Digestor
This adds a bit of complexity, but is necessary for now to avoid holding extra copies of templates which are resolved from ActionView::Digestor after disabling cache on the lookup context.
Diffstat (limited to 'actionview')
-rw-r--r--actionview/lib/action_view/template/resolver.rb55
-rw-r--r--actionview/lib/action_view/testing/resolvers.rb4
-rw-r--r--actionview/test/template/resolver_shared_tests.rb14
3 files changed, 51 insertions, 22 deletions
diff --git a/actionview/lib/action_view/template/resolver.rb b/actionview/lib/action_view/template/resolver.rb
index 1be82f5df5..6a9beede8c 100644
--- a/actionview/lib/action_view/template/resolver.rb
+++ b/actionview/lib/action_view/template/resolver.rb
@@ -178,36 +178,51 @@ module ActionView
super()
end
+ def find_all(name, prefix = nil, partial = false, details = {}, key = nil, locals = [])
+ locals = locals.map(&:to_s).sort!.freeze
+
+ cached(key, [name, prefix, partial], details, locals) do
+ find_templates(name, prefix, partial, details, locals, cache: !!key)
+ end
+ end
+
private
- def find_templates(name, prefix, partial, details, locals)
+ def find_templates(name, prefix, partial, details, locals, cache: true)
path = Path.build(name, prefix, partial)
- query(path, details, details[:formats], locals)
+ query(path, details, details[:formats], locals, cache: cache)
end
- def query(path, details, formats, locals)
+ def query(path, details, formats, locals, cache:)
template_paths = find_template_paths_from_details(path, details)
template_paths = reject_files_external_to_app(template_paths)
template_paths.map do |template|
- build_template(template, path.virtual, locals)
+ unbound_template =
+ if cache
+ @unbound_templates.compute_if_absent([template, path.virtual]) do
+ build_unbound_template(template, path.virtual)
+ end
+ else
+ build_unbound_template(template, path.virtual)
+ end
+
+ unbound_template.bind_locals(locals)
end
end
- def build_template(template, virtual_path, locals)
- @unbound_templates.compute_if_absent([template, virtual_path]) do
- handler, format, variant = extract_handler_and_format_and_variant(template)
- source = Template::Sources::File.new(template)
-
- UnboundTemplate.new(
- source,
- template,
- handler,
- virtual_path: virtual_path,
- format: format,
- variant: variant,
- )
- end.bind_locals(locals)
+ def build_unbound_template(template, virtual_path)
+ handler, format, variant = extract_handler_and_format_and_variant(template)
+ source = Template::Sources::File.new(template)
+
+ UnboundTemplate.new(
+ source,
+ template,
+ handler,
+ virtual_path: virtual_path,
+ format: format,
+ variant: variant,
+ )
end
def reject_files_external_to_app(files)
@@ -372,8 +387,8 @@ module ActionView
[new(""), new("/")]
end
- def build_template(template, virtual_path, locals)
- super(template, nil, locals)
+ def build_unbound_template(template, _)
+ super(template, nil)
end
def reject_files_external_to_app(files)
diff --git a/actionview/lib/action_view/testing/resolvers.rb b/actionview/lib/action_view/testing/resolvers.rb
index a97fb71b26..1bedf44934 100644
--- a/actionview/lib/action_view/testing/resolvers.rb
+++ b/actionview/lib/action_view/testing/resolvers.rb
@@ -23,7 +23,7 @@ module ActionView #:nodoc:
private
- def query(path, exts, _, locals)
+ def query(path, exts, _, locals, cache:)
query = +""
EXTENSIONS.each do |ext, prefix|
query << "(" << exts[ext].map { |e| e && Regexp.escape("#{prefix}#{e}") }.join("|") << "|)"
@@ -47,7 +47,7 @@ module ActionView #:nodoc:
end
class NullResolver < PathResolver
- def query(path, exts, _, locals)
+ def query(path, exts, _, locals, cache:)
handler, format, variant = extract_handler_and_format_and_variant(path)
[ActionView::Template.new("Template generated by Null Resolver", path.virtual, handler, virtual_path: path.virtual, format: format, variant: variant, locals: locals)]
end
diff --git a/actionview/test/template/resolver_shared_tests.rb b/actionview/test/template/resolver_shared_tests.rb
index 37bdf4b22c..ee73ec1922 100644
--- a/actionview/test/template/resolver_shared_tests.rb
+++ b/actionview/test/template/resolver_shared_tests.rb
@@ -95,6 +95,20 @@ module ResolverSharedTests
assert_same a, b
end
+ def test_different_templates_when_cache_disabled
+ with_file "test/hello_world.html.erb", "Hello HTML!"
+
+ a = context.find("hello_world", "test", false, [], {})
+ b = context.disable_cache { context.find("hello_world", "test", false, [], {}) }
+ c = context.find("hello_world", "test", false, [], {})
+
+ # disable_cache should give us a new object
+ refute_same a, b
+
+ # but it should not clear the cache
+ assert_same a, c
+ end
+
def test_same_template_from_different_details_is_same_object
with_file "test/hello_world.html.erb", "Hello plain text!"