rob-murray/london-bike-hire-cli

View on GitHub
lib/london_bike_hire_cli/repository/in_memory_store_adapter.rb

Summary

Maintainability
A
0 mins
Test Coverage
module LondonBikeHireCli
  module Repository
    # Adapter that stores records in memory.
    # Supports multiple record types
    #
    class InMemoryStoreAdapter
      def initialize(items = [])
        @counter = 0
        @map = {}
        add_items(items)
      end

      def create(record)
        @counter = @counter + 1
        record.id ||= @counter
        map_for(record)[record.id] = record
      end

      def update(record)
        map_for(record)[record.id] = record
      end

      def delete(record)
        map_for(record).delete record.id
      end

      def find(klass, id)
        map_for_class(klass).fetch id
      end

      def find_by_ids(klass, *ids)
        map_for_class(klass).values_at(*ids)
      end

      def all(klass)
        map_for_class(klass).values
      end

      def query(klass, selector)
        # TODO fix introspection
        send "query_#{underscore(selector.class.name)}", klass, selector
      end

      private

      def add_items(items)
        items.each { |item| create(item) }
      end

      def map_for_class(klass)
        @map[klass.to_s.to_sym] ||= {}
      end

      def map_for(record)
        map_for_class(record.class)
      end

      # TODO fix
      def underscore(camel_cased_word)
        demod_word = camel_cased_word.to_s.split('::').last
        demod_word.gsub!(/([A-Z\d]+)([A-Z][a-z])/, '\1_\2')
        demod_word.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
        demod_word.tr!('-', '_')
        demod_word.downcase!
        demod_word
      end
    end
  end
end