crystal_clear 0.1.1 → 0.2.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 +4 -4
- data/Rakefile +0 -9
- data/crystal_clear.gemspec +1 -1
- data/lib/crystal_clear/instantiator/argumentless_instantiator.rb +3 -2
- data/lib/crystal_clear/instantiator/instantiator.rb +7 -0
- data/lib/crystal_clear/instantiator/pass_through_instantiator.rb +3 -2
- data/lib/crystal_clear/instantiator/provider_instantiator.rb +10 -8
- data/lib/crystal_clear/instantiator/singleton_instantiator.rb +5 -4
- data/lib/crystal_clear/registration_builder.rb +7 -6
- data/lib/crystal_clear/resolver.rb +32 -13
- data/lib/crystal_clear/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cb9309b4bbb48f717389e2f5435724f2a3242ba31cbc38534e30cd7e89270dec
|
4
|
+
data.tar.gz: 7758694d4a4c39af92b69d74d8870b91e4a6e9cea869df6230bb6b9d95871983
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 68eb064946dcf6b0807fc8d9cc6c16698dd983dea5875cbbee892d26543d4eec1428b002ebad550f355fa67d0098a9ea6e4b1566f66cc920212e055674b698d8
|
7
|
+
data.tar.gz: cfb3c13303372c91fbf12c058b264e805ab4831489da70ef6443e075a27f196a1600830535d71a7f7fc06c60623d246f9a393b853bce2e6a7a75b1b781d0905f
|
data/Rakefile
CHANGED
data/crystal_clear.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
|
11
11
|
spec.summary = %q{Simple implementation of DI in ruby.}
|
12
12
|
spec.description = %q{Simple implementation of DI in ruby.}
|
13
|
-
spec.homepage
|
13
|
+
spec.homepage = "https://github.com/jstefek/crystal-clear"
|
14
14
|
spec.license = "MIT"
|
15
15
|
|
16
16
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
@@ -1,24 +1,26 @@
|
|
1
|
+
require_relative 'instantiator'
|
2
|
+
|
1
3
|
module CrystalClear
|
2
|
-
class ProviderInstantiator
|
4
|
+
class ProviderInstantiator < Instantiator
|
3
5
|
|
4
|
-
|
5
|
-
|
6
|
+
# @param [Class<? extends CrystalClear::Provider>]
|
7
|
+
def initialize(provider_class)
|
8
|
+
@provider_class = provider_class
|
6
9
|
end
|
7
10
|
|
8
11
|
def instantiate
|
9
|
-
|
12
|
+
@provider_class.new.provide
|
10
13
|
end
|
11
14
|
end
|
12
15
|
|
13
16
|
class Provider
|
14
|
-
attr_reader :class_name
|
15
17
|
|
16
18
|
def initialize(class_name)
|
17
|
-
@
|
19
|
+
@provided_class = class_name
|
18
20
|
end
|
19
21
|
|
20
|
-
def provide
|
21
|
-
@
|
22
|
+
def provide
|
23
|
+
@provided_class.new
|
22
24
|
end
|
23
25
|
end
|
24
26
|
end
|
@@ -1,14 +1,15 @@
|
|
1
|
+
require_relative 'instantiator'
|
2
|
+
|
1
3
|
module CrystalClear
|
2
|
-
class SingletonInstantiator
|
3
|
-
attr_reader :class_name
|
4
|
+
class SingletonInstantiator < Instantiator
|
4
5
|
|
5
6
|
def initialize(class_name)
|
6
7
|
@instance = nil
|
7
|
-
@
|
8
|
+
@provider_class = class_name
|
8
9
|
end
|
9
10
|
|
10
11
|
def instantiate
|
11
|
-
@instance ||= @
|
12
|
+
@instance ||= @provider_class.new
|
12
13
|
end
|
13
14
|
|
14
15
|
end
|
@@ -12,31 +12,32 @@ module CrystalClear
|
|
12
12
|
def initialize(clazz)
|
13
13
|
@clazz = clazz
|
14
14
|
@classes = [clazz]
|
15
|
-
@block = lambda { |add_procedure| add_procedure.call(@classes, ArgumentlessInstantiator.new(@clazz)) }
|
15
|
+
@block = lambda { |add_procedure| add_procedure.call(@classes, ArgumentlessInstantiator.new(@clazz), @clazz) }
|
16
16
|
end
|
17
17
|
|
18
18
|
def self.for(clazz)
|
19
19
|
RegistrationBuilder.new(clazz)
|
20
20
|
end
|
21
21
|
|
22
|
-
def under(classes)
|
22
|
+
def under(*classes)
|
23
23
|
arr = classes.respond_to?(:each) ? classes : [classes]
|
24
24
|
arr.each { |c| @classes.push(c) }
|
25
|
+
@classes.uniq!
|
25
26
|
self
|
26
27
|
end
|
27
28
|
|
28
29
|
def resolves_to_singleton
|
29
|
-
@block = lambda { |add_procedure| add_procedure.call(@classes, SingletonInstantiator.new(@clazz)) }
|
30
|
+
@block = lambda { |add_procedure| add_procedure.call(@classes, SingletonInstantiator.new(@clazz), @clazz) }
|
30
31
|
self
|
31
32
|
end
|
32
33
|
|
33
34
|
def resolves_to_instance(instance)
|
34
|
-
@block = lambda { |add_procedure| add_procedure.call(@classes, PassThroughInstantiator.new(instance)) }
|
35
|
+
@block = lambda { |add_procedure| add_procedure.call(@classes, PassThroughInstantiator.new(instance), @clazz) }
|
35
36
|
self
|
36
37
|
end
|
37
38
|
|
38
|
-
def resolves_to_provider
|
39
|
-
@block = lambda { |add_procedure| add_procedure.call(@classes, ProviderInstantiator.new(@clazz)
|
39
|
+
def resolves_to_provider(provider_class)
|
40
|
+
@block = lambda { |add_procedure| add_procedure.call(@classes, ProviderInstantiator.new(provider_class), @clazz) }
|
40
41
|
self
|
41
42
|
end
|
42
43
|
|
@@ -3,26 +3,45 @@ require_relative 'registration_builder'
|
|
3
3
|
module CrystalClear
|
4
4
|
class Resolver
|
5
5
|
|
6
|
-
# @return [
|
6
|
+
# @return [<? extends class_name>]
|
7
7
|
def get(class_name)
|
8
8
|
result = storage[class_name]
|
9
9
|
raise ClassNotRegisteredError.new("No information about class: #{class_name}") unless result
|
10
10
|
result.instantiate
|
11
11
|
end
|
12
12
|
|
13
|
-
# @param [
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
when CrystalClear::RegistrationBuilder
|
19
|
-
param.build(add_procedure)
|
20
|
-
else
|
21
|
-
raise ArgumentError.new("Unsupported type: #{param.class}")
|
22
|
-
end
|
13
|
+
# @param [CrystalClear::RegistrationBuilder] builder
|
14
|
+
# @return [CrystalClear::Resolver]
|
15
|
+
def register(builder)
|
16
|
+
raise ArgumentError, "#{builder.class} is not a CrystalClear::RegistrationBuilder" unless builder.is_a?(CrystalClear::RegistrationBuilder)
|
17
|
+
builder.build(add_procedure)
|
23
18
|
self
|
24
19
|
end
|
25
20
|
|
21
|
+
# @param [Class] class_name
|
22
|
+
# @return [CrystalClear::Resolver]
|
23
|
+
def register_class(class_name)
|
24
|
+
raise ArgumentError, "#{class_name.class} is not a Class" unless class_name.is_a?(Class)
|
25
|
+
register(CrystalClear::RegistrationBuilder.for(class_name))
|
26
|
+
end
|
27
|
+
|
28
|
+
# @param [Class] class_name
|
29
|
+
# @return [CrystalClear::Resolver]
|
30
|
+
def register_as_singleton(class_name)
|
31
|
+
raise ArgumentError, "#{class_name.class} is not a Class" unless class_name.is_a?(Class)
|
32
|
+
register(CrystalClear::RegistrationBuilder.for(class_name).resolves_to_singleton)
|
33
|
+
end
|
34
|
+
|
35
|
+
# @param [Class] provider_class
|
36
|
+
# @param [Class] class_name
|
37
|
+
# @return [CrystalClear::Resolver]
|
38
|
+
def register_provider(provider_class, class_name)
|
39
|
+
raise ArgumentError, "#{provider_class} is not a Class" unless provider_class.is_a?(Class)
|
40
|
+
raise ArgumentError, "#{provider_class} is not a Provider" unless provider_class < CrystalClear::Provider
|
41
|
+
raise ArgumentError, "#{class_name} is not a Class" unless class_name.is_a?(Class)
|
42
|
+
register(CrystalClear::RegistrationBuilder.for(class_name).resolves_to_provider(provider_class))
|
43
|
+
end
|
44
|
+
|
26
45
|
private
|
27
46
|
|
28
47
|
def storage
|
@@ -30,12 +49,12 @@ module CrystalClear
|
|
30
49
|
end
|
31
50
|
|
32
51
|
def add_procedure
|
33
|
-
@add_procedure ||= proc do |classes, instantiator|
|
52
|
+
@add_procedure ||= proc do |classes, instantiator, class_name|
|
34
53
|
classes.each do |c|
|
35
54
|
if storage[c].nil?
|
36
55
|
storage[c] = instantiator
|
37
56
|
else
|
38
|
-
raise ClassAlreadyRegisteredError.new("Class #{c} already registered for class: #{
|
57
|
+
raise ClassAlreadyRegisteredError.new("Class #{c} already registered for class: #{class_name}")
|
39
58
|
end
|
40
59
|
end
|
41
60
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crystal_clear
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jiri Stefek
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- crystal_clear.gemspec
|
71
71
|
- lib/crystal_clear.rb
|
72
72
|
- lib/crystal_clear/instantiator/argumentless_instantiator.rb
|
73
|
+
- lib/crystal_clear/instantiator/instantiator.rb
|
73
74
|
- lib/crystal_clear/instantiator/pass_through_instantiator.rb
|
74
75
|
- lib/crystal_clear/instantiator/provider_instantiator.rb
|
75
76
|
- lib/crystal_clear/instantiator/singleton_instantiator.rb
|