mattetti-couchrest 0.16 → 0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,14 +1,15 @@
1
1
  module CouchRest
2
2
  class Response < Hash
3
- def initialize(keys = {})
4
- keys.each do |k,v|
3
+ def initialize(pkeys = {})
4
+ pkeys ||= {}
5
+ pkeys.each do |k,v|
5
6
  self[k.to_s] = v
6
7
  end
7
8
  end
8
- def []= key, value
9
+ def []=(key, value)
9
10
  super(key.to_s, value)
10
11
  end
11
- def [] key
12
+ def [](key)
12
13
  super(key.to_s)
13
14
  end
14
15
  end
@@ -55,9 +55,14 @@ module CouchRest
55
55
  else
56
56
  # Let people use :send as a Time parse arg
57
57
  klass = ::CouchRest.constantize(target)
58
+ # I'm not convince we should or should not create a new instance if we are casting a doc/extended doc without default value and nothing was passed
59
+ # unless (property.casted &&
60
+ # (klass.superclass == CouchRest::ExtendedDocument || klass.superclass == CouchRest::Document) &&
61
+ # (self[key].nil? || property.default.nil?))
58
62
  klass.send(property.init_method, self[key])
63
+ #end
59
64
  end
60
- self[key].casted_by = self if self[key].respond_to?(:casted_by)
65
+ self[property.name].casted_by = self if self[property.name].respond_to?(:casted_by)
61
66
  end
62
67
  end
63
68
  end
@@ -133,7 +133,9 @@ module CouchRest
133
133
  fetch_view(name, opts, &block)
134
134
  else
135
135
  begin
136
- view = fetch_view name, opts.merge({:include_docs => true}), &block
136
+ # auto load mentioned documents unless asked differently
137
+ opts.merge({:include_docs => true}) unless opts.has_key?(:include_docs)
138
+ view = fetch_view name, opts, &block
137
139
  view['rows'].collect{|r|new(r['doc'])} if view['rows']
138
140
  rescue
139
141
  # fallback for old versions of couchdb that don't
@@ -24,15 +24,17 @@ module CouchRest
24
24
  subklass.send(:include, CouchRest::Mixins::Properties)
25
25
  end
26
26
 
27
+ # Accessors
28
+ attr_accessor :casted_by
29
+
27
30
  # Callbacks
28
31
  define_callbacks :create
29
32
  define_callbacks :save
30
33
  define_callbacks :update
31
34
  define_callbacks :destroy
32
35
 
33
- def initialize(keys={})
36
+ def initialize(passed_keys={})
34
37
  apply_defaults # defined in CouchRest::Mixins::Properties
35
- keys ||= {}
36
38
  super
37
39
  cast_keys # defined in CouchRest::Mixins::Properties
38
40
  unless self['_id'] && self['_rev']
data/lib/couchrest.rb CHANGED
@@ -27,7 +27,7 @@ require 'couchrest/monkeypatches'
27
27
 
28
28
  # = CouchDB, close to the metal
29
29
  module CouchRest
30
- VERSION = '0.16' unless self.const_defined?("VERSION")
30
+ VERSION = '0.17' unless self.const_defined?("VERSION")
31
31
 
32
32
  autoload :Server, 'couchrest/core/server'
33
33
  autoload :Database, 'couchrest/core/database'
@@ -124,18 +124,30 @@ module CouchRest
124
124
  cr.database(parsed[:database])
125
125
  end
126
126
 
127
- def put uri, doc = nil
127
+ def put(uri, doc = nil)
128
128
  payload = doc.to_json if doc
129
- JSON.parse(RestClient.put(uri, payload))
129
+ begin
130
+ JSON.parse(RestClient.put(uri, payload))
131
+ rescue Exception => e
132
+ raise "Error while sending a PUT request #{uri}\npayload: #{payload.inspect}\n#{e}"
133
+ end
130
134
  end
131
135
 
132
- def get uri
133
- JSON.parse(RestClient.get(uri), :max_nesting => false)
136
+ def get(uri)
137
+ begin
138
+ JSON.parse(RestClient.get(uri), :max_nesting => false)
139
+ rescue => e
140
+ raise "Error while sending a GET request #{uri}\n: #{e}"
141
+ end
134
142
  end
135
143
 
136
144
  def post uri, doc = nil
137
145
  payload = doc.to_json if doc
138
- JSON.parse(RestClient.post(uri, payload))
146
+ begin
147
+ JSON.parse(RestClient.post(uri, payload))
148
+ rescue Exception => e
149
+ raise "Error while sending a POST request #{uri}\npayload: #{payload.inspect}\n#{e}"
150
+ end
139
151
  end
140
152
 
141
153
  def delete uri
@@ -0,0 +1,40 @@
1
+ require File.join(File.dirname(__FILE__), '..', '..', 'spec_helper')
2
+ require File.join(FIXTURE_PATH, 'more', 'card')
3
+
4
+ class Car < CouchRest::ExtendedDocument
5
+ use_database TEST_SERVER.default_database
6
+
7
+ property :name
8
+ property :driver, :cast_as => 'Driver'
9
+ end
10
+
11
+ class Driver < CouchRest::ExtendedDocument
12
+ use_database TEST_SERVER.default_database
13
+ # You have to add a casted_by accessor if you want to reach a casted extended doc parent
14
+ attr_accessor :casted_by
15
+
16
+ property :name
17
+ end
18
+
19
+ describe "casting an extended document" do
20
+
21
+ before(:each) do
22
+ @car = Car.new(:name => 'Renault 306')
23
+ @driver = Driver.new(:name => 'Matt')
24
+ end
25
+
26
+ # it "should not create an empty casted object" do
27
+ # @car.driver.should be_nil
28
+ # end
29
+
30
+ it "should let you assign the casted attribute after instantializing an object" do
31
+ @car.driver = @driver
32
+ @car.driver.name.should == 'Matt'
33
+ end
34
+
35
+ it "should let the casted document who casted it" do
36
+ Car.new(:name => 'Renault 306', :driver => @driver)
37
+ @car.driver.casted_by.should == @car
38
+ end
39
+
40
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mattetti-couchrest
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.16"
4
+ version: "0.17"
5
5
  platform: ruby
6
6
  authors:
7
7
  - J. Chris Anderson
@@ -136,6 +136,7 @@ files:
136
136
  - spec/couchrest/helpers/pager_spec.rb
137
137
  - spec/couchrest/helpers/streamer_spec.rb
138
138
  - spec/couchrest/more
139
+ - spec/couchrest/more/casted_extended_doc_spec.rb
139
140
  - spec/couchrest/more/casted_model_spec.rb
140
141
  - spec/couchrest/more/extended_doc_attachment_spec.rb
141
142
  - spec/couchrest/more/extended_doc_spec.rb