Sha256: bf95ede3f33c3fb5254da84614824947cfdda6afcf0a5a53c3020c19000dba14

Contents?: true

Size: 1.22 KB

Versions: 2

Compression:

Stored size: 1.22 KB

Contents

require 'set'
require 'mongo'

module Flipper
  module Adapters
    class Mongo
      DefaultId = 'flipper'

      def initialize(collection, options = {})
        @collection = collection
        @options = options
        @mongo_criteria = {:_id => id}
        @mongo_options = {:upsert => true, :safe => true}
      end

      def read(key)
        read_key(key)
      end

      def write(key, value)
        update '$set' => {key => value}
      end

      def delete(key)
        update '$unset' => {key => 1}
      end

      def set_add(key, value)
        update '$addToSet' => {key => value}
      end

      def set_delete(key, value)
        update '$pull' => {key => value}
      end

      def set_members(key)
        read_key(key) { Set.new }.to_set
      end

      private

      def id
        @id ||= @options.fetch(:id) { DefaultId }
      end

      def update(updates)
        @collection.update(@mongo_criteria, updates, @mongo_options)
      end

      def read_key(key, &block)
        load

        if block_given?
          @document.fetch(key, &block)
        else
          @document[key]
        end
      end

      def load
        @document = @collection.find_one(@mongo_criteria) || {}
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
flipper-mongo-0.1.1 lib/flipper/adapters/mongo.rb
flipper-mongo-0.1.0 lib/flipper/adapters/mongo.rb