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
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require 'riak/link'
|
|
2
|
+
|
|
3
|
+
module Ripple
|
|
4
|
+
module Document
|
|
5
|
+
# A Link that is tied to a particular document and tag.
|
|
6
|
+
# The key is fetched from the document lazily when needed.
|
|
7
|
+
class Link < Riak::Link
|
|
8
|
+
attr_reader :document
|
|
9
|
+
private :document
|
|
10
|
+
|
|
11
|
+
def initialize(document, tag)
|
|
12
|
+
@document = document
|
|
13
|
+
super(document.class.bucket_name, nil, tag)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def key
|
|
17
|
+
document.key
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def hash
|
|
21
|
+
document.hash
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def to_link(tag)
|
|
26
|
+
Link.new(self, tag)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
# Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
|
|
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
|
-
|
|
15
1
|
require 'active_support/concern'
|
|
16
2
|
|
|
17
3
|
module Ripple
|
|
@@ -29,7 +15,7 @@ module Ripple
|
|
|
29
15
|
# Destroys all records one at a time.
|
|
30
16
|
# Place holder while :delete to bucket is being developed.
|
|
31
17
|
def destroy_all
|
|
32
|
-
|
|
18
|
+
list(&:destroy)
|
|
33
19
|
end
|
|
34
20
|
|
|
35
21
|
attr_writer :quorums
|
|
@@ -74,8 +60,7 @@ module Ripple
|
|
|
74
60
|
end
|
|
75
61
|
|
|
76
62
|
def really_save(*args)
|
|
77
|
-
|
|
78
|
-
robject.data = attributes_for_persistence
|
|
63
|
+
update_robject
|
|
79
64
|
robject.store(self.class.quorums.slice(:w,:dw))
|
|
80
65
|
self.key = robject.key
|
|
81
66
|
@new = false
|
|
@@ -86,8 +71,9 @@ module Ripple
|
|
|
86
71
|
# @return self
|
|
87
72
|
def reload
|
|
88
73
|
return self if new?
|
|
89
|
-
robject.reload(:force => true)
|
|
90
|
-
self.__send__(:
|
|
74
|
+
@robject = @robject.reload(:force => true)
|
|
75
|
+
self.__send__(:raw_attributes=, @robject.data.except("_type"))
|
|
76
|
+
reset_associations
|
|
91
77
|
self
|
|
92
78
|
end
|
|
93
79
|
|
|
@@ -113,9 +99,15 @@ module Ripple
|
|
|
113
99
|
end
|
|
114
100
|
end
|
|
115
101
|
|
|
102
|
+
def update_robject
|
|
103
|
+
robject.key = key if robject.key != key
|
|
104
|
+
robject.content_type = 'application/json'
|
|
105
|
+
robject.data = attributes_for_persistence
|
|
106
|
+
end
|
|
107
|
+
|
|
116
108
|
private
|
|
117
109
|
def attributes_for_persistence
|
|
118
|
-
|
|
110
|
+
raw_attributes.merge("_type" => self.class.name)
|
|
119
111
|
end
|
|
120
112
|
end
|
|
121
113
|
end
|
|
@@ -1,20 +1,7 @@
|
|
|
1
|
-
# Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
|
|
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
|
-
|
|
15
1
|
require 'active_support/concern'
|
|
16
2
|
require 'active_support/core_ext/hash/except'
|
|
17
3
|
require 'ripple/translation'
|
|
4
|
+
require 'ripple/embedded_document/around_callbacks'
|
|
18
5
|
require 'ripple/embedded_document/finders'
|
|
19
6
|
require 'ripple/embedded_document/persistence'
|
|
20
7
|
require 'ripple/properties'
|
|
@@ -45,6 +32,7 @@ module Ripple
|
|
|
45
32
|
include Ripple::Validations
|
|
46
33
|
include Ripple::Associations
|
|
47
34
|
include Ripple::Callbacks
|
|
35
|
+
include Ripple::EmbeddedDocument::AroundCallbacks
|
|
48
36
|
include Ripple::Conversion
|
|
49
37
|
include Finders
|
|
50
38
|
include Ripple::Inspection
|
|
@@ -62,7 +50,14 @@ module Ripple
|
|
|
62
50
|
def ==(other)
|
|
63
51
|
self.class == other.class &&
|
|
64
52
|
_parent_document == other._parent_document &&
|
|
65
|
-
|
|
53
|
+
serializable_hash == other.serializable_hash
|
|
54
|
+
end
|
|
55
|
+
alias eql? ==
|
|
56
|
+
|
|
57
|
+
def hash
|
|
58
|
+
parent = [_parent_document.class]
|
|
59
|
+
parent << [_parent_document.key] if _parent_document.respond_to?(:key)
|
|
60
|
+
[ self.class, parent, serializable_hash ].hash
|
|
66
61
|
end
|
|
67
62
|
end
|
|
68
63
|
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'ripple/callbacks'
|
|
2
|
+
|
|
3
|
+
module Ripple
|
|
4
|
+
module EmbeddedDocument
|
|
5
|
+
module AroundCallbacks
|
|
6
|
+
extend ActiveSupport::Concern
|
|
7
|
+
extend Translation
|
|
8
|
+
|
|
9
|
+
included do
|
|
10
|
+
Ripple::Callbacks::CALLBACK_TYPES.each do |type|
|
|
11
|
+
define_singleton_method "around_#{type}" do |*args|
|
|
12
|
+
raise NotImplementedError.new(t("around_callbacks_not_supported", :type => type))
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
# Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
|
|
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
|
-
|
|
15
1
|
require 'active_support/concern'
|
|
16
2
|
require 'active_support/inflector'
|
|
17
3
|
|
|
@@ -24,14 +10,17 @@ module Ripple
|
|
|
24
10
|
module ClassMethods
|
|
25
11
|
def instantiate(attrs)
|
|
26
12
|
begin
|
|
27
|
-
klass = attrs['_type'].present? ? attrs
|
|
28
|
-
klass.new(attrs)
|
|
13
|
+
klass = attrs['_type'].present? ? attrs.delete('_type').constantize : self
|
|
29
14
|
rescue NameError
|
|
30
|
-
|
|
15
|
+
klass = self
|
|
16
|
+
end
|
|
17
|
+
klass.new.tap do |object|
|
|
18
|
+
object.raw_attributes = attrs
|
|
19
|
+
object.changed_attributes.clear
|
|
31
20
|
end
|
|
32
21
|
end
|
|
33
22
|
end
|
|
34
|
-
|
|
23
|
+
|
|
35
24
|
end
|
|
36
25
|
end
|
|
37
26
|
end
|
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
# Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
|
|
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
|
-
|
|
15
1
|
require 'active_support/concern'
|
|
16
2
|
require 'ripple/translation'
|
|
17
3
|
|
|
@@ -32,7 +18,7 @@ module Ripple
|
|
|
32
18
|
extend ActiveSupport::Concern
|
|
33
19
|
|
|
34
20
|
module ClassMethods
|
|
35
|
-
# Creates a method that points to the parent document.
|
|
21
|
+
# Creates a method that points to the parent document.
|
|
36
22
|
def embedded_in(parent)
|
|
37
23
|
define_method(parent) { @_parent_document }
|
|
38
24
|
end
|
|
@@ -68,7 +54,9 @@ module Ripple
|
|
|
68
54
|
# Saves this embedded document by delegating to the root document.
|
|
69
55
|
def save(*args)
|
|
70
56
|
if _root_document
|
|
71
|
-
|
|
57
|
+
run_save_callbacks do
|
|
58
|
+
_root_document.save(*args)
|
|
59
|
+
end
|
|
72
60
|
else
|
|
73
61
|
raise NoRootDocument.new(self, :save)
|
|
74
62
|
end
|
|
@@ -76,7 +64,7 @@ module Ripple
|
|
|
76
64
|
|
|
77
65
|
# @private
|
|
78
66
|
def attributes_for_persistence
|
|
79
|
-
|
|
67
|
+
raw_attributes.merge("_type" => self.class.name)
|
|
80
68
|
end
|
|
81
69
|
|
|
82
70
|
# The root {Ripple::Document} to which this embedded document belongs.
|
data/lib/ripple/i18n.rb
CHANGED
|
@@ -1,16 +1,2 @@
|
|
|
1
|
-
# Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
|
|
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
|
-
|
|
15
1
|
require 'active_support/i18n'
|
|
16
2
|
I18n.load_path << File.expand_path("../locale/en.yml", __FILE__)
|
data/lib/ripple/inspection.rb
CHANGED
|
@@ -1,26 +1,32 @@
|
|
|
1
|
-
# Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
|
|
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
1
|
require 'ripple'
|
|
15
2
|
|
|
16
3
|
module Ripple
|
|
17
4
|
# Makes IRB and other inspect output a bit friendlier
|
|
18
5
|
module Inspection
|
|
6
|
+
|
|
19
7
|
# A human-readable version of the {Ripple::Document} or {Ripple::EmbeddedDocument}
|
|
8
|
+
# plus attributes
|
|
20
9
|
def inspect
|
|
21
10
|
attribute_list = attributes_for_persistence.except("_type").map {|k,v| "#{k}=#{v.inspect}" }.join(' ')
|
|
22
|
-
|
|
23
|
-
|
|
11
|
+
inspection_string(attribute_list)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# A string representation of the {Ripple::Document} or {Ripple::EmbeddedDocument}
|
|
15
|
+
def to_s
|
|
16
|
+
inspection_string
|
|
24
17
|
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def inspection_string(extra = nil)
|
|
22
|
+
body = self.class.name + persistance_identifier
|
|
23
|
+
body += " #{extra}" if extra
|
|
24
|
+
"<#{body}>"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def persistance_identifier
|
|
28
|
+
self.class.embeddable? ? "" : ":#{key || '[new]'}"
|
|
29
|
+
end
|
|
30
|
+
|
|
25
31
|
end
|
|
26
32
|
end
|
data/lib/ripple/locale/en.yml
CHANGED
|
@@ -1,26 +1,22 @@
|
|
|
1
|
-
# Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
|
|
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
1
|
en:
|
|
15
2
|
ripple:
|
|
3
|
+
around_callbacks_not_supported: "around_%{type} callbacks are not supported on embedded documents. See https://github.com/seancribbs/ripple/issues/188 for more detail."
|
|
4
|
+
associated_document_error_summary: "for %{doc_type} %{doc_id}: %{errors}"
|
|
16
5
|
attribute_hash: "value of attributes must be a Hash"
|
|
6
|
+
cluster_not_created: "The cluster for the current environment is not created yet. Run `rake riak:create` first."
|
|
7
|
+
conflict_handler_not_implemented: "No on_conflict handler has been implemented for %{document}"
|
|
17
8
|
document_invalid: "Validation failed: %{errors}"
|
|
18
9
|
document_not_found:
|
|
19
10
|
no_key: "Couldn't find document without a key"
|
|
20
11
|
one_key: "Couldn't find document with key: %{key}"
|
|
21
12
|
many_keys: "Couldn't find documents with keys: %{keys}"
|
|
22
13
|
invalid_association_value: "Invalid value %{value} for association %{name} of type %{klass} on %{owner}"
|
|
14
|
+
many_association_validation_error: "are invalid (%{association_errors})"
|
|
15
|
+
many_key_association: "You cannot use a many association using :key"
|
|
23
16
|
missing_configuration: "You are missing your ripple configuration file that should be at %{file}"
|
|
24
17
|
no_root_document: "You cannot call %{method} on %{doc} without a root document"
|
|
18
|
+
one_association_validation_error: "is invalid (%{association_errors})"
|
|
25
19
|
property_type_mismatch: "Cannot cast %{value} into a %{class}"
|
|
20
|
+
undefined_property: "Undefined property :%{prop} for class '%{class}'"
|
|
21
|
+
unexpected_conflicts: "Conflict cannot be resolved for %{conflicts} (for %{document})"
|
|
26
22
|
|
|
@@ -1,17 +1,3 @@
|
|
|
1
|
-
# Copyright 2010 Sean Cribbs, Sonian Inc., and Basho Technologies, Inc.
|
|
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
|
-
|
|
15
1
|
require 'active_support/concern'
|
|
16
2
|
require 'active_support/core_ext/class/inheritable_attributes'
|
|
17
3
|
|
|
@@ -23,10 +9,14 @@ module Ripple
|
|
|
23
9
|
TRUE_VALUES = [ true, "true", 1, "1", "yes", "ok", "y" ]
|
|
24
10
|
|
|
25
11
|
included do
|
|
26
|
-
|
|
12
|
+
if respond_to?(:class_attribute) # ActiveSupport 3.1
|
|
13
|
+
class_attribute :nested_attributes_options, :instance_writer => false
|
|
14
|
+
else
|
|
15
|
+
class_inheritable_accessor :nested_attributes_options, :instance_writer => false
|
|
16
|
+
end
|
|
27
17
|
self.nested_attributes_options = {}
|
|
28
18
|
end
|
|
29
|
-
|
|
19
|
+
|
|
30
20
|
# = Nested Attributes
|
|
31
21
|
#
|
|
32
22
|
# This is similar to the `accepts_nested_attributes` functionality
|
|
@@ -87,7 +77,7 @@ module Ripple
|
|
|
87
77
|
# { :key => 'yyy', :reference => 'updated foo2' } ])
|
|
88
78
|
# manifest.shipments.first.reference # => updated foo1
|
|
89
79
|
# manifest.shipments.second.reference # => updated foo2
|
|
90
|
-
#
|
|
80
|
+
#
|
|
91
81
|
# NOTE: On many embedded, then entire collection of embedded documents is replaced, as there
|
|
92
82
|
# is no key to specifically update.
|
|
93
83
|
#
|
|
@@ -105,41 +95,45 @@ module Ripple
|
|
|
105
95
|
# end
|
|
106
96
|
#
|
|
107
97
|
# The assigning of attributes replaces existing:
|
|
108
|
-
#
|
|
98
|
+
#
|
|
109
99
|
# manifest = Manifest.create(:signature_attributes => [ { :esig => 'a00001' }, { :esig => 'b00001' } ]
|
|
110
100
|
# manifest.signatures # => [<Signature esig="a00001">, <Signature esig="b00001">]
|
|
111
101
|
#
|
|
112
102
|
# manifest.signature_attributes = [ { :esig => 'c00001' } ]
|
|
113
103
|
# manifest.signatures # => [<Signature esig="c00001">]
|
|
114
|
-
#
|
|
104
|
+
#
|
|
115
105
|
module ClassMethods
|
|
116
|
-
|
|
106
|
+
|
|
117
107
|
def accepts_nested_attributes_for(*attr_names)
|
|
118
108
|
options = { :allow_destroy => false }
|
|
119
109
|
options.update(attr_names.extract_options!)
|
|
120
|
-
|
|
110
|
+
|
|
121
111
|
attr_names.each do |association_name|
|
|
122
112
|
if association = self.associations[association_name]
|
|
123
113
|
nested_attributes_options[association_name.to_sym] = options
|
|
124
|
-
|
|
125
|
-
class_eval %{
|
|
126
|
-
def #{association_name}_attributes=(attributes)
|
|
127
|
-
assign_nested_attributes_for_#{association.type}_association(:#{association_name}, attributes)
|
|
128
|
-
end
|
|
129
114
|
|
|
130
|
-
|
|
131
|
-
|
|
115
|
+
define_method "#{association_name}_attributes=" do |attributes|
|
|
116
|
+
send("assign_nested_attributes_for_#{association.type}_association",
|
|
117
|
+
association_name, attributes
|
|
118
|
+
)
|
|
119
|
+
end
|
|
132
120
|
|
|
133
|
-
|
|
121
|
+
before_save :"autosave_nested_attributes_for_#{association_name}"
|
|
122
|
+
before_save :destroy_marked_for_destruction
|
|
134
123
|
|
|
135
|
-
|
|
136
|
-
|
|
124
|
+
define_method "autosave_nested_attributes_for_#{association_name}" do
|
|
125
|
+
if self.autosave[association_name]
|
|
126
|
+
send("save_nested_attributes_for_#{association.type}_association",
|
|
127
|
+
association_name
|
|
128
|
+
)
|
|
137
129
|
end
|
|
138
|
-
|
|
130
|
+
end
|
|
131
|
+
private :"autosave_nested_attributes_for_#{association_name}"
|
|
132
|
+
|
|
139
133
|
else
|
|
140
134
|
raise ArgumentError, "Association #{association_name} not found!"
|
|
141
135
|
end
|
|
142
|
-
end
|
|
136
|
+
end
|
|
143
137
|
end
|
|
144
138
|
end
|
|
145
139
|
|
|
@@ -156,7 +150,7 @@ module Ripple
|
|
|
156
150
|
end
|
|
157
151
|
|
|
158
152
|
private
|
|
159
|
-
|
|
153
|
+
|
|
160
154
|
def save_nested_attributes_for_one_association(association_name)
|
|
161
155
|
send(association_name).save
|
|
162
156
|
end
|
|
@@ -178,14 +172,14 @@ module Ripple
|
|
|
178
172
|
|
|
179
173
|
def assign_nested_attributes_for_one_association(association_name, attributes)
|
|
180
174
|
association = self.class.associations[association_name]
|
|
181
|
-
if association.
|
|
175
|
+
if association.embedded?
|
|
182
176
|
assign_nested_attributes_for_one_embedded_association(association_name, attributes)
|
|
183
177
|
else
|
|
184
178
|
self.autosave[association_name] = true
|
|
185
179
|
assign_nested_attributes_for_one_linked_association(association_name, attributes)
|
|
186
180
|
end
|
|
187
181
|
end
|
|
188
|
-
|
|
182
|
+
|
|
189
183
|
def assign_nested_attributes_for_one_embedded_association(association_name, attributes)
|
|
190
184
|
send(association_name).build(attributes.except(*UNASSIGNABLE_KEYS))
|
|
191
185
|
end
|
|
@@ -215,7 +209,7 @@ module Ripple
|
|
|
215
209
|
end
|
|
216
210
|
|
|
217
211
|
association = self.class.associations[association_name]
|
|
218
|
-
if association.
|
|
212
|
+
if association.embedded?
|
|
219
213
|
assign_nested_attributes_for_many_embedded_association(association_name, attributes_collection)
|
|
220
214
|
else
|
|
221
215
|
self.autosave[association_name] = true
|
|
@@ -255,7 +249,7 @@ module Ripple
|
|
|
255
249
|
record.attributes = attributes.except(*UNASSIGNABLE_KEYS)
|
|
256
250
|
end
|
|
257
251
|
end
|
|
258
|
-
|
|
252
|
+
|
|
259
253
|
def has_destroy_flag?(hash)
|
|
260
254
|
TRUE_VALUES.include?(hash.stringify_keys['_destroy'])
|
|
261
255
|
end
|
|
@@ -275,5 +269,5 @@ module Ripple
|
|
|
275
269
|
end
|
|
276
270
|
|
|
277
271
|
end
|
|
278
|
-
|
|
272
|
+
|
|
279
273
|
end
|