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

push kwargs up to the user facing API

this lets us leverage Ruby's kwarg handling (exceptions for missing
params, etc) ASAP which allows us to skip active support method calls
and make sure the exception stack is closer to where the user called the
methods.
This commit is contained in:
Aaron Patterson 2016-02-12 14:30:13 -08:00
parent 6e8d70e697
commit ac9d32bf90
3 changed files with 13 additions and 13 deletions

View file

@ -22,23 +22,23 @@ module ActionView
# * <tt>finder</tt> - An instance of <tt>ActionView::LookupContext</tt>
# * <tt>dependencies</tt> - An array of dependent views
# * <tt>partial</tt> - Specifies whether the template is a partial
def digest(options)
options.assert_valid_keys(:name, :finder, :dependencies, :partial)
def digest(name:, finder:, **options)
options.assert_valid_keys(:dependencies, :partial)
cache_key = ([ options[:name], options[:finder].details_key.hash ].compact + Array.wrap(options[:dependencies])).join('.')
cache_key = ([ name, finder.details_key.hash ].compact + Array.wrap(options[:dependencies])).join('.')
# this is a correctly done double-checked locking idiom
# (Concurrent::Map's lookups have volatile semantics)
@@cache[cache_key] || @@digest_monitor.synchronize do
@@cache.fetch(cache_key) do # re-check under lock
compute_and_store_digest(cache_key, options)
compute_and_store_digest(cache_key, name, finder, options)
end
end
end
private
def compute_and_store_digest(cache_key, options) # called under @@digest_monitor lock
klass = if options[:partial] || options[:name].include?("/_")
def compute_and_store_digest(cache_key, name, finder, options) # called under @@digest_monitor lock
klass = if options[:partial] || name.include?("/_")
# Prevent re-entry or else recursive templates will blow the stack.
# There is no need to worry about other threads seeing the +false+ value,
# as they will then have to wait for this thread to let go of the @@digest_monitor lock.
@ -48,7 +48,7 @@ module ActionView
Digestor
end
@@cache[cache_key] = stored_digest = klass.new(options).digest
@@cache[cache_key] = stored_digest = klass.new(name, finder, options).digest
ensure
# something went wrong or ActionView::Resolver.caching? is false, make sure not to corrupt the @@cache
@@cache.delete_pair(cache_key, false) if pre_stored && !stored_digest
@ -57,7 +57,7 @@ module ActionView
attr_reader :name, :finder, :options
def initialize(name:, finder:, **options)
def initialize(name, finder, options = {})
@name, @finder = name, finder
@options = options
end
@ -80,7 +80,7 @@ module ActionView
def nested_dependencies
dependencies.collect do |dependency|
dependencies = PartialDigestor.new(name: dependency, finder: finder).nested_dependencies
dependencies = PartialDigestor.new(dependency, finder).nested_dependencies
dependencies.any? ? { dependency => dependencies } : dependency
end
end

View file

@ -2,13 +2,13 @@ namespace :cache_digests do
desc 'Lookup nested dependencies for TEMPLATE (like messages/show or comments/_comment.html)'
task :nested_dependencies => :environment do
abort 'You must provide TEMPLATE for the task to run' unless ENV['TEMPLATE'].present?
puts JSON.pretty_generate ActionView::Digestor.new(name: CacheDigests.template_name, finder: CacheDigests.finder).nested_dependencies
puts JSON.pretty_generate ActionView::Digestor.new(CacheDigests.template_name, CacheDigests.finder).nested_dependencies
end
desc 'Lookup first-level dependencies for TEMPLATE (like messages/show or comments/_comment.html)'
task :dependencies => :environment do
abort 'You must provide TEMPLATE for the task to run' unless ENV['TEMPLATE'].present?
puts JSON.pretty_generate ActionView::Digestor.new(name: CacheDigests.template_name, finder: CacheDigests.finder).dependencies
puts JSON.pretty_generate ActionView::Digestor.new(CacheDigests.template_name, CacheDigests.finder).dependencies
end
class CacheDigests

View file

@ -308,11 +308,11 @@ class TemplateDigestorTest < ActionView::TestCase
end
def dependencies(template_name)
ActionView::Digestor.new({ name: template_name, finder: finder }).dependencies
ActionView::Digestor.new(template_name, finder).dependencies
end
def nested_dependencies(template_name)
ActionView::Digestor.new({ name: template_name, finder: finder }).nested_dependencies
ActionView::Digestor.new(template_name, finder).nested_dependencies
end
def finder