manufacturable 1.6.0 → 2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1feea379db04261f90df6f10fba0eca3fddcbf5ba6b4e912a2b9e110ba6a16f0
4
- data.tar.gz: 2d8345f1bf8ac8bf5af40ec365a3dedb3bc27e0e8873eb879731d19aa98a94f4
3
+ metadata.gz: 34e0bee5e73591bee5d9bbcdb20761596facb07dbf15f6fedb61a2af2d2baf78
4
+ data.tar.gz: b83684b6cf6bde99726921e683597cdf06a622ac0662509f433f5d53cf848824
5
5
  SHA512:
6
- metadata.gz: a0c9267425d0782095662830afa73a9a9a5fec0fb5df11d820bc04365f70ca042fff9842f81910c28dd9ec8f7b6eade54f2eef6cf02f28019851f4c6e0f9ffbf
7
- data.tar.gz: ad0a90d1041cb5111955a34cec43ec917bd85f0418cc4ccfc3b83be2674a01522a8bb190069f3be29568b75389f891325b79d0eab6855f235abde1b07ef438b1
6
+ metadata.gz: 8fcaa04eb2f22748b66a3755d3d1d739f77aa0a5c7e37dbaff2d5d67810c740c8b4f73b09565fe60b054ed4d25d12d8e7b75406c435ff73002b0b456c76e0f3f
7
+ data.tar.gz: 3430e40a0395c0ee22b67e5ae1fe9180c062eebe37a08bd6a2628f3c110e45d10cf1cf46225fd4a418653d787ea38e0069801fe76ce7a5c1d0171f0bce727763
data/.gitignore CHANGED
@@ -11,3 +11,4 @@
11
11
  .rspec_status
12
12
 
13
13
  Gemfile.lock
14
+ .DS_Store
@@ -1,3 +1,4 @@
1
+ require 'manufacturable/injector'
1
2
  require 'manufacturable/registrar'
2
3
 
3
4
  module Manufacturable
@@ -48,13 +49,15 @@ module Manufacturable
48
49
  end
49
50
 
50
51
  def instances
51
- @instances ||= klasses.map do |klass|
52
- klass.new(*args, **kwargs_with_key).tap { |instance| block&.call(instance) }
53
- end
52
+ @instances ||= klasses.map { |klass| inject(klass) }
54
53
  end
55
54
 
56
55
  def last_instance
57
- last_klass&.new(*args, **kwargs_with_key)&.tap { |instance| block&.call(instance) }
56
+ inject(last_klass) unless last_klass.nil?
57
+ end
58
+
59
+ def inject(klass)
60
+ Injector.inject(klass, *args, **kwargs_with_key).tap { |instance| block&.call(instance) }
58
61
  end
59
62
 
60
63
  def klasses
@@ -0,0 +1,20 @@
1
+ module Manufacturable
2
+ class Dispatcher
3
+ attr_reader :message, :receiver
4
+
5
+ def initialize(message:, receiver:)
6
+ @message = message
7
+ @receiver = receiver
8
+ end
9
+
10
+ def method_missing(name, *args, **kwargs)
11
+ return super unless respond_to?(name)
12
+
13
+ Manufacturable.build_one(receiver, name, *args, **kwargs).public_send(message)
14
+ end
15
+
16
+ def respond_to_missing?(name, include_private = false)
17
+ Manufacturable.builds?(receiver, name) || super
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ require 'manufacturable/simple_registrar'
2
+
3
+ module Manufacturable
4
+ class Injector
5
+ class << self
6
+ def inject(klass, *args, **kwargs)
7
+ params = dependencies_for(klass).merge(**kwargs)
8
+ klass.new(*args, **params)
9
+ end
10
+
11
+ private
12
+
13
+ def dependencies_for(klass)
14
+ return {} unless klass.private_method_defined?(:initialize)
15
+
16
+ params = klass
17
+ .instance_method(:initialize)
18
+ .parameters
19
+ .select { |(type, name)| type == :keyreq }
20
+ .map(&:last)
21
+
22
+ SimpleRegistrar.entries(*params)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -6,8 +6,8 @@ module Manufacturable
6
6
  DEFAULT_KEY = :__default__
7
7
 
8
8
  class << self
9
- def register(type, key, klass)
10
- self.new(registry, type, key).register(klass)
9
+ def register(type, key, value)
10
+ self.new(registry, type, key).register(value)
11
11
  end
12
12
 
13
13
  def get(type, key)
@@ -37,13 +37,13 @@ module Manufacturable
37
37
  @registry, @type, @key = registry, type, key
38
38
  end
39
39
 
40
- def register(klass)
40
+ def register(value)
41
41
  assign_set if set.nil?
42
- set.add(klass)
42
+ set.add(value)
43
43
  end
44
44
 
45
45
  def get
46
- merged_klasses.empty? ? default_klasses : merged_klasses
46
+ merged_values.empty? ? default_values : merged_values
47
47
  end
48
48
 
49
49
  private
@@ -60,19 +60,19 @@ module Manufacturable
60
60
  @registry[@type][registry_key]
61
61
  end
62
62
 
63
- def merged_klasses
64
- key_klasses.merge(all_klasses)
63
+ def merged_values
64
+ key_values.merge(all_values)
65
65
  end
66
66
 
67
- def key_klasses
67
+ def key_values
68
68
  get_for(registry_key)
69
69
  end
70
70
 
71
- def all_klasses
71
+ def all_values
72
72
  get_for(ALL_KEY)
73
73
  end
74
74
 
75
- def default_klasses
75
+ def default_values
76
76
  get_for(DEFAULT_KEY)
77
77
  end
78
78
 
@@ -0,0 +1,33 @@
1
+ module Manufacturable
2
+ class SimpleRegistrar
3
+ class << self
4
+ def register(key, value)
5
+ self.new(registry, key).register(value)
6
+ end
7
+
8
+ def entries(*keys)
9
+ registry.slice(*keys)
10
+ end
11
+
12
+ private
13
+
14
+ def registry
15
+ @registry ||= Hash.new
16
+ end
17
+ end
18
+
19
+ def initialize(registry, key)
20
+ @registry, @key = registry, key
21
+ end
22
+
23
+ def register(value)
24
+ @registry[registry_key] = value
25
+ end
26
+
27
+ private
28
+
29
+ def registry_key
30
+ @registry_key ||= (@key.respond_to?(:to_sym) && @key.to_sym) || @key
31
+ end
32
+ end
33
+ end
@@ -1,3 +1,3 @@
1
1
  module Manufacturable
2
- VERSION = "1.6.0"
2
+ VERSION = "2.2.0"
3
3
  end
@@ -4,6 +4,8 @@ require 'manufacturable/factory'
4
4
  require 'manufacturable/item'
5
5
  require 'manufacturable/object_factory'
6
6
  require 'manufacturable/railtie'
7
+ require 'manufacturable/simple_registrar'
8
+ require 'manufacturable/dispatcher'
7
9
 
8
10
  module Manufacturable
9
11
  def self.build(*args, **kwargs, &block)
@@ -26,12 +28,8 @@ module Manufacturable
26
28
  Builder.builds?(type, key)
27
29
  end
28
30
 
29
- def self.registered_types
30
- Registrar.registered_types
31
- end
32
-
33
- def self.registered_keys(type)
34
- Registrar.registered_keys(type)
31
+ def self.register_dependency(key, value)
32
+ SimpleRegistrar.register(key, value)
35
33
  end
36
34
 
37
35
  def self.reset!
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.license = "MIT"
13
13
  spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
14
14
 
15
- spec.metadata = {
15
+ spec.metadata = {
16
16
  "bug_tracker_uri" => "https://github.com/first-try-software/manufacturable/issues",
17
17
  "homepage_uri" => spec.homepage,
18
18
  "source_code_uri" => "https://github.com/first-try-software/manufacturable"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: manufacturable
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alan Ridlehoover
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2021-09-06 00:00:00.000000000 Z
12
+ date: 2022-04-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -106,11 +106,14 @@ files:
106
106
  - lib/manufacturable.rb
107
107
  - lib/manufacturable/builder.rb
108
108
  - lib/manufacturable/config.rb
109
+ - lib/manufacturable/dispatcher.rb
109
110
  - lib/manufacturable/factory.rb
111
+ - lib/manufacturable/injector.rb
110
112
  - lib/manufacturable/item.rb
111
113
  - lib/manufacturable/object_factory.rb
112
114
  - lib/manufacturable/railtie.rb
113
115
  - lib/manufacturable/registrar.rb
116
+ - lib/manufacturable/simple_registrar.rb
114
117
  - lib/manufacturable/version.rb
115
118
  - manufacturable.gemspec
116
119
  homepage: https://github.com/first-try-software/manufacturable
@@ -135,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
135
138
  - !ruby/object:Gem::Version
136
139
  version: '0'
137
140
  requirements: []
138
- rubygems_version: 3.2.15
141
+ rubygems_version: 3.3.11
139
142
  signing_key:
140
143
  specification_version: 4
141
144
  summary: Manufacturable is a factory that builds self-registering objects.