active_delegate 0.2.0 → 0.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 35e32e13c8c9845a3a17e841ddb1eaa2d5f9121a
4
- data.tar.gz: 0ed1a3d1c8ca242f17e4380b71580a67b5ee37c9
3
+ metadata.gz: db4ce7e906bb62440ecead0e66d21d611b9354ac
4
+ data.tar.gz: e6e9e1b63faaf10d0f7522f7c19cc22563976554
5
5
  SHA512:
6
- metadata.gz: 5cab38ba25465170241da07c01579281f56f7ad72e423fad6c42a22b3f1769d13963533b67347835fc2a93d1eccab2bbdd1157bae6c59ea9585829136629864a
7
- data.tar.gz: '0782f2d0cc0d8f9585921d3fcf4dbedd32ecfcc5768fd45a90019be9343850b4c67733e9d82e1a6bf3cf7fb66558196a00c679e9ff574e1c0ee6b78c569ea2c0'
6
+ metadata.gz: 11d848253fb51ced3c37e97806dcd15ef71634a501ae6003a65e18a074347406d1b1c12241904b74d58b5ebc37a386d97baf119250fe83fcd0d16ad26686265d
7
+ data.tar.gz: 51202fe31b97ac2fa6bf6dfa0966681d9b75fc87ef3845b9959674f59403c6f9d7dce06a62682175c14fee417f7cdfdc000c51798557f53a8c1001925dd55df9
@@ -1,29 +1,28 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- active_delegate (0.1.2)
4
+ active_delegate (0.1.1)
5
5
  activerecord (~> 5.0)
6
6
  i18n (~> 0.8)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- activemodel (5.1.4)
12
- activesupport (= 5.1.4)
13
- activerecord (5.1.4)
14
- activemodel (= 5.1.4)
15
- activesupport (= 5.1.4)
11
+ activemodel (5.1.1)
12
+ activesupport (= 5.1.1)
13
+ activerecord (5.1.1)
14
+ activemodel (= 5.1.1)
15
+ activesupport (= 5.1.1)
16
16
  arel (~> 8.0)
17
- activesupport (5.1.4)
17
+ activesupport (5.1.1)
18
18
  concurrent-ruby (~> 1.0, >= 1.0.2)
19
19
  i18n (~> 0.7)
20
20
  minitest (~> 5.1)
21
21
  tzinfo (~> 1.1)
22
22
  arel (8.0.0)
23
23
  concurrent-ruby (1.0.5)
24
- i18n (0.9.0)
25
- concurrent-ruby (~> 1.0)
26
- minitest (5.10.3)
24
+ i18n (0.8.4)
25
+ minitest (5.10.2)
27
26
  rake (10.5.0)
28
27
  thread_safe (0.3.6)
29
28
  tzinfo (1.2.3)
@@ -39,4 +38,4 @@ DEPENDENCIES
39
38
  rake (~> 10.0)
40
39
 
41
40
  BUNDLED WITH
42
- 1.15.4
41
+ 1.14.6
@@ -18,7 +18,11 @@ module ActiveDelegate
18
18
 
19
19
  # Get default options
20
20
  def default_options
21
- { except: [], only: [], allow_nil: false, to: [], prefix: nil, localized: false, finder: false, scope: false }
21
+ {
22
+ except: [], only: [], allow_nil: false, to: [],
23
+ prefix: nil, localized: false, finder: false,
24
+ scope: false, cast: false
25
+ }
22
26
  end
23
27
 
24
28
  # Get association reflection
@@ -117,12 +121,22 @@ module ActiveDelegate
117
121
 
118
122
  # Get attribute default
119
123
  def attribute_default(attribute)
120
- @options[:default] || association_class.column_defaults["#{attribute}"]
124
+ @options.fetch :default, association_class.column_defaults["#{attribute}"]
121
125
  end
122
126
 
123
127
  # Get attribute cast type
124
128
  def attribute_cast_type(attribute)
125
- @options[:cast_type] || association_class.attribute_types["#{attribute}"]
129
+ @options.fetch :cast_type, association_class.type_for_attribute("#{attribute}")
130
+ end
131
+
132
+ # Check if attribute types are not the same
133
+ def cast_types_mismatch?(attribute)
134
+ attribute_cast_type(attribute) != association_class.type_for_attribute("#{attribute}")
135
+ end
136
+
137
+ # Check if attribute needs type cast
138
+ def needs_type_cast?(attribute)
139
+ @options[:cast] != false && cast_types_mismatch?(attribute)
126
140
  end
127
141
 
128
142
  # Check if should define attribute finders
@@ -163,6 +177,7 @@ module ActiveDelegate
163
177
  attr_name = unprefix_attribute(attrib)
164
178
 
165
179
  define_attribute_default_value(attrib, attr_name)
180
+ define_attribute_type_cast(attrib, attr_name)
166
181
  define_attribute_and_alias(attrib, attr_name)
167
182
  define_attribute_finders_and_scopes(attrib, attr_name)
168
183
  end
@@ -188,6 +203,29 @@ module ActiveDelegate
188
203
  end
189
204
  end
190
205
 
206
+ # Define attribute type casting
207
+ def define_attribute_type_cast(attrib, attr_name)
208
+ attr_assoc = @options[:to]
209
+ attr_cattr = :"_attribute_#{attrib}_default"
210
+
211
+ if needs_type_cast?(attr_name)
212
+ @model.class_eval do
213
+ class_eval <<-EOM, __FILE__, __LINE__ + 1
214
+ def #{attrib}
215
+ assoc_value = send(:#{attr_assoc}).try(:#{attr_name})
216
+ self.class.type_for_attribute('#{attrib}').cast(assoc_value) ||
217
+ self.class.try(:#{attr_cattr})
218
+ end
219
+
220
+ def #{attrib}=(value)
221
+ assoc_value = self.class.type_for_attribute('#{attrib}').cast(value)
222
+ send(:#{attr_assoc}).send(:#{attr_name}=, assoc_value)
223
+ end
224
+ EOM
225
+ end
226
+ end
227
+ end
228
+
191
229
  # Define delegated attribute alias
192
230
  def define_attribute_and_alias(attrib, attr_name)
193
231
  cast_type = attribute_cast_type(attr_name)
@@ -213,15 +251,11 @@ module ActiveDelegate
213
251
 
214
252
  # Define attribute finder methods
215
253
  def define_attribute_finder_methods(attrib, attr_name, attr_assoc, attr_table)
216
- attr_method = :"find_by_#{attrib}"
217
-
218
- @model.send(:define_singleton_method, attr_method) do |value|
219
- value = type_caster.type_cast_for_database(attr_name, value)
254
+ @model.send(:define_singleton_method, :"find_by_#{attrib}") do |value|
220
255
  joins(attr_assoc).find_by(attr_table => { attr_name => value })
221
256
  end
222
257
 
223
- @model.send(:define_singleton_method, :"#{attr_method}!") do |value|
224
- value = type_caster.type_cast_for_database(attr_name, value)
258
+ @model.send(:define_singleton_method, :"find_by_#{attrib}!") do |value|
225
259
  joins(attr_assoc).find_by!(attr_table => { attr_name => value })
226
260
  end
227
261
  end
@@ -229,12 +263,10 @@ module ActiveDelegate
229
263
  # Define attribute scope methods
230
264
  def define_attribute_scope_methods(attrib, attr_name, attr_assoc, attr_table)
231
265
  @model.scope :"with_#{attrib}", -> (*names) do
232
- names = names.map { |n| type_caster.type_cast_for_database(attr_name, n) }
233
266
  joins(attr_assoc).where(attr_table => { attr_name => names })
234
267
  end
235
268
 
236
269
  @model.scope :"without_#{attrib}", -> (*names) do
237
- names = names.map { |n| type_caster.type_cast_for_database(attr_name, n) }
238
270
  joins(attr_assoc).where.not(attr_table => { attr_name => names })
239
271
  end
240
272
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveDelegate
2
- VERSION = '0.2.0'
2
+ VERSION = '0.2.1'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_delegate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonian Guveli
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-11-19 00:00:00.000000000 Z
11
+ date: 2017-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord