class Dry::View::Exposure
An exposure defined on a view
@api private
Constants
- EXPOSURE_DEPENDENCY_PARAMETER_TYPES
- INPUT_PARAMETER_TYPES
Attributes
name[R]
object[R]
options[R]
proc[R]
Public Class Methods
new(name, proc = nil, object = nil, **options)
click to toggle source
# File lib/dry/view/exposure.rb, line 21 def initialize(name, proc = nil, object = nil, **options) @name = name @proc = prepare_proc(proc, object) @object = object @options = options end
Public Instance Methods
bind(obj)
click to toggle source
# File lib/dry/view/exposure.rb, line 28 def bind(obj) self.class.new(name, proc, obj, **options) end
call(input, locals = {})
click to toggle source
# File lib/dry/view/exposure.rb, line 68 def call(input, locals = {}) if proc call_proc(input, locals) else input.fetch(name) { default_value } end end
decorate?()
click to toggle source
# File lib/dry/view/exposure.rb, line 56 def decorate? options.fetch(:decorate) { true } end
default_value()
click to toggle source
# File lib/dry/view/exposure.rb, line 64 def default_value options[:default] end
dependency_names()
click to toggle source
# File lib/dry/view/exposure.rb, line 32 def dependency_names if proc proc.parameters.each_with_object([]) { |(type, name), names| names << name if EXPOSURE_DEPENDENCY_PARAMETER_TYPES.include?(type) } else [] end end
for_layout?()
click to toggle source
# File lib/dry/view/exposure.rb, line 52 def for_layout? options.fetch(:layout) { false } end
input_keys()
click to toggle source
# File lib/dry/view/exposure.rb, line 42 def input_keys if proc proc.parameters.each_with_object([]) { |(type, name), keys| keys << name if INPUT_PARAMETER_TYPES.include?(type) } else [] end end
private?()
click to toggle source
# File lib/dry/view/exposure.rb, line 60 def private? options.fetch(:private) { false } end
Private Instance Methods
call_proc(input, locals)
click to toggle source
# File lib/dry/view/exposure.rb, line 78 def call_proc(input, locals) args, keywords = proc_args(input, locals) if keywords.empty? if proc.is_a?(Method) proc.(*args) else object.instance_exec(*args, &proc) end else if proc.is_a?(Method) proc.(*args, **keywords) else object.instance_exec(*args, **keywords, &proc) end end end
prepare_proc(proc, object)
click to toggle source
# File lib/dry/view/exposure.rb, line 117 def prepare_proc(proc, object) if proc proc elsif object.respond_to?(name, _include_private = true) object.method(name) end end
proc_args(input, locals)
click to toggle source
# File lib/dry/view/exposure.rb, line 96 def proc_args(input, locals) dependency_args = proc_dependency_args(locals) keywords = proc_input_args(input) if keywords.empty? [dependency_args, {}] else [dependency_args, keywords] end end
proc_dependency_args(locals)
click to toggle source
# File lib/dry/view/exposure.rb, line 107 def proc_dependency_args(locals) dependency_names.map { |name| locals.fetch(name) } end
proc_input_args(input)
click to toggle source
# File lib/dry/view/exposure.rb, line 111 def proc_input_args(input) input_keys.each_with_object({}) { |key, args| args[key] = input[key] if input.key?(key) } end