glue_gun_dsl 0.1.21 → 0.1.22
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/glue_gun/dsl.rb +7 -20
- data/lib/glue_gun/model.rb +57 -25
- data/lib/glue_gun/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8f609405b59c865b180e5e07a5a74ebbf4867cea468444983820202b17fbcb7
|
4
|
+
data.tar.gz: b71c914a42fe7175f41b7faa674c30c58d03fcc2c1f54c281bcbf0b8876b1800
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 425a1e574b7a54826b2d2881a38d5efc190d14c46e7f5c85cd9b779c17182ad01a1427a746a1dce10780d4243bf575e9ac8e3a467497c41cd1a1e74ac8466be7
|
7
|
+
data.tar.gz: e819aacabb11e0c6174f167cd9fee3eaf2fdd882797631b0c383abbbf9c0bb69431c28cde2bfc024cd391d6c4e526fb8e5c1fa1862396d28d3d3fc889ae737f4
|
data/lib/glue_gun/dsl.rb
CHANGED
@@ -438,8 +438,13 @@ module GlueGun
|
|
438
438
|
def determine_option_name(init_args, instance)
|
439
439
|
option_name = nil
|
440
440
|
|
441
|
-
|
442
|
-
|
441
|
+
user_specified_option = init_args.is_a?(Hash) && init_args.keys.size == 1
|
442
|
+
user_specified_valid_option = user_specified_option && option_configs.key?(init_args.keys.first)
|
443
|
+
|
444
|
+
if user_specified_valid_option
|
445
|
+
option_name = init_args.keys.first
|
446
|
+
init_args = init_args[option_name] # Extract the inner value
|
447
|
+
elsif when_block.present?
|
443
448
|
result = instance.instance_exec(init_args, &when_block)
|
444
449
|
if result.is_a?(Hash) && result[:option]
|
445
450
|
option_name = result[:option]
|
@@ -448,24 +453,6 @@ module GlueGun
|
|
448
453
|
end
|
449
454
|
end
|
450
455
|
|
451
|
-
# Detect option from user input
|
452
|
-
if option_name.nil? && (init_args.is_a?(Hash) && init_args.keys.size == 1)
|
453
|
-
if option_configs.key?(init_args.keys.first)
|
454
|
-
option_name = init_args.keys.first
|
455
|
-
init_args = init_args[option_name] # Extract the inner value
|
456
|
-
else
|
457
|
-
default_option = get_option(default_option_name)
|
458
|
-
unless default_option.only?
|
459
|
-
raise ArgumentError,
|
460
|
-
"Unknown #{component_type} option: #{init_args.keys.first}."
|
461
|
-
end
|
462
|
-
unless default_option.attributes.keys.include?(init_args.keys.first)
|
463
|
-
raise ArgumentError, "#{default_option.class_name} does not respond to #{init_args.keys.first}"
|
464
|
-
end
|
465
|
-
end
|
466
|
-
end
|
467
|
-
|
468
|
-
# Use default option if none determined
|
469
456
|
option_name ||= default_option_name
|
470
457
|
|
471
458
|
[option_name, init_args]
|
data/lib/glue_gun/model.rb
CHANGED
@@ -24,11 +24,43 @@ module GlueGun
|
|
24
24
|
raise ArgumentError, "You must provide a service class, factory, or a block to resolve the service class."
|
25
25
|
end
|
26
26
|
end
|
27
|
+
|
28
|
+
def find_or_create_by!(attributes)
|
29
|
+
attributes = attributes.deep_symbolize_keys
|
30
|
+
db_attributes = extract_db_attributes(attributes)
|
31
|
+
attributes.except(*db_attributes.keys)
|
32
|
+
|
33
|
+
record = where(db_attributes).first_or_initialize(attributes)
|
34
|
+
|
35
|
+
record.save! if record.new_record?
|
36
|
+
|
37
|
+
record
|
38
|
+
end
|
39
|
+
|
40
|
+
def find_or_create_by(attributes)
|
41
|
+
attributes = attributes.deep_symbolize_keys
|
42
|
+
db_attributes = extract_db_attributes(attributes)
|
43
|
+
attributes.except(*db_attributes.keys)
|
44
|
+
|
45
|
+
record = where(db_attributes).first_or_initialize(attributes)
|
46
|
+
|
47
|
+
record.save if record.new_record?
|
48
|
+
|
49
|
+
record
|
50
|
+
end
|
51
|
+
|
52
|
+
def extract_db_attributes(attributes)
|
53
|
+
# Extract attributes that correspond to database columns or associations
|
54
|
+
column_names = self.column_names.map(&:to_sym)
|
55
|
+
association_names = reflect_on_all_associations.map(&:name)
|
56
|
+
|
57
|
+
attributes.slice(*(column_names + association_names))
|
58
|
+
end
|
27
59
|
end
|
28
60
|
|
29
61
|
def initialize(attributes = {})
|
30
62
|
attributes = attributes.deep_symbolize_keys
|
31
|
-
db_attributes = extract_db_attributes(attributes)
|
63
|
+
db_attributes = self.class.extract_db_attributes(attributes)
|
32
64
|
super(db_attributes)
|
33
65
|
self.class.send(:attr_reader, service_attribute_name)
|
34
66
|
build_service_object(attributes)
|
@@ -36,14 +68,6 @@ module GlueGun
|
|
36
68
|
|
37
69
|
private
|
38
70
|
|
39
|
-
def extract_db_attributes(attributes)
|
40
|
-
# Extract attributes that correspond to database columns or associations
|
41
|
-
column_names = self.class.column_names.map(&:to_sym)
|
42
|
-
association_names = self.class.reflect_on_all_associations.map(&:name)
|
43
|
-
|
44
|
-
attributes.slice(*(column_names + association_names))
|
45
|
-
end
|
46
|
-
|
47
71
|
def build_service_object(attributes)
|
48
72
|
service_class = resolve_service_class(attributes)
|
49
73
|
service_attributes = extract_service_attributes(attributes, service_class)
|
@@ -116,16 +140,36 @@ module GlueGun
|
|
116
140
|
}
|
117
141
|
end
|
118
142
|
end
|
119
|
-
json = attrs.merge(deps.deep_compact).deep_symbolize_keys
|
143
|
+
json = serializable!(attrs.merge(deps.deep_compact).deep_symbolize_keys)
|
120
144
|
write_attribute(:configuration, json.to_json)
|
121
145
|
end
|
122
146
|
|
147
|
+
def serializable!(json)
|
148
|
+
regular_args = json.slice(*allowed_names(json.keys))
|
149
|
+
assoc_names = self.class.reflect_on_all_associations.map(&:name)
|
150
|
+
found_associations = assoc_names & json.keys
|
151
|
+
found_associations.each do |association|
|
152
|
+
regular_args[association] = true
|
153
|
+
end
|
154
|
+
regular_args
|
155
|
+
end
|
156
|
+
|
157
|
+
def deserialize_associations(json)
|
158
|
+
assoc_names = self.class.reflect_on_all_associations.map(&:name)
|
159
|
+
found_associations = assoc_names & json.keys
|
160
|
+
found_associations.each do |association|
|
161
|
+
json[association] = send(association)
|
162
|
+
end
|
163
|
+
json
|
164
|
+
end
|
165
|
+
|
123
166
|
def deserialize_service_object
|
124
167
|
serialized_data = JSON.parse(read_attribute(:configuration) || "{}")
|
125
168
|
serialized_data.deep_symbolize_keys!
|
126
169
|
service_class = resolve_service_class(serialized_data)
|
170
|
+
serialized_data = deserialize_associations(serialized_data)
|
127
171
|
serialized_data = service_class.deserialize(serialized_data) if service_class.respond_to?(:deserialize)
|
128
|
-
service_instance =
|
172
|
+
service_instance = build_service_object(serialized_data)
|
129
173
|
instance_variable_set("@#{service_attribute_name}", service_instance)
|
130
174
|
end
|
131
175
|
|
@@ -134,23 +178,11 @@ module GlueGun
|
|
134
178
|
[names.map(&:to_sym) - assoc_names.map(&:to_sym)].flatten
|
135
179
|
end
|
136
180
|
|
137
|
-
def
|
138
|
-
dataset_service.attributes
|
139
|
-
write_attribute(:configuration, json.to_json)
|
140
|
-
end
|
141
|
-
|
142
|
-
def deserialize
|
143
|
-
options = JSON.parse(read_attribute(:configuration))
|
144
|
-
options.deep_symbolize_keys!
|
145
|
-
|
146
|
-
build_dataset_service(options)
|
147
|
-
end
|
148
|
-
|
149
|
-
def method_missing(method_name, *args, &block)
|
181
|
+
def method_missing(method_name, *args, **kwargs, &block)
|
150
182
|
service_object = instance_variable_get("@#{service_attribute_name}")
|
151
183
|
|
152
184
|
if service_object && service_object.respond_to?(method_name)
|
153
|
-
service_object.send(method_name, *args, &block)
|
185
|
+
service_object.send(method_name, *args, **kwargs, &block)
|
154
186
|
else
|
155
187
|
super
|
156
188
|
end
|
data/lib/glue_gun/version.rb
CHANGED