active_data 1.0.0 → 1.1.0

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 (115) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +13 -0
  3. data/.rubocop.yml +56 -0
  4. data/.rubocop_todo.yml +53 -0
  5. data/.rvmrc +1 -1
  6. data/.travis.yml +15 -2
  7. data/Appraisals +1 -1
  8. data/CHANGELOG.md +31 -0
  9. data/Guardfile +8 -8
  10. data/README.md +256 -0
  11. data/Rakefile +2 -4
  12. data/active_data.gemspec +8 -7
  13. data/gemfiles/rails.4.0.gemfile +1 -1
  14. data/gemfiles/rails.4.1.gemfile +1 -1
  15. data/gemfiles/rails.4.2.gemfile +1 -1
  16. data/gemfiles/rails.5.0.gemfile +1 -1
  17. data/gemfiles/rails.5.1.gemfile +14 -0
  18. data/lib/active_data/active_record/associations.rb +18 -13
  19. data/lib/active_data/active_record/nested_attributes.rb +8 -14
  20. data/lib/active_data/base.rb +13 -0
  21. data/lib/active_data/config.rb +4 -4
  22. data/lib/active_data/errors.rb +29 -13
  23. data/lib/active_data/extensions.rb +22 -21
  24. data/lib/active_data/model/associations/base.rb +22 -6
  25. data/lib/active_data/model/associations/embeds_any.rb +17 -0
  26. data/lib/active_data/model/associations/embeds_many.rb +29 -19
  27. data/lib/active_data/model/associations/embeds_one.rb +30 -26
  28. data/lib/active_data/model/associations/nested_attributes.rb +82 -50
  29. data/lib/active_data/model/associations/persistence_adapters/active_record/referenced_proxy.rb +31 -0
  30. data/lib/active_data/model/associations/persistence_adapters/active_record.rb +66 -0
  31. data/lib/active_data/model/associations/persistence_adapters/base.rb +53 -0
  32. data/lib/active_data/model/associations/references_any.rb +41 -0
  33. data/lib/active_data/model/associations/references_many.rb +51 -37
  34. data/lib/active_data/model/associations/references_one.rb +43 -41
  35. data/lib/active_data/model/associations/reflections/base.rb +19 -29
  36. data/lib/active_data/model/associations/reflections/embeds_any.rb +43 -0
  37. data/lib/active_data/model/associations/reflections/embeds_many.rb +3 -13
  38. data/lib/active_data/model/associations/reflections/embeds_one.rb +5 -37
  39. data/lib/active_data/model/associations/reflections/references_any.rb +62 -0
  40. data/lib/active_data/model/associations/reflections/references_many.rb +7 -7
  41. data/lib/active_data/model/associations/reflections/references_one.rb +9 -7
  42. data/lib/active_data/model/associations/reflections/singular.rb +35 -0
  43. data/lib/active_data/model/associations/validations.rb +2 -27
  44. data/lib/active_data/model/associations.rb +12 -10
  45. data/lib/active_data/model/attributes/attribute.rb +10 -10
  46. data/lib/active_data/model/attributes/base.rb +8 -7
  47. data/lib/active_data/model/attributes/localized.rb +4 -4
  48. data/lib/active_data/model/attributes/reference_many.rb +6 -8
  49. data/lib/active_data/model/attributes/reference_one.rb +17 -9
  50. data/lib/active_data/model/attributes/reflections/attribute.rb +2 -2
  51. data/lib/active_data/model/attributes/reflections/base.rb +8 -11
  52. data/lib/active_data/model/attributes/reflections/localized.rb +2 -2
  53. data/lib/active_data/model/attributes/reflections/reference_one.rb +11 -22
  54. data/lib/active_data/model/attributes/reflections/represents.rb +5 -6
  55. data/lib/active_data/model/attributes/represents.rb +6 -5
  56. data/lib/active_data/model/attributes.rb +33 -87
  57. data/lib/active_data/model/callbacks.rb +6 -7
  58. data/lib/active_data/model/conventions.rb +2 -0
  59. data/lib/active_data/model/dirty.rb +4 -4
  60. data/lib/active_data/model/lifecycle.rb +18 -20
  61. data/lib/active_data/model/localization.rb +5 -2
  62. data/lib/active_data/model/persistence.rb +2 -2
  63. data/lib/active_data/model/primary.rb +19 -14
  64. data/lib/active_data/model/representation.rb +81 -0
  65. data/lib/active_data/model/scopes.rb +22 -12
  66. data/lib/active_data/model/validations/associated.rb +3 -2
  67. data/lib/active_data/model/validations/nested.rb +6 -1
  68. data/lib/active_data/model/validations.rb +3 -3
  69. data/lib/active_data/model.rb +2 -1
  70. data/lib/active_data/undefined_class.rb +9 -0
  71. data/lib/active_data/version.rb +1 -1
  72. data/lib/active_data.rb +40 -17
  73. data/spec/lib/active_data/active_record/associations_spec.rb +107 -45
  74. data/spec/lib/active_data/active_record/nested_attributes_spec.rb +1 -2
  75. data/spec/lib/active_data/config_spec.rb +37 -15
  76. data/spec/lib/active_data/model/associations/embeds_many_spec.rb +475 -172
  77. data/spec/lib/active_data/model/associations/embeds_one_spec.rb +353 -96
  78. data/spec/lib/active_data/model/associations/nested_attributes_spec.rb +108 -12
  79. data/spec/lib/active_data/model/associations/persistence_adapters/active_record_spec.rb +58 -0
  80. data/spec/lib/active_data/model/associations/references_many_spec.rb +440 -64
  81. data/spec/lib/active_data/model/associations/references_one_spec.rb +347 -36
  82. data/spec/lib/active_data/model/associations/reflections/embeds_many_spec.rb +8 -7
  83. data/spec/lib/active_data/model/associations/reflections/embeds_one_spec.rb +7 -6
  84. data/spec/lib/active_data/model/associations/reflections/references_many_spec.rb +81 -33
  85. data/spec/lib/active_data/model/associations/reflections/references_one_spec.rb +116 -37
  86. data/spec/lib/active_data/model/associations/validations_spec.rb +27 -43
  87. data/spec/lib/active_data/model/associations_spec.rb +34 -25
  88. data/spec/lib/active_data/model/attributes/attribute_spec.rb +26 -23
  89. data/spec/lib/active_data/model/attributes/base_spec.rb +5 -6
  90. data/spec/lib/active_data/model/attributes/collection_spec.rb +7 -8
  91. data/spec/lib/active_data/model/attributes/dictionary_spec.rb +40 -33
  92. data/spec/lib/active_data/model/attributes/localized_spec.rb +27 -28
  93. data/spec/lib/active_data/model/attributes/reflections/attribute_spec.rb +6 -6
  94. data/spec/lib/active_data/model/attributes/represents_spec.rb +10 -78
  95. data/spec/lib/active_data/model/attributes_spec.rb +150 -45
  96. data/spec/lib/active_data/model/callbacks_spec.rb +69 -70
  97. data/spec/lib/active_data/model/conventions_spec.rb +0 -1
  98. data/spec/lib/active_data/model/dirty_spec.rb +22 -13
  99. data/spec/lib/active_data/model/lifecycle_spec.rb +49 -23
  100. data/spec/lib/active_data/model/persistence_spec.rb +5 -6
  101. data/spec/lib/active_data/model/representation_spec.rb +126 -0
  102. data/spec/lib/active_data/model/scopes_spec.rb +1 -3
  103. data/spec/lib/active_data/model/typecasting_spec.rb +6 -5
  104. data/spec/lib/active_data/model/validations/associated_spec.rb +26 -18
  105. data/spec/lib/active_data/model/validations/nested_spec.rb +89 -18
  106. data/spec/lib/active_data/model_spec.rb +1 -2
  107. data/spec/lib/active_data_spec.rb +0 -1
  108. data/spec/shared/nested_attribute_examples.rb +332 -0
  109. data/spec/spec_helper.rb +3 -0
  110. data/spec/support/model_helpers.rb +2 -2
  111. data/spec/support/muffle_helper.rb +7 -0
  112. metadata +52 -18
  113. data/lib/active_data/model/associations/collection/referenced.rb +0 -26
  114. data/lib/active_data/model/associations/reflections/reference_reflection.rb +0 -45
  115. data/spec/lib/active_data/model/nested_attributes.rb +0 -202
@@ -11,27 +11,17 @@ module ActiveData
11
11
  attr_accessor :parent_reflection
12
12
  delegate :association_class, to: 'self.class'
13
13
 
14
- def self.build target, generated_methods, name, options = {}, &block
15
- if block
16
- options[:class] = proc do |reflection|
17
- superclass = reflection.options[:class_name].to_s.presence.try(:constantize)
18
- klass = Class.new(superclass || Object) do
19
- include ActiveData::Model
20
- include ActiveData::Model::Associations
21
- include ActiveData::Model::Lifecycle
22
- include ActiveData::Model::Primary
23
- end
24
- target.const_set(name.to_s.classify, klass)
25
- klass.class_eval(&block)
26
- klass
27
- end
28
- end
14
+ def self.build(target, generated_methods, name, options = {}, &_block)
29
15
  generate_methods name, generated_methods
30
- target.validates_nested name if options.delete(:validate) && target.respond_to?(:validates_nested)
16
+ if options.delete(:validate) &&
17
+ target.respond_to?(:validates_nested) &&
18
+ !target.validates_nested?(name)
19
+ target.validates_nested name
20
+ end
31
21
  new(name, options)
32
22
  end
33
23
 
34
- def self.generate_methods name, target
24
+ def self.generate_methods(name, target)
35
25
  target.class_eval <<-RUBY, __FILE__, __LINE__ + 1
36
26
  def #{name} force_reload = false
37
27
  association(:#{name}).reader(force_reload)
@@ -47,8 +37,9 @@ module ActiveData
47
37
  @association_class ||= "ActiveData::Model::Associations::#{name.demodulize}".constantize
48
38
  end
49
39
 
50
- def initialize name, options = {}
51
- @name, @options = name.to_sym, options
40
+ def initialize(name, options = {})
41
+ @name = name.to_sym
42
+ @options = options
52
43
  end
53
44
 
54
45
  def macro
@@ -56,31 +47,30 @@ module ActiveData
56
47
  end
57
48
 
58
49
  def klass
59
- @klass ||= options[:class] ?
60
- options[:class].call(self) :
61
- (options[:class_name].presence || name.to_s.classify).to_s.constantize
50
+ @klass ||= (options[:class_name].presence || name.to_s.classify).to_s.constantize
62
51
  end
63
52
 
53
+ # AR compatibility
64
54
  def belongs_to?
65
55
  false
66
56
  end
67
57
 
68
- def build_association object
58
+ def build_association(object)
69
59
  self.class.association_class.new object, self
70
60
  end
71
61
 
72
- def read_source object
62
+ def read_source(object)
73
63
  (options[:read] || READ).call(self, object)
74
64
  end
75
65
 
76
- def write_source object, value
66
+ def write_source(object, value)
77
67
  (options[:write] || WRITE).call(self, object, value)
78
68
  end
79
69
 
80
- def default object
70
+ def default(object)
81
71
  defaultizer = options[:default]
82
72
  if defaultizer.is_a?(Proc)
83
- if defaultizer.arity != 0
73
+ if defaultizer.arity.nonzero?
84
74
  defaultizer.call(object)
85
75
  else
86
76
  object.instance_exec(&defaultizer)
@@ -90,8 +80,8 @@ module ActiveData
90
80
  end
91
81
  end
92
82
 
93
- def inspect
94
- "#{self.class.name.demodulize}(#{klass})"
83
+ def collection?
84
+ true
95
85
  end
96
86
  end
97
87
  end
@@ -0,0 +1,43 @@
1
+ module ActiveData
2
+ module Model
3
+ module Associations
4
+ module Reflections
5
+ class EmbedsAny < Base
6
+ def self.build(target, generated_methods, name, options = {}, &block)
7
+ if block
8
+ options[:class] = proc do |reflection|
9
+ superclass = reflection.options[:class_name].to_s.presence.try(:constantize)
10
+ klass = Class.new(superclass || ActiveData::Base) do
11
+ include ActiveData::Model
12
+ include ActiveData::Model::Associations
13
+ include ActiveData::Model::Lifecycle
14
+ include ActiveData::Model::Primary
15
+ end
16
+ target.const_set(name.to_s.classify, klass)
17
+ klass.class_eval(&block)
18
+ klass
19
+ end
20
+ end
21
+ super
22
+ end
23
+
24
+ def klass
25
+ @klass ||= if options[:class]
26
+ options[:class].call(self)
27
+ else
28
+ super
29
+ end
30
+ end
31
+
32
+ def inspect
33
+ "#{self.class.name.demodulize}(#{klass})"
34
+ end
35
+
36
+ def embedded?
37
+ true
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -2,22 +2,12 @@ module ActiveData
2
2
  module Model
3
3
  module Associations
4
4
  module Reflections
5
- class EmbedsMany < Base
6
- def self.build target, generated_methods, name, options = {}, &block
7
- if target < ActiveData::Model::Attributes
8
- target.add_attribute(ActiveData::Model::Attributes::Reflections::Base, name)
9
- end
5
+ class EmbedsMany < EmbedsAny
6
+ def self.build(target, generated_methods, name, options = {}, &block)
7
+ target.add_attribute(ActiveData::Model::Attributes::Reflections::Base, name) if target < ActiveData::Model::Attributes
10
8
  options[:validate] = true unless options.key?(:validate)
11
9
  super
12
10
  end
13
-
14
- def collection?
15
- true
16
- end
17
-
18
- def embedded?
19
- true
20
- end
21
11
  end
22
12
  end
23
13
  end
@@ -2,46 +2,14 @@ module ActiveData
2
2
  module Model
3
3
  module Associations
4
4
  module Reflections
5
- class EmbedsOne < Base
6
- def self.build target, generated_methods, name, options = {}, &block
7
- if target < ActiveData::Model::Attributes
8
- target.add_attribute(ActiveData::Model::Attributes::Reflections::Base, name)
9
- end
5
+ class EmbedsOne < EmbedsAny
6
+ include Singular
7
+
8
+ def self.build(target, generated_methods, name, options = {}, &block)
9
+ target.add_attribute(ActiveData::Model::Attributes::Reflections::Base, name) if target < ActiveData::Model::Attributes
10
10
  options[:validate] = true unless options.key?(:validate)
11
11
  super
12
12
  end
13
-
14
- def self.generate_methods name, target
15
- target.class_eval <<-RUBY, __FILE__, __LINE__ + 1
16
- def #{name} force_reload = false
17
- association(:#{name}).reader(force_reload)
18
- end
19
-
20
- def #{name}= value
21
- association(:#{name}).writer(value)
22
- end
23
-
24
- def build_#{name} attributes = {}
25
- association(:#{name}).build(attributes)
26
- end
27
-
28
- def create_#{name} attributes = {}
29
- association(:#{name}).create(attributes)
30
- end
31
-
32
- def create_#{name}! attributes = {}
33
- association(:#{name}).create!(attributes)
34
- end
35
- RUBY
36
- end
37
-
38
- def collection?
39
- false
40
- end
41
-
42
- def embedded?
43
- true
44
- end
45
13
  end
46
14
  end
47
15
  end
@@ -0,0 +1,62 @@
1
+ module ActiveData
2
+ module Model
3
+ module Associations
4
+ module Reflections
5
+ class ReferencesAny < Base
6
+ def self.build(_target, generated_methods, name, *args)
7
+ reflection = new(name, *args)
8
+ generate_methods name, generated_methods
9
+ reflection
10
+ end
11
+
12
+ def self.persistence_adapter(klass)
13
+ adapter = klass.active_data_persistence_adapter if klass.respond_to?(:active_data_persistence_adapter)
14
+ adapter or raise PersistenceAdapterMissing, klass
15
+ end
16
+
17
+ delegate :primary_key, to: :persistence_adapter
18
+
19
+ def initialize(name, *args)
20
+ @options = args.extract_options!
21
+ @scope_proc = args.first
22
+ @name = name.to_sym
23
+ end
24
+
25
+ def klass
26
+ @klass ||= if options[:data_source].present?
27
+ options[:data_source].to_s.constantize
28
+ else
29
+ super
30
+ end
31
+ end
32
+ alias_method :data_source, :klass
33
+
34
+ def persistence_adapter
35
+ @persistence_adapter ||= self.class.persistence_adapter(klass)
36
+ .new(data_source, options[:primary_key], @scope_proc)
37
+ end
38
+
39
+ def read_source(object)
40
+ object.read_attribute(reference_key)
41
+ end
42
+
43
+ def write_source(object, value)
44
+ object.write_attribute(reference_key, value)
45
+ end
46
+
47
+ def embedded?
48
+ false
49
+ end
50
+
51
+ def inspect
52
+ "#{self.class.name.demodulize}(#{persistence_adapter.data_type})"
53
+ end
54
+
55
+ def autosave?
56
+ !!options[:autosave]
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -1,22 +1,22 @@
1
+ require 'active_data/model/attributes/reflections/reference_many'
2
+ require 'active_data/model/attributes/reference_many'
3
+
1
4
  module ActiveData
2
5
  module Model
3
6
  module Associations
4
7
  module Reflections
5
- class ReferencesMany < ReferenceReflection
6
- def self.build target, generated_methods, name, *args, &block
8
+ class ReferencesMany < ReferencesAny
9
+ def self.build(target, generated_methods, name, *args, &block)
7
10
  reflection = super
8
11
 
9
12
  target.add_attribute(
10
13
  ActiveData::Model::Attributes::Reflections::ReferenceMany,
11
- reflection.reference_key, association: name)
14
+ reflection.reference_key, association: name
15
+ )
12
16
 
13
17
  reflection
14
18
  end
15
19
 
16
- def collection?
17
- true
18
- end
19
-
20
20
  def reference_key
21
21
  @reference_key ||= options[:reference_key].presence.try(:to_sym) ||
22
22
  :"#{name.to_s.singularize}_#{primary_key.to_s.pluralize}"
@@ -1,22 +1,24 @@
1
+ require 'active_data/model/attributes/reflections/reference_one'
2
+ require 'active_data/model/attributes/reference_one'
3
+
1
4
  module ActiveData
2
5
  module Model
3
6
  module Associations
4
7
  module Reflections
5
- class ReferencesOne < ReferenceReflection
6
- def self.build target, generated_methods, name, *args, &block
8
+ class ReferencesOne < ReferencesAny
9
+ include Singular
10
+
11
+ def self.build(target, generated_methods, name, *args, &block)
7
12
  reflection = super
8
13
 
9
14
  target.add_attribute(
10
15
  ActiveData::Model::Attributes::Reflections::ReferenceOne,
11
- reflection.reference_key, association: name)
16
+ reflection.reference_key, association: name
17
+ )
12
18
 
13
19
  reflection
14
20
  end
15
21
 
16
- def collection?
17
- false
18
- end
19
-
20
22
  def reference_key
21
23
  @reference_key ||= options[:reference_key].presence.try(:to_sym) ||
22
24
  :"#{name}_#{primary_key}"
@@ -0,0 +1,35 @@
1
+ module ActiveData
2
+ module Model
3
+ module Associations
4
+ module Reflections
5
+ module Singular
6
+ extend ActiveSupport::Concern
7
+
8
+ module ClassMethods
9
+ def generate_methods(name, target)
10
+ super
11
+
12
+ target.class_eval <<-RUBY, __FILE__, __LINE__ + 1
13
+ def build_#{name} attributes = {}
14
+ association(:#{name}).build(attributes)
15
+ end
16
+
17
+ def create_#{name} attributes = {}
18
+ association(:#{name}).create(attributes)
19
+ end
20
+
21
+ def create_#{name}! attributes = {}
22
+ association(:#{name}).create!(attributes)
23
+ end
24
+ RUBY
25
+ end
26
+ end
27
+
28
+ def collection?
29
+ false
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -19,44 +19,19 @@ module ActiveData
19
19
 
20
20
  private
21
21
 
22
- def run_validations! #:nodoc:
23
- super
24
- emerge_represented_attributes_errors!
25
- errors.empty?
26
- end
27
-
28
22
  def validate_nested!
29
23
  association_names.each do |name|
30
24
  association = association(name)
31
25
  invalid_block = if association.reflection.klass.method_defined?(:invalid_ansestry?)
32
- lambda { |object| object.invalid_ansestry? }
26
+ ->(object) { object.invalid_ansestry? }
33
27
  else
34
- lambda { |object| object.invalid? }
28
+ ->(object) { object.invalid? }
35
29
  end
36
30
 
37
31
  ActiveData::Model::Validations::NestedValidator
38
32
  .validate_nested(self, name, association.target, &invalid_block)
39
33
  end
40
34
  end
41
-
42
- # Move represent attribute errors to the top level:
43
- #
44
- # {:'role.email' => ['Some error']}
45
- #
46
- # to:
47
- #
48
- # {email: ['Some error']}
49
- #
50
- def emerge_represented_attributes_errors!
51
- self.class.represented_attributes.each do |attribute|
52
- key = :"#{attribute.reference}.#{attribute.column}"
53
- messages = errors.messages[key]
54
- if messages.present?
55
- errors[attribute.column].concat(messages)
56
- errors.delete(key)
57
- end
58
- end
59
- end
60
35
  end
61
36
  end
62
37
  end
@@ -1,17 +1,20 @@
1
1
  require 'active_data/model/associations/collection/proxy'
2
2
  require 'active_data/model/associations/collection/embedded'
3
- require 'active_data/model/associations/collection/referenced'
4
3
 
5
4
  require 'active_data/model/associations/reflections/base'
5
+ require 'active_data/model/associations/reflections/singular'
6
+ require 'active_data/model/associations/reflections/embeds_any'
6
7
  require 'active_data/model/associations/reflections/embeds_one'
7
8
  require 'active_data/model/associations/reflections/embeds_many'
8
- require 'active_data/model/associations/reflections/reference_reflection'
9
+ require 'active_data/model/associations/reflections/references_any'
9
10
  require 'active_data/model/associations/reflections/references_one'
10
11
  require 'active_data/model/associations/reflections/references_many'
11
12
 
12
13
  require 'active_data/model/associations/base'
14
+ require 'active_data/model/associations/embeds_any'
13
15
  require 'active_data/model/associations/embeds_one'
14
16
  require 'active_data/model/associations/embeds_many'
17
+ require 'active_data/model/associations/references_any'
15
18
  require 'active_data/model/associations/references_one'
16
19
  require 'active_data/model/associations/references_many'
17
20
 
@@ -25,7 +28,6 @@ module ActiveData
25
28
 
26
29
  included do
27
30
  include NestedAttributes
28
- include Validations
29
31
 
30
32
  class_attribute :_associations, :_association_aliases, instance_reader: false, instance_writer: false
31
33
  self._associations = {}
@@ -54,13 +56,13 @@ module ActiveData
54
56
 
55
57
  def alias_association(alias_name, association_name)
56
58
  reflection = reflect_on_association(association_name)
57
- raise ArgumentError.new("Can't alias undefined association `#{attribute_name}` on #{self}") unless reflection
59
+ raise ArgumentError, "Can't alias undefined association `#{attribute_name}` on #{self}" unless reflection
58
60
  reflection.class.generate_methods alias_name, generated_associations_methods
59
61
  self._association_aliases = _association_aliases.merge(alias_name.to_sym => reflection.name)
60
62
  reflection
61
63
  end
62
64
 
63
- def reflect_on_association name
65
+ def reflect_on_association(name)
64
66
  name = name.to_sym
65
67
  _associations[_association_aliases[name] || name]
66
68
  end
@@ -83,17 +85,17 @@ module ActiveData
83
85
  end
84
86
  end
85
87
 
86
- def == other
88
+ def ==(other)
87
89
  super && association_names.all? do |association|
88
90
  public_send(association) == other.public_send(association)
89
91
  end
90
92
  end
91
93
  alias_method :eql?, :==
92
94
 
93
- def association name
94
- if reflection = self.class.reflect_on_association(name)
95
- (@_associations ||= {})[reflection.name] ||= reflection.build_association(self)
96
- end
95
+ def association(name)
96
+ reflection = self.class.reflect_on_association(name)
97
+ return unless reflection
98
+ (@_associations ||= {})[reflection.name] ||= reflection.build_association(self)
97
99
  end
98
100
 
99
101
  def apply_association_changes!
@@ -4,7 +4,7 @@ module ActiveData
4
4
  class Attribute < Base
5
5
  delegate :defaultizer, :enumerizer, :normalizers, to: :reflection
6
6
 
7
- def write value
7
+ def write(value)
8
8
  return if readonly?
9
9
  pollute do
10
10
  write_value value
@@ -27,8 +27,8 @@ module ActiveData
27
27
  defaultizer.is_a?(Proc) ? evaluate(&defaultizer) : defaultizer
28
28
  end
29
29
 
30
- def defaultize value, default_value = nil
31
- defaultizer && value.nil? ? default_value || default : value
30
+ def defaultize(value, default_value = nil)
31
+ !defaultizer.nil? && value.nil? ? default_value || default : value
32
32
  end
33
33
 
34
34
  def enum
@@ -44,25 +44,25 @@ module ActiveData
44
44
  end.to_set
45
45
  end
46
46
 
47
- def enumerize value
47
+ def enumerize(value)
48
48
  set = enum if enumerizer
49
49
  value if !set || (set.none? || set.include?(value))
50
50
  end
51
51
 
52
- def normalize value
52
+ def normalize(value)
53
53
  if normalizers.none?
54
54
  value
55
55
  else
56
- normalizers.inject(value) do |value, normalizer|
56
+ normalizers.inject(value) do |val, normalizer|
57
57
  case normalizer
58
58
  when Proc
59
- evaluate(value, &normalizer)
59
+ evaluate(val, &normalizer)
60
60
  when Hash
61
- normalizer.inject(value) do |value, (name, options)|
62
- ActiveData.normalizer(name).call(value, options, self)
61
+ normalizer.inject(val) do |v, (name, options)|
62
+ ActiveData.normalizer(name).call(v, options, self)
63
63
  end
64
64
  else
65
- ActiveData.normalizer(normalizer).call(value, {}, self)
65
+ ActiveData.normalizer(normalizer).call(val, {}, self)
66
66
  end
67
67
  end
68
68
  end
@@ -5,20 +5,21 @@ module ActiveData
5
5
  attr_reader :name, :owner
6
6
  delegate :type, :typecaster, :readonly, to: :reflection
7
7
 
8
- def initialize name, owner
9
- @name, @owner = name, owner
8
+ def initialize(name, owner)
9
+ @name = name
10
+ @owner = owner
10
11
  end
11
12
 
12
13
  def reflection
13
14
  @owner.class._attributes[name]
14
15
  end
15
16
 
16
- def write_value value
17
+ def write_value(value)
17
18
  reset
18
19
  @value_cache = value
19
20
  end
20
21
 
21
- def write value
22
+ def write(value)
22
23
  return if readonly?
23
24
  write_value value
24
25
  end
@@ -43,7 +44,7 @@ module ActiveData
43
44
  !(read.respond_to?(:zero?) ? read.zero? : read.blank?)
44
45
  end
45
46
 
46
- def typecast value
47
+ def typecast(value)
47
48
  if value.instance_of?(type)
48
49
  value
49
50
  else
@@ -86,12 +87,12 @@ module ActiveData
86
87
 
87
88
  private
88
89
 
89
- def evaluate *args, &block
90
+ def evaluate(*args, &block)
90
91
  if block.arity >= 0 && block.arity <= args.length
91
92
  owner.instance_exec(*args.first(block.arity), &block)
92
93
  else
93
94
  args = block.arity < 0 ? args : args.first(block.arity)
94
- block.call(*args, owner)
95
+ yield(*args, owner)
95
96
  end
96
97
  end
97
98
 
@@ -14,25 +14,25 @@ module ActiveData
14
14
  end]
15
15
  end
16
16
 
17
- def write_locale value, locale
17
+ def write_locale(value, locale)
18
18
  pollute do
19
19
  write(read.merge(locale.to_s => value))
20
20
  end
21
21
  end
22
22
 
23
- def read_locale locale
23
+ def read_locale(locale)
24
24
  read[owner.class.fallbacks(locale).detect do |fallback|
25
25
  read[fallback.to_s]
26
26
  end.to_s]
27
27
  end
28
28
 
29
- def read_locale_before_type_cast locale
29
+ def read_locale_before_type_cast(locale)
30
30
  read_before_type_cast[owner.class.fallbacks(locale).detect do |fallback|
31
31
  read_before_type_cast[fallback.to_s]
32
32
  end.to_s]
33
33
  end
34
34
 
35
- def locale_query locale
35
+ def locale_query(locale)
36
36
  value = read_locale(locale)
37
37
  !(value.respond_to?(:zero?) ? value.zero? : value.blank?)
38
38
  end
@@ -2,19 +2,17 @@ module ActiveData
2
2
  module Model
3
3
  module Attributes
4
4
  class ReferenceMany < ReferenceOne
5
- def read_before_type_cast
6
- variable_cache(:value_before_type_cast) do
7
- Array.wrap(@value_cache)
8
- end
9
- end
10
-
11
- private
12
-
13
5
  def type_casted_value
14
6
  variable_cache(:value) do
15
7
  read_before_type_cast.map { |id| typecast(id) }
16
8
  end
17
9
  end
10
+
11
+ def read_before_type_cast
12
+ variable_cache(:value_before_type_cast) do
13
+ Array.wrap(@value_cache)
14
+ end
15
+ end
18
16
  end
19
17
  end
20
18
  end