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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 38508b078fa49c0797704147d5bbb79e69ea896fee49f8d6ac08339af4120e48
4
- data.tar.gz: 1c90dd7f6008b3ef4f42631a0c1d02caab8a5b07cfa853ca0fcbcb2083cae661
3
+ metadata.gz: cb9309b4bbb48f717389e2f5435724f2a3242ba31cbc38534e30cd7e89270dec
4
+ data.tar.gz: 7758694d4a4c39af92b69d74d8870b91e4a6e9cea869df6230bb6b9d95871983
5
5
  SHA512:
6
- metadata.gz: ccdc2dc4518215df326f6a5d954564c4e1df2263df132ca331da37e0ba8eb03d4dc52a6e7da72117cd5fcde4f1086aa74c06bc1769f32acbb8a2cdc8784243b4
7
- data.tar.gz: 0ce6e9eccd5620d2603d2d20c68437ce3df37a8c4d50dc59ea4e544a5f194f5d6736b4425b1f530de2d1b55c00856a9b14376c6df454d927c54d4b56905cd4df
6
+ metadata.gz: 68eb064946dcf6b0807fc8d9cc6c16698dd983dea5875cbbee892d26543d4eec1428b002ebad550f355fa67d0098a9ea6e4b1566f66cc920212e055674b698d8
7
+ data.tar.gz: cfb3c13303372c91fbf12c058b264e805ab4831489da70ef6443e075a27f196a1600830535d71a7f7fc06c60623d246f9a393b853bce2e6a7a75b1b781d0905f
data/Rakefile CHANGED
@@ -5,12 +5,3 @@ RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  task :default => :spec
7
7
 
8
- task :build do
9
- Dir.glob('*.gem') do |f|
10
- `rm -rf #{f}`
11
- end
12
- `gem build crystal_clear.gemspec`
13
- Dir.glob('*.gem') do |f|
14
- `gem push #{f}`
15
- end
16
- end
@@ -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 = "https://github.com/jstefek/crystal-clear"
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,6 +1,7 @@
1
+ require_relative 'instantiator'
2
+
1
3
  module CrystalClear
2
- class ArgumentlessInstantiator
3
- attr_reader :class_name
4
+ class ArgumentlessInstantiator < Instantiator
4
5
 
5
6
  def initialize(class_name)
6
7
  @class_name = class_name
@@ -0,0 +1,7 @@
1
+ module CrystalClear
2
+ class Instantiator
3
+ def instantiate
4
+ raise 'Implement me'
5
+ end
6
+ end
7
+ end
@@ -1,6 +1,7 @@
1
+ require_relative 'instantiator'
2
+
1
3
  module CrystalClear
2
- class PassThroughInstantiator
3
- attr_reader :class_name
4
+ class PassThroughInstantiator < Instantiator
4
5
 
5
6
  def initialize(instance)
6
7
  @instance = instance
@@ -1,24 +1,26 @@
1
+ require_relative 'instantiator'
2
+
1
3
  module CrystalClear
2
- class ProviderInstantiator
4
+ class ProviderInstantiator < Instantiator
3
5
 
4
- def initialize(class_name)
5
- @class_name = class_name
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
- Provider.new(@class_name)
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
- @class_name = class_name
19
+ @provided_class = class_name
18
20
  end
19
21
 
20
- def provide(*args)
21
- @class_name.new(*args)
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
- @class_name = class_name
8
+ @provider_class = class_name
8
9
  end
9
10
 
10
11
  def instantiate
11
- @instance ||= @class_name.new
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 [@class_name]
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 [Class, CrystalClear::RegistrationBuilder] param
14
- def register(param)
15
- case param
16
- when Class
17
- return register(CrystalClear::RegistrationBuilder.for(param))
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: #{storage[c].class_name}")
57
+ raise ClassAlreadyRegisteredError.new("Class #{c} already registered for class: #{class_name}")
39
58
  end
40
59
  end
41
60
  end
@@ -1,3 +1,3 @@
1
1
  module CrystalClear
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.1"
3
3
  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.1.1
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-05-23 00:00:00.000000000 Z
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