providers 0.3.1
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 +7 -0
- data/lib/config/config.rb +7 -0
- data/lib/dependencies.rb +68 -0
- data/lib/expressions/dependency.rb +37 -0
- data/lib/factories/dependency_factory.rb +27 -0
- data/lib/models/provider.rb +17 -0
- data/lib/providers.rb +39 -0
- data/lib/repositories/dependencies.rb +20 -0
- data/lib/version.rb +5 -0
- metadata +64 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: ae45a99a137a22b85a607817e9a75b18de4ec52dcce7e6655da647ebc7d6c47d
|
|
4
|
+
data.tar.gz: 451913f8ad2f29c3412a82c215dabe79ffe1be35c8b82c7a8057496bdfc04512
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 98903d9d7bf948baba13e56f28499ff80e37f0c292be508c495e273f846d1810d369469562bebee89c26532e7bb569db1bd457a119c33b8ee3f845633da23a4d
|
|
7
|
+
data.tar.gz: 0650357e620e054d1606854f5b272331a21ecbf8dc91b1a5b324547d9213434e28a32ec48197f6b0b3aee830a46acdb13a3d48a6049ab9bd420513375b94019e
|
data/lib/dependencies.rb
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'config/config'
|
|
4
|
+
require_relative 'expressions/dependency'
|
|
5
|
+
require_relative 'factories/dependency_factory'
|
|
6
|
+
require_relative 'repositories/dependencies'
|
|
7
|
+
require_relative 'providers'
|
|
8
|
+
|
|
9
|
+
class Dependencies
|
|
10
|
+
class << self
|
|
11
|
+
def provide(key, &block)
|
|
12
|
+
Low::Dependencies.provide(key:, &block)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Usage: "include Dependencies[:dependency]"
|
|
16
|
+
def [](*dependencies)
|
|
17
|
+
class_dependencies = Low::DependencyFactory.parse([*dependencies])
|
|
18
|
+
|
|
19
|
+
# "include" doesn't know the class that did the include, however "included" happens immediately after.
|
|
20
|
+
Low::Dependencies.push(class_dependencies:)
|
|
21
|
+
|
|
22
|
+
included_hook
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def included_hook
|
|
26
|
+
Module.new do
|
|
27
|
+
def self.included(klass)
|
|
28
|
+
klass.class_eval do
|
|
29
|
+
# "include" doesn't know the class that did the include, however "included" happens immediately after.
|
|
30
|
+
@low_dependencies = Low::Dependencies.pop
|
|
31
|
+
|
|
32
|
+
class << self
|
|
33
|
+
attr_reader :low_dependencies
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def initialize
|
|
37
|
+
self.class.low_dependencies.each do |dependency|
|
|
38
|
+
provider = Low::Providers.find(dependency.provider_key)
|
|
39
|
+
raise StandardError, "Provider #{dependency.provider_key} not found" if provider.nil?
|
|
40
|
+
|
|
41
|
+
var_name = Providers.var_name_via_namespace(dependency.var_name)
|
|
42
|
+
instance_variable_set("@#{var_name}", provider.result)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
Providers.define_readers(@low_dependencies, self)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def define_readers(dependencies, klass)
|
|
53
|
+
dependencies.each do |dependency|
|
|
54
|
+
var_name = var_name_via_namespace(dependency.var_name)
|
|
55
|
+
|
|
56
|
+
klass.define_method(var_name) do
|
|
57
|
+
instance_variable_get("@#{var_name}")
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def var_name_via_namespace(namespace)
|
|
63
|
+
return namespace.split('.').last if namespace.is_a?(String)
|
|
64
|
+
|
|
65
|
+
namespace
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'expressions'
|
|
4
|
+
|
|
5
|
+
module Low
|
|
6
|
+
# A Dependency Expression requires LowType in order to be injected via a constructor.
|
|
7
|
+
# See "Dependencies[:dependency]" for traditional dependency injection without LowType.
|
|
8
|
+
class Dependency < ::Expressions::Expression
|
|
9
|
+
attr_reader :provider_key, :var_name
|
|
10
|
+
|
|
11
|
+
def initialize(provider_key: nil, var_name: nil)
|
|
12
|
+
super()
|
|
13
|
+
|
|
14
|
+
@provider_key = provider_key || var_name
|
|
15
|
+
@var_name = var_name
|
|
16
|
+
end
|
|
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
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def union_value(value)
|
|
33
|
+
@provider_key = value
|
|
34
|
+
@var_name = Dependencies.var_name_via_namespace(value)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../expressions/dependency'
|
|
4
|
+
|
|
5
|
+
module Low
|
|
6
|
+
class DependencyFactory
|
|
7
|
+
class << self
|
|
8
|
+
def parse(dependencies)
|
|
9
|
+
class_dependencies = []
|
|
10
|
+
|
|
11
|
+
dependencies.each do |dependency|
|
|
12
|
+
case dependency
|
|
13
|
+
when Hash
|
|
14
|
+
provider_key = dependency.keys.first
|
|
15
|
+
dependency = dependency[provider_key]
|
|
16
|
+
else
|
|
17
|
+
provider_key = dependency
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
class_dependencies << (Dependency.new(var_name: dependency) | provider_key)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
class_dependencies
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
data/lib/providers.rb
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative '../models/provider'
|
|
4
|
+
|
|
5
|
+
class Providers
|
|
6
|
+
class MissingProviderError < StandardError; end
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
def provide(key:, &block)
|
|
10
|
+
providers[key] = Provider.new(key:, &block)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def providers
|
|
14
|
+
@providers ||= {}
|
|
15
|
+
@providers
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def find(provider_key)
|
|
19
|
+
providers[provider_key]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Providers[] are hard to stub in tests and should only be used when dependency injection isn't possible.
|
|
23
|
+
# TODO: Make Providers[] easy to stub in tests and look into feature where we get providers from another Ecosystem.
|
|
24
|
+
def [](provider_key)
|
|
25
|
+
provider = providers[provider_key]
|
|
26
|
+
raise(MissingProviderError, "Provider #{provider_key.inspect} not found") if provider.nil?
|
|
27
|
+
|
|
28
|
+
provider.result
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def all
|
|
32
|
+
providers
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def clear
|
|
36
|
+
@providers = {}
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Low
|
|
4
|
+
class Dependencies
|
|
5
|
+
class << self
|
|
6
|
+
def stack
|
|
7
|
+
@stack ||= []
|
|
8
|
+
@stack
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def push(class_dependencies:)
|
|
12
|
+
stack << class_dependencies
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def pop
|
|
16
|
+
stack.pop
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
data/lib/version.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: providers
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.3.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- maedi
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: expressions
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '0.1'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '0.1'
|
|
26
|
+
description: Automatic Dependency Injection where you get to see and keep control
|
|
27
|
+
of the constructor
|
|
28
|
+
email:
|
|
29
|
+
- maediprichard@gmail.com
|
|
30
|
+
executables: []
|
|
31
|
+
extensions: []
|
|
32
|
+
extra_rdoc_files: []
|
|
33
|
+
files:
|
|
34
|
+
- lib/config/config.rb
|
|
35
|
+
- lib/dependencies.rb
|
|
36
|
+
- lib/expressions/dependency.rb
|
|
37
|
+
- lib/factories/dependency_factory.rb
|
|
38
|
+
- lib/models/provider.rb
|
|
39
|
+
- lib/providers.rb
|
|
40
|
+
- lib/repositories/dependencies.rb
|
|
41
|
+
- lib/version.rb
|
|
42
|
+
homepage: https://github.com/raindeer-rb/providers
|
|
43
|
+
licenses: []
|
|
44
|
+
metadata:
|
|
45
|
+
homepage_uri: https://github.com/raindeer-rb/providers
|
|
46
|
+
source_code_uri: https://github.com/raindeer-rb/providers/src/branch/main
|
|
47
|
+
rdoc_options: []
|
|
48
|
+
require_paths:
|
|
49
|
+
- lib
|
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - ">="
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: 3.3.0
|
|
55
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
56
|
+
requirements:
|
|
57
|
+
- - ">="
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: '0'
|
|
60
|
+
requirements: []
|
|
61
|
+
rubygems_version: 3.7.2
|
|
62
|
+
specification_version: 4
|
|
63
|
+
summary: Dependency Injection in crisp and clear syntax
|
|
64
|
+
test_files: []
|