ripple 0.7.0 → 0.7.1

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 (51) hide show
  1. data/lib/ripple.rb +17 -1
  2. data/lib/ripple/associations.rb +157 -0
  3. data/lib/ripple/associations/embedded.rb +42 -0
  4. data/lib/ripple/associations/instantiators.rb +39 -0
  5. data/lib/ripple/{document/associations → associations}/linked.rb +9 -11
  6. data/lib/ripple/{document/associations/one_embedded_proxy.rb → associations/many.rb} +30 -21
  7. data/lib/ripple/{document/associations/embedded.rb → associations/many_embedded_proxy.rb} +26 -23
  8. data/lib/ripple/{embedded_document/conversion.rb → associations/one.rb} +8 -13
  9. data/lib/ripple/{document/associations/instantiators.rb → associations/one_embedded_proxy.rb} +17 -19
  10. data/lib/ripple/associations/proxy.rb +123 -0
  11. data/lib/ripple/attribute_methods.rb +116 -0
  12. data/lib/ripple/{document/attribute_methods/write.rb → attribute_methods/dirty.rb} +26 -16
  13. data/lib/ripple/attribute_methods/query.rb +48 -0
  14. data/lib/ripple/{document/attribute_methods → attribute_methods}/read.rb +16 -18
  15. data/lib/ripple/attribute_methods/write.rb +38 -0
  16. data/lib/ripple/callbacks.rb +73 -0
  17. data/lib/ripple/{document/associations/one.rb → conversion.rb} +18 -13
  18. data/lib/ripple/document.rb +19 -9
  19. data/lib/ripple/embedded_document.rb +10 -10
  20. data/lib/ripple/embedded_document/persistence.rb +12 -53
  21. data/lib/ripple/properties.rb +83 -0
  22. data/lib/ripple/timestamps.rb +34 -0
  23. data/lib/ripple/{document/validations.rb → validations.rb} +31 -33
  24. data/lib/ripple/{document/validations → validations}/associated_validator.rb +9 -10
  25. data/spec/integration/ripple/associations_spec.rb +1 -2
  26. data/spec/integration/ripple/persistence_spec.rb +2 -3
  27. data/spec/ripple/associations/many_embedded_proxy_spec.rb +2 -2
  28. data/spec/ripple/associations/one_embedded_proxy_spec.rb +2 -2
  29. data/spec/ripple/associations/proxy_spec.rb +1 -1
  30. data/spec/ripple/associations_spec.rb +15 -20
  31. data/spec/ripple/attribute_methods_spec.rb +3 -6
  32. data/spec/ripple/callbacks_spec.rb +1 -1
  33. data/spec/ripple/{embedded_document/conversion_spec.rb → conversion_spec.rb} +4 -4
  34. data/spec/ripple/embedded_document/persistence_spec.rb +4 -16
  35. data/spec/ripple/properties_spec.rb +17 -18
  36. data/spec/ripple/timestamps_spec.rb +1 -1
  37. data/spec/ripple/validations_spec.rb +1 -1
  38. data/spec/spec_helper.rb +1 -1
  39. data/spec/support/associations/proxies.rb +4 -4
  40. metadata +27 -29
  41. data/lib/ripple/document/associations.rb +0 -154
  42. data/lib/ripple/document/associations/many.rb +0 -52
  43. data/lib/ripple/document/associations/many_embedded_proxy.rb +0 -49
  44. data/lib/ripple/document/associations/proxy.rb +0 -125
  45. data/lib/ripple/document/attribute_methods.rb +0 -118
  46. data/lib/ripple/document/attribute_methods/dirty.rb +0 -52
  47. data/lib/ripple/document/attribute_methods/query.rb +0 -49
  48. data/lib/ripple/document/callbacks.rb +0 -75
  49. data/lib/ripple/document/properties.rb +0 -85
  50. data/lib/ripple/document/timestamps.rb +0 -22
  51. data/spec/support/integration.rb +0 -4
@@ -1,118 +0,0 @@
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
- require 'ripple'
15
-
16
- module Ripple
17
- module Document
18
- # Makes ActiveRecord-like attribute accessors based on your
19
- # {Document}'s properties.
20
- module AttributeMethods
21
- extend ActiveSupport::Concern
22
- extend ActiveSupport::Autoload
23
- include ActiveModel::AttributeMethods
24
-
25
- autoload :Read
26
- autoload :Write
27
- autoload :Query
28
- autoload :Dirty
29
-
30
- included do
31
- include Read
32
- include Write
33
- include Query
34
- include Dirty
35
- end
36
-
37
- module ClassMethods
38
- # @private
39
- def property(key, type, options={})
40
- undefine_attribute_methods
41
- super
42
- end
43
-
44
- # Generates all the attribute-related methods for properties defined
45
- # on the document, including accessors, mutators and query methods.
46
- def define_attribute_methods
47
- super(properties.keys)
48
- end
49
- end
50
-
51
- module InstanceMethods
52
- attr_accessor :key
53
-
54
- # A copy of the values of all attributes in the Document. The result
55
- # is not memoized, so use sparingly. This does not include associated objects,
56
- # nor embedded documents.
57
- # @return [Hash] all document attributes, by key
58
- def attributes
59
- self.class.properties.values.inject({}) do |hash, prop|
60
- hash[prop.key] = attribute(prop.key)
61
- hash
62
- end.with_indifferent_access
63
- end
64
-
65
- # Mass assign the document's attributes.
66
- # @param [Hash] attrs the attributes to assign
67
- def attributes=(attrs)
68
- raise ArgumentError, t('attribute_hash') unless Hash === attrs
69
- attrs.each do |k,v|
70
- next if k.to_sym == :key
71
- if respond_to?("#{k}=")
72
- __send__("#{k}=",v)
73
- else
74
- __send__(:attribute=,k,v)
75
- end
76
- end
77
- end
78
-
79
- def key=(value)
80
- @key = value.to_s
81
- end
82
-
83
- # @private
84
- def initialize(attrs={})
85
- super()
86
- @attributes = attributes_from_property_defaults
87
- self.attributes = attrs
88
- yield self if block_given?
89
- end
90
-
91
- # @private
92
- def method_missing(method, *args, &block)
93
- self.class.define_attribute_methods
94
- super
95
- end
96
-
97
- # @private
98
- def respond_to?(*args)
99
- self.class.define_attribute_methods
100
- super
101
- end
102
-
103
- protected
104
- # @private
105
- def attribute_method?(attr_name)
106
- self.class.properties.include?(attr_name)
107
- end
108
-
109
- def attributes_from_property_defaults
110
- self.class.properties.values.inject({}) do |hash, prop|
111
- hash[prop.key] = prop.default if prop.default
112
- hash
113
- end.with_indifferent_access
114
- end
115
- end
116
- end
117
- end
118
- end
@@ -1,52 +0,0 @@
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
- require 'ripple'
15
-
16
- module Ripple
17
- module Document
18
- module AttributeMethods
19
- module Dirty
20
- extend ActiveSupport::Concern
21
- include ActiveModel::Dirty
22
-
23
- # @private
24
- def save
25
- if result = super
26
- changed_attributes.clear
27
- end
28
- result
29
- end
30
-
31
- # @private
32
- def reload
33
- returning super do
34
- changed_attributes.clear
35
- end
36
- end
37
-
38
- # @private
39
- def initialize(attrs={})
40
- super(attrs)
41
- changed_attributes.clear
42
- end
43
-
44
- private
45
- def attribute=(attr_name, value)
46
- attribute_will_change!(attr_name)
47
- super
48
- end
49
- end
50
- end
51
- end
52
- end
@@ -1,49 +0,0 @@
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
- require 'ripple'
15
-
16
- module Ripple
17
- module Document
18
- module AttributeMethods
19
- module Query
20
- extend ActiveSupport::Concern
21
-
22
- included do
23
- attribute_method_suffix "?"
24
- end
25
-
26
- private
27
- # Based on code from ActiveRecord
28
- def attribute?(attr_name)
29
- unless value = attribute(attr_name)
30
- false
31
- else
32
- prop = self.class.properties[attr_name]
33
- if prop.nil?
34
- if Numeric === value || value !~ /[^0-9]/
35
- !value.to_i.zero?
36
- else
37
- Boolean.ripple_cast(value) || value.present?
38
- end
39
- elsif prop.type <= Numeric
40
- !value.zero?
41
- else
42
- value.present?
43
- end
44
- end
45
- end
46
- end
47
- end
48
- end
49
- end
@@ -1,75 +0,0 @@
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
- require 'ripple'
15
-
16
- module Ripple
17
- module Document
18
- module Callbacks
19
- extend ActiveSupport::Concern
20
-
21
- included do
22
- extend ActiveModel::Callbacks
23
- define_model_callbacks :create, :update, :save, :destroy
24
- define_callbacks :validation, :terminator => "result == false", :scope => [:kind, :name]
25
- end
26
-
27
- module ClassMethods
28
- def before_validation(*args, &block)
29
- options = args.last
30
- if options.is_a?(Hash) && options[:on]
31
- options[:if] = Array(options[:if])
32
- options[:if] << "@_on_validate == :#{options[:on]}"
33
- end
34
- set_callback(:validation, :before, *args, &block)
35
- end
36
-
37
- def after_validation(*args, &block)
38
- options = args.extract_options!
39
- options[:prepend] = true
40
- options[:if] = Array(options[:if])
41
- options[:if] << "!halted && value != false"
42
- options[:if] << "@_on_validate == :#{options[:on]}" if options[:on]
43
- set_callback(:validation, :after, *(args << options), &block)
44
- end
45
- end
46
-
47
- module InstanceMethods
48
- # @private
49
- def save(*args, &block)
50
- state = new? ? :create : :update
51
- run_callbacks(:save) do
52
- run_callbacks(state) do
53
- super
54
- end
55
- end
56
- end
57
-
58
- # @private
59
- def destroy(*args, &block)
60
- run_callbacks(:destroy) do
61
- super
62
- end
63
- end
64
-
65
- # @private
66
- def valid?(*args, &block)
67
- @_on_validate = new? ? :create : :update
68
- run_callbacks(:validation) do
69
- super
70
- end
71
- end
72
- end
73
- end
74
- end
75
- end
@@ -1,85 +0,0 @@
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
- require 'ripple'
15
- require 'ripple/core_ext/casting'
16
-
17
- module Ripple
18
- module Document
19
- # Adds the ability to declare properties on your Ripple::Document class.
20
- # Properties will automatically generate accessor (get/set/query) methods and
21
- # handle type-casting between your Ruby type and JSON-compatible types.
22
- module Properties
23
- # @private
24
- def inherited(subclass)
25
- super
26
- subclass.properties.merge!(properties)
27
- end
28
-
29
- # @return [Hash] the properties defined on the document
30
- def properties
31
- @properties ||= {}.with_indifferent_access
32
- end
33
-
34
- def property(key, type, options={})
35
- prop = Property.new(key, type, options)
36
- properties[prop.key] = prop
37
- end
38
- end
39
-
40
- # Encapsulates a single property on your Ripple::Document class.
41
- class Property
42
- # @return [Symbol] the key of this property in the Document
43
- attr_reader :key
44
- # @return [Class] the Ruby type of property.
45
- attr_reader :type
46
- # @return [Hash] configuration options
47
- attr_reader :options
48
-
49
- # Create a new document property.
50
- # @param [String, Symbol] key the key of the property
51
- # @param [Class] type the Ruby type of the property. Use {Boolean} for true or false types.
52
- # @param [Hash] options configuration options
53
- # @option options [Object, Proc] :default (nil) a default value for the property, or a lambda to evaluate when providing the default.
54
- def initialize(key, type, options={})
55
- @options = options.to_options
56
- @key = key.to_sym
57
- @type = type
58
- end
59
-
60
- # @return [Object] The default value for this property if defined, or nil.
61
- def default
62
- if default = options[:default]
63
- type_cast(default.respond_to?(:call) ? default.call : default)
64
- end
65
- end
66
-
67
- # @return [Hash] options appropriate for the validates class method
68
- def validation_options
69
- @options.dup.except(:default)
70
- end
71
-
72
- # Attempt to coerce the passed value into this property's type
73
- # @param [Object] value the value to coerce
74
- # @return [Object] the value coerced into this property's type
75
- # @raise [PropertyTypeMismatch] if the value cannot be coerced into the property's type
76
- def type_cast(value)
77
- if @type.respond_to?(:ripple_cast)
78
- @type.ripple_cast(value)
79
- else
80
- value
81
- end
82
- end
83
- end
84
- end
85
- end
@@ -1,22 +0,0 @@
1
- module Ripple
2
- module Document
3
- module Timestamps
4
- extend ActiveSupport::Concern
5
-
6
- module ClassMethods
7
- def timestamps!
8
- property :created_at, Time, :default => proc { Time.now.utc }
9
- property :updated_at, Time
10
- before_save :touch
11
- end
12
- end
13
-
14
- module InstanceMethods
15
- def touch
16
- self.updated_at = Time.now.utc
17
- end
18
- end
19
-
20
- end
21
- end
22
- end
@@ -1,4 +0,0 @@
1
-
2
- def switch_to_test_node
3
- Ripple.client.port = 9000
4
- end