glue_gun_dsl 0.1.26 → 0.1.27

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
  SHA256:
3
- metadata.gz: ea68a31c6e7206e0aeeb14467b1335a39047b49d870fd79cde4ce334c7c6d860
4
- data.tar.gz: 67eb48676fc5502ca0869041ecd6c5a7d653005ea14777fe315828eca035fd42
3
+ metadata.gz: 697e6798ae2b2c4c3db3f4e3cd9b2c65ccc8081386636c08366e4d023cb04afe
4
+ data.tar.gz: f7a025244f1b5627691676d784658d2a14a289914533e17f4c1daca896c6ebdf
5
5
  SHA512:
6
- metadata.gz: 6830bf72b7f05306b46eb9b987f2bd15facc0510c1e2983b2c0a51802807f39518a5d6829dc499a54138a47e797e433ea16ee2b7ef1131b594e50677a64fcefc
7
- data.tar.gz: 450f8dd49be6d2b0cdc9d840f4c03f404c1b7aaf69664ed3666b7e0cbef948952754e71ee12484a634b4661cb2e3a42e99eabc2e3d246319f3cc75e7c7598969
6
+ metadata.gz: 8d32f478f2e294ae9510abb04b0ac5b5490c8468918879363f790eebc5167d7c3e28ec5edf9675301a2a211b7f5493bcf24c1884295598e9cf859f5b6b146f21
7
+ data.tar.gz: ee627464ed957cffac221bd2d701e9a9deba768e1cac558349878d101b67281a2c5977379f79496af43ed7bdbc392489c60e7d3fec2d09445b2e35526d2d256f
@@ -112,6 +112,7 @@ module GlueGun
112
112
  end
113
113
 
114
114
  def initialize(attributes = {})
115
+ attributes = {} if attributes.nil?
115
116
  attributes[:root_dir] ||= detect_root_dir
116
117
  attributes = attributes.deep_symbolize_keys
117
118
  attributes[option_key] ||= resolve_service_type(attributes, true)
@@ -210,30 +211,45 @@ module GlueGun
210
211
  end.symbolize_keys
211
212
  end
212
213
 
214
+ def serialize_dependency(dependency, dep_instance = nil)
215
+ dep_instance = service_object.send(dependency) if dep_instance.nil?
216
+ return nil unless dep_instance.present?
217
+
218
+ return dep_instance.map { |dep| serialize_dependency(dependency, dep) } if dep_instance.is_a?(Array)
219
+
220
+ opts = service_object.dependency_definitions[dependency].option_configs
221
+ selected_option = opts.detect do |_k, v|
222
+ dep_instance.class == v.class_name
223
+ end&.first
224
+ unless selected_option.present?
225
+ raise "Don't know how to serialize dependency of type #{dependency}, available options are #{opts.keys}. You didn't specify an option."
226
+ end
227
+
228
+ serialized = dep_instance.respond_to?(:serialize) ? dep_instance.serialize : dep_instance.attributes.deep_compact
229
+ {
230
+ selected_option => serialized
231
+ }
232
+ end
233
+
234
+ def service_object
235
+ instance_variable_get("@#{service_attribute_name}")
236
+ end
237
+
238
+ def service_class
239
+ service_object.class
240
+ end
241
+
213
242
  def serialize_service_object
214
- service_object = instance_variable_get("@#{service_attribute_name}")
215
- service_klass = service_object.class
216
- attrs = service_klass.respond_to?(:serialize) ? service_klass.serialize(service_object) : service_object.attributes
243
+ attrs = service_object.respond_to?(:serialize) ? service_object.serialize : service_object.attributes.deep_compact
217
244
  deps = allowed_names(service_object.dependency_definitions.keys).inject({}) do |hash, dep|
218
245
  hash.tap do
219
- this_dep = service_object.send(dep)
220
- next unless this_dep.present?
221
-
222
- opts = service_object.dependency_definitions[dep].option_configs
223
- selected_option = opts.detect do |_k, v|
224
- this_dep.class == v.class_name
225
- end&.first
226
- unless selected_option.present?
227
- raise "Don't know how to serialize dependency of type #{dep}, available options are #{opts.keys}. You didn't specify an option."
228
- end
246
+ serialized = serialize_dependency(dep)
247
+ next if serialized.nil?
229
248
 
230
- serialized = this_dep.respond_to?(:serialize) ? this_dep.serialize : this_dep.attributes
231
- hash[dep] = {
232
- selected_option => serialized
233
- }
249
+ hash[dep] = serialized
234
250
  end
235
251
  end
236
- json = serializable!(attrs.merge(deps.deep_compact).deep_symbolize_keys)
252
+ json = serializable!(attrs.merge(deps).deep_symbolize_keys)
237
253
  write_attribute(:configuration, json.to_json)
238
254
  end
239
255
 
@@ -256,12 +272,37 @@ module GlueGun
256
272
  json
257
273
  end
258
274
 
275
+ def deserialize_dependency(serialized, definition)
276
+ return serialized.map { |dep| deserialize_dependency(dep, definition) } if serialized.is_a?(Array)
277
+
278
+ dep_name = serialized.keys.first
279
+ selected_option = definition.option_configs[dep_name]
280
+ dependency_class = selected_option.class_name
281
+ arguments = serialized[dep_name]
282
+
283
+ dependency_class.respond_to?(:deserialize) ? dependency_class.deserialize(arguments) : arguments
284
+ {
285
+ dep_name => arguments
286
+ }
287
+ end
288
+
289
+ def deserialize_dependencies(serialized_data, service_class)
290
+ serialized_deps = (serialized_data.keys & allowed_names(service_class.dependency_definitions.keys))
291
+ serialized_deps.each do |name|
292
+ serialized = serialized_data[name]
293
+ definition = service_class.dependency_definitions[name]
294
+ serialized_data[name] = deserialize_dependency(serialized, definition)
295
+ end
296
+ serialized_data
297
+ end
298
+
259
299
  def deserialize_service_object
260
300
  serialized_data = JSON.parse(read_attribute(:configuration) || "{}")
261
301
  serialized_data.deep_symbolize_keys!
262
302
  service_class = resolve_service_class(serialized_data)
263
303
  serialized_data = deserialize_associations(serialized_data)
264
304
  serialized_data = service_class.deserialize(serialized_data) if service_class.respond_to?(:deserialize)
305
+ serialized_data = deserialize_dependencies(serialized_data, service_class)
265
306
  service_instance = build_service_object(serialized_data)
266
307
  instance_variable_set("@#{service_attribute_name}", service_instance)
267
308
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GlueGun
4
- VERSION = "0.1.26"
4
+ VERSION = "0.1.27"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glue_gun_dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.26
4
+ version: 0.1.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Shollenberger