class Hanami::View::Exposure
An exposure defined on a view
@api private @since 2.1.0
Constants
- EXPOSURE_DEPENDENCY_PARAMETER_TYPES
- INPUT_PARAMETER_TYPES
Attributes
name[R]
@api private @since 2.1.0
object[R]
@api private @since 2.1.0
options[R]
@api private @since 2.1.0
proc[R]
@api private @since 2.1.0
Public Class Methods
new(name, proc = nil, object = nil, **options)
click to toggle source
@api private @since 2.1.0
# File lib/hanami/view/exposure.rb, line 35 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
@api private @since 2.1.0
# File lib/hanami/view/exposure.rb, line 44 def bind(obj) self.class.new(name, proc, obj, **options) end
call(input, locals = {})
click to toggle source
@api private @since 2.1.0
# File lib/hanami/view/exposure.rb, line 106 def call(input, locals = {}) if proc call_proc(input, locals) else input.fetch(name) { default_value } end end
decorate?()
click to toggle source
@api private @since 2.1.0
# File lib/hanami/view/exposure.rb, line 88 def decorate? options.fetch(:decorate, true) end
default_value()
click to toggle source
@api private @since 2.1.0
# File lib/hanami/view/exposure.rb, line 100 def default_value options[:default] end
dependencies?()
click to toggle source
@api private @since 2.1.0
# File lib/hanami/view/exposure.rb, line 63 def dependencies? !dependency_names.empty? end
dependency_names()
click to toggle source
@api private @since 2.1.0
# File lib/hanami/view/exposure.rb, line 50 def dependency_names @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
@api private @since 2.1.0
# File lib/hanami/view/exposure.rb, line 82 def for_layout? options.fetch(:layout, false) end
input_keys()
click to toggle source
@api private @since 2.1.0
# File lib/hanami/view/exposure.rb, line 69 def input_keys @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
@api private @since 2.1.0
# File lib/hanami/view/exposure.rb, line 94 def private? options.fetch(:private, false) end
Private Instance Methods
call_proc(input, locals)
click to toggle source
# File lib/hanami/view/exposure.rb, line 116 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/hanami/view/exposure.rb, line 155 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/hanami/view/exposure.rb, line 134 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/hanami/view/exposure.rb, line 145 def proc_dependency_args(locals) dependency_names.map { |name| locals.fetch(name) } end
proc_input_args(input)
click to toggle source
# File lib/hanami/view/exposure.rb, line 149 def proc_input_args(input) input_keys.each_with_object({}) { |key, args| args[key] = input[key] if input.key?(key) } end