diff --git a/Gemfile.lock b/Gemfile.lock index 17529a1..1e0c47c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -52,7 +52,7 @@ GEM railties (>= 3.0.0) fakeweb (1.3.0) hike (1.2.3) - httparty (0.14.0) + httparty (0.15.6) multi_xml (>= 0.5.2) i18n (0.6.9) mail (2.5.4) @@ -116,4 +116,4 @@ DEPENDENCIES turn! BUNDLED WITH - 1.14.6 + 1.12.0 diff --git a/lib/dolly/bulk_document.rb b/lib/dolly/bulk_document.rb index 8d61696..21e57f9 100644 --- a/lib/dolly/bulk_document.rb +++ b/lib/dolly/bulk_document.rb @@ -24,7 +24,7 @@ def docs def save return if docs.empty? - self.response = JSON::parse self.database.post(DOC_NAME, json_payload) + self.response = self.database.post(DOC_NAME, json_payload) build_errors update_revs end diff --git a/lib/dolly/collection.rb b/lib/dolly/collection.rb index 3dc7dfa..f73e06d 100644 --- a/lib/dolly/collection.rb +++ b/lib/dolly/collection.rb @@ -57,7 +57,7 @@ def rows= ary end def load - parsed = JSON::parse json + parsed = json.is_a?(String) ? JSON.parse(json) : json self.rows = parsed['rows'] end diff --git a/lib/dolly/document.rb b/lib/dolly/document.rb index 082bc4e..22a4c03 100644 --- a/lib/dolly/document.rb +++ b/lib/dolly/document.rb @@ -63,8 +63,7 @@ def save options = {} self.doc['_id'] = self.class.next_id if self.doc['_id'].blank? set_created_at if timestamps[self.class.name] set_updated_at if timestamps[self.class.name] - response = database.put(id_as_resource, self.doc.to_json) - obj = JSON::parse response.parsed_response + obj = database.put(id_as_resource, self.doc.to_json) doc['_rev'] = obj['rev'] if obj['rev'] obj['ok'] end @@ -77,8 +76,7 @@ def save! def destroy hard = true if hard q = id_as_resource + "?rev=#{rev}" - response = database.delete(q) - JSON::parse response.parsed_response + database.delete(q) else self.doc['_deleted'] = true self.save @@ -104,6 +102,11 @@ def from_json string self end + def from_response response + self.rows = response['rows'] + self + end + def database self.class.database end diff --git a/lib/dolly/property.rb b/lib/dolly/property.rb index 27c89a5..8d39e06 100644 --- a/lib/dolly/property.rb +++ b/lib/dolly/property.rb @@ -4,7 +4,7 @@ class Property attr_accessor :name attr_reader :class_name, :default - CANT_CLONE = [NilClass, TrueClass, FalseClass, Fixnum].freeze + CANT_CLONE = [NilClass, TrueClass, FalseClass, Integer].freeze def initialize opts = {} @class_name = opts.delete(:class_name) if opts.present? diff --git a/lib/dolly/query.rb b/lib/dolly/query.rb index 8ae6a6e..b45dad2 100644 --- a/lib/dolly/query.rb +++ b/lib/dolly/query.rb @@ -18,7 +18,7 @@ def find *keys if keys.count > 1 build_collection( query_hash ) else - self.new.from_json( database.all_docs(query_hash).parsed_response ) + self.new.from_response(database.all_docs(query_hash)) end rescue NoMethodError => err if err.message == "undefined method `[]' for nil:NilClass" @@ -48,12 +48,12 @@ def last limit = 1 def build_collection q res = database.all_docs(q) - Collection.new res.parsed_response, name_for_class + Collection.new res, name_for_class end def find_with doc, view_name, opts = {} res = view "_design/#{doc}/_view/#{view_name}", opts - Collection.new res.parsed_response, name_for_class + Collection.new res, name_for_class end #TODO: new implementation for collection returning @@ -72,7 +72,7 @@ def view doc, options = {} end def raw_view doc, view, opts = {} - JSON.parse database.get "_design/#{doc}/_view/#{view}", opts + database.get("_design/#{doc}/_view/#{view}", opts) end end diff --git a/lib/dolly/request.rb b/lib/dolly/request.rb index 93ea44a..3d4e7a1 100644 --- a/lib/dolly/request.rb +++ b/lib/dolly/request.rb @@ -67,7 +67,7 @@ def all_docs data = {} def request method, resource, data = nil data ||= {} data.merge!(basic_auth: auth_info) if auth_info.present? - headers = { 'Content-Type' => 'application/json' } + headers = { 'Content-Type' => 'application/json', 'Accept' => 'application/json' } headers.merge! data[:headers] if data[:headers] response = self.class.send method, resource, data.merge(headers: headers) log_request(resource, response.code) if Dolly.log_requests? @@ -76,7 +76,8 @@ def request method, resource, data = nil elsif (400..600).include? response.code raise Dolly::ServerError.new( response ) else - response + body = response.parsed_response + body.is_a?(String) ? JSON.parse(body) : body end end diff --git a/lib/tasks/db.rake b/lib/tasks/db.rake index 5dde5a9..49b3972 100644 --- a/lib/tasks/db.rake +++ b/lib/tasks/db.rake @@ -9,18 +9,28 @@ namespace :db do task design: :environment do design_dir = Rails.root.join 'db', 'designs' files = Dir.glob File.join design_dir, '**', '*.coffee' + files += Dir.glob File.join design_dir, '**', '*.js' + data = {} files.each do |filename| parts = filename[design_dir.to_s.length+1..-1].split '/' design_doc_name = parts.count == 1 ? Dolly::Document.design_doc : "_design/#{parts.first}" - name, key = File.basename(filename).sub(/.coffee/i, '').split(/\./) + name, key = File.basename(filename).sub(/.coffee|.js/i, '').split(/\./) + language = File.basename(filename) =~ /.js/ ? 'javascript' : 'coffeescript' + key ||= 'map' source = File.read filename vd = data[design_doc_name] ||= { 'views' => {}, 'filters' => {}, 'lists' => {}, 'lib' => {} } + vd['language'] ||= language + + if data[design_doc_name]['language'] != language + raise 'Design document can only have one view language' + end + if key == 'filter' vd['filters'][name] = source elsif key == 'lists' @@ -35,10 +45,10 @@ namespace :db do end data.each do |design_doc_name, view_doc| - view_doc.merge!( '_id' => design_doc_name, 'language' => 'coffeescript') + view_doc.merge!('_id' => design_doc_name) begin - hash_doc = JSON::parse Dolly::Document.database.get(view_doc["_id"]).parsed_response + hash_doc = Dolly::Document.database.get(view_doc["_id"]) rev = hash_doc.delete('_rev')