# File lib/rufus/cloche.rb, line 75
    def put(doc, opts={})

      opts = opts.inject({}) { |h, (k, v)| h[k.to_s] = v; h }

      doc = Rufus::Json.dup(doc) unless opts['update_rev']
        # work with a copy, don't touch original

      type, key = doc['type'], doc['_id']

      raise(
        ArgumentError.new("missing values for keys 'type' and/or '_id'")
      ) if type.nil? || key.nil?

      rev = (doc['_rev'] ||= -1)

      raise(
        ArgumentError.new("values for '_rev' must be positive integers")
      ) if rev.class != Fixnum && rev.class != Bignum

      r =
        lock(rev == -1 ? :create : :write, type, key) do |file|

          cur = do_get(file)

          return cur if cur && cur['_rev'] != doc['_rev']
          return true if cur.nil? && doc['_rev'] != -1

          doc['_rev'] += 1

          File.open(file.path, 'wb') { |io| io.write(Rufus::Json.encode(doc)) }
        end

      r == false ? true : nil
    end