ripple 0.8.3 → 0.9.0.beta

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile CHANGED
@@ -156,18 +156,18 @@ require 'rspec/core'
156
156
  require 'rspec/core/rake_task'
157
157
 
158
158
  desc "Run Unit Specs Only"
159
- Rspec::Core::RakeTask.new(:spec) do |spec|
159
+ RSpec::Core::RakeTask.new(:spec) do |spec|
160
160
  spec.pattern = "spec/ripple/**/*_spec.rb"
161
161
  end
162
162
 
163
163
  namespace :spec do
164
164
  desc "Run Integration Specs Only"
165
- Rspec::Core::RakeTask.new(:integration) do |spec|
165
+ RSpec::Core::RakeTask.new(:integration) do |spec|
166
166
  spec.pattern = "spec/integration/**/*_spec.rb"
167
167
  end
168
168
 
169
169
  desc "Run All Specs"
170
- Rspec::Core::RakeTask.new(:all) do |spec|
170
+ RSpec::Core::RakeTask.new(:all) do |spec|
171
171
  spec.pattern = "spec/**/*_spec.rb"
172
172
  end
173
173
  end
data/lib/ripple.rb CHANGED
@@ -39,6 +39,7 @@ module Ripple
39
39
  autoload :Timestamps
40
40
  autoload :Validations
41
41
  autoload :NestedAttributes
42
+ autoload :Observable
42
43
 
43
44
  # Exceptions
44
45
  autoload :PropertyTypeMismatch
@@ -58,6 +58,7 @@ module Ripple
58
58
  include Ripple::Validations
59
59
  include Ripple::Associations
60
60
  include Ripple::Callbacks
61
+ include Ripple::Observable
61
62
  include Ripple::Conversion
62
63
  include Ripple::Document::Finders
63
64
  include Ripple::Inspection
@@ -25,7 +25,7 @@ module Ripple
25
25
 
26
26
  # @return [Riak::Bucket] The bucket assigned to this class.
27
27
  def bucket
28
- Riak::Bucket.new(Ripple.client, bucket_name)
28
+ Ripple.client.bucket(bucket_name)
29
29
  end
30
30
 
31
31
  # Set the bucket name for this class and its subclasses.
data/ripple.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{ripple}
5
- s.version = "0.8.3"
5
+ s.version = "0.9.0.beta"
6
6
 
7
- s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
7
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Sean Cribbs"]
9
- s.date = %q{2010-12-13}
9
+ s.date = %q{2010-12-29}
10
10
  s.description = %q{ripple is an object-mapper library for Riak, the distributed database by Basho. It uses ActiveModel to provide an experience that integrates well with Rails 3 applications.}
11
11
  s.email = %q{sean@basho.com}
12
12
  s.files = ["Gemfile", "lib/rails/generators/ripple/configuration/configuration_generator.rb", "lib/rails/generators/ripple/configuration/templates/ripple.yml", "lib/rails/generators/ripple/js/js_generator.rb", "lib/rails/generators/ripple/js/templates/js/contrib.js", "lib/rails/generators/ripple/js/templates/js/ripple.js", "lib/rails/generators/ripple/model/model_generator.rb", "lib/rails/generators/ripple/model/templates/model.rb", "lib/rails/generators/ripple/test/templates/test_server.rb", "lib/rails/generators/ripple/test/test_generator.rb", "lib/rails/generators/ripple_generator.rb", "lib/ripple/associations/embedded.rb", "lib/ripple/associations/instantiators.rb", "lib/ripple/associations/linked.rb", "lib/ripple/associations/many.rb", "lib/ripple/associations/many_embedded_proxy.rb", "lib/ripple/associations/many_linked_proxy.rb", "lib/ripple/associations/one.rb", "lib/ripple/associations/one_embedded_proxy.rb", "lib/ripple/associations/one_linked_proxy.rb", "lib/ripple/associations/proxy.rb", "lib/ripple/associations.rb", "lib/ripple/attribute_methods/dirty.rb", "lib/ripple/attribute_methods/query.rb", "lib/ripple/attribute_methods/read.rb", "lib/ripple/attribute_methods/write.rb", "lib/ripple/attribute_methods.rb", "lib/ripple/callbacks.rb", "lib/ripple/conversion.rb", "lib/ripple/core_ext/casting.rb", "lib/ripple/core_ext.rb", "lib/ripple/document/bucket_access.rb", "lib/ripple/document/finders.rb", "lib/ripple/document/key.rb", "lib/ripple/document/persistence.rb", "lib/ripple/document.rb", "lib/ripple/embedded_document/finders.rb", "lib/ripple/embedded_document/persistence.rb", "lib/ripple/embedded_document.rb", "lib/ripple/i18n.rb", "lib/ripple/inspection.rb", "lib/ripple/locale/en.yml", "lib/ripple/nested_attributes.rb", "lib/ripple/properties.rb", "lib/ripple/property_type_mismatch.rb", "lib/ripple/railtie.rb", "lib/ripple/timestamps.rb", "lib/ripple/translation.rb", "lib/ripple/validations/associated_validator.rb", "lib/ripple/validations.rb", "lib/ripple.rb", "Rakefile", "ripple.gemspec", "spec/fixtures/config.yml", "spec/integration/ripple/associations_spec.rb", "spec/integration/ripple/nested_attributes_spec.rb", "spec/integration/ripple/persistence_spec.rb", "spec/ripple/associations/many_embedded_proxy_spec.rb", "spec/ripple/associations/many_linked_proxy_spec.rb", "spec/ripple/associations/one_embedded_proxy_spec.rb", "spec/ripple/associations/one_linked_proxy_spec.rb", "spec/ripple/associations/proxy_spec.rb", "spec/ripple/associations_spec.rb", "spec/ripple/attribute_methods_spec.rb", "spec/ripple/bucket_access_spec.rb", "spec/ripple/callbacks_spec.rb", "spec/ripple/conversion_spec.rb", "spec/ripple/core_ext_spec.rb", "spec/ripple/document_spec.rb", "spec/ripple/embedded_document/finders_spec.rb", "spec/ripple/embedded_document/persistence_spec.rb", "spec/ripple/embedded_document_spec.rb", "spec/ripple/finders_spec.rb", "spec/ripple/inspection_spec.rb", "spec/ripple/key_spec.rb", "spec/ripple/persistence_spec.rb", "spec/ripple/properties_spec.rb", "spec/ripple/ripple_spec.rb", "spec/ripple/timestamps_spec.rb", "spec/ripple/validations_spec.rb", "spec/spec_helper.rb", "spec/support/associations/proxies.rb", "spec/support/mocks.rb", "spec/support/models/address.rb", "spec/support/models/box.rb", "spec/support/models/car.rb", "spec/support/models/cardboard_box.rb", "spec/support/models/clock.rb", "spec/support/models/customer.rb", "spec/support/models/driver.rb", "spec/support/models/email.rb", "spec/support/models/engine.rb", "spec/support/models/family.rb", "spec/support/models/favorite.rb", "spec/support/models/invoice.rb", "spec/support/models/late_invoice.rb", "spec/support/models/note.rb", "spec/support/models/page.rb", "spec/support/models/paid_invoice.rb", "spec/support/models/passenger.rb", "spec/support/models/seat.rb", "spec/support/models/tasks.rb", "spec/support/models/tree.rb", "spec/support/models/user.rb", "spec/support/models/wheel.rb", "spec/support/models/widget.rb", "spec/support/test_server.rb", "spec/support/test_server.yml.example"]
@@ -22,18 +22,18 @@ Gem::Specification.new do |s|
22
22
 
23
23
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
24
24
  s.add_development_dependency(%q<rspec>, ["~> 2.0.0"])
25
- s.add_runtime_dependency(%q<riak-client>, ["~> 0.8.3"])
25
+ s.add_runtime_dependency(%q<riak-client>, ["~> 0.9.0.beta"])
26
26
  s.add_runtime_dependency(%q<activesupport>, ["~> 3.0.0"])
27
27
  s.add_runtime_dependency(%q<activemodel>, ["~> 3.0.0"])
28
28
  else
29
29
  s.add_dependency(%q<rspec>, ["~> 2.0.0"])
30
- s.add_dependency(%q<riak-client>, ["~> 0.8.3"])
30
+ s.add_dependency(%q<riak-client>, ["~> 0.9.0.beta"])
31
31
  s.add_dependency(%q<activesupport>, ["~> 3.0.0"])
32
32
  s.add_dependency(%q<activemodel>, ["~> 3.0.0"])
33
33
  end
34
34
  else
35
35
  s.add_dependency(%q<rspec>, ["~> 2.0.0"])
36
- s.add_dependency(%q<riak-client>, ["~> 0.8.3"])
36
+ s.add_dependency(%q<riak-client>, ["~> 0.9.0.beta"])
37
37
  s.add_dependency(%q<activesupport>, ["~> 3.0.0"])
38
38
  s.add_dependency(%q<activemodel>, ["~> 3.0.0"])
39
39
  end
@@ -35,8 +35,8 @@ describe Ripple::Callbacks do
35
35
  before :each do
36
36
  response = {:headers => {"content-type" => ["application/json"]}, :body => "{}"}
37
37
  @client = Ripple.client
38
- @http = mock("HTTP Backend", :get => response, :put => response, :post => response, :delete => response)
39
- @client.stub!(:http).and_return(@http)
38
+ @backend = mock("Backend", :store_object => true)
39
+ @client.stub!(:backend).and_return(@backend)
40
40
  $pinger = mock("callback verifier")
41
41
  end
42
42
 
@@ -76,7 +76,7 @@ describe Ripple::Callbacks do
76
76
  @box = Box.new
77
77
  @box.destroy
78
78
  end
79
-
79
+
80
80
  describe "validation callbacks" do
81
81
  it "should call validation callbacks" do
82
82
  Box.before_validation { $pinger.ping }
@@ -85,7 +85,7 @@ describe Ripple::Callbacks do
85
85
  @box = Box.new
86
86
  @box.valid?
87
87
  end
88
-
88
+
89
89
  it "should call validation callbacks only if the document is new" do
90
90
  Box.before_validation(:on => :create) { $pinger.ping }
91
91
  Box.after_validation(:on => :create) { $pinger.ping }
@@ -101,7 +101,7 @@ describe Ripple::Callbacks do
101
101
  @box = Box.new
102
102
  @box.valid?
103
103
  end
104
-
104
+
105
105
  it "should call validation callbacks only if the document is not new" do
106
106
  Box.before_validation(:on => :update) { $pinger.ping }
107
107
  Box.after_validation(:on => :update) { $pinger.ping }
@@ -33,5 +33,4 @@ describe Ripple::EmbeddedDocument::Finders do
33
33
  it "should use self if being called from a class including Ripple::EmbeddedDocument and _type is not present" do
34
34
  Address.instantiate({}).class.should == Address
35
35
  end
36
-
37
36
  end
@@ -18,11 +18,12 @@ describe Ripple::Document::Finders do
18
18
  require 'support/models/cardboard_box'
19
19
 
20
20
  before :each do
21
- @http = mock("HTTP Backend")
21
+ @backend = mock("Backend")
22
22
  @client = Ripple.client
23
- @client.stub!(:http).and_return(@http)
24
- @bucket = Riak::Bucket.new(@client, "boxes")
25
- Box.stub!(:bucket).and_return(@bucket)
23
+ @client.stub!(:backend).and_return(@backend)
24
+ @bucket = Ripple.client.bucket("boxes")
25
+ @plain = Riak::RObject.new(@bucket, "square"){|o| o.content_type = "application/json"; o.raw_data = '{"shape":"square"}'}
26
+ @cb = Riak::RObject.new(@bucket, "rectangle"){|o| o.content_type = "application/json"; o.raw_data = '{"shape":"rectangle"}'}
26
27
  end
27
28
 
28
29
  it "should return nil if no keys are passed to find" do
@@ -39,8 +40,12 @@ describe Ripple::Document::Finders do
39
40
  end
40
41
 
41
42
  describe "finding single documents" do
43
+ before do
44
+ @bucket.stub!(:get).with("square", {}).and_return(@plain)
45
+ end
46
+
42
47
  it "should find a single document by key and assign its attributes" do
43
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
48
+ @bucket.should_receive(:get).with("square", {}).and_return(@plain)
44
49
  box = Box.find("square")
45
50
  box.should be_kind_of(Box)
46
51
  box.shape.should == "square"
@@ -67,50 +72,48 @@ describe Ripple::Document::Finders do
67
72
  end
68
73
 
69
74
  it "should not raise an exception when finding an existing document with find!" do
70
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
71
75
  lambda { Box.find!("square") }.should_not raise_error(Ripple::DocumentNotFound)
72
76
  end
73
77
 
74
78
  it "should raise an exception when finding an existing document that has properties we don't know about" do
75
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"non_existent_property":"whatever"}'})
79
+ @plain.raw_data = '{"non_existent_property":"whatever"}'
76
80
  lambda { Box.find("square") }.should raise_error
77
81
  end
78
82
 
79
83
  it "should return the document when calling find!" do
80
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
81
84
  box = Box.find!("square")
82
85
  box.should be_kind_of(Box)
83
86
  end
84
87
 
85
88
  it "should return nil when no object exists at that key" do
86
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
89
+ @bucket.should_receive(:get).with("square", {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
87
90
  box = Box.find("square")
88
91
  box.should be_nil
89
92
  end
90
93
 
91
94
  it "should raise DocumentNotFound when using find! if no object exists at that key" do
92
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
95
+ @bucket.should_receive(:get).with("square", {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
93
96
  lambda { Box.find!("square") }.should raise_error(Ripple::DocumentNotFound, "Couldn't find document with key: square")
94
97
  end
95
98
 
96
99
  it "should re-raise the failed request exception if not a 404" do
97
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_raise(Riak::FailedRequest.new(:get, 200, 500, {}, "500 internal server error"))
100
+ @bucket.should_receive(:get).with("square", {}).and_raise(Riak::FailedRequest.new(:get, 200, 500, {}, "500 internal server error"))
98
101
  lambda { Box.find("square") }.should raise_error(Riak::FailedRequest)
99
102
  end
100
103
 
101
104
  it "should handle a key with a nil value" do
102
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => nil})
105
+ @plain.raw_data = nil
106
+ @plain.data = nil
103
107
  box = Box.find("square")
104
108
  box.should be_kind_of(Box)
105
109
  box.key.should == "square"
106
110
  end
107
-
108
111
  end
109
112
 
110
113
  describe "finding multiple documents" do
111
114
  it "should find multiple documents by the keys" do
112
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
113
- @http.should_receive(:get).with(200, "/riak/", "boxes", "rectangle", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"rectangle"}'})
115
+ @bucket.should_receive(:get).with("square", {}).and_return(@plain)
116
+ @bucket.should_receive(:get).with("rectangle", {}).and_return(@cb)
114
117
  boxes = Box.find("square", "rectangle")
115
118
  boxes.should have(2).items
116
119
  boxes.first.shape.should == "square"
@@ -119,8 +122,8 @@ describe Ripple::Document::Finders do
119
122
 
120
123
  describe "when using find with missing keys" do
121
124
  before :each do
122
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
123
- @http.should_receive(:get).with(200, "/riak/", "boxes", "rectangle", {}, {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
125
+ @bucket.should_receive(:get).with("square", {}).and_return(@plain)
126
+ @bucket.should_receive(:get).with("rectangle", {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
124
127
  end
125
128
 
126
129
  it "should return nil for documents that no longer exist" do
@@ -139,8 +142,8 @@ describe Ripple::Document::Finders do
139
142
  describe "finding all documents in the bucket" do
140
143
  it "should load all objects in the bucket" do
141
144
  @bucket.should_receive(:keys).and_return(["square", "rectangle"])
142
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
143
- @http.should_receive(:get).with(200, "/riak/", "boxes", "rectangle", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"rectangle"}'})
145
+ @bucket.should_receive(:get).with("square", {}).and_return(@plain)
146
+ @bucket.should_receive(:get).with("rectangle", {}).and_return(@cb)
144
147
  boxes = Box.all
145
148
  boxes.should have(2).items
146
149
  boxes.first.shape.should == "square"
@@ -149,29 +152,17 @@ describe Ripple::Document::Finders do
149
152
 
150
153
  it "should exclude objects that are not found" do
151
154
  @bucket.should_receive(:keys).and_return(["square", "rectangle"])
152
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
153
- @http.should_receive(:get).with(200, "/riak/", "boxes", "rectangle", {}, {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
155
+ @bucket.should_receive(:get).with("square", {}).and_return(@plain)
156
+ @bucket.should_receive(:get).with("rectangle", {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
154
157
  boxes = Box.all
155
158
  boxes.should have(1).item
156
159
  boxes.first.shape.should == "square"
157
160
  end
158
161
 
159
- it "should yield found objects to the passed block and return an empty array" do
160
- @bucket.should_receive(:keys).and_yield(["square"]).and_yield(["rectangle"])
161
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
162
- @http.should_receive(:get).with(200, "/riak/", "boxes", "rectangle", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"rectangle"}'})
163
- @block = mock()
164
- @block.should_receive(:ping).twice
165
- Box.all do |box|
166
- @block.ping
167
- ["square", "rectangle"].should include(box.shape)
168
- end.should == []
169
- end
170
-
171
162
  it "should yield found objects to the passed block, excluding missing objects, and return an empty array" do
172
163
  @bucket.should_receive(:keys).and_yield(["square"]).and_yield(["rectangle"])
173
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
174
- @http.should_receive(:get).with(200, "/riak/", "boxes", "rectangle", {}, {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
164
+ @bucket.should_receive(:get).with("square", {}).and_return(@plain)
165
+ @bucket.should_receive(:get).with("rectangle", {}).and_raise(Riak::FailedRequest.new(:get, 200, 404, {}, "404 not found"))
175
166
  @block = mock()
176
167
  @block.should_receive(:ping).once
177
168
  Box.all do |box|
@@ -183,8 +174,9 @@ describe Ripple::Document::Finders do
183
174
 
184
175
  describe "single-bucket inheritance" do
185
176
  it "should instantiate as the proper type if defined in the document" do
186
- @http.should_receive(:get).with(200, "/riak/", "boxes", "square", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"square"}'})
187
- @http.should_receive(:get).with(200, "/riak/", "boxes", "rectangle", {}, {}).and_return({:code => 200, :headers => {"content-type" => ["application/json"]}, :body => '{"shape":"rectangle", "_type":"CardboardBox"}'})
177
+ @cb.raw_data = '{"shape":"rectangle", "_type":"CardboardBox"}'
178
+ @bucket.should_receive(:get).with("square", {}).and_return(@plain)
179
+ @bucket.should_receive(:get).with("rectangle", {}).and_return(@cb)
188
180
  boxes = Box.find("square", "rectangle")
189
181
  boxes.should have(2).items
190
182
  boxes.first.class.should == Box
@@ -17,17 +17,21 @@ describe Ripple::Document::Persistence do
17
17
  require 'support/models/widget'
18
18
 
19
19
  before :each do
20
- @http = mock("HTTP Backend")
20
+ @backend = mock("Backend")
21
21
  @client = Ripple.client
22
- @client.stub!(:http).and_return(@http)
23
- @bucket = Riak::Bucket.new(@client, "widgets")
24
- @client.stub!(:[]).and_return(@bucket)
22
+ @client.stub!(:backend).and_return(@backend)
23
+ @bucket = Ripple.client.bucket("widgets")
25
24
  @widget = Widget.new(:size => 1000)
26
25
  end
27
26
 
28
27
  it "should save a new object to Riak" do
29
28
  json = @widget.attributes.merge("_type" => "Widget").to_json
30
- @http.should_receive(:post).with(201, "/riak/", "widgets", an_instance_of(Hash), json, hash_including("Content-Type" => "application/json")).and_return(:code => 201, :headers => {'location' => ["/riak/widgets/new_widget"]})
29
+ @backend.should_receive(:store_object) do |obj, _, _, _|
30
+ obj.raw_data.should == json
31
+ obj.key.should be_nil
32
+ # Simulate loading the response with the key
33
+ obj.key = "new_widget"
34
+ end
31
35
  @widget.save
32
36
  @widget.key.should == "new_widget"
33
37
  @widget.should_not be_a_new_record
@@ -36,7 +40,12 @@ describe Ripple::Document::Persistence do
36
40
 
37
41
  it "should modify attributes and save a new object" do
38
42
  json = @widget.attributes.merge("_type" => "Widget", "size" => 5).to_json
39
- @http.should_receive(:post).with(201, "/riak/", "widgets", an_instance_of(Hash), json, hash_including("Content-Type" => "application/json")).and_return(:code => 201, :headers => {'location' => ["/riak/widgets/new_widget"]})
43
+ @backend.should_receive(:store_object) do |obj, _, _, _|
44
+ obj.raw_data.should == json
45
+ obj.key.should be_nil
46
+ # Simulate loading the response with the key
47
+ obj.key = "new_widget"
48
+ end
40
49
  @widget.update_attributes(:size => 5)
41
50
  @widget.key.should == "new_widget"
42
51
  @widget.should_not be_a_new_record
@@ -45,7 +54,12 @@ describe Ripple::Document::Persistence do
45
54
 
46
55
  it "should modify a single attribute and save a new object" do
47
56
  json = @widget.attributes.merge("_type" => "Widget", "size" => 5).to_json
48
- @http.should_receive(:post).with(201, "/riak/", "widgets", an_instance_of(Hash), json, hash_including("Content-Type" => "application/json")).and_return(:code => 201, :headers => {'location' => ["/riak/widgets/new_widget"]})
57
+ @backend.should_receive(:store_object) do |obj, _, _, _|
58
+ obj.raw_data.should == json
59
+ obj.key.should be_nil
60
+ # Simulate loading the response with the key
61
+ obj.key = "new_widget"
62
+ end
49
63
  @widget.update_attribute(:size, 5)
50
64
  @widget.key.should == "new_widget"
51
65
  @widget.should_not be_a_new_record
@@ -55,7 +69,12 @@ describe Ripple::Document::Persistence do
55
69
 
56
70
  it "should instantiate and save a new object to riak" do
57
71
  json = @widget.attributes.merge(:size => 10, :shipped_at => "Sat, 01 Jan 2000 20:15:01 -0000", :_type => 'Widget').to_json
58
- @http.should_receive(:post).with(201, "/riak/", "widgets", an_instance_of(Hash), json, hash_including("Content-Type" => "application/json")).and_return(:code => 201, :headers => {'location' => ["/riak/widgets/new_widget"]})
72
+ @backend.should_receive(:store_object) do |obj, _, _, _|
73
+ obj.raw_data.should == json
74
+ obj.key.should be_nil
75
+ # Simulate loading the response with the key
76
+ obj.key = "new_widget"
77
+ end
59
78
  @widget = Widget.create(:size => 10, :shipped_at => Time.utc(2000,"jan",1,20,15,1))
60
79
  @widget.size.should == 10
61
80
  @widget.shipped_at.should == Time.utc(2000,"jan",1,20,15,1)
@@ -64,7 +83,12 @@ describe Ripple::Document::Persistence do
64
83
 
65
84
  it "should instantiate and save a new object to riak and allow its attributes to be set via a block" do
66
85
  json = @widget.attributes.merge(:size => 10, :_type => 'Widget').to_json
67
- @http.should_receive(:post).with(201, "/riak/", "widgets", an_instance_of(Hash), json, hash_including("Content-Type" => "application/json")).and_return(:code => 201, :headers => {'location' => ["/riak/widgets/new_widget"]})
86
+ @backend.should_receive(:store_object) do |obj, _, _, _|
87
+ obj.raw_data.should == json
88
+ obj.key.should be_nil
89
+ # Simulate loading the response with the key
90
+ obj.key = "new_widget"
91
+ end
68
92
  @widget = Widget.create do |widget|
69
93
  widget.size = 10
70
94
  end
@@ -74,9 +98,17 @@ describe Ripple::Document::Persistence do
74
98
 
75
99
  it "should reload a saved object" do
76
100
  json = @widget.attributes.merge(:_type => "Widget").to_json
77
- @http.should_receive(:post).with(201, "/riak/", "widgets", an_instance_of(Hash), json, hash_including("Content-Type" => "application/json")).and_return(:code => 201, :headers => {'location' => ["/riak/widgets/new_widget"]})
101
+ @backend.should_receive(:store_object) do |obj, _, _, _|
102
+ obj.raw_data.should == json
103
+ obj.key.should be_nil
104
+ # Simulate loading the response with the key
105
+ obj.key = "new_widget"
106
+ end
78
107
  @widget.save
79
- @http.should_receive(:get).and_return(:code => 200, :headers => {'content-type' => ["application/json"]}, :body => '{"name":"spring","size":10,"shipped_at":"Sat, 01 Jan 2000 20:15:01 -0000","_type":"Widget"}')
108
+ @backend.should_receive(:reload_object) do |obj, _|
109
+ obj.key.should == "new_widget"
110
+ obj.raw_data = '{"name":"spring","size":10,"shipped_at":"Sat, 01 Jan 2000 20:15:01 -0000","_type":"Widget"}'
111
+ end
80
112
  @widget.reload
81
113
  @widget.changes.should be_blank
82
114
  @widget.name.should == "spring"
@@ -85,9 +117,11 @@ describe Ripple::Document::Persistence do
85
117
  end
86
118
 
87
119
  it "should destroy a saved object" do
88
- @http.should_receive(:post).and_return(:code => 201, :headers => {'location' => ["/riak/widgets/new_widget"]})
120
+ @backend.should_receive(:store_object).and_return(true)
121
+ @widget.key = "foo"
89
122
  @widget.save
90
- @http.should_receive(:delete).and_return(:code => 204, :headers => {})
123
+ @widget.should_not be_new
124
+ @backend.should_receive(:delete_object).and_return(true)
91
125
  @widget.destroy.should be_true
92
126
  @widget.should be_frozen
93
127
  end
@@ -99,7 +133,7 @@ describe Ripple::Document::Persistence do
99
133
  end
100
134
 
101
135
  it "should freeze an unsaved object when destroying" do
102
- @http.should_not_receive(:delete)
136
+ @backend.should_not_receive(:delete_object)
103
137
  @widget.destroy.should be_true
104
138
  @widget.should be_frozen
105
139
  end
@@ -115,11 +149,13 @@ describe Ripple::Document::Persistence do
115
149
 
116
150
  it "should store the _type field as the class name" do
117
151
  json = @cog.attributes.merge("_type" => "Cog").to_json
118
- @http.should_receive(:post).and_return(:code => 201, :headers => {'location' => ["/riak/widgets/new_widget"]})
152
+ @backend.should_receive(:store_object) do |obj, _, _, _|
153
+ obj.raw_data.should == json
154
+ obj.key = "new_widget"
155
+ end
119
156
  @cog.save
120
157
  @cog.should_not be_new_record
121
158
  end
122
-
123
159
  end
124
160
 
125
161
  describe "modifying the default quorum values" do
@@ -20,8 +20,8 @@ describe Ripple::Timestamps do
20
20
  before :each do
21
21
  response = {:headers => {"content-type" => ["application/json"]}, :body => "{}"}
22
22
  @client = Ripple.client
23
- @http = mock("HTTP Backend", :get => response, :put => response, :post => response, :delete => response)
24
- @client.stub!(:http).and_return(@http)
23
+ @backend = mock("Backend", :store_object => true)
24
+ @client.stub!(:backend).and_return(@backend)
25
25
  @clock = Clock.new
26
26
  end
27
27
 
@@ -51,6 +51,5 @@ describe Ripple::Timestamps do
51
51
  start = @clock.updated_at
52
52
  @clock.save
53
53
  @clock.updated_at.should > start
54
- end
55
-
54
+ end
56
55
  end
@@ -18,6 +18,8 @@ describe Ripple::Validations do
18
18
 
19
19
  before :each do
20
20
  @box = Box.new
21
+ @client = Ripple.client
22
+ @client.stub!(:backend).and_return(mock("Backend", :store_object => true))
21
23
  end
22
24
 
23
25
  it "should add validation declarations to the class" do
@@ -103,6 +105,5 @@ describe Ripple::Validations do
103
105
 
104
106
  after :each do
105
107
  Box.reset_callbacks(:validate)
106
- end
107
-
108
+ end
108
109
  end
data/spec/spec_helper.rb CHANGED
@@ -21,7 +21,7 @@ require 'rspec'
21
21
 
22
22
  Dir[File.join(File.dirname(__FILE__), "support", "*.rb")].each {|f| require f }
23
23
 
24
- Rspec.configure do |config|
24
+ RSpec.configure do |config|
25
25
  config.mock_with :rspec
26
26
  config.after(:each) do
27
27
  $test_server.recycle if $test_server
metadata CHANGED
@@ -1,12 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ripple
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 31098121
5
+ prerelease: true
5
6
  segments:
6
7
  - 0
7
- - 8
8
- - 3
9
- version: 0.8.3
8
+ - 9
9
+ - 0
10
+ - beta
11
+ version: 0.9.0.beta
10
12
  platform: ruby
11
13
  authors:
12
14
  - Sean Cribbs
@@ -14,7 +16,7 @@ autorequire:
14
16
  bindir: bin
15
17
  cert_chain: []
16
18
 
17
- date: 2010-12-13 00:00:00 -06:00
19
+ date: 2010-12-29 00:00:00 -06:00
18
20
  default_executable:
19
21
  dependencies:
20
22
  - !ruby/object:Gem::Dependency
@@ -25,6 +27,7 @@ dependencies:
25
27
  requirements:
26
28
  - - ~>
27
29
  - !ruby/object:Gem::Version
30
+ hash: 15
28
31
  segments:
29
32
  - 2
30
33
  - 0
@@ -40,11 +43,13 @@ dependencies:
40
43
  requirements:
41
44
  - - ~>
42
45
  - !ruby/object:Gem::Version
46
+ hash: 31098121
43
47
  segments:
44
48
  - 0
45
- - 8
46
- - 3
47
- version: 0.8.3
49
+ - 9
50
+ - 0
51
+ - beta
52
+ version: 0.9.0.beta
48
53
  type: :runtime
49
54
  version_requirements: *id002
50
55
  - !ruby/object:Gem::Dependency
@@ -55,6 +60,7 @@ dependencies:
55
60
  requirements:
56
61
  - - ~>
57
62
  - !ruby/object:Gem::Version
63
+ hash: 7
58
64
  segments:
59
65
  - 3
60
66
  - 0
@@ -70,6 +76,7 @@ dependencies:
70
76
  requirements:
71
77
  - - ~>
72
78
  - !ruby/object:Gem::Version
79
+ hash: 7
73
80
  segments:
74
81
  - 3
75
82
  - 0
@@ -208,17 +215,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
208
215
  requirements:
209
216
  - - ">="
210
217
  - !ruby/object:Gem::Version
218
+ hash: 3
211
219
  segments:
212
220
  - 0
213
221
  version: "0"
214
222
  required_rubygems_version: !ruby/object:Gem::Requirement
215
223
  none: false
216
224
  requirements:
217
- - - ">="
225
+ - - ">"
218
226
  - !ruby/object:Gem::Version
227
+ hash: 25
219
228
  segments:
220
- - 0
221
- version: "0"
229
+ - 1
230
+ - 3
231
+ - 1
232
+ version: 1.3.1
222
233
  requirements: []
223
234
 
224
235
  rubyforge_project: