module Flatter::Mapper::Collection

Constants

NonUniqKeysError

Public Class Methods

prepended(base) click to toggle source
# File lib/flatter/mapper/collection.rb, line 5
def self.prepended(base)
  base.send(:include, Concern)
end

Public Instance Methods

collection() click to toggle source
# File lib/flatter/mapper/collection.rb, line 161
def collection
  return nil unless collection?

  @collection ||= target.each.with_index.map do |item, index|
    clone.tap do |mapper|
      mapper.reset_locals!
      mapper.set_target! item
      mapper.item_index = index
    end
  end
end
collection?() click to toggle source
# File lib/flatter/mapper/collection.rb, line 201
def collection?
  options[:collection] && item_index.nil?
end
mapping_names() click to toggle source
Calls superclass method
# File lib/flatter/mapper/collection.rb, line 134
def mapping_names
  super.map{ |name| collection? || pluralized? ? name.pluralize : name }
end
mounting_names() click to toggle source
Calls superclass method
# File lib/flatter/mapper/collection.rb, line 138
def mounting_names
  super.map{ |name| pluralized? ? name.pluralize : name }
end
pluralize!() click to toggle source
# File lib/flatter/mapper/collection.rb, line 126
def pluralize!
  @_pluralized = true
end
pluralized?() click to toggle source
# File lib/flatter/mapper/collection.rb, line 130
def pluralized?
  !!@_pluralized
end
read() click to toggle source
Calls superclass method
# File lib/flatter/mapper/collection.rb, line 91
def read
  return super unless collection?

  values = collection.map(&:read)

  assert_key_uniqueness!(values)

  {name => values}
end
write(params) click to toggle source
Calls superclass method
# File lib/flatter/mapper/collection.rb, line 101
def write(params)
  return super unless collection?
  return unless params.key?(name)

  data = extract_data(params)

  assert_collection!(data)

  keys = collection.map(&:key)
  remove_items(keys - data.map{ |p| p[:key] })

  data.each do |params|
    if params.key?(:key)
      update_item(params[:key], params.except(:key))
    else
      add_item(params)
    end
  end
end

Protected Instance Methods

as_inner_mountings() click to toggle source
Calls superclass method
# File lib/flatter/mapper/collection.rb, line 185
def as_inner_mountings
  if collection?
    ensure_target!
    collection.map{ |item| item.as_inner_mountings }
  else
    super
  end
end
item_name() click to toggle source
# File lib/flatter/mapper/collection.rb, line 180
def item_name
  "#{name}.#{item_index}" if item_index.present?
end
local_mountings() click to toggle source
Calls superclass method
# File lib/flatter/mapper/collection.rb, line 142
def local_mountings
  super.each{ |mapper| mapper.pluralize! if collection? || pluralized? }
end
prefix() click to toggle source
Calls superclass method
# File lib/flatter/mapper/collection.rb, line 173
def prefix
  return super if mounter.nil?

  [mounter.prefix, item_name].compact.join(?.).presence
end
reset_locals!() click to toggle source
# File lib/flatter/mapper/collection.rb, line 195
def reset_locals!
  @_local_mappings = nil
  @_local_mountings = nil
end

Private Instance Methods

assert_collection!(data) click to toggle source
# File lib/flatter/mapper/collection.rb, line 154
def assert_collection!(data)
  unless data.respond_to?(:each)
    fail ArgumentError, "Cannot write to '#{name}': argument is not a collection"
  end
end
assert_key_uniqueness!(values) click to toggle source
# File lib/flatter/mapper/collection.rb, line 147
def assert_key_uniqueness!(values)
  keys = values.map{ |v| v['key'] }.compact
  keys == keys.uniq or
    fail NonUniqKeysError, "All keys in collection '#{name}' should be uniq, but were not"
end
extract_data(params) click to toggle source
# File lib/flatter/mapper/collection.rb, line 121
def extract_data(params)
  params[name]
end