module MetaMongo

Constants

VERSION

Public Class Methods

check_missing_keys(obj, *keys) click to toggle source
# File lib/meta_mongo.rb, line 34
def check_missing_keys(obj, *keys)
  keys.each do |key|
    missing_key(key) if !obj.key?(key)
  end
end
create_method(klass, method, block) click to toggle source
# File lib/meta_mongo.rb, line 18
def create_method(klass, method, block)
  klass.singleton_class.send(:define_method, :foo, &block)
end
create_model(name) click to toggle source
# File lib/meta_mongo.rb, line 10
def create_model(name)
  Utils.create_class(name)
end
extend_module(klass, mod) click to toggle source
# File lib/meta_mongo.rb, line 28
def extend_module(klass, mod)
  klass.class_eval do
    extend mod
  end
end
include_module(klass, mod) click to toggle source
# File lib/meta_mongo.rb, line 22
def include_module(klass, mod)
  klass.class_eval do
    include mod
  end
end
init(hash) click to toggle source
# File lib/meta_mongo.rb, line 69
def init(hash)
  models = hash["models"]

  missing_key("models") unless models
  wrong_type("models") unless models.is_a?(Array)

  models.each do |model|
    check_missing_keys(model, "name", "attributes")

    if !model["attributes"].is_a?(Array)
      wrong_type("attributes")
    end

    attrs = parse_attributes(model["attributes"])

    klass = MetaMongo.create_model(model["name"])
    MetaMongo.include_module(klass, Mongoid::Document)
    MetaMongo.include_module(klass, Mongoid::Timestamps)
    MetaMongo.extend_module(klass, Enumerize)

    if relations = model["relations"]
      wrong_type("relations") unless relations.is_a?(Array)
      relations.each do |relation|
        relation.each_pair do |func, args|
          MetaMongo.run_method(klass, func, *args)
        end
      end
    end

    attrs.each do |att|
      MetaMongo.run_method(klass, :field, att[:field], type: att[:type])

      att[:vals].each do |val|
        MetaMongo.run_method(klass, :validates, att[:field], val)
      end

      if enum = att[:enum]
        MetaMongo.run_method(klass, :enumerize, att[:field], enum)
      end
    end
  end
end
missing_key(key) click to toggle source
# File lib/meta_mongo.rb, line 40
def missing_key(key)
  raise BadHash.new("Missing '#{key}' key")
end
parse_attributes(attrs) click to toggle source
# File lib/meta_mongo.rb, line 48
def parse_attributes(attrs)
  out = []

  attrs.each do |my_attr|
    check_missing_keys my_attr, "field", "name", "type", "validations"

    out << {
      name:  my_attr["name"],
      field: my_attr["field"],
      type:  Utils.to_class(my_attr["type"]),
      vals:  my_attr["validations"],
      enum:  my_attr["enumerize"]
    }

    wrong_type("validations") if !out.last[:vals].is_a?(Array)

  end

  out
end
run_method(klass, method, *args) click to toggle source
# File lib/meta_mongo.rb, line 14
def run_method(klass, method, *args)
  klass.send(method, *args)
end
wrong_type(key) click to toggle source
# File lib/meta_mongo.rb, line 44
def wrong_type(key)
  raise BadHash.new("Invalid '#{key}' type")
end