module MarkMapper::Plugins::Keys::ClassMethods

Public Instance Methods

abbr(name)
Alias for: persisted_name
dealias(hash)
Alias for: dealias_keys
dealias_key(name) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 49
def dealias_key(name)
  key = keys[name.to_s]
  key && key.abbr || k
end
dealias_keys(hash) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 39
def dealias_keys(hash)
  out = {}
  hash.each do |k, v|
    key = keys[k.to_s]
    name = key && key.abbr || k
    out[name] = k.to_s.match(/^\$/) && v.is_a?(Hash) ? dealias_keys(v) : v
  end
  out
end
Also aliased as: dealias, unalias
defined_keys() click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 31
def defined_keys
  @defined_keys ||= Hash[*unaliased_keys.select {|k, v| !v.dynamic? }.flatten(1)]
end
dynamic_keys() click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 27
def dynamic_keys
  @dynamic_keys ||= Hash[*unaliased_keys.select {|k, v| v.dynamic? }.flatten(1)]
end
from_marklogic(value) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 112
def from_marklogic(value)
  value && (value.instance_of?(self) ? value : load(value))
end
inherited(descendant) click to toggle source
Calls superclass method
# File lib/mark_mapper/plugins/keys.rb, line 18
def inherited(descendant)
  descendant.instance_variable_set(:@keys, keys.dup)
  super
end
key(*args) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 57
def key(*args)
  Key.new(*args).tap do |key|
    keys[key.name] = key
    keys[key.abbr] = key if key.abbr
    create_accessors_for(key) if key.valid_ruby_name? && !key.reserved_name?
    create_key_in_descendants(*args)
    create_indexes_for(key)
    create_validations_for(key)
    @dynamic_keys = @defined_keys = @unaliased_keys = @object_id_keys = nil
  end
end
key?(key) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 92
def key?(key)
  keys.key? key.to_s
end
keys() click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 23
def keys
  @keys ||= {}
end
load(attrs, with_cast = false) click to toggle source

load is overridden in identity map to ensure same objects are loaded

# File lib/mark_mapper/plugins/keys.rb, line 117
def load(attrs, with_cast = false)
  return nil if attrs.nil?
  begin
    attrs['_type'] ? attrs['_type'].constantize : self
  rescue NameError
    self
  end.allocate.initialize_from_database(attrs, with_cast)
end
object_id_key?(name) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 104
def object_id_key?(name)
  object_id_keys.include?(name.to_sym)
end
object_id_keys() click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 100
def object_id_keys
  @object_id_keys ||= unaliased_keys.keys.select { |key| keys[key].type == ObjectId }.map(&:to_sym)
end
persisted_name(name) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 83
def persisted_name(name)
  if key = keys[name.to_s]
    key.persisted_name
  else
    name
  end
end
Also aliased as: abbr
remove_key(name) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 69
def remove_key(name)
  if key = keys[name.to_s]
    keys.delete key.name
    keys.delete key.abbr
    remove_method key.name if respond_to? "#{key.name}"
    remove_method "#{key.name}=" if respond_to? "#{key.name}="
    remove_method "#{key.name}?" if respond_to? "#{key.name}?"
    remove_method "#{key.name}_before_type_cast" if respond_to? "#{key.name}_before_type_cast"
    remove_key_in_descendants key.name
    remove_validations_for key.name
    @dynamic_keys = @defined_keys = @unaliased_keys = @object_id_keys = nil
  end
end
to_marklogic(instance) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 108
def to_marklogic(instance)
  instance && instance.to_marklogic
end
unalias(hash)
Alias for: dealias_keys
unaliased_keys() click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 35
def unaliased_keys
  @unaliased_keys ||= Hash[*keys.select {|k, v| k == v.name }.flatten(1)]
end
using_object_id?() click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 96
def using_object_id?
  object_id_key?(:_id)
end

Private Instance Methods

accessors_module() click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 137
def accessors_module
  if key_accessors_module_defined?
    const_get 'MarkMapperKeys'
  else
    const_set 'MarkMapperKeys', Module.new
  end
end
create_accessors_for(key) { || ... } click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 145
          def create_accessors_for(key)
            accessors = ""
            if key.read_accessor?
              accessors << <<-end_eval
                def #{key.name}
                  read_key(:#{key.name})
                end

                def #{key.name}_before_type_cast
                  read_key_before_type_cast(:#{key.name})
                end
              end_eval
            end

            if key.write_accessor?
              accessors << <<-end_eval
                def #{key.name}=(value)
                  write_key(:#{key.name}, value)
                end
              end_eval
            end

            if key.predicate_accessor?
              accessors << <<-end_eval
                def #{key.name}?
                  read_key(:#{key.name}).present?
                end
              end_eval
            end

            if block_given?
              accessors_module.module_eval do
                yield
              end
            end

            accessors_module.module_eval accessors
            include accessors_module
          end
create_indexes_for(key) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 193
def create_indexes_for(key)
  if key.options[:index] && !key.embeddable?
    warn "[DEPRECATION] :index option when defining key #{key.name.inspect} is deprecated. Put indexes in `db/indexes.rb`"
    ensure_index key.name
  end
end
create_key_in_descendants(*args) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 185
def create_key_in_descendants(*args)
  descendants.each { |descendant| descendant.key(*args) }
end
create_validations_for(key) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 200
def create_validations_for(key)
  attribute = key.name.to_sym

  if key.options[:required]
    if key.type == Boolean
      validates_inclusion_of attribute, :in => [true, false]
    else
      validates_presence_of(attribute)
    end
  end

  if key.options[:unique]
    validates_uniqueness_of(attribute)
  end

  if key.options[:numeric]
    number_options = key.type == Integer ? {:only_integer => true} : {}
    validates_numericality_of(attribute, number_options)
  end

  if key.options[:format]
    validates_format_of(attribute, :with => key.options[:format])
  end

  if key.options[:in]
    validates_inclusion_of(attribute, :in => key.options[:in])
  end

  if key.options[:not_in]
    validates_exclusion_of(attribute, :in => key.options[:not_in])
  end

  if key.options[:length]
    length_options = case key.options[:length]
    when Integer
      {:minimum => 0, :maximum => key.options[:length]}
    when Range
      {:within => key.options[:length]}
    when Hash
      key.options[:length]
    end
    validates_length_of(attribute, length_options)
  end
end
key_accessors_module_defined?() click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 127
def key_accessors_module_defined?
  # :nocov:
  if IS_RUBY_1_9
    const_defined?('MarkMapperKeys')
  else
    const_defined?('MarkMapperKeys', false)
  end
  # :nocov:
end
remove_key_in_descendants(name) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 189
def remove_key_in_descendants(name)
  descendants.each { |descendant| descendant.remove_key(name) }
end
remove_validate_callbacks(a_name) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 253
def remove_validate_callbacks(a_name)
  chain = _validate_callbacks.dup.reject do |callback|
    f = callback.raw_filter
    f.respond_to?(:attributes) && f.attributes == a_name
  end
  reset_callbacks(:validate)
  chain.each do |callback|
    set_callback 'validate', callback.raw_filter
  end
end
remove_validations_for(name) click to toggle source
# File lib/mark_mapper/plugins/keys.rb, line 245
def remove_validations_for(name)
  name = name.to_sym
  a_name = [name]

  _validators.reject!{ |key, _| key == name }
  remove_validate_callbacks a_name
end