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 +4 -4
- data/lib/expressions/dependency.rb +21 -6
- data/lib/factories/dependency_factory.rb +5 -7
- data/lib/low_dependency.rb +9 -10
- data/lib/repositories/providers.rb +11 -0
- data/lib/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6b0a13e9a844071f5d62b2f5c406738ea8e6a91eb5739d437c76e58880e6af7a
|
|
4
|
+
data.tar.gz: 67ae806313dd6bad24f796bc143436fb4cbfbc65dbc3a06a71b67a5eab0be447
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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 :
|
|
9
|
+
attr_reader :provider_key, :var_name
|
|
8
10
|
|
|
9
|
-
def initialize(
|
|
11
|
+
def initialize(provider_key: nil, var_name: nil)
|
|
10
12
|
super()
|
|
11
13
|
|
|
12
|
-
@
|
|
13
|
-
@
|
|
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
|
|
19
|
-
@
|
|
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
|
|
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
|
-
|
|
17
|
-
dependency = dependency[
|
|
14
|
+
provider_key = dependency.keys.first
|
|
15
|
+
dependency = dependency[provider_key]
|
|
18
16
|
else
|
|
19
|
-
|
|
17
|
+
provider_key = dependency
|
|
20
18
|
end
|
|
21
19
|
|
|
22
|
-
class_dependencies << (Dependency.new(
|
|
20
|
+
class_dependencies << (Dependency.new(var_name: dependency) | provider_key)
|
|
23
21
|
end
|
|
24
22
|
|
|
25
23
|
class_dependencies
|
data/lib/low_dependency.rb
CHANGED
|
@@ -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.
|
|
40
|
-
raise StandardError, "Provider #{dependency.
|
|
38
|
+
provider = Low::Providers.find(dependency.provider_key)
|
|
39
|
+
raise StandardError, "Provider #{dependency.provider_key} not found" if provider.nil?
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
instance_variable_set("@#{
|
|
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
|
-
|
|
54
|
+
var_name = var_name_via_namespace(dependency.var_name)
|
|
56
55
|
|
|
57
|
-
klass.define_method(
|
|
58
|
-
instance_variable_get("@#{
|
|
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
|
|
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
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.
|
|
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:
|