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,20 +1,7 @@
|
|
|
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::AttributeMethods do
|
|
17
|
-
require 'support/models/widget'
|
|
4
|
+
# require 'support/models/widget'
|
|
18
5
|
|
|
19
6
|
before :each do
|
|
20
7
|
@widget = Widget.new
|
|
@@ -59,6 +46,13 @@ describe Ripple::AttributeMethods do
|
|
|
59
46
|
@widget.manufactured.should == false
|
|
60
47
|
end
|
|
61
48
|
|
|
49
|
+
it "dups the default if it is duplicable so that two document do not share the same mutable value" do
|
|
50
|
+
widget2 = Widget.new
|
|
51
|
+
@widget.name.should_not be(widget2.name)
|
|
52
|
+
widget2.name.gsub!("w", "f")
|
|
53
|
+
@widget.name.should == "widget"
|
|
54
|
+
end
|
|
55
|
+
|
|
62
56
|
it "should allow raw attribute access when accessing the document with []" do
|
|
63
57
|
@widget['name'].should == 'widget'
|
|
64
58
|
end
|
|
@@ -81,8 +75,9 @@ describe Ripple::AttributeMethods do
|
|
|
81
75
|
end
|
|
82
76
|
|
|
83
77
|
it "should allow assignment of undefined attributes when assigning to the document with []=" do
|
|
84
|
-
@widget
|
|
85
|
-
@widget
|
|
78
|
+
@widget.should_not respond_to(:shoe_size)
|
|
79
|
+
@widget['shoe_size'] = 8
|
|
80
|
+
@widget['shoe_size'].should == 8
|
|
86
81
|
end
|
|
87
82
|
|
|
88
83
|
it "should type cast assigned values automatically" do
|
|
@@ -143,8 +138,28 @@ describe Ripple::AttributeMethods do
|
|
|
143
138
|
Widget.properties.delete(:start_date) # cleanup
|
|
144
139
|
end
|
|
145
140
|
|
|
146
|
-
|
|
147
|
-
|
|
141
|
+
describe "#attributes" do
|
|
142
|
+
it "it returns a hash representation of all of the attributes" do
|
|
143
|
+
@widget.attributes.should == {"name" => "widget", "size" => nil, "manufactured" => false, "shipped_at" => nil}
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
it "does not include ghost attributes (attributes that do not have a defined property)" do
|
|
147
|
+
@widget['some_undefined_prop'] = 3.14159
|
|
148
|
+
@widget.attributes.should_not include('some_undefined_prop')
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
describe "#raw_attributes" do
|
|
153
|
+
it "returns a hash representation, including attributes for undefined properties" do
|
|
154
|
+
@widget['some_undefined_prop'] = 17
|
|
155
|
+
@widget.raw_attributes.should == {
|
|
156
|
+
'name' => 'widget',
|
|
157
|
+
'size' => nil,
|
|
158
|
+
'manufactured' => false,
|
|
159
|
+
'shipped_at' => nil,
|
|
160
|
+
'some_undefined_prop' => 17
|
|
161
|
+
}
|
|
162
|
+
end
|
|
148
163
|
end
|
|
149
164
|
|
|
150
165
|
it "should load attributes from mass assignment" do
|
|
@@ -196,9 +211,20 @@ describe Ripple::AttributeMethods do
|
|
|
196
211
|
@widget.manufactured.should be_false
|
|
197
212
|
end
|
|
198
213
|
|
|
199
|
-
it "should allow protected attributes to be mass assigned" do
|
|
214
|
+
it "should allow protected attributes to be mass assigned via raw_attributes=" do
|
|
200
215
|
@widget = Widget.new
|
|
201
|
-
@widget.send(:
|
|
216
|
+
@widget.send(:raw_attributes=, { :manufactured => true })
|
|
202
217
|
@widget.manufactured.should be_true
|
|
203
218
|
end
|
|
219
|
+
|
|
220
|
+
it "should allow mass assigning arbitrary attributes via raw_attributes" do
|
|
221
|
+
@widget = Widget.new
|
|
222
|
+
@widget.__send__(:raw_attributes=, :explode => '?BOOM')
|
|
223
|
+
@widget[:explode].should eq('?BOOM')
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
it "should raise an ArgumentError with an undefined property message when mass assigning a property that doesn't exist" do
|
|
227
|
+
lambda { @widget = Widget.new(:explode => '?BOOM') }.should raise_error(ArgumentError, %q[Undefined property :explode for class 'Widget'])
|
|
228
|
+
end
|
|
229
|
+
|
|
204
230
|
end
|
|
@@ -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.dirname(__FILE__))
|
|
1
|
+
require 'spec_helper'
|
|
15
2
|
|
|
16
3
|
describe Ripple::Document::BucketAccess do
|
|
17
|
-
require 'support/models/invoice'
|
|
18
|
-
require 'support/models/late_invoice'
|
|
19
|
-
require 'support/models/paid_invoice'
|
|
4
|
+
# require 'support/models/invoice'
|
|
5
|
+
# require 'support/models/late_invoice'
|
|
6
|
+
# require 'support/models/paid_invoice'
|
|
20
7
|
|
|
21
8
|
it "should use the plural model name as the bucket name" do
|
|
22
9
|
Invoice.bucket_name.should == "invoices"
|
|
@@ -1,20 +1,7 @@
|
|
|
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::Callbacks do
|
|
17
|
-
require 'support/models/box'
|
|
4
|
+
# require 'support/models/box'
|
|
18
5
|
|
|
19
6
|
it "should add create, update, save, and destroy callback declarations" do
|
|
20
7
|
[:save, :create, :update, :destroy].each do |event|
|
|
@@ -49,6 +36,55 @@ describe Ripple::Callbacks do
|
|
|
49
36
|
@box.save
|
|
50
37
|
end
|
|
51
38
|
|
|
39
|
+
it "propagates callbacks to embedded associated documents" do
|
|
40
|
+
Box.before_save { $pinger.ping }
|
|
41
|
+
BoxSide.before_save { $pinger.ping }
|
|
42
|
+
$pinger.should_receive(:ping).exactly(2).times
|
|
43
|
+
@box = Box.new
|
|
44
|
+
@box.sides << BoxSide.new
|
|
45
|
+
@box.save
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'does not persist the object to riak multiple times when propagating callbacks' do
|
|
49
|
+
Box.before_save { }
|
|
50
|
+
BoxSide.before_save { }
|
|
51
|
+
@box = Box.new
|
|
52
|
+
@box.sides << BoxSide.new << BoxSide.new
|
|
53
|
+
|
|
54
|
+
@box.robject.should_receive(:store).once
|
|
55
|
+
@box.save
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it 'invokes the before/after callbacks in the correct order on embedded associated documents' do
|
|
59
|
+
callbacks = []
|
|
60
|
+
BoxSide.before_save { callbacks << :before_save }
|
|
61
|
+
BoxSide.after_save { callbacks << :after_save }
|
|
62
|
+
|
|
63
|
+
@box = Box.new
|
|
64
|
+
@box.sides << BoxSide.new
|
|
65
|
+
@box.robject.stub(:store) do
|
|
66
|
+
callbacks << :save
|
|
67
|
+
end
|
|
68
|
+
@box.save
|
|
69
|
+
|
|
70
|
+
callbacks.should == [:before_save, :save, :after_save]
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
it 'does not allow around callbacks on embedded associated documents' do
|
|
74
|
+
expect {
|
|
75
|
+
BoxSide.around_save { }
|
|
76
|
+
}.to raise_error(/around_save callbacks are not supported/)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it 'does not propagate validation callbacks multiple times' do
|
|
80
|
+
Box.before_validation { $pinger.ping }
|
|
81
|
+
BoxSide.before_validation { $pinger.ping }
|
|
82
|
+
$pinger.should_receive(:ping).exactly(2).times
|
|
83
|
+
@box = Box.new
|
|
84
|
+
@box.sides << BoxSide.new
|
|
85
|
+
@box.valid?
|
|
86
|
+
end
|
|
87
|
+
|
|
52
88
|
it "should call create callbacks on save when the document is new" do
|
|
53
89
|
Box.before_create { $pinger.ping }
|
|
54
90
|
Box.after_create { $pinger.ping }
|
|
@@ -133,6 +169,7 @@ describe Ripple::Callbacks do
|
|
|
133
169
|
after :each do
|
|
134
170
|
[:save, :create, :update, :destroy, :validation].each do |type|
|
|
135
171
|
Box.reset_callbacks(type)
|
|
172
|
+
BoxSide.reset_callbacks(type)
|
|
136
173
|
end
|
|
137
174
|
end
|
|
138
175
|
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Ripple
|
|
4
|
+
module Conflict
|
|
5
|
+
describe Resolver do
|
|
6
|
+
it 'is registered as an on conflict hook with Riak::RObject' do
|
|
7
|
+
Riak::RObject.on_conflict_hooks.should include(described_class.to_proc)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe 'calling the lambda returned by .to_proc' do
|
|
11
|
+
let(:sibling_1) { stub(:data => { '_type' => 'User' } ) }
|
|
12
|
+
let(:sibling_2) { stub(:data => { '_type' => 'User' } ) }
|
|
13
|
+
let(:user_siblings) { [sibling_1, sibling_2] }
|
|
14
|
+
let(:wheel_sibling) { stub(:data => { '_type' => 'Wheel' } ) }
|
|
15
|
+
let(:robject) { stub(:siblings => user_siblings) }
|
|
16
|
+
let(:resolved_robject) { stub("Resolved RObject") }
|
|
17
|
+
let(:resolved_document) { stub(:robject => resolved_robject) }
|
|
18
|
+
|
|
19
|
+
let!(:resolver) { described_class.new(robject, User) }
|
|
20
|
+
|
|
21
|
+
it 'creates a resolver for the appropriate model class, resolves the robject, and returns the resolved robject' do
|
|
22
|
+
described_class.
|
|
23
|
+
should_receive(:new).
|
|
24
|
+
with(robject, User).
|
|
25
|
+
and_return(resolver)
|
|
26
|
+
|
|
27
|
+
resolver.should_receive(:resolve)
|
|
28
|
+
resolver.stub(:document => resolved_document)
|
|
29
|
+
|
|
30
|
+
described_class.to_proc.call(robject).should be(resolved_robject)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it 'returns nil and does not attempt resolution when given an robject with siblings of different types' do
|
|
34
|
+
user_siblings << wheel_sibling
|
|
35
|
+
described_class.should_not_receive(:new)
|
|
36
|
+
described_class.to_proc.call(robject).should be_nil
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
@@ -1,20 +1,7 @@
|
|
|
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::Conversion do
|
|
17
|
-
require 'support/models/box'
|
|
4
|
+
# require 'support/models/box'
|
|
18
5
|
|
|
19
6
|
before :each do
|
|
20
7
|
@box = Box.new { |a| a.key = 'some-key' }
|
|
@@ -1,17 +1,4 @@
|
|
|
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 Time do
|
|
17
4
|
before { @date_format = Ripple.date_format }
|
|
@@ -46,7 +33,7 @@ describe DateTime do
|
|
|
46
33
|
after { Ripple.date_format = @date_format }
|
|
47
34
|
|
|
48
35
|
before :each do
|
|
49
|
-
Time.zone =
|
|
36
|
+
Time.zone = "UTC"
|
|
50
37
|
end
|
|
51
38
|
|
|
52
39
|
it "serializes to JSON in UTC, ISO 8601 format by default" do
|
|
@@ -104,3 +91,13 @@ describe "Boolean" do
|
|
|
104
91
|
}.should_not raise_error(NameError)
|
|
105
92
|
end
|
|
106
93
|
end
|
|
94
|
+
|
|
95
|
+
describe Set do
|
|
96
|
+
describe "#as_json" do
|
|
97
|
+
it 'returns an array of the #as_json result of each element' do
|
|
98
|
+
set = Set.new([stub(:as_json => 's1'), stub(:as_json => 's2')])
|
|
99
|
+
set.as_json.should =~ ['s1', 's2']
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module Ripple
|
|
4
|
+
module Document
|
|
5
|
+
describe self do
|
|
6
|
+
describe "#to_link" do
|
|
7
|
+
let(:tag) { 'invoices' }
|
|
8
|
+
let(:document) { Invoice.new }
|
|
9
|
+
let(:to_link) { document.to_link(tag) }
|
|
10
|
+
|
|
11
|
+
it "returns a #{described_class}::Link" do
|
|
12
|
+
to_link.should be_a(Link)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "sets the document to this document" do
|
|
16
|
+
to_link.send(:document).should equal(document)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "sets the tag to the given tag" do
|
|
20
|
+
to_link.tag.should == tag
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe Link do
|
|
26
|
+
let(:key) { 'the-invoice-key' }
|
|
27
|
+
let(:tag) { 'invoices' }
|
|
28
|
+
let(:document) { Invoice.new { |i| i.key = key } }
|
|
29
|
+
let(:link) { described_class.new(document, tag) }
|
|
30
|
+
|
|
31
|
+
it 'does not fetch the key immediately' do
|
|
32
|
+
document.should_not_receive(:key)
|
|
33
|
+
link
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
describe '#key' do
|
|
37
|
+
it "returns the document's key" do
|
|
38
|
+
link.key.should == key
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
describe '#bucket' do
|
|
43
|
+
it "returns the bucket name from the document class" do
|
|
44
|
+
link.bucket.should == Invoice.bucket_name
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe '#tag' do
|
|
49
|
+
it 'returns the tag passed to the constructor' do
|
|
50
|
+
link.tag.should == tag
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
describe "#hash" do
|
|
55
|
+
it 'does not use the key' do
|
|
56
|
+
document.should_not_receive(:key)
|
|
57
|
+
link.hash
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it "uses the document's #hash" do
|
|
61
|
+
document.should_receive(:hash).and_return(1234)
|
|
62
|
+
link.hash.should == 1234
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -1,20 +1,7 @@
|
|
|
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.dirname(__FILE__))
|
|
1
|
+
require 'spec_helper'
|
|
15
2
|
|
|
16
3
|
describe Ripple::Document do
|
|
17
|
-
require 'support/models/page'
|
|
4
|
+
# require 'support/models/page'
|
|
18
5
|
|
|
19
6
|
it "should add bucket access methods to classes when included" do
|
|
20
7
|
(class << Page; self; end).included_modules.should include(Ripple::Document::BucketAccess)
|
|
@@ -38,22 +25,50 @@ describe Ripple::Document do
|
|
|
38
25
|
[@doc,@doc2,@sub,@error].each {|d| d.key = "root"; d.stub!(:new?).and_return(false) }
|
|
39
26
|
end
|
|
40
27
|
|
|
41
|
-
it "should be
|
|
28
|
+
it "should be == and eql? if the same object, and have the same hash key" do
|
|
42
29
|
@doc.should == @doc
|
|
30
|
+
@doc.should eql(@doc)
|
|
31
|
+
@doc.hash.should == @doc.hash
|
|
43
32
|
end
|
|
44
33
|
|
|
45
|
-
it "should be
|
|
34
|
+
it "should be == and eql? and have the same hash key if instance of same class and key" do
|
|
46
35
|
@doc.should == @doc2
|
|
36
|
+
@doc2.should == @doc
|
|
37
|
+
@doc.should eql(@doc2)
|
|
38
|
+
@doc2.should eql(@doc)
|
|
39
|
+
@doc.hash.should == @doc2.hash
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should be == but not eql? and have different hash keys if they have the same key but one is a subclass of the other" do
|
|
47
43
|
@doc.should == @sub
|
|
44
|
+
@sub.should == @doc
|
|
45
|
+
|
|
46
|
+
@doc.should_not eql(@sub)
|
|
47
|
+
@sub.should_not eql(@doc)
|
|
48
|
+
|
|
49
|
+
@doc.hash.should_not == @sub.hash
|
|
48
50
|
end
|
|
49
51
|
|
|
50
|
-
it "should be
|
|
52
|
+
it "should be == but not eql? and have different hash keys if of the same bucket and key" do
|
|
51
53
|
@doc.should == @error
|
|
54
|
+
@error.should == @doc
|
|
55
|
+
|
|
56
|
+
@doc.should_not eql(@error)
|
|
57
|
+
@error.should_not eql(@doc)
|
|
58
|
+
|
|
59
|
+
@doc.hash.should_not == @error.hash
|
|
60
|
+
@error.hash.should_not == @doc.hash
|
|
52
61
|
end
|
|
53
62
|
|
|
54
|
-
it "should not be
|
|
63
|
+
it "should not be == or eql? or have the same hash key if new record" do
|
|
55
64
|
@doc2.stub!(:new?).and_return(true)
|
|
56
65
|
@doc.should_not == @doc2
|
|
66
|
+
@doc2.should_not == @doc
|
|
67
|
+
|
|
68
|
+
@doc.should_not eql(@doc2)
|
|
69
|
+
@doc2.should_not eql(@doc)
|
|
70
|
+
|
|
71
|
+
@doc.hash.should_not == @doc2.hash
|
|
57
72
|
end
|
|
58
73
|
end
|
|
59
74
|
|