glue_gun_dsl 0.1.24 → 0.1.26

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e2fd5acfe5156d1581b51d68d5598ef181faea52ec3c46d730fef428f7faba15
4
- data.tar.gz: c6185af99fd906dd841582b283b4559d8f1fbc4e3046086d7cf4a15ac5e1b1d3
3
+ metadata.gz: ea68a31c6e7206e0aeeb14467b1335a39047b49d870fd79cde4ce334c7c6d860
4
+ data.tar.gz: 67eb48676fc5502ca0869041ecd6c5a7d653005ea14777fe315828eca035fd42
5
5
  SHA512:
6
- metadata.gz: 587486d0afa4a7cde26ffc1a6d6a766123db4c09111b4f2e9d3b4f9f17651856a6a587b81832cb78fe93fa6d0f9f23cae88c145a61ac9905968508ffb6f8b7fc
7
- data.tar.gz: 14d80f872b13ada859d605068799e8331136c36db88e9dd5ba81eadd93b34b7362918e08eb3e1a48848e8b42ea4477f597d43cc1b3633205dfdc2d2e84d66b5d
6
+ metadata.gz: 6830bf72b7f05306b46eb9b987f2bd15facc0510c1e2983b2c0a51802807f39518a5d6829dc499a54138a47e797e433ea16ee2b7ef1131b594e50677a64fcefc
7
+ data.tar.gz: 450f8dd49be6d2b0cdc9d840f4c03f404c1b7aaf69664ed3666b7e0cbef948952754e71ee12484a634b4661cb2e3a42e99eabc2e3d246319f3cc75e7c7598969
@@ -3,6 +3,40 @@ module GlueGun
3
3
  module Model
4
4
  extend ActiveSupport::Concern
5
5
 
6
+ class ServiceRegistry
7
+ attr_accessor :services
8
+
9
+ def register(k, v)
10
+ @services ||= {}
11
+ @services[k.to_sym] = v
12
+ end
13
+
14
+ def options
15
+ services.keys
16
+ end
17
+
18
+ def []=(k, v)
19
+ register(k, v)
20
+ end
21
+
22
+ def [](k)
23
+ return nil if k.nil?
24
+
25
+ @services ||= {}
26
+ @services.dig(k.to_sym)
27
+ end
28
+
29
+ def default_key
30
+ return unless services.keys.count == 1
31
+
32
+ services.keys.first
33
+ end
34
+
35
+ def default
36
+ default_key.present? ? services[default_key] : nil
37
+ end
38
+ end
39
+
6
40
  included do
7
41
  include GlueGun::Shared
8
42
 
@@ -16,6 +50,13 @@ module GlueGun
16
50
  # Set default service attribute name based on the class name
17
51
  self.service_attribute_name = "#{name.demodulize.underscore}_service".to_sym
18
52
 
53
+ class_attribute :service_registry
54
+ self.service_registry = ServiceRegistry.new
55
+
56
+ # Set default option key based on the class name
57
+ class_attribute :option_key
58
+ self.option_key = "#{name.demodulize.underscore}_type".to_sym
59
+
19
60
  def assign_attributes(attributes)
20
61
  return if attributes.blank?
21
62
 
@@ -31,14 +72,8 @@ module GlueGun
31
72
  end
32
73
 
33
74
  class_methods do
34
- def service(class_or_proc = nil, &block)
35
- if class_or_proc.is_a?(Class)
36
- self.service_class = class_or_proc
37
- elsif block_given?
38
- self.service_class_resolver = block
39
- else
40
- raise ArgumentError, "You must provide a service class, factory, or a block to resolve the service class."
41
- end
75
+ def service(key, service_class)
76
+ service_registry[key] = service_class
42
77
  end
43
78
 
44
79
  def find_or_create_by!(attributes)
@@ -77,8 +112,9 @@ module GlueGun
77
112
  end
78
113
 
79
114
  def initialize(attributes = {})
80
- attributes[:root_dir] = detect_root_dir
115
+ attributes[:root_dir] ||= detect_root_dir
81
116
  attributes = attributes.deep_symbolize_keys
117
+ attributes[option_key] ||= resolve_service_type(attributes, true)
82
118
  db_attributes = self.class.extract_db_attributes(attributes)
83
119
  super(db_attributes)
84
120
  build_service_object(attributes)
@@ -119,14 +155,26 @@ module GlueGun
119
155
  instance_variable_set("@#{service_attribute_name}", service_instance)
120
156
  end
121
157
 
158
+ def resolve_service_type(attributes, initializing = false)
159
+ attrs = if initializing || !persisted? || attributes.key?(self.class.option_key)
160
+ attributes
161
+ else
162
+ { self.class.option_key => send(self.class.option_key) }
163
+ end
164
+ attrs[self.class.option_key] || self.class.service_registry.default_key
165
+ end
166
+
122
167
  def resolve_service_class(attributes)
123
- if self.class.service_class
124
- self.class.service_class
125
- elsif self.class.service_class_resolver
126
- self.class.service_class_resolver.call(attributes)
127
- else
128
- raise "Service class not defined for #{self.class.name}"
168
+ type = resolve_service_type(attributes)
169
+ service_class = self.class.service_registry[type] || self.class.service_registry.default
170
+
171
+ unless service_class
172
+ available_types = self.class.service_registry.options
173
+ raise ArgumentError,
174
+ "#{self.class} requires argument #{self.class.option_key}. Invalid option key received: #{type}. Allowed options are: #{available_types}"
129
175
  end
176
+
177
+ service_class
130
178
  end
131
179
 
132
180
  def extract_service_attributes(attributes, service_class)
@@ -179,8 +227,9 @@ module GlueGun
179
227
  raise "Don't know how to serialize dependency of type #{dep}, available options are #{opts.keys}. You didn't specify an option."
180
228
  end
181
229
 
230
+ serialized = this_dep.respond_to?(:serialize) ? this_dep.serialize : this_dep.attributes
182
231
  hash[dep] = {
183
- selected_option => service_object.send(dep).attributes
232
+ selected_option => serialized
184
233
  }
185
234
  end
186
235
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GlueGun
4
- VERSION = "0.1.24"
4
+ VERSION = "0.1.26"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: glue_gun_dsl
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.24
4
+ version: 0.1.26
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brett Shollenberger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-23 00:00:00.000000000 Z
11
+ date: 2024-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel