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