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.
Files changed (152) hide show
  1. data/.gitignore +32 -0
  2. data/Gemfile +10 -9
  3. data/Guardfile +15 -0
  4. data/Rakefile +11 -40
  5. data/lib/rails/generators/ripple/configuration/configuration_generator.rb +0 -13
  6. data/lib/rails/generators/ripple/configuration/templates/ripple.yml +4 -4
  7. data/lib/rails/generators/ripple/js/js_generator.rb +0 -13
  8. data/lib/rails/generators/ripple/js/templates/js/contrib.js +0 -17
  9. data/lib/rails/generators/ripple/js/templates/js/ripple.js +0 -13
  10. data/lib/rails/generators/ripple/model/model_generator.rb +0 -14
  11. data/lib/rails/generators/ripple/model/templates/model.rb +1 -1
  12. data/lib/rails/generators/ripple/observer/observer_generator.rb +0 -14
  13. data/lib/rails/generators/ripple/test/test_generator.rb +7 -19
  14. data/lib/rails/generators/ripple_generator.rb +1 -14
  15. data/lib/ripple.rb +7 -14
  16. data/lib/ripple/associations.rb +129 -26
  17. data/lib/ripple/associations/embedded.rb +1 -15
  18. data/lib/ripple/associations/instantiators.rb +0 -13
  19. data/lib/ripple/associations/linked.rb +41 -19
  20. data/lib/ripple/associations/many.rb +0 -14
  21. data/lib/ripple/associations/many_embedded_proxy.rb +0 -14
  22. data/lib/ripple/associations/many_linked_proxy.rb +39 -18
  23. data/lib/ripple/associations/many_reference_proxy.rb +93 -0
  24. data/lib/ripple/associations/many_stored_key_proxy.rb +76 -0
  25. data/lib/ripple/associations/one.rb +1 -15
  26. data/lib/ripple/associations/one_embedded_proxy.rb +0 -14
  27. data/lib/ripple/associations/one_key_proxy.rb +58 -0
  28. data/lib/ripple/associations/one_linked_proxy.rb +4 -14
  29. data/lib/ripple/associations/one_stored_key_proxy.rb +43 -0
  30. data/lib/ripple/associations/proxy.rb +8 -14
  31. data/lib/ripple/attribute_methods.rb +19 -17
  32. data/lib/ripple/attribute_methods/dirty.rb +19 -15
  33. data/lib/ripple/attribute_methods/query.rb +0 -14
  34. data/lib/ripple/attribute_methods/read.rb +0 -14
  35. data/lib/ripple/attribute_methods/write.rb +0 -14
  36. data/lib/ripple/callbacks.rb +10 -16
  37. data/lib/ripple/conflict/basic_resolver.rb +82 -0
  38. data/lib/ripple/conflict/document_hooks.rb +20 -0
  39. data/lib/ripple/conflict/resolver.rb +71 -0
  40. data/lib/ripple/conflict/test_helper.rb +33 -0
  41. data/lib/ripple/conversion.rb +0 -14
  42. data/lib/ripple/core_ext.rb +1 -14
  43. data/lib/ripple/core_ext/casting.rb +19 -19
  44. data/lib/ripple/core_ext/object.rb +8 -0
  45. data/lib/ripple/document.rb +21 -16
  46. data/lib/ripple/document/bucket_access.rb +0 -14
  47. data/lib/ripple/document/finders.rb +17 -23
  48. data/lib/ripple/document/key.rb +8 -28
  49. data/lib/ripple/document/link.rb +30 -0
  50. data/lib/ripple/document/persistence.rb +12 -20
  51. data/lib/ripple/embedded_document.rb +10 -15
  52. data/lib/ripple/embedded_document/around_callbacks.rb +18 -0
  53. data/lib/ripple/embedded_document/finders.rb +7 -18
  54. data/lib/ripple/embedded_document/persistence.rb +5 -17
  55. data/lib/ripple/i18n.rb +0 -14
  56. data/lib/ripple/inspection.rb +21 -15
  57. data/lib/ripple/locale/en.yml +9 -13
  58. data/lib/ripple/nested_attributes.rb +33 -39
  59. data/lib/ripple/observable.rb +0 -13
  60. data/lib/ripple/properties.rb +1 -14
  61. data/lib/ripple/property_type_mismatch.rb +0 -14
  62. data/lib/ripple/railtie.rb +4 -14
  63. data/lib/ripple/railties/ripple.rake +86 -0
  64. data/lib/ripple/serialization.rb +11 -11
  65. data/lib/ripple/test_server.rb +36 -0
  66. data/lib/ripple/timestamps.rb +0 -13
  67. data/lib/ripple/translation.rb +4 -14
  68. data/lib/ripple/validations.rb +1 -15
  69. data/lib/ripple/validations/associated_validator.rb +26 -17
  70. data/lib/ripple/version.rb +3 -0
  71. data/ripple.gemspec +24 -35
  72. data/spec/integration/ripple/associations_spec.rb +89 -58
  73. data/spec/integration/ripple/conflict_resolution_spec.rb +298 -0
  74. data/spec/integration/ripple/nested_attributes_spec.rb +19 -19
  75. data/spec/integration/ripple/persistence_spec.rb +15 -34
  76. data/spec/integration/ripple/search_associations_spec.rb +31 -0
  77. data/spec/ripple/associations/many_embedded_proxy_spec.rb +23 -36
  78. data/spec/ripple/associations/many_linked_proxy_spec.rb +133 -45
  79. data/spec/ripple/associations/many_reference_proxy_spec.rb +170 -0
  80. data/spec/ripple/associations/many_stored_key_proxy_spec.rb +158 -0
  81. data/spec/ripple/associations/one_embedded_proxy_spec.rb +24 -37
  82. data/spec/ripple/associations/one_key_proxy_spec.rb +82 -0
  83. data/spec/ripple/associations/one_linked_proxy_spec.rb +22 -23
  84. data/spec/ripple/associations/one_stored_key_proxy_spec.rb +72 -0
  85. data/spec/ripple/associations/proxy_spec.rb +21 -15
  86. data/spec/ripple/associations_spec.rb +54 -23
  87. data/spec/ripple/attribute_methods/dirty_spec.rb +56 -5
  88. data/spec/ripple/attribute_methods_spec.rb +47 -21
  89. data/spec/ripple/bucket_access_spec.rb +4 -17
  90. data/spec/ripple/callbacks_spec.rb +52 -15
  91. data/spec/ripple/conflict/resolver_spec.rb +42 -0
  92. data/spec/ripple/conversion_spec.rb +2 -15
  93. data/spec/ripple/core_ext_spec.rb +12 -15
  94. data/spec/ripple/document/link_spec.rb +67 -0
  95. data/spec/ripple/document_spec.rb +34 -19
  96. data/spec/ripple/embedded_document/finders_spec.rb +12 -19
  97. data/spec/ripple/embedded_document/persistence_spec.rb +20 -26
  98. data/spec/ripple/embedded_document_spec.rb +44 -34
  99. data/spec/ripple/finders_spec.rb +58 -29
  100. data/spec/ripple/inspection_spec.rb +40 -37
  101. data/spec/ripple/key_spec.rb +5 -17
  102. data/spec/ripple/observable_spec.rb +3 -16
  103. data/spec/ripple/persistence_spec.rb +134 -18
  104. data/spec/ripple/properties_spec.rb +21 -15
  105. data/spec/ripple/ripple_spec.rb +1 -14
  106. data/spec/ripple/serialization_spec.rb +16 -17
  107. data/spec/ripple/timestamps_spec.rb +73 -52
  108. data/spec/ripple/validations/associated_validator_spec.rb +69 -25
  109. data/spec/ripple/validations_spec.rb +3 -16
  110. data/spec/spec_helper.rb +17 -18
  111. data/spec/support/associations.rb +1 -1
  112. data/spec/support/associations/proxies.rb +0 -13
  113. data/spec/support/integration_setup.rb +11 -0
  114. data/spec/support/mocks.rb +0 -13
  115. data/spec/support/models.rb +33 -2
  116. data/spec/support/models/address.rb +1 -16
  117. data/spec/support/models/box.rb +7 -14
  118. data/spec/support/models/car.rb +27 -1
  119. data/spec/support/models/cardboard_box.rb +0 -14
  120. data/spec/support/models/clock.rb +6 -15
  121. data/spec/support/models/clock_observer.rb +0 -14
  122. data/spec/support/models/credit_card.rb +5 -0
  123. data/spec/support/models/customer.rb +0 -14
  124. data/spec/support/models/email.rb +0 -14
  125. data/spec/support/models/family.rb +1 -13
  126. data/spec/support/models/favorite.rb +0 -14
  127. data/spec/support/models/invoice.rb +0 -14
  128. data/spec/support/models/late_invoice.rb +0 -14
  129. data/spec/support/models/nested.rb +12 -0
  130. data/spec/support/models/ninja.rb +7 -0
  131. data/spec/support/models/note.rb +0 -14
  132. data/spec/support/models/page.rb +1 -15
  133. data/spec/support/models/paid_invoice.rb +0 -14
  134. data/spec/support/models/post.rb +12 -0
  135. data/spec/support/models/profile.rb +7 -0
  136. data/spec/support/models/subscription.rb +26 -0
  137. data/spec/support/models/tasks.rb +0 -18
  138. data/spec/support/models/team.rb +11 -0
  139. data/spec/support/models/transactions.rb +17 -0
  140. data/spec/support/models/tree.rb +2 -16
  141. data/spec/support/models/user.rb +14 -16
  142. data/spec/support/models/widget.rb +8 -14
  143. data/spec/support/search.rb +14 -0
  144. data/spec/support/test_server.rb +22 -12
  145. data/spec/support/test_server.yml.example +14 -2
  146. metadata +223 -59
  147. data/lib/rails/generators/ripple/test/templates/test_server.rb +0 -46
  148. data/spec/support/models/driver.rb +0 -5
  149. data/spec/support/models/engine.rb +0 -4
  150. data/spec/support/models/passenger.rb +0 -5
  151. data/spec/support/models/seat.rb +0 -4
  152. data/spec/support/models/wheel.rb +0 -5
@@ -0,0 +1,20 @@
1
+ module Ripple
2
+ module Conflict
3
+ module DocumentHooks
4
+ extend ActiveSupport::Concern
5
+
6
+ module ClassMethods
7
+ attr_reader :on_conflict_block
8
+
9
+ def on_conflict(*expected_conflicts, &block)
10
+ @expected_conflicts = expected_conflicts
11
+ @on_conflict_block = block
12
+ end
13
+
14
+ def expected_conflicts
15
+ @expected_conflicts ||= []
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,71 @@
1
+ require 'ripple/conflict/basic_resolver'
2
+
3
+ module Ripple
4
+ module Conflict
5
+ class Resolver
6
+ include Translation
7
+
8
+ attr_reader :document, :model_class
9
+
10
+ delegate :expected_conflicts, :on_conflict_block, :to => :model_class
11
+
12
+ def self.to_proc
13
+ @to_proc ||= lambda do |robject|
14
+ possible_model_classes = robject.siblings.map { |s| s.data['_type'] }.uniq
15
+ return nil unless possible_model_classes.size == 1
16
+
17
+ resolver = new(robject, possible_model_classes.first.constantize)
18
+ resolver.resolve
19
+ resolver.document.robject
20
+ end
21
+ end
22
+
23
+ Riak::RObject.on_conflict(&self)
24
+
25
+ def initialize(robject, model_class)
26
+ @robject = robject
27
+ @model_class = model_class
28
+ end
29
+
30
+ def resolve
31
+ assert_conflict_block
32
+ basic_resolver.perform
33
+ assert_no_unexpected_conflicts
34
+ document.instance_exec(siblings, basic_resolver.remaining_conflicts, &on_conflict_block)
35
+ document.update_robject
36
+ end
37
+
38
+ def siblings
39
+ @siblings ||= @robject.siblings.map { |s| @model_class.send(:instantiate, s) }
40
+ end
41
+
42
+ def document
43
+ # pick a sibling robject to use as the basis of the document to resolve
44
+ # which one doesn't really matter.
45
+ @document ||= @model_class.send(:instantiate, @robject.siblings.first.dup)
46
+ end
47
+
48
+ private
49
+
50
+ def basic_resolver
51
+ @basic_resolver ||= BasicResolver.new(self)
52
+ end
53
+
54
+ def assert_conflict_block
55
+ return if on_conflict_block
56
+
57
+ raise NotImplementedError, t('conflict_handler_not_implemented', :document => document)
58
+ end
59
+
60
+ def assert_no_unexpected_conflicts
61
+ return unless basic_resolver.unexpected_conflicts.any?
62
+
63
+ raise NotImplementedError, t('unexpected_conflicts',
64
+ :conflicts => basic_resolver.unexpected_conflicts.inspect,
65
+ :document => document.inspect
66
+ )
67
+ end
68
+ end
69
+ end
70
+ end
71
+
@@ -0,0 +1,33 @@
1
+ module Ripple
2
+ module Conflict
3
+ module TestHelper
4
+ def create_conflict(main_record, *modifiers)
5
+ # We have to disable all on conflict resolvers while we create conflict
6
+ # so that they don't auto-resolve it.
7
+ orig_hooks = Riak::RObject.on_conflict_hooks.dup
8
+ Riak::RObject.on_conflict_hooks.clear
9
+
10
+ begin
11
+ klass, key = main_record.class, main_record.key
12
+ records = modifiers.map { |_| klass.find!(key) }
13
+
14
+ records.zip(modifiers).each do |(record, modifier)|
15
+ # necessary to get conflict, so riak thinks they are being saved by different clients
16
+ Ripple.client.client_id += 1
17
+
18
+ modifier.call(record)
19
+ record.save!
20
+ end
21
+
22
+ robject = klass.bucket.get(key)
23
+ raise "#{robject} is not in conflict as expected." unless robject.conflict?
24
+ ensure
25
+ orig_hooks.each do |hook|
26
+ Riak::RObject.on_conflict(&hook)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+
@@ -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_model/conversion'
16
2
 
17
3
  module Ripple
@@ -1,15 +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 'ripple/core_ext/casting'
2
+ require 'ripple/core_ext/object'
@@ -1,17 +1,4 @@
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 'tzinfo'
15
2
  require 'active_support/json'
16
3
  require 'active_support/core_ext/object/blank'
17
4
  require 'active_support/core_ext/object/to_json'
@@ -23,6 +10,7 @@ require 'active_support/core_ext/time/conversions'
23
10
  require 'active_support/core_ext/time/zones'
24
11
  require 'active_support/core_ext/string/conversions'
25
12
  require 'ripple/property_type_mismatch'
13
+ require 'set'
26
14
 
27
15
  # @private
28
16
  class Object
@@ -74,8 +62,8 @@ class String
74
62
  end
75
63
  end
76
64
 
77
- boolean_cast = proc do
78
- def self.ripple_cast(value)
65
+ BooleanCast = Module.new do
66
+ def ripple_cast(value)
79
67
  case value
80
68
  when NilClass
81
69
  nil
@@ -98,9 +86,9 @@ unless defined?(::Boolean)
98
86
  module ::Boolean; end
99
87
  end
100
88
 
101
- ::Boolean.module_eval(&boolean_cast)
102
- TrueClass.module_eval(&boolean_cast)
103
- FalseClass.module_eval(&boolean_cast)
89
+ ::Boolean.send(:extend, BooleanCast)
90
+ TrueClass.send(:extend, BooleanCast)
91
+ FalseClass.send(:extend, BooleanCast)
104
92
 
105
93
  # @private
106
94
  class Time
@@ -147,3 +135,15 @@ module ActiveSupport
147
135
  end
148
136
  end
149
137
 
138
+ # @private
139
+ class Set
140
+ def as_json(options = {})
141
+ map { |e| e.as_json(options) }
142
+ end
143
+
144
+ def self.ripple_cast(value)
145
+ return nil if value.nil?
146
+ value.is_a?(Enumerable) && new(value) or raise Ripple::PropertyTypeMismatch.new(self, value)
147
+ end
148
+ end
149
+
@@ -0,0 +1,8 @@
1
+ unless respond_to?(:define_singleton_method)
2
+ class Object
3
+ def define_singleton_method(name, &block)
4
+ singleton_class = class << self; self; end
5
+ singleton_class.send(:define_method, name, &block)
6
+ end
7
+ end
8
+ end
@@ -1,23 +1,11 @@
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_model/naming'
3
+ require 'ripple/conflict/document_hooks'
17
4
  require 'ripple/document/bucket_access'
18
5
  require 'ripple/document/key'
19
6
  require 'ripple/document/persistence'
20
7
  require 'ripple/document/finders'
8
+ require 'ripple/document/link'
21
9
  require 'ripple/properties'
22
10
  require 'ripple/attribute_methods'
23
11
  require 'ripple/timestamps'
@@ -64,6 +52,7 @@ module Ripple
64
52
  include Ripple::Document::Key
65
53
  include Ripple::Document::Persistence
66
54
  extend Ripple::Properties
55
+ include Ripple::Document::Finders
67
56
  include Ripple::AttributeMethods
68
57
  include Ripple::Timestamps
69
58
  include Ripple::Validations
@@ -71,10 +60,10 @@ module Ripple
71
60
  include Ripple::Callbacks
72
61
  include Ripple::Observable
73
62
  include Ripple::Conversion
74
- include Ripple::Document::Finders
75
63
  include Ripple::Inspection
76
64
  include Ripple::NestedAttributes
77
65
  include Ripple::Serialization
66
+ include Ripple::Conflict::DocumentHooks
78
67
  end
79
68
 
80
69
  module ClassMethods
@@ -92,7 +81,23 @@ module Ripple
92
81
  def ==(comparison_object)
93
82
  comparison_object.equal?(self) ||
94
83
  (comparison_object.class < Document && (comparison_object.instance_of?(self.class) || comparison_object.class.bucket.name == self.class.bucket.name) &&
95
- comparison_object.key == key && !comparison_object.new?)
84
+ !new? && comparison_object.key == key && !comparison_object.new?)
85
+ end
86
+
87
+ def eql?(other)
88
+ return true if other.equal?(self)
89
+
90
+ (other.class.equal?(self.class)) &&
91
+ !other.new? && !new? &&
92
+ (other.key == key)
93
+ end
94
+
95
+ def hash
96
+ if new?
97
+ super # every new document should be treated as a different doc
98
+ else
99
+ [self.class, key].hash
100
+ end
96
101
  end
97
102
  end
98
103
  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 'ripple'
16
2
 
17
3
  module Ripple
@@ -1,22 +1,9 @@
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 'ripple/translation'
16
2
  require 'active_support/concern'
17
3
  require 'active_support/inflector'
18
4
  require 'active_support/core_ext/hash/except'
19
5
  require 'active_support/core_ext/hash/slice'
6
+ require 'ripple/conflict/resolver'
20
7
 
21
8
  module Ripple
22
9
 
@@ -60,10 +47,14 @@ module Ripple
60
47
  # @param [Array<String>] keylist an array of keys to find
61
48
  # @return [Array<Document>] a list of found documents, including nil for missing documents
62
49
  def find(*args)
63
- args.flatten!
64
- return nil if args.empty? || args.all?(&:blank?)
65
- return find_one(args.first) if args.size == 1
66
- args.map {|key| find_one(key) }
50
+ if args.first.is_a?(Array)
51
+ args.flatten.map {|key| find_one(key) }
52
+ else
53
+ args.flatten!
54
+ return nil if args.empty? || args.all?(&:blank?)
55
+ return find_one(args.first) if args.size == 1
56
+ args.map {|key| find_one(key) }
57
+ end
67
58
  end
68
59
 
69
60
  # Retrieve single or multiple documents from Riak
@@ -90,15 +81,17 @@ module Ripple
90
81
  end
91
82
 
92
83
  # Find all documents in the Document's bucket and return them.
93
- # @overload all()
84
+ # @overload list()
94
85
  # Get all documents and return them in an array.
95
86
  # @param [Hash] options options to be passed to the
96
87
  # underlying {Bucket#keys} method.
97
88
  # @return [Array<Document>] all found documents in the bucket
98
- # @overload all() {|doc| ... }
89
+ # @overload list() {|doc| ... }
99
90
  # Stream all documents in the bucket through the block.
100
91
  # @yield [Document] doc a found document
101
- def all(options={})
92
+ # @note This operation is incredibly expensive and should not
93
+ # be used in production applications.
94
+ def list
102
95
  if block_given?
103
96
  bucket.keys do |keys|
104
97
  keys.each do |key|
@@ -108,7 +101,7 @@ module Ripple
108
101
  end
109
102
  []
110
103
  else
111
- bucket.keys(options).inject([]) do |acc, k|
104
+ bucket.keys.inject([]) do |acc, k|
112
105
  obj = find_one(k)
113
106
  obj ? acc << obj : acc
114
107
  end
@@ -126,9 +119,10 @@ module Ripple
126
119
  klass = robject.data['_type'].constantize rescue self
127
120
  klass.new.tap do |doc|
128
121
  doc.key = robject.key
129
- doc.__send__(:attributes=, robject.data.except("_type"), false) if robject.data
122
+ doc.__send__(:raw_attributes=, robject.data.except("_type")) if robject.data
130
123
  doc.instance_variable_set(:@new, false)
131
124
  doc.instance_variable_set(:@robject, robject)
125
+ doc.changed_attributes.clear
132
126
  end
133
127
  end
134
128
  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
 
17
3
  module Ripple
@@ -23,26 +9,20 @@ module Ripple
23
9
  # Defines the key to be derived from a property.
24
10
  # @param [String,Symbol] prop the property to derive the key from
25
11
  def key_on(prop)
26
- class_eval <<-CODE
27
- def key
28
- #{prop}.to_s
29
- end
30
- def key=(value)
31
- self.#{prop} = value
32
- end
33
- def key_attr
34
- :#{prop}
35
- end
36
- CODE
12
+ prop = prop.to_sym
13
+
14
+ define_method(:key) { send(prop).to_s }
15
+ define_method(:key=) { |v| send(:"#{prop}=", v) }
16
+ define_method(:key_attr) { prop }
37
17
  end
38
18
  end
39
-
19
+
40
20
  module InstanceMethods
41
21
  # Reads the key for this Document.
42
22
  def key
43
23
  @key
44
24
  end
45
-
25
+
46
26
  # Sets the key for this Document.
47
27
  def key=(value)
48
28
  @key = value.to_s
@@ -50,7 +30,7 @@ module Ripple
50
30
 
51
31
  def key_attr
52
32
  :key
53
- end
33
+ end
54
34
  end
55
35
  end
56
36
  end