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