active_delegate 0.1.9 → 0.2.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.
- checksums.yaml +4 -4
- data/lib/active_delegate/attributes.rb +73 -54
- data/lib/active_delegate/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35e32e13c8c9845a3a17e841ddb1eaa2d5f9121a
|
4
|
+
data.tar.gz: 0ed1a3d1c8ca242f17e4380b71580a67b5ee37c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5cab38ba25465170241da07c01579281f56f7ad72e423fad6c42a22b3f1769d13963533b67347835fc2a93d1eccab2bbdd1157bae6c59ea9585829136629864a
|
7
|
+
data.tar.gz: '0782f2d0cc0d8f9585921d3fcf4dbedd32ecfcc5768fd45a90019be9343850b4c67733e9d82e1a6bf3cf7fb66558196a00c679e9ff574e1c0ee6b78c569ea2c0'
|
@@ -101,6 +101,11 @@ module ActiveDelegate
|
|
101
101
|
prefix.is_a?(TrueClass) ? @options[:to] : prefix
|
102
102
|
end
|
103
103
|
|
104
|
+
# Get unprefixed attribute
|
105
|
+
def unprefix_attribute(attribute)
|
106
|
+
attribute.to_s.sub("#{attribute_prefix}_", '')
|
107
|
+
end
|
108
|
+
|
104
109
|
# Get prefixed attributes
|
105
110
|
def prefix_attributes(attributes)
|
106
111
|
if @options[:prefix].present?
|
@@ -110,13 +115,33 @@ module ActiveDelegate
|
|
110
115
|
end
|
111
116
|
end
|
112
117
|
|
118
|
+
# Get attribute default
|
119
|
+
def attribute_default(attribute)
|
120
|
+
@options[:default] || association_class.column_defaults["#{attribute}"]
|
121
|
+
end
|
122
|
+
|
123
|
+
# Get attribute cast type
|
124
|
+
def attribute_cast_type(attribute)
|
125
|
+
@options[:cast_type] || association_class.attribute_types["#{attribute}"]
|
126
|
+
end
|
127
|
+
|
128
|
+
# Check if should define attribute finders
|
129
|
+
def define_finders?(attribute)
|
130
|
+
@options[:finder] || Array(@options[:finder]).include?(attribute)
|
131
|
+
end
|
132
|
+
|
133
|
+
# Check if should define attribute scopes
|
134
|
+
def define_scopes?(attribute)
|
135
|
+
@options[:scope] || Array(@options[:scope]).include?(attribute)
|
136
|
+
end
|
137
|
+
|
113
138
|
# Save delagated attributes in model class
|
114
139
|
def save_delegated_attributes
|
115
140
|
dl_atable = association_reflection.klass.table_name
|
116
141
|
dl_method = :"#{dl_atable}_attribute_names"
|
117
142
|
|
118
143
|
delegated = prefix_attributes(delegatable_attributes)
|
119
|
-
|
144
|
+
define_attribute_defaults_and_methods(delegated)
|
120
145
|
|
121
146
|
delegated = @model.try(dl_method).to_a.concat(delegated)
|
122
147
|
@model.send(:define_singleton_method, dl_method) { delegated }
|
@@ -129,54 +154,65 @@ module ActiveDelegate
|
|
129
154
|
end
|
130
155
|
end
|
131
156
|
|
132
|
-
# Define attribute
|
133
|
-
def
|
157
|
+
# Define attribute default values, methods and scopes
|
158
|
+
def define_attribute_defaults_and_methods(attributes)
|
134
159
|
existing = @model.attribute_names.map(&:to_sym)
|
135
160
|
undefined = attributes.reject { |a| a.in? existing }
|
136
161
|
|
137
162
|
undefined.each do |attrib|
|
138
|
-
attr_name
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
attr_scope = @options[:scope] || Array(@options[:scope]).include?(attr_name)
|
144
|
-
|
145
|
-
@model.attribute(attrib, cast_type)
|
146
|
-
|
147
|
-
define_attribute_default_value(attrib, attr_name, attr_default) unless attr_default.nil?
|
148
|
-
define_attribute_alias_method(attrib, attr_alias, cast_type) unless attr_alias.nil?
|
149
|
-
define_attribute_finder_methods(attr_alias || attrib, attr_name) if attr_finder == true
|
150
|
-
define_attribute_scope_methods(attr_alias || attrib, attr_name) if attr_scope == true
|
163
|
+
attr_name = unprefix_attribute(attrib)
|
164
|
+
|
165
|
+
define_attribute_default_value(attrib, attr_name)
|
166
|
+
define_attribute_and_alias(attrib, attr_name)
|
167
|
+
define_attribute_finders_and_scopes(attrib, attr_name)
|
151
168
|
end
|
152
169
|
end
|
153
170
|
|
154
171
|
# Define delegated attribute default
|
155
|
-
def define_attribute_default_value(attrib, attr_name
|
156
|
-
|
157
|
-
attr_cattr = :"_attribute_#{attrib}_default"
|
172
|
+
def define_attribute_default_value(attrib, attr_name)
|
173
|
+
attr_default = attribute_default(attr_name)
|
158
174
|
|
159
|
-
|
175
|
+
unless attr_default.nil?
|
176
|
+
attr_assoc = @options[:to]
|
177
|
+
attr_cattr = :"_attribute_#{attrib}_default"
|
160
178
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
179
|
+
@model.send(:define_singleton_method, attr_cattr) { attr_default }
|
180
|
+
|
181
|
+
@model.class_eval do
|
182
|
+
class_eval <<-EOM, __FILE__, __LINE__ + 1
|
183
|
+
def #{attrib}
|
184
|
+
send(:#{attr_assoc}).try(:#{attr_name}) || self.class.send(:#{attr_cattr})
|
185
|
+
end
|
186
|
+
EOM
|
187
|
+
end
|
167
188
|
end
|
168
189
|
end
|
169
190
|
|
170
191
|
# Define delegated attribute alias
|
171
|
-
def
|
172
|
-
|
173
|
-
|
192
|
+
def define_attribute_and_alias(attrib, attr_name)
|
193
|
+
cast_type = attribute_cast_type(attr_name)
|
194
|
+
attr_alias = @options[:alias]
|
195
|
+
|
196
|
+
@model.attribute(attrib, cast_type)
|
197
|
+
|
198
|
+
unless attr_alias.nil?
|
199
|
+
@model.attribute(attr_alias, cast_type)
|
200
|
+
@model.alias_attribute(attr_alias, attrib)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
# Define attribute finders and scopes
|
205
|
+
def define_attribute_finders_and_scopes(attrib, attr_name)
|
206
|
+
attr_assoc = @options[:to]
|
207
|
+
attr_table = association_reflection.klass.table_name
|
208
|
+
attr_args = [@options[:alias] || attrib, attr_name, attr_assoc, attr_table]
|
209
|
+
|
210
|
+
define_attribute_finder_methods(*attr_args) if define_finders?(attr_name)
|
211
|
+
define_attribute_scope_methods(*attr_args) if define_scopes?(attr_name)
|
174
212
|
end
|
175
213
|
|
176
214
|
# Define attribute finder methods
|
177
|
-
def define_attribute_finder_methods(attrib, attr_name)
|
178
|
-
attr_assoc = @options[:to]
|
179
|
-
attr_table = association_reflection.klass.table_name
|
215
|
+
def define_attribute_finder_methods(attrib, attr_name, attr_assoc, attr_table)
|
180
216
|
attr_method = :"find_by_#{attrib}"
|
181
217
|
|
182
218
|
@model.send(:define_singleton_method, attr_method) do |value|
|
@@ -191,32 +227,15 @@ module ActiveDelegate
|
|
191
227
|
end
|
192
228
|
|
193
229
|
# Define attribute scope methods
|
194
|
-
def define_attribute_scope_methods(attrib, attr_name)
|
195
|
-
attr_assoc = @options[:to]
|
196
|
-
attr_table = association_reflection.klass.table_name
|
197
|
-
attr_blank = { attr_table => { attr_name => nil } }
|
198
|
-
|
230
|
+
def define_attribute_scope_methods(attrib, attr_name, attr_assoc, attr_table)
|
199
231
|
@model.scope :"with_#{attrib}", -> (*names) do
|
200
|
-
|
201
|
-
|
202
|
-
else
|
203
|
-
names = names.map { |n| type_caster.type_cast_for_database(attr_name, n) }
|
204
|
-
named = { attr_table => { attr_name => names } }
|
205
|
-
|
206
|
-
left_outer_joins(attr_assoc).where(named)
|
207
|
-
end
|
232
|
+
names = names.map { |n| type_caster.type_cast_for_database(attr_name, n) }
|
233
|
+
joins(attr_assoc).where(attr_table => { attr_name => names })
|
208
234
|
end
|
209
235
|
|
210
236
|
@model.scope :"without_#{attrib}", -> (*names) do
|
211
|
-
|
212
|
-
|
213
|
-
else
|
214
|
-
names = names.map { |n| type_caster.type_cast_for_database(attr_name, n) }
|
215
|
-
named = { attr_table => { attr_name => names } }
|
216
|
-
|
217
|
-
left_outer_joins(attr_assoc).where(attr_blank)
|
218
|
-
.or(left_outer_joins(attr_assoc).where.not(named))
|
219
|
-
end
|
237
|
+
names = names.map { |n| type_caster.type_cast_for_database(attr_name, n) }
|
238
|
+
joins(attr_assoc).where.not(attr_table => { attr_name => names })
|
220
239
|
end
|
221
240
|
end
|
222
241
|
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.
|
4
|
+
version: 0.2.0
|
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-
|
11
|
+
date: 2017-11-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|