low_dependency 0.2.0 → 0.3.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: cb969f9e394ddc2e6e0b4669e58736b14ea78b7539495035c51a11765d8c365b
4
- data.tar.gz: 19144722e967c2d936a039d1667701b552cb0db4f78aa737c8ac6a24aef137d7
3
+ metadata.gz: 6b0a13e9a844071f5d62b2f5c406738ea8e6a91eb5739d437c76e58880e6af7a
4
+ data.tar.gz: 67ae806313dd6bad24f796bc143436fb4cbfbc65dbc3a06a71b67a5eab0be447
5
5
  SHA512:
6
- metadata.gz: b3fd43c0ded0f0c9e5b6390c45c2638395fc3fc75ef085038fdd70749ff8fba83435ffa33862e289d50f8b99bc4368179d5922287a0dc977e6aa810f52f1a176
7
- data.tar.gz: da84dd6d96730943ae4d23228108e1186f2657d53bcf4387ae15cddcefbecbdba1716c48149a8ddd82834308f910d3354281926a1a2360c9c910597eb734f0cf
6
+ metadata.gz: 268a0167f2823345223ccf8fa2d28799f58cd530b8d52cb233cd5b84bd7af44464551ac8375eaf9a60f48b6ae977b8801937694810783d4dcf4a9d1866caa25a
7
+ data.tar.gz: fe8dfa1f39c7e1dd889319e37c7ced72febcb093b17b4ff348110201214ddf131cdce269eb6182e3357bb1e1b0fead518efc060ecfdadf226c1ca65063dd93f6
@@ -3,20 +3,35 @@
3
3
  require 'expressions'
4
4
 
5
5
  module Low
6
+ # A Dependency Expression requires LowType in order to be injected via a constructor.
7
+ # See "LowDependency[:dependency]" for traditional dependency injection without LowType.
6
8
  class Dependency < Expressions::Expression
7
- attr_reader :key, :var
9
+ attr_reader :provider_key, :var_name
8
10
 
9
- def initialize(var:)
11
+ def initialize(provider_key: nil, var_name: nil)
10
12
  super()
11
13
 
12
- @key = var
13
- @var = var
14
+ @provider_key = provider_key || var_name
15
+ @var_name = var_name
14
16
  end
15
17
 
18
+ def required?
19
+ false
20
+ end
21
+
22
+ # Inject dependency via LowType's default value.
23
+ def default_value
24
+ Providers[@provider_key]
25
+ end
26
+
27
+ # Ignore LowType's validation of arguments of type Dependency.
28
+ def validate!(value:, proxy:); end
29
+
16
30
  private
17
31
 
18
- def receive_value(value)
19
- @key = value
32
+ def union_value(value)
33
+ @provider_key = value
34
+ @var_name = LowDependency.var_name_via_namespace(value)
20
35
  end
21
36
  end
22
37
  end
@@ -4,22 +4,20 @@ require_relative '../expressions/dependency'
4
4
 
5
5
  module Low
6
6
  class DependencyFactory
7
- include LowType
8
-
9
7
  class << self
10
- def parse(dependencies = Array)
8
+ def parse(dependencies)
11
9
  class_dependencies = []
12
10
 
13
11
  dependencies.each do |dependency|
14
12
  case dependency
15
13
  when Hash
16
- key = dependency.keys.first
17
- dependency = dependency[key]
14
+ provider_key = dependency.keys.first
15
+ dependency = dependency[provider_key]
18
16
  else
19
- key = dependency
17
+ provider_key = dependency
20
18
  end
21
19
 
22
- class_dependencies << (Dependency.new(var: dependency) | key)
20
+ class_dependencies << (Dependency.new(var_name: dependency) | provider_key)
23
21
  end
24
22
 
25
23
  class_dependencies
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'low_type'
4
3
  require_relative 'config/config'
5
4
  require_relative 'expressions/dependency'
6
5
  require_relative 'factories/dependency_factory'
@@ -13,7 +12,7 @@ class LowDependency
13
12
  Low::Providers.provide(key:, &block)
14
13
  end
15
14
 
16
- # "include LowDependency[:dependency]"
15
+ # Usage: "include LowDependency[:dependency]"
17
16
  def [](*dependencies)
18
17
  class_dependencies = Low::DependencyFactory.parse([*dependencies])
19
18
 
@@ -36,11 +35,11 @@ class LowDependency
36
35
 
37
36
  def initialize
38
37
  self.class.low_dependencies.each do |dependency|
39
- provider = Low::Providers.find(dependency.key)
40
- raise StandardError, "Provider #{dependency.key} not found" if provider.nil?
38
+ provider = Low::Providers.find(dependency.provider_key)
39
+ raise StandardError, "Provider #{dependency.provider_key} not found" if provider.nil?
41
40
 
42
- var = LowDependency.provider_from_namespace(dependency.var)
43
- instance_variable_set("@#{var}", provider.result)
41
+ var_name = LowDependency.var_name_via_namespace(dependency.var_name)
42
+ instance_variable_set("@#{var_name}", provider.result)
44
43
  end
45
44
  end
46
45
 
@@ -52,15 +51,15 @@ class LowDependency
52
51
 
53
52
  def define_readers(dependencies, klass)
54
53
  dependencies.each do |dependency|
55
- var = provider_from_namespace(dependency.var)
54
+ var_name = var_name_via_namespace(dependency.var_name)
56
55
 
57
- klass.define_method(var) do
58
- instance_variable_get("@#{var}")
56
+ klass.define_method(var_name) do
57
+ instance_variable_get("@#{var_name}")
59
58
  end
60
59
  end
61
60
  end
62
61
 
63
- def provider_from_namespace(namespace)
62
+ def var_name_via_namespace(namespace)
64
63
  return namespace.split('.').last if namespace.is_a?(String)
65
64
 
66
65
  namespace
@@ -3,7 +3,10 @@
3
3
  require_relative '../models/provider'
4
4
 
5
5
  module Low
6
+ # Private API. Public methods exposed via LowDependency.
6
7
  class Providers
8
+ class MissingProviderError < StandardError; end
9
+
7
10
  class << self
8
11
  def provide(key:, &block)
9
12
  providers[key] = Provider.new(key:, &block)
@@ -18,6 +21,14 @@ module Low
18
21
  providers[provider_key]
19
22
  end
20
23
 
24
+ # Providers[] is harder to stub in tests and should only be used when dependency injection isn't possible.
25
+ def [](provider_key)
26
+ provider = providers[provider_key]
27
+ raise(MissingProviderError, "Provider #{provider_key.inspect} not found") if provider.nil?
28
+
29
+ provider.result
30
+ end
31
+
21
32
  def all
22
33
  providers
23
34
  end
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Low
4
- DEPENDENCY_VERSION = '0.2.0'
4
+ DEPENDENCY_VERSION = '0.3.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: low_dependency
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi
@@ -13,16 +13,16 @@ dependencies:
13
13
  name: expressions
14
14
  requirement: !ruby/object:Gem::Requirement
15
15
  requirements:
16
- - - ">="
16
+ - - "~>"
17
17
  - !ruby/object:Gem::Version
18
- version: '0'
18
+ version: '0.1'
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
- - - ">="
23
+ - - "~>"
24
24
  - !ruby/object:Gem::Version
25
- version: '0'
25
+ version: '0.1'
26
26
  description: Automatic Dependency Injection where you get to see and keep control
27
27
  of the constructor
28
28
  email: