module ORMivore::MemoryAdapter

Attributes

converter[R]

Public Class Methods

included(base) click to toggle source
# File lib/ormivore/memory_adapter.rb, line 10
def self.included(base)
  base.extend(ClassMethods)
end
new(converter = nil) click to toggle source
# File lib/ormivore/memory_adapter.rb, line 14
def initialize(converter = nil)
  @converter = converter || self.class.default_converter_class.new
end

Public Instance Methods

create(attrs) click to toggle source
# File lib/ormivore/memory_adapter.rb, line 27
def create(attrs)
  id = attrs[:id]
  if id
    raise RecordAlreadyExists if storage.any? { |o| o[:id] == id }
  else
    id = next_id
  end
  attrs.merge(id: id).tap { |attrs_with_id|
    storage << attrs_with_id
  }
end
find(conditions, attributes_to_load, options = {}) click to toggle source
# File lib/ormivore/memory_adapter.rb, line 18
def find(conditions, attributes_to_load, options = {})
  order = options.fetch(:order, {})

  reorder(
    filter_from_storage(conditions, attributes_to_load),
    order
  )
end
storage() click to toggle source

open for tests, not to be used by any other code

# File lib/ormivore/memory_adapter.rb, line 46
def storage
  @storage ||= []
end
update(attrs, conditions) click to toggle source
# File lib/ormivore/memory_adapter.rb, line 39
def update(attrs, conditions)
  select_from_storage(conditions).each { |record|
    record.merge!(attrs)
  }.length
end

Private Instance Methods

filter_from_storage(conditions, attributes_to_load) click to toggle source
# File lib/ormivore/memory_adapter.rb, line 64
def filter_from_storage(conditions, attributes_to_load)
  select_from_storage(conditions).map { |record|
    record.select { |k, v| attributes_to_load.include?(k) }
  }
end
next_id() click to toggle source
# File lib/ormivore/memory_adapter.rb, line 93
def next_id
  (@next_id ||= 1).tap { |current_id|
    @next_id = current_id + 1
  }
end
reorder(records, order) click to toggle source
# File lib/ormivore/memory_adapter.rb, line 70
def reorder(records, order)
  return records if order.empty?

  records.sort { |x, y|
    order.inject(0) { |acc, (k, v)|
      break unless acc.zero?

      multiplier =
        case v
        when :ascending
          1
        when :descending
          -1
        else
          raise BadArgumentError, "Order direction #{v} is invalid"
        end
      (x[k] <=> y[k]) * multiplier
    }
  }
end
select_from_storage(conditions) click to toggle source
# File lib/ormivore/memory_adapter.rb, line 52
def select_from_storage(conditions)
  storage.select { |o|
    conditions.all? { |k, v|
      if v.is_a?(Enumerable)
        v.include?(o[k])
      else
        o[k] == v
      end
    }
  }
end