low_dependency 0.2.1 → 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: 075ac4a80826125fc91b875a75713e886b1e97a61df624e3a627c00fad361869
4
- data.tar.gz: b6cff0dfb63fb8dac55f017fb0c69a2fc38282cebf7daee3d6b320f5f285c096
3
+ metadata.gz: 6b0a13e9a844071f5d62b2f5c406738ea8e6a91eb5739d437c76e58880e6af7a
4
+ data.tar.gz: 67ae806313dd6bad24f796bc143436fb4cbfbc65dbc3a06a71b67a5eab0be447
5
5
  SHA512:
6
- metadata.gz: 752c6eeb2d63d3986cb9515a016ef70dcf48beb31318c7b43c28fa042404019b70901fe88e881401796b2dd7707f6547f05131deafcbb8ccca9862a51239422f
7
- data.tar.gz: 4802aad346e2e897e7e4678b7ead34fbed27e01c229dde55859937e9794c5d852eb24320a05358693439e84130d241a7bd4d7dd8c629678cfdb8a0a52e2bfcc9
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
@@ -11,13 +11,13 @@ module Low
11
11
  dependencies.each do |dependency|
12
12
  case dependency
13
13
  when Hash
14
- key = dependency.keys.first
15
- dependency = dependency[key]
14
+ provider_key = dependency.keys.first
15
+ dependency = dependency[provider_key]
16
16
  else
17
- key = dependency
17
+ provider_key = dependency
18
18
  end
19
19
 
20
- class_dependencies << (Dependency.new(var: dependency) | key)
20
+ class_dependencies << (Dependency.new(var_name: dependency) | provider_key)
21
21
  end
22
22
 
23
23
  class_dependencies
@@ -12,7 +12,7 @@ class LowDependency
12
12
  Low::Providers.provide(key:, &block)
13
13
  end
14
14
 
15
- # "include LowDependency[:dependency]"
15
+ # Usage: "include LowDependency[:dependency]"
16
16
  def [](*dependencies)
17
17
  class_dependencies = Low::DependencyFactory.parse([*dependencies])
18
18
 
@@ -35,11 +35,11 @@ class LowDependency
35
35
 
36
36
  def initialize
37
37
  self.class.low_dependencies.each do |dependency|
38
- provider = Low::Providers.find(dependency.key)
39
- 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?
40
40
 
41
- var = LowDependency.provider_from_namespace(dependency.var)
42
- 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)
43
43
  end
44
44
  end
45
45
 
@@ -51,15 +51,15 @@ class LowDependency
51
51
 
52
52
  def define_readers(dependencies, klass)
53
53
  dependencies.each do |dependency|
54
- var = provider_from_namespace(dependency.var)
54
+ var_name = var_name_via_namespace(dependency.var_name)
55
55
 
56
- klass.define_method(var) do
57
- instance_variable_get("@#{var}")
56
+ klass.define_method(var_name) do
57
+ instance_variable_get("@#{var_name}")
58
58
  end
59
59
  end
60
60
  end
61
61
 
62
- def provider_from_namespace(namespace)
62
+ def var_name_via_namespace(namespace)
63
63
  return namespace.split('.').last if namespace.is_a?(String)
64
64
 
65
65
  namespace
@@ -5,6 +5,8 @@ require_relative '../models/provider'
5
5
  module Low
6
6
  # Private API. Public methods exposed via LowDependency.
7
7
  class Providers
8
+ class MissingProviderError < StandardError; end
9
+
8
10
  class << self
9
11
  def provide(key:, &block)
10
12
  providers[key] = Provider.new(key:, &block)
@@ -19,9 +21,12 @@ module Low
19
21
  providers[provider_key]
20
22
  end
21
23
 
22
- # Usage: def initialize(dependency: Low::Providers[:dependency])
24
+ # Providers[] is harder to stub in tests and should only be used when dependency injection isn't possible.
23
25
  def [](provider_key)
24
- providers[provider_key].result
26
+ provider = providers[provider_key]
27
+ raise(MissingProviderError, "Provider #{provider_key.inspect} not found") if provider.nil?
28
+
29
+ provider.result
25
30
  end
26
31
 
27
32
  def all
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.1'
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.1
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: