class Humidifier::Config::Mapper

The parent class for mapper classes. These classes are used to transform arbitrary attributes coming from the user-provided YAML files into valid CloudFormation props that can then be used in the template. This class provides an easy-to-extend DSL that allows for default attributes specifying custom attributes.

Constants

COMMON_ATTRIBUTES

The list of attributes that are common to all resources that need to be handled separately.

Public Class Methods

attribute(name, &block) click to toggle source

Defines a custom attribute. The given block will receive the user-provided value for the attribute. The block should return a hash where the keys are valid humidifier properties and the values are valid values for those properties. In the below example, we specify the group attribute which maps to the groups attribute after some transformation.

attribute :group do |group|
  groups = GROUPS[group]
  groups.any? ? { groups: GROUPS[group] } : {}
end
# File lib/humidifier/config/mapper.rb, line 35
def attribute(name, &block)
  define_method(:"attribute_#{name}", &block)
  attribute_methods << name
end
attribute_methods() click to toggle source

The names of the custom attribute methods.

# File lib/humidifier/config/mapper.rb, line 41
def attribute_methods
  @attribute_methods ||= []
end
defaults(&block) click to toggle source

Defines the default attributes that should be applied to all resources of this type. The given block will be passed the logical resource name that the user specified for the resource. The block should return a hash where the keys are valid humidifier properties and the values are valid values for those properties. In the example below, the user_name property is set based on the logical name.

defaults do |name|
  { user_name: name }
end
# File lib/humidifier/config/mapper.rb, line 55
def defaults(&block)
  define_method(:attribute_defaults, &block)
end

Public Instance Methods

resource_for(clazz, name, attributes) click to toggle source

Builds a humidifier resource using the given humidifier resource class, the logical name for the resource, and the user-specified attributes.

# File lib/humidifier/config/mapper.rb, line 62
def resource_for(clazz, name, attributes)
  mapped =
    respond_to?(:attribute_defaults) ? attribute_defaults(name) : {}

  attributes.each do |key, value|
    mapped.merge!(mapped_from(clazz, key, value))
  end

  common_attributes = common_attributes_from(mapped)

  resource = clazz.new(mapped)
  resource.update_attributes(common_attributes)
  resource
end

Private Instance Methods

common_attributes_from(mapped) click to toggle source
# File lib/humidifier/config/mapper.rb, line 79
def common_attributes_from(mapped)
  COMMON_ATTRIBUTES.each_with_object({}) do |common_attribute, extract|
    extracted = mapped.delete(common_attribute)
    extract[common_attribute] = extracted if extracted
  end
end
mapped_from(clazz, key, value) click to toggle source
# File lib/humidifier/config/mapper.rb, line 86
def mapped_from(clazz, key, value)
  if self.class.attribute_methods.include?(key.to_sym)
    # The given attribute name has been defined using the `::attribute`
    # DSL method, so send the given value to that method and return the
    # resulting hash.
    public_send(:"attribute_#{key}", value)
  elsif clazz.prop?(key)
    # The given attribute name is a valid property on the resource, so
    # directly map the attribute to the given value.
    { key.to_sym => value }
  elsif clazz.prop?("#{key}_id")
    # The given attribute name corresponds to a property on the resource
    # that takes the ID of another resource (for example, specifying the
    # vpc option in the file when the resource has a vpc_id property). In
    # this case, automatically convert the given value into a
    # CloudFormation reference.
    { "#{key}_id": Humidifier.ref(value) }
  elsif COMMON_ATTRIBUTES.include?(key.to_sym)
    # The given attribute name is one of the attributes common to all
    # resources (for example creation_policy), so map that directly to the
    # given value.
    { key.to_sym => value }
  else
    # The given attribute name did not match one of the valid options, so
    # raise an error to alert the user.
    raise InvalidResourceAttributeError.new(clazz, key)
  end
end