ripple 0.9.5 → 1.0.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/.gitignore +32 -0
- data/Gemfile +10 -9
- data/Guardfile +15 -0
- data/Rakefile +11 -40
- data/lib/rails/generators/ripple/configuration/configuration_generator.rb +0 -13
- data/lib/rails/generators/ripple/configuration/templates/ripple.yml +4 -4
- data/lib/rails/generators/ripple/js/js_generator.rb +0 -13
- data/lib/rails/generators/ripple/js/templates/js/contrib.js +0 -17
- data/lib/rails/generators/ripple/js/templates/js/ripple.js +0 -13
- data/lib/rails/generators/ripple/model/model_generator.rb +0 -14
- data/lib/rails/generators/ripple/model/templates/model.rb +1 -1
- data/lib/rails/generators/ripple/observer/observer_generator.rb +0 -14
- data/lib/rails/generators/ripple/test/test_generator.rb +7 -19
- data/lib/rails/generators/ripple_generator.rb +1 -14
- data/lib/ripple.rb +7 -14
- data/lib/ripple/associations.rb +129 -26
- data/lib/ripple/associations/embedded.rb +1 -15
- data/lib/ripple/associations/instantiators.rb +0 -13
- data/lib/ripple/associations/linked.rb +41 -19
- data/lib/ripple/associations/many.rb +0 -14
- data/lib/ripple/associations/many_embedded_proxy.rb +0 -14
- data/lib/ripple/associations/many_linked_proxy.rb +39 -18
- data/lib/ripple/associations/many_reference_proxy.rb +93 -0
- data/lib/ripple/associations/many_stored_key_proxy.rb +76 -0
- data/lib/ripple/associations/one.rb +1 -15
- data/lib/ripple/associations/one_embedded_proxy.rb +0 -14
- data/lib/ripple/associations/one_key_proxy.rb +58 -0
- data/lib/ripple/associations/one_linked_proxy.rb +4 -14
- data/lib/ripple/associations/one_stored_key_proxy.rb +43 -0
- data/lib/ripple/associations/proxy.rb +8 -14
- data/lib/ripple/attribute_methods.rb +19 -17
- data/lib/ripple/attribute_methods/dirty.rb +19 -15
- data/lib/ripple/attribute_methods/query.rb +0 -14
- data/lib/ripple/attribute_methods/read.rb +0 -14
- data/lib/ripple/attribute_methods/write.rb +0 -14
- data/lib/ripple/callbacks.rb +10 -16
- data/lib/ripple/conflict/basic_resolver.rb +82 -0
- data/lib/ripple/conflict/document_hooks.rb +20 -0
- data/lib/ripple/conflict/resolver.rb +71 -0
- data/lib/ripple/conflict/test_helper.rb +33 -0
- data/lib/ripple/conversion.rb +0 -14
- data/lib/ripple/core_ext.rb +1 -14
- data/lib/ripple/core_ext/casting.rb +19 -19
- data/lib/ripple/core_ext/object.rb +8 -0
- data/lib/ripple/document.rb +21 -16
- data/lib/ripple/document/bucket_access.rb +0 -14
- data/lib/ripple/document/finders.rb +17 -23
- data/lib/ripple/document/key.rb +8 -28
- data/lib/ripple/document/link.rb +30 -0
- data/lib/ripple/document/persistence.rb +12 -20
- data/lib/ripple/embedded_document.rb +10 -15
- data/lib/ripple/embedded_document/around_callbacks.rb +18 -0
- data/lib/ripple/embedded_document/finders.rb +7 -18
- data/lib/ripple/embedded_document/persistence.rb +5 -17
- data/lib/ripple/i18n.rb +0 -14
- data/lib/ripple/inspection.rb +21 -15
- data/lib/ripple/locale/en.yml +9 -13
- data/lib/ripple/nested_attributes.rb +33 -39
- data/lib/ripple/observable.rb +0 -13
- data/lib/ripple/properties.rb +1 -14
- data/lib/ripple/property_type_mismatch.rb +0 -14
- data/lib/ripple/railtie.rb +4 -14
- data/lib/ripple/railties/ripple.rake +86 -0
- data/lib/ripple/serialization.rb +11 -11
- data/lib/ripple/test_server.rb +36 -0
- data/lib/ripple/timestamps.rb +0 -13
- data/lib/ripple/translation.rb +4 -14
- data/lib/ripple/validations.rb +1 -15
- data/lib/ripple/validations/associated_validator.rb +26 -17
- data/lib/ripple/version.rb +3 -0
- data/ripple.gemspec +24 -35
- data/spec/integration/ripple/associations_spec.rb +89 -58
- data/spec/integration/ripple/conflict_resolution_spec.rb +298 -0
- data/spec/integration/ripple/nested_attributes_spec.rb +19 -19
- data/spec/integration/ripple/persistence_spec.rb +15 -34
- data/spec/integration/ripple/search_associations_spec.rb +31 -0
- data/spec/ripple/associations/many_embedded_proxy_spec.rb +23 -36
- data/spec/ripple/associations/many_linked_proxy_spec.rb +133 -45
- data/spec/ripple/associations/many_reference_proxy_spec.rb +170 -0
- data/spec/ripple/associations/many_stored_key_proxy_spec.rb +158 -0
- data/spec/ripple/associations/one_embedded_proxy_spec.rb +24 -37
- data/spec/ripple/associations/one_key_proxy_spec.rb +82 -0
- data/spec/ripple/associations/one_linked_proxy_spec.rb +22 -23
- data/spec/ripple/associations/one_stored_key_proxy_spec.rb +72 -0
- data/spec/ripple/associations/proxy_spec.rb +21 -15
- data/spec/ripple/associations_spec.rb +54 -23
- data/spec/ripple/attribute_methods/dirty_spec.rb +56 -5
- data/spec/ripple/attribute_methods_spec.rb +47 -21
- data/spec/ripple/bucket_access_spec.rb +4 -17
- data/spec/ripple/callbacks_spec.rb +52 -15
- data/spec/ripple/conflict/resolver_spec.rb +42 -0
- data/spec/ripple/conversion_spec.rb +2 -15
- data/spec/ripple/core_ext_spec.rb +12 -15
- data/spec/ripple/document/link_spec.rb +67 -0
- data/spec/ripple/document_spec.rb +34 -19
- data/spec/ripple/embedded_document/finders_spec.rb +12 -19
- data/spec/ripple/embedded_document/persistence_spec.rb +20 -26
- data/spec/ripple/embedded_document_spec.rb +44 -34
- data/spec/ripple/finders_spec.rb +58 -29
- data/spec/ripple/inspection_spec.rb +40 -37
- data/spec/ripple/key_spec.rb +5 -17
- data/spec/ripple/observable_spec.rb +3 -16
- data/spec/ripple/persistence_spec.rb +134 -18
- data/spec/ripple/properties_spec.rb +21 -15
- data/spec/ripple/ripple_spec.rb +1 -14
- data/spec/ripple/serialization_spec.rb +16 -17
- data/spec/ripple/timestamps_spec.rb +73 -52
- data/spec/ripple/validations/associated_validator_spec.rb +69 -25
- data/spec/ripple/validations_spec.rb +3 -16
- data/spec/spec_helper.rb +17 -18
- data/spec/support/associations.rb +1 -1
- data/spec/support/associations/proxies.rb +0 -13
- data/spec/support/integration_setup.rb +11 -0
- data/spec/support/mocks.rb +0 -13
- data/spec/support/models.rb +33 -2
- data/spec/support/models/address.rb +1 -16
- data/spec/support/models/box.rb +7 -14
- data/spec/support/models/car.rb +27 -1
- data/spec/support/models/cardboard_box.rb +0 -14
- data/spec/support/models/clock.rb +6 -15
- data/spec/support/models/clock_observer.rb +0 -14
- data/spec/support/models/credit_card.rb +5 -0
- data/spec/support/models/customer.rb +0 -14
- data/spec/support/models/email.rb +0 -14
- data/spec/support/models/family.rb +1 -13
- data/spec/support/models/favorite.rb +0 -14
- data/spec/support/models/invoice.rb +0 -14
- data/spec/support/models/late_invoice.rb +0 -14
- data/spec/support/models/nested.rb +12 -0
- data/spec/support/models/ninja.rb +7 -0
- data/spec/support/models/note.rb +0 -14
- data/spec/support/models/page.rb +1 -15
- data/spec/support/models/paid_invoice.rb +0 -14
- data/spec/support/models/post.rb +12 -0
- data/spec/support/models/profile.rb +7 -0
- data/spec/support/models/subscription.rb +26 -0
- data/spec/support/models/tasks.rb +0 -18
- data/spec/support/models/team.rb +11 -0
- data/spec/support/models/transactions.rb +17 -0
- data/spec/support/models/tree.rb +2 -16
- data/spec/support/models/user.rb +14 -16
- data/spec/support/models/widget.rb +8 -14
- data/spec/support/search.rb +14 -0
- data/spec/support/test_server.rb +22 -12
- data/spec/support/test_server.yml.example +14 -2
- metadata +223 -59
- data/lib/rails/generators/ripple/test/templates/test_server.rb +0 -46
- data/spec/support/models/driver.rb +0 -5
- data/spec/support/models/engine.rb +0 -4
- data/spec/support/models/passenger.rb +0 -5
- data/spec/support/models/seat.rb +0 -4
- data/spec/support/models/wheel.rb +0 -5
|
@@ -1,36 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
#
|
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
# you may not use this file except in compliance with the License.
|
|
5
|
-
# You may obtain a copy of the License at
|
|
6
|
-
#
|
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
#
|
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
# See the License for the specific language governing permissions and
|
|
13
|
-
# limitations under the License.
|
|
14
|
-
require File.expand_path("../../../spec_helper", __FILE__)
|
|
1
|
+
require 'spec_helper'
|
|
15
2
|
|
|
16
3
|
describe Ripple::EmbeddedDocument::Finders do
|
|
17
|
-
require 'support/models/address'
|
|
18
|
-
require 'support/models/favorite'
|
|
4
|
+
# require 'support/models/address'
|
|
5
|
+
# require 'support/models/favorite'
|
|
19
6
|
|
|
20
7
|
before :each do
|
|
21
|
-
@
|
|
8
|
+
@address = Address.new
|
|
22
9
|
end
|
|
23
10
|
|
|
24
11
|
it "should instantiate a document" do
|
|
25
12
|
Address.stub!(:new).and_return(@address)
|
|
26
13
|
Address.instantiate('_type' => 'Address').should == @address
|
|
27
14
|
end
|
|
28
|
-
|
|
15
|
+
|
|
29
16
|
it "should instantiate a class of _type if present in attrs" do
|
|
30
17
|
Favorite.instantiate('_type' => 'Address').class.should == Address
|
|
31
18
|
end
|
|
32
|
-
|
|
19
|
+
|
|
33
20
|
it "should use self if being called from a class including Ripple::EmbeddedDocument and _type is not present" do
|
|
34
21
|
Address.instantiate({}).class.should == Address
|
|
35
22
|
end
|
|
23
|
+
|
|
24
|
+
it 'initializes the document with no changes' do
|
|
25
|
+
a = Address.instantiate('_type' => 'Address', 'street' => 'Pine St')
|
|
26
|
+
a.should_not be_changed
|
|
27
|
+
a.changes.should be_empty
|
|
28
|
+
end
|
|
36
29
|
end
|
|
@@ -1,25 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
#
|
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
# you may not use this file except in compliance with the License.
|
|
5
|
-
# You may obtain a copy of the License at
|
|
6
|
-
#
|
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
#
|
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
# See the License for the specific language governing permissions and
|
|
13
|
-
# limitations under the License.
|
|
14
|
-
require File.expand_path("../../../spec_helper", __FILE__)
|
|
1
|
+
require 'spec_helper'
|
|
15
2
|
|
|
16
3
|
describe Ripple::EmbeddedDocument::Persistence do
|
|
17
|
-
require 'support/models/user'
|
|
18
|
-
require 'support/models/address'
|
|
19
|
-
|
|
4
|
+
# require 'support/models/user'
|
|
5
|
+
# require 'support/models/address'
|
|
6
|
+
|
|
20
7
|
before :each do
|
|
21
8
|
@root = User.new
|
|
22
|
-
@addr = Address.new(:street => "196 Broadway")
|
|
9
|
+
@addr = Address.new(:street => "196 Broadway", :kind => "Home")
|
|
23
10
|
@addr._parent_document = @root
|
|
24
11
|
end
|
|
25
12
|
|
|
@@ -32,17 +19,17 @@ describe Ripple::EmbeddedDocument::Persistence do
|
|
|
32
19
|
@root.should_receive(:save).and_return(true)
|
|
33
20
|
@addr.save.should be_true
|
|
34
21
|
end
|
|
35
|
-
|
|
22
|
+
|
|
36
23
|
it "should delegate save! to the root document" do
|
|
37
24
|
@root.should_receive(:save).and_return(true)
|
|
38
25
|
@addr.save!.should be_true
|
|
39
26
|
end
|
|
40
|
-
|
|
27
|
+
|
|
41
28
|
it "should raise NoRootDocument when calling save without a root document" do
|
|
42
29
|
@addr._parent_document = nil
|
|
43
30
|
lambda { @addr.save }.should raise_error(Ripple::NoRootDocument)
|
|
44
31
|
end
|
|
45
|
-
|
|
32
|
+
|
|
46
33
|
it "should raise NoRootDocument when calling save! without a root document" do
|
|
47
34
|
@addr._parent_document = nil
|
|
48
35
|
lambda { @addr.save! }.should raise_error(Ripple::NoRootDocument)
|
|
@@ -51,25 +38,32 @@ describe Ripple::EmbeddedDocument::Persistence do
|
|
|
51
38
|
it "should have a root document" do
|
|
52
39
|
@addr._root_document.should == @root
|
|
53
40
|
end
|
|
54
|
-
|
|
41
|
+
|
|
55
42
|
it "should have a parent document" do
|
|
56
43
|
@addr._parent_document.should == @root
|
|
57
44
|
end
|
|
58
|
-
|
|
45
|
+
|
|
59
46
|
it "should respond to new_record?" do
|
|
60
47
|
@addr.should respond_to(:new_record?)
|
|
61
48
|
@addr.should be_a_new_record
|
|
62
49
|
end
|
|
63
|
-
|
|
50
|
+
|
|
64
51
|
it "should respond to persisted" do
|
|
65
52
|
@addr.should respond_to(:persisted?)
|
|
66
53
|
@addr.should_not be_persisted
|
|
67
54
|
end
|
|
68
|
-
|
|
55
|
+
|
|
69
56
|
it "should properly create embedded attributes for persistence" do
|
|
70
57
|
@addr = Address.new
|
|
71
58
|
@root.addresses << @addr
|
|
72
|
-
@root.attributes_for_persistence.should == {'_type' => 'User', 'addresses' => [{'_type' => 'Address', 'street' => nil}]}
|
|
59
|
+
@root.attributes_for_persistence.should == {'_type' => 'User', 'email' => nil, 'addresses' => [{'_type' => 'Address', 'street' => nil, 'kind' => nil}]}
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "includes undefined properties in the attributes for persistence" do
|
|
63
|
+
addr = Address.new
|
|
64
|
+
addr['some_undefined_prop'] = 17
|
|
65
|
+
@root.addresses << addr
|
|
66
|
+
@root.attributes_for_persistence['addresses'].first.should include('some_undefined_prop' => 17)
|
|
73
67
|
end
|
|
74
68
|
|
|
75
69
|
it "should modify its attributes and save" do
|
|
@@ -1,21 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
#
|
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
# you may not use this file except in compliance with the License.
|
|
5
|
-
# You may obtain a copy of the License at
|
|
6
|
-
#
|
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
#
|
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
# See the License for the specific language governing permissions and
|
|
13
|
-
# limitations under the License.
|
|
14
|
-
require File.expand_path("../../spec_helper", __FILE__)
|
|
1
|
+
require 'spec_helper'
|
|
15
2
|
|
|
16
3
|
describe Ripple::EmbeddedDocument do
|
|
17
|
-
require 'support/models/address'
|
|
18
|
-
require 'support/models/user'
|
|
4
|
+
# require 'support/models/address'
|
|
5
|
+
# require 'support/models/user'
|
|
19
6
|
|
|
20
7
|
it "should have a model name when included" do
|
|
21
8
|
Address.should respond_to(:model_name)
|
|
@@ -26,9 +13,9 @@ describe Ripple::EmbeddedDocument do
|
|
|
26
13
|
Address.should be_embeddable
|
|
27
14
|
end
|
|
28
15
|
|
|
29
|
-
describe "
|
|
30
|
-
let(:user_1) { User.
|
|
31
|
-
let(:user_2) { User.
|
|
16
|
+
describe "equality" do
|
|
17
|
+
let(:user_1) { User.new {|u| u.key = "u1"} }
|
|
18
|
+
let(:user_2) { User.new {|u| u.key = "u2"} }
|
|
32
19
|
let(:street_1) { '123 Somewhere St' }
|
|
33
20
|
let(:street_2) { '123 Somewhere Ave' }
|
|
34
21
|
let(:address_1) { Address.new(:street => street_1) }
|
|
@@ -39,36 +26,59 @@ describe Ripple::EmbeddedDocument do
|
|
|
39
26
|
address_2._parent_document = user_1
|
|
40
27
|
end
|
|
41
28
|
|
|
42
|
-
|
|
29
|
+
def should_be_equal
|
|
43
30
|
(address_1 == address_2).should be_true
|
|
31
|
+
address_1.eql?(address_2).should be_true
|
|
32
|
+
|
|
44
33
|
(address_2 == address_1).should be_true
|
|
34
|
+
address_2.eql?(address_1).should be_true
|
|
35
|
+
|
|
36
|
+
address_1.hash.should == address_2.hash
|
|
45
37
|
end
|
|
46
38
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
address_1.
|
|
39
|
+
def should_not_be_equal(other_address = address_2)
|
|
40
|
+
(address_1 == other_address).should be_false
|
|
41
|
+
address_1.eql?(other_address).should be_false
|
|
50
42
|
|
|
51
|
-
(
|
|
52
|
-
(
|
|
43
|
+
(other_address == address_1).should be_false
|
|
44
|
+
address_1.eql?(other_address).should be_false
|
|
45
|
+
|
|
46
|
+
address_1.hash.should_not == other_address.hash
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
specify "two document are equal when they have the same classes, parents and attributes" do
|
|
50
|
+
should_be_equal
|
|
53
51
|
end
|
|
54
52
|
|
|
55
|
-
|
|
53
|
+
specify "two documents are not equal when the parents are different (even if the attributes and classes are the same)" do
|
|
56
54
|
address_2._parent_document = user_2
|
|
57
|
-
|
|
58
|
-
(address_2 == address_1).should be_false
|
|
55
|
+
should_not_be_equal
|
|
59
56
|
end
|
|
60
57
|
|
|
61
|
-
|
|
58
|
+
specify "two documents are not equal when the attributes are different (even if the parents and classes are the same)" do
|
|
62
59
|
address_2.street = street_2
|
|
63
|
-
|
|
64
|
-
(address_2 == address_1).should be_false
|
|
60
|
+
should_not_be_equal
|
|
65
61
|
end
|
|
66
62
|
|
|
67
|
-
|
|
63
|
+
specify "two documents are not equal when the classes are different (even if the parents and attributes are the same)" do
|
|
68
64
|
special_address = SpecialAddress.new(address_1.attributes)
|
|
69
65
|
special_address._parent_document = address_1._parent_document
|
|
70
|
-
|
|
71
|
-
(special_address
|
|
66
|
+
|
|
67
|
+
should_not_be_equal(special_address)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
specify "two documents are not equal when their embedded documents are not equal (even if they are identical otherwise)" do
|
|
71
|
+
address_1.notes << Note.new(:text => 'Bob lives here')
|
|
72
|
+
address_2.notes << Note.new(:text => 'Jill lives here')
|
|
73
|
+
|
|
74
|
+
should_not_be_equal
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
specify "two documents can be equal when their embedded doc objects are different instances but are equal" do
|
|
78
|
+
address_1.notes << Note.new(:text => 'Bob lives here')
|
|
79
|
+
address_2.notes << Note.new(:text => 'Bob lives here')
|
|
80
|
+
|
|
81
|
+
should_be_equal
|
|
72
82
|
end
|
|
73
83
|
end
|
|
74
84
|
end
|
data/spec/ripple/finders_spec.rb
CHANGED
|
@@ -1,22 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
#
|
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
# you may not use this file except in compliance with the License.
|
|
5
|
-
# You may obtain a copy of the License at
|
|
6
|
-
#
|
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
#
|
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
# See the License for the specific language governing permissions and
|
|
13
|
-
# limitations under the License.
|
|
14
|
-
require File.expand_path("../../spec_helper", __FILE__)
|
|
1
|
+
require 'spec_helper'
|
|
15
2
|
|
|
16
3
|
describe Ripple::Document::Finders do
|
|
17
|
-
require 'support/models/box'
|
|
18
|
-
require 'support/models/cardboard_box'
|
|
19
|
-
|
|
4
|
+
# require 'support/models/box'
|
|
5
|
+
# require 'support/models/cardboard_box'
|
|
6
|
+
|
|
20
7
|
before :each do
|
|
21
8
|
@backend = mock("Backend")
|
|
22
9
|
@client = Ripple.client
|
|
@@ -34,7 +21,7 @@ describe Ripple::Document::Finders do
|
|
|
34
21
|
Box.find(nil).should be_nil
|
|
35
22
|
Box.find("").should be_nil
|
|
36
23
|
end
|
|
37
|
-
|
|
24
|
+
|
|
38
25
|
it "should raise Ripple::DocumentNotFound if an empty array is passed to find!" do
|
|
39
26
|
lambda { Box.find!() }.should raise_error(Ripple::DocumentNotFound, "Couldn't find document without a key")
|
|
40
27
|
end
|
|
@@ -43,7 +30,7 @@ describe Ripple::Document::Finders do
|
|
|
43
30
|
before do
|
|
44
31
|
@bucket.stub!(:get).with("square", {}).and_return(@plain)
|
|
45
32
|
end
|
|
46
|
-
|
|
33
|
+
|
|
47
34
|
it "should find a single document by key and assign its attributes" do
|
|
48
35
|
@bucket.should_receive(:get).with("square", {}).and_return(@plain)
|
|
49
36
|
box = Box.find("square")
|
|
@@ -54,6 +41,11 @@ describe Ripple::Document::Finders do
|
|
|
54
41
|
box.should_not be_new_record
|
|
55
42
|
end
|
|
56
43
|
|
|
44
|
+
it "should have no changes after find" do
|
|
45
|
+
box = Box.find("square")
|
|
46
|
+
box.changes.should == {}
|
|
47
|
+
end
|
|
48
|
+
|
|
57
49
|
it "should find the first document using the first key with the bucket's keys" do
|
|
58
50
|
box = Box.new
|
|
59
51
|
keys = ['some_boxes_key']
|
|
@@ -110,9 +102,15 @@ describe Ripple::Document::Finders do
|
|
|
110
102
|
box.should be_kind_of(Box)
|
|
111
103
|
box.key.should == "square"
|
|
112
104
|
end
|
|
105
|
+
|
|
106
|
+
it 'initializes the document with no changed attributes' do
|
|
107
|
+
box = Box.find("square")
|
|
108
|
+
box.should_not be_changed
|
|
109
|
+
box.changes.should be_empty
|
|
110
|
+
end
|
|
113
111
|
end
|
|
114
112
|
|
|
115
|
-
describe "finding multiple documents" do
|
|
113
|
+
describe "finding multiple documents when given a splat of keys" do
|
|
116
114
|
it "should find multiple documents by the keys" do
|
|
117
115
|
@bucket.should_receive(:get).with("square", {}).and_return(@plain)
|
|
118
116
|
@bucket.should_receive(:get).with("rectangle", {}).and_return(@cb)
|
|
@@ -141,12 +139,48 @@ describe Ripple::Document::Finders do
|
|
|
141
139
|
end
|
|
142
140
|
end
|
|
143
141
|
|
|
144
|
-
describe "finding
|
|
142
|
+
describe "finding multiple documents when given an array" do
|
|
143
|
+
it "should find multiple documents by the keys" do
|
|
144
|
+
@bucket.should_receive(:get).with("square", {}).and_return(@plain)
|
|
145
|
+
@bucket.should_receive(:get).with("rectangle", {}).and_return(@cb)
|
|
146
|
+
boxes = Box.find(["square", "rectangle"])
|
|
147
|
+
boxes.should have(2).items
|
|
148
|
+
boxes.first.shape.should == "square"
|
|
149
|
+
boxes.last.shape.should == "rectangle"
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
it "should return an array of docs when given an array of one key" do
|
|
153
|
+
@bucket.should_receive(:get).with("square", {}).and_return(@plain)
|
|
154
|
+
boxes = Box.find(["square"])
|
|
155
|
+
boxes.should have(1).items
|
|
156
|
+
boxes.first.shape.should == "square"
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
it "should return an empty array when given an empty array" do
|
|
160
|
+
Box.find([ ]).should == []
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
describe "when using find with missing keys" do
|
|
164
|
+
before :each do
|
|
165
|
+
@bucket.should_receive(:get).with("square", {}).and_return(@plain)
|
|
166
|
+
@bucket.should_receive(:get).with("rectangle", {}).and_raise(Riak::HTTPFailedRequest.new(:get, 200, 404, {}, "404 not found"))
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
it "should return nil for documents that no longer exist" do
|
|
170
|
+
boxes = Box.find(["square", "rectangle"])
|
|
171
|
+
boxes.should have(2).items
|
|
172
|
+
boxes.first.shape.should == "square"
|
|
173
|
+
boxes.last.should be_nil
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
describe "listings all documents in the bucket" do
|
|
145
179
|
it "should load all objects in the bucket" do
|
|
146
180
|
@bucket.should_receive(:keys).and_return(["square", "rectangle"])
|
|
147
181
|
@bucket.should_receive(:get).with("square", {}).and_return(@plain)
|
|
148
182
|
@bucket.should_receive(:get).with("rectangle", {}).and_return(@cb)
|
|
149
|
-
boxes = Box.
|
|
183
|
+
boxes = Box.list
|
|
150
184
|
boxes.should have(2).items
|
|
151
185
|
boxes.first.shape.should == "square"
|
|
152
186
|
boxes.last.shape.should == "rectangle"
|
|
@@ -156,7 +190,7 @@ describe Ripple::Document::Finders do
|
|
|
156
190
|
@bucket.should_receive(:keys).and_return(["square", "rectangle"])
|
|
157
191
|
@bucket.should_receive(:get).with("square", {}).and_return(@plain)
|
|
158
192
|
@bucket.should_receive(:get).with("rectangle", {}).and_raise(Riak::HTTPFailedRequest.new(:get, 200, 404, {}, "404 not found"))
|
|
159
|
-
boxes = Box.
|
|
193
|
+
boxes = Box.list
|
|
160
194
|
boxes.should have(1).item
|
|
161
195
|
boxes.first.shape.should == "square"
|
|
162
196
|
end
|
|
@@ -167,16 +201,11 @@ describe Ripple::Document::Finders do
|
|
|
167
201
|
@bucket.should_receive(:get).with("rectangle", {}).and_raise(Riak::HTTPFailedRequest.new(:get, 200, 404, {}, "404 not found"))
|
|
168
202
|
@block = mock()
|
|
169
203
|
@block.should_receive(:ping).once
|
|
170
|
-
Box.
|
|
204
|
+
Box.list do |box|
|
|
171
205
|
@block.ping
|
|
172
206
|
["square", "rectangle"].should include(box.shape)
|
|
173
207
|
end.should == []
|
|
174
208
|
end
|
|
175
|
-
|
|
176
|
-
it "should pass any given options to the underlying Bucket#keys method" do
|
|
177
|
-
@bucket.should_receive(:keys).with(:reload => true).and_return([])
|
|
178
|
-
Box.all(:reload => true).should == []
|
|
179
|
-
end
|
|
180
209
|
end
|
|
181
210
|
|
|
182
211
|
describe "single-bucket inheritance" do
|
|
@@ -1,48 +1,51 @@
|
|
|
1
|
-
|
|
2
|
-
#
|
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
# you may not use this file except in compliance with the License.
|
|
5
|
-
# You may obtain a copy of the License at
|
|
6
|
-
#
|
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
#
|
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
# See the License for the specific language governing permissions and
|
|
13
|
-
# limitations under the License.
|
|
14
|
-
require File.expand_path("../../spec_helper", __FILE__)
|
|
1
|
+
require 'spec_helper'
|
|
15
2
|
|
|
16
3
|
describe Ripple::Inspection do
|
|
17
|
-
require 'support/models/box'
|
|
18
|
-
require 'support/models/address'
|
|
4
|
+
# require 'support/models/box'
|
|
5
|
+
# require 'support/models/address'
|
|
6
|
+
|
|
7
|
+
shared_examples_for 'an inspected document' do |method|
|
|
8
|
+
|
|
9
|
+
it "should include the class name in the inspect string" do
|
|
10
|
+
@box.send(method).should be_starts_with("<Box")
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should include the key in the #{method} string for documents" do
|
|
14
|
+
@box.key = "square"
|
|
15
|
+
@box.send(method).should be_starts_with("<Box:square")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should indicate a new document when no key is specified" do
|
|
19
|
+
@box.send(method).should be_starts_with("<Box:[new]")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should not display a key for embedded documents" do
|
|
23
|
+
@address.send(method).should_not include("[new]")
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
19
27
|
|
|
20
28
|
before :each do
|
|
21
29
|
@box = Box.new
|
|
22
30
|
@address = Address.new
|
|
23
31
|
end
|
|
24
|
-
|
|
25
|
-
it "should include the class name in the inspect string" do
|
|
26
|
-
@box.inspect.should be_starts_with("<Box")
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
it "should include the key in the inspect string for documents" do
|
|
30
|
-
@box.key = "square"
|
|
31
|
-
@box.inspect.should be_starts_with("<Box:square")
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
it "should indicate a new document when no key is specified" do
|
|
35
|
-
@box.inspect.should be_starts_with("<Box:[new]")
|
|
36
|
-
end
|
|
37
32
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
33
|
+
describe '#inspect' do
|
|
34
|
+
|
|
35
|
+
it_should_behave_like 'an inspected document', :inspect
|
|
36
|
+
|
|
37
|
+
it "should enumerate the document's properties and their values" do
|
|
38
|
+
@box.shape = "square"
|
|
39
|
+
@box.inspect.should include("shape=\"square\"")
|
|
40
|
+
@box.inspect.should include("created_at=")
|
|
41
|
+
@box.inspect.should include("updated_at=")
|
|
42
|
+
end
|
|
43
|
+
|
|
43
44
|
end
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
|
|
46
|
+
describe '#to_s' do
|
|
47
|
+
|
|
48
|
+
it_should_behave_like 'an inspected document', :to_s
|
|
49
|
+
|
|
47
50
|
end
|
|
48
51
|
end
|