ripple 0.8.3 → 0.9.0.beta

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.
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: