module MongoidFixtures

Constants

VERSION

Public Class Methods

create_or_save_instance(instance) click to toggle source
# File lib/mongoid_fixtures.rb, line 151
def self.create_or_save_instance(instance)
  attributes = instance.attributes.select { |key, value| !key.to_s.eql?('_id') }
  flattened_attributes = flatten_attributes(attributes)
  if instance.class.where(flattened_attributes).exists?
    instance = instance.class.where(flattened_attributes).first
  else
    EmbedUtils.insert_embedded_ids(instance)
    instance.save! # auto serialize the document
  end
  instance
end
flatten_attributes(attributes) click to toggle source
# File lib/mongoid_fixtures.rb, line 116
def self.flatten_attributes(attributes)
  flattened_attributes = {}
  if attributes.is_a? String
    return attributes
  end
  if attributes.is_a? Mongoid::Document
    attributes.attributes.each do |name, attribute|
      unless name.eql? '_id'
        flattened_attributes["#{attributes.class.to_s.downcase}.#{name}"] = attribute
      end
    end
  else

    attributes.each do |key, values|
      if values.is_a? Hash
        values.each do |value, inner_value|
          flattened_attributes["#{key}.#{value}"] = inner_value
        end
      elsif values.is_a? Mongoid::Document
        values.attributes.each do |name, attribute|
          unless name.eql? '_id'
            flattened_attributes["#{values.class.to_s.downcase}.#{name}"] = values.send(name)
          end
        end
      elsif values.is_a? Array # Don't do anything
      else
        flattened_attributes[key] = values
      end
    end
  end
  flattened_attributes
end
include_setter?(instance, setter) click to toggle source
# File lib/mongoid_fixtures.rb, line 112
def self.include_setter?(instance, setter)
  instance.class.instance_methods.include? "#{setter}=".to_sym
end
load(clazz) click to toggle source
# File lib/mongoid_fixtures.rb, line 52
def self.load(clazz)
  fixture_instances = Loader.instance.fixtures[clazz.to_s.downcase.en.plural] # get class name
  instances = {}
  if fixture_instances.nil?
    raise "Could not find instances for #{clazz}"
  end
  fixture_instances.each do |key, fixture_instance|
    instance = clazz.new
    fields = fixture_instance.keys
    fields.each do |field|

      value = fixture_instance[field]
      field_label = field.to_s.capitalize
      field_clazz = Module.resolve_class_ignore_plurality(field_label)

      # If the current value is a symbol then it represents another fixture.
      # Find it and store its id
      if value.is_a? Symbol or value.nil?
        relations = instance.relations
        if relations.include? field
          if relations[field].relation.eql? Mongoid::Relations::Referenced::In or relations[field].relation.eql? Mongoid::Relations::Referenced::One
            instance.send("#{field}=", self.load(field_clazz)[value])
          else
            # instance[field] = self.load(field_clazz)[value].id # embedded fields?
            raise "#{instance} relationship not defined: #{relations[field].relation}"
          end
        else
          raise "Symbol (#{value.nil? ? value : 'nil'}) doesn't reference relationship"
        end

      elsif value.is_a? Array
        values = []
        value.each do |v|
          if field_clazz.nil?
            values << v
          else
            values << EmbedUtils.create_embedded_instance(field_clazz, v, instance)
          end
        end
        if instance[field].nil?
          instance[field] = []
        end
        instance[field].concat(values)
      elsif value.is_a? Hash
        # take hash convert it to object and serialize it
        instance[field] = EmbedUtils.create_embedded_instance(field_clazz, value, instance)
        # else just set the field
      else
        if include_setter?(instance, field)
          instance.send("#{field}=", value)
        else
          instance[field] = value
        end
      end
    end
    instances[key] = create_or_save_instance(instance) # store it based on its key name
  end
  instances
end