class Spectifly::Entity

Attributes

fields[RW]
metadata[RW]
name[R]
options[R]
path[R]
presented_as[R]
relationships[RW]
root[R]

Public Class Methods

from_directory(entities_path, options = {}) click to toggle source
# File lib/spectifly/entity.rb, line 13
def from_directory(entities_path, options = {})
  presenter_path = options[:presenter_path]
  entities = {}
  entities_glob = File.join(entities_path, '*.entity')
  Dir[entities_glob].each do |path|
    path = File.expand_path(path)
    entity = Spectifly::Entity.parse(path)
    entities[entity.name] = entity
  end
  if presenter_path
    presenters_glob = File.join(presenter_path, '*')
    Dir[presenters_glob].each do |presenter_list_path|
      if File.directory? presenter_list_path
        presenter_name = presenter_list_path.sub(/^#{presenter_path}\//, '')
        entities[presenter_name] = {}
        entities_glob = File.join(presenter_list_path, '*.entity')
        Dir[entities_glob].each do |path|
          path = File.expand_path(path)
          presenter = Spectifly::Entity.parse(path)
          base_entity = entities[Spectifly::Support.tokenize(presenter.root)]
          entity = base_entity.present_as(presenter)
          entities[presenter_name][entity.name] = entity
        end
      end
    end
  end
  entities
end
new(path, options = {}) click to toggle source
# File lib/spectifly/entity.rb, line 43
def initialize(path, options = {})
  @options = options
  @path = path
  @name = File.basename(@path).sub(/(.*)\.entity$/, '\1')
  @parsed_yaml = YAML.load_file(@path)
  @root = @parsed_yaml.keys.first
  @metadata = @parsed_yaml.values.first
  @fields = @metadata.delete('Fields')
  @relationships = @metadata.delete('Related Entities') || {}
  if @presented_as = options[:presenter]
    @path = @presented_as.path
    @name = @presented_as.name
  end
  unless valid?
    raise Invalid, @errors.join(', ')
  end
end
parse(*args) click to toggle source
# File lib/spectifly/entity.rb, line 9
def parse(*args)
  new(*args)
end

Public Instance Methods

attributes_for_field_by_base_name(base_name) click to toggle source
# File lib/spectifly/entity.rb, line 68
def attributes_for_field_by_base_name(base_name)
  @fields.select { |name, attributes|
    name.gsub(/\W+$/, '') == base_name
  }.values.first
end
attributes_for_relationship_by_base_name(type, base_name) click to toggle source
# File lib/spectifly/entity.rb, line 74
def attributes_for_relationship_by_base_name(type, base_name)
  @relationships[type].select { |name, attributes|
    name.gsub(/\W+$/, '') == base_name
  }.values.first
end
present_as(presenter_entity) click to toggle source
# File lib/spectifly/entity.rb, line 80
def present_as(presenter_entity)
  unless @root == presenter_entity.root
    raise ArgumentError, "Presenter entity has different root"
  end
  merged_fields = {}
  merged_relationships = {}
  presenter_entity.fields.each_pair do |name, attributes|
    attributes ||= {}
    inherit_from = attributes['Inherits From'] || name.gsub(/\W+$/, '')
    parent_attrs = attributes_for_field_by_base_name(inherit_from)
    merged_fields[name] = (parent_attrs || {}).merge(attributes)
  end

  if presenter_entity.relationships
    presenter_entity.relationships.each_pair do |type, relationships|
      relationships.each do |name, attributes|
        attributes ||= {}
        inherit_from = attributes['Inherits From'] || name.gsub(/\W+$/, '')
        parent_attrs = attributes_for_relationship_by_base_name(type, inherit_from)
        (merged_relationships[type] ||= {})[name] = (parent_attrs || {}).merge(attributes)
      end
    end
  end

  merged_entity = self.class.parse(
    path, options.merge(:presenter => presenter_entity)
  )
  merged_entity.relationships = merged_relationships
  merged_entity.fields = merged_fields
  merged_entity.metadata.merge!(presenter_entity.metadata)
  merged_entity
end
valid?() click to toggle source
# File lib/spectifly/entity.rb, line 61
def valid?
  @errors = []
  @errors << 'Exactly one root element required' unless @parsed_yaml.count == 1
  @errors << 'Entity is missing "Fields" key' if @fields.nil?
  @errors.empty?
end