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