lib/picky/sources/couch.rb in picky-1.2.0 vs lib/picky/sources/couch.rb in picky-1.2.1
- old
+ new
@@ -33,32 +33,81 @@
# Sources::Couch.new(:title, :author, :isbn, url:'localhost:5984')
# Sources::Couch.new(:title, :author, :isbn, url:'localhost:5984', user:'someuser', password:'somepassword')
#
class Couch < Base
+ # If your Couch DB uses UUID keys, use
+ # Sources::Couch.new(:title, keys: Sources::Couch::UUIDKeys.new)
+ # Do not forget to reconvert the UUID Key from an integer in the client:
+ # uuid = UUIDTools::UUID.parse_int(id)
+ # uuid.to_s
+ #
+ class UUIDKeys
+ def initialize
+ # Tries to require the uuidtools gem.
+ #
+ begin
+ require 'uuidtools'
+ rescue LoadError
+ puts_gem_missing 'uuidtools', 'UUID keys in a CouchDB source'
+ exit 1
+ end
+ end
+ def to_i id
+ uuid = UUIDTools::UUID.parse id
+ uuid.to_i
+ end
+ end
+
+ # If your Couch DB uses Hex keys, use
+ # Sources::Couch.new(:title, keys: Sources::Couch::HexKeys.new)
+ # Do not forget to reconvert the Hex Key from an integer in the client:
+ # id.to_s(16)
+ #
+ class HexKeys
+ def to_i id
+ id.hex
+ end
+ end
+
+ # If your Couch DB uses Integer keys, use
+ # Sources::Couch.new(:title, keys: Sources::Couch::IntegerKeys.new)
+ #
+ class IntegerKeys
+ def to_i id
+ id
+ end
+ end
+
+ #
+ #
def initialize *category_names, options
check_gem
+
Hash === options && options[:url] || raise_no_db_given(category_names)
@db = RestClient::Resource.new options.delete(:url), options
+
+ @to_i_strategy = options.delete(:keys) || HexKeys.new
end
# Tries to require the rest_client gem.
#
def check_gem # :nodoc:
require 'rest_client'
rescue LoadError
- puts "Rest-client gem missing!\nTo use the CouchDB source, you need to:\n 1. Add the following line to Gemfile:\n gem 'rest-client'\n 2. Then, run:\n bundle update\n"
+ puts_gem_missing 'rest-client', 'the CouchDB source'
exit 1
end
# Harvests the data to index.
#
# See important note, above.
#
+ @@id_key = '_id'
def harvest type, category
category_name = category.from.to_s
get_data do |doc|
- yield doc['_id'].hex, doc[category_name] || next
+ yield @to_i_strategy.to_i(doc[@@id_key]), doc[category_name] || next
end
end
def get_data &block # :nodoc:
resp = @db['_all_docs?include_docs=true'].get