class Curly::ComponentCompiler

Attributes

component[R]
presenter_class[R]
type[R]

Public Class Methods

compile(presenter_class, component, type: nil) click to toggle source
# File lib/curly/component_compiler.rb, line 5
def self.compile(presenter_class, component, type: nil)
  new(presenter_class, component, type: type).compile
end
new(presenter_class, component, type: nil) click to toggle source
# File lib/curly/component_compiler.rb, line 9
def initialize(presenter_class, component, type: nil)
  @presenter_class, @component, @type = presenter_class, component, type
end

Public Instance Methods

compile() click to toggle source
# File lib/curly/component_compiler.rb, line 13
def compile
  unless presenter_class.component_available?(method)
    raise Curly::InvalidComponent.new(method)
  end

  validate_block_argument!
  validate_attributes!

  code = "presenter.#{method}("

  append_positional_argument(code)
  append_keyword_arguments(code)

  code << ")"
end

Private Instance Methods

append_keyword_arguments(code) click to toggle source
# File lib/curly/component_compiler.rb, line 59
def append_keyword_arguments(code)
  unless keyword_argument_string.empty?
    code << ", " unless argument.nil?
    code << keyword_argument_string
  end
end
append_positional_argument(code) click to toggle source
# File lib/curly/component_compiler.rb, line 43
def append_positional_argument(code)
  if required_identifier?
    if argument.nil?
      raise Curly::Error, "`#{method}` requires an identifier"
    end

    code << argument.inspect
  elsif optional_identifier?
    code << argument.inspect unless argument.nil?
  elsif invalid_signature?
    raise Curly::Error, "`#{method}` is not a valid component method"
  elsif !argument.nil?
    raise Curly::Error, "`#{method}` does not take an identifier"
  end
end
argument() click to toggle source
# File lib/curly/component_compiler.rb, line 35
def argument
  component.identifier
end
attribute_names() click to toggle source
# File lib/curly/component_compiler.rb, line 112
def attribute_names
  @attribute_names ||= params.
    select {|type, name| [:key, :keyreq].include?(type) }.
    map {|type, name| name.to_s }
end
attributes() click to toggle source
# File lib/curly/component_compiler.rb, line 39
def attributes
  component.attributes
end
attributes_collected?() click to toggle source
# File lib/curly/component_compiler.rb, line 118
def attributes_collected?
  param_types.include?(:keyrest)
end
invalid_signature?() click to toggle source
# File lib/curly/component_compiler.rb, line 66
def invalid_signature?
  param_types.count { |type| [:req, :opt].include?(type) } > 1
end
keyword_argument_string() click to toggle source
# File lib/curly/component_compiler.rb, line 78
def keyword_argument_string
  @keyword_argument_string ||= attributes.map {|name, value|
    "#{name}: #{value.inspect}"
  }.join(", ")
end
method() click to toggle source
# File lib/curly/component_compiler.rb, line 31
def method
  component.name
end
optional_identifier?() click to toggle source
# File lib/curly/component_compiler.rb, line 74
def optional_identifier?
  param_types.include?(:opt)
end
param_types() click to toggle source
# File lib/curly/component_compiler.rb, line 108
def param_types
  params.map(&:first)
end
params() click to toggle source
# File lib/curly/component_compiler.rb, line 104
def params
  @params ||= presenter_class.instance_method(method).parameters
end
required_attribute_names() click to toggle source
# File lib/curly/component_compiler.rb, line 122
def required_attribute_names
  @required_attribute_names ||= params.
    select {|type, name| type == :keyreq }.
    map {|type, name| name.to_s }
end
required_identifier?() click to toggle source
# File lib/curly/component_compiler.rb, line 70
def required_identifier?
  param_types.include?(:req)
end
validate_attributes!() click to toggle source
# File lib/curly/component_compiler.rb, line 90
def validate_attributes!
  attributes_collected? || attributes.keys.each do |key|
    unless attribute_names.include?(key)
      raise Curly::Error, "`#{method}` does not allow attribute `#{key}`"
    end
  end

  required_attribute_names.each do |key|
    unless attributes.key?(key)
      raise Curly::Error, "`#{method}` is missing the required attribute `#{key}`"
    end
  end
end
validate_block_argument!() click to toggle source
# File lib/curly/component_compiler.rb, line 84
def validate_block_argument!
  if type == :context && !param_types.include?(:block)
    raise Curly::Error, "`#{method}` cannot be used as a context block"
  end
end