ioc 3.0.0 → 4.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: daea0d62d1d33b2d291e60e8ded2d3e22ea64434
4
- data.tar.gz: 8e58e246b0b6f1ca08f0aa1475e25423db9307f5
3
+ metadata.gz: 88f7a749eb3e62a7f4633a46b76fc0d353315588
4
+ data.tar.gz: 23827f1f2cb06e3f27240287edaf5d5ce3ab890d
5
5
  SHA512:
6
- metadata.gz: 92df3344bbe775ce4ce55ec7a28c043a31151baa1310aa272d69120786b45e3f1c6b27b196a85609323fe6a61e7dcdb5e4a3a0c4135fdea93a95377744957153
7
- data.tar.gz: 0dff485f90b20931e6715e2d08ac55509791813aa3c8041386b3b3303f641fe7b56fa9187aedae61b98e1bd5d230ddecba49fb86a47829d2f06ddb2f99658491
6
+ metadata.gz: 1c72d08fb16c77a1c40145e4f05a828c370c2974fc5a6673f5b090bdbcf5be929139171ed3500aa40c8484317a7de0c16c8d95bb9f0444cf6b59feafb7082d55
7
+ data.tar.gz: 5e59363962cd2c7823d71a1647eb32dd8d7a4a6e9fbc4fccce34479a15b9abd3b2e25e0b135458f895a62a4c9e440b78b78974185f7980a3d53687fb662d2483
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |spec|
4
4
  spec.name = 'ioc'
5
- spec.version = '3.0.0'
5
+ spec.version = '4.0.0'
6
6
  spec.authors = ['Erik Lott']
7
7
  spec.email = ['erik.lott@kodio.io']
8
8
  spec.summary = 'Minimal inversion of control container for Ruby'
data/lib/ioc.rb CHANGED
@@ -1 +1 @@
1
- require 'ioc/container'
1
+ require "ioc/container"
@@ -1,39 +1,39 @@
1
- require 'ioc/service_class'
2
- require 'ioc/service_block'
1
+ require "ioc/service_class"
2
+ require "ioc/service_block"
3
+ require "ioc/unresolvable_container"
3
4
 
4
5
  module IOC
5
6
  class Container
6
- def self.install(*installers)
7
- [*installers].inject(new) do |c, installer|
8
- installer.install(c)
9
- c
10
- end
11
- end
12
-
13
- def initialize
14
- @resolvers = {}
7
+ def initialize(parent=UnresolvableContainer.new)
8
+ @services = {}
15
9
  @cache = {}
10
+ @parent = parent
16
11
  end
17
12
 
18
13
  def register(service_name, klass=nil, &block)
19
- raise(ArgumentError, "Service '#{service_name}' has already been registered") if @resolvers.key?(service_name)
20
- @resolvers[service_name] =
14
+ raise(ArgumentError, "Service '#{service_name}' has already been registered") if @services.key?(service_name)
15
+ @services[service_name] =
21
16
  if klass
22
17
  ServiceClass.new(klass)
23
18
  elsif block_given?
24
19
  ServiceBlock.new(block)
25
20
  else
26
- raise(ArgumentError, 'expected service')
21
+ raise(ArgumentError, "expected service")
27
22
  end
28
23
  end
29
24
 
30
25
  def resolve(name)
31
- raise(ArgumentError, "Service '#{name}' not registered") unless @resolvers.key?(name)
32
- @cache[name] ||= @resolvers[name].resolve(self)
26
+ @cache[name] ||= service_locator(name)
33
27
  end
34
28
 
35
29
  def [](key)
36
30
  resolve(key)
37
31
  end
32
+
33
+ private
34
+
35
+ def service_locator(name)
36
+ @services.key?(name) ? @services[name].resolve(self) : @parent.resolve(name)
37
+ end
38
38
  end
39
39
  end
@@ -4,7 +4,7 @@ module IOC
4
4
  klass.instance_method(:initialize)
5
5
  @klass = klass
6
6
  rescue NoMethodError => e
7
- raise(ArgumentError, 'Expected initialize method on registered service')
7
+ raise(ArgumentError, "Expected initialize method on registered service")
8
8
  end
9
9
 
10
10
  def resolve(container)
@@ -0,0 +1,7 @@
1
+ module IOC
2
+ class UnresolvableContainer
3
+ def resolve(name)
4
+ raise(ArgumentError, "Service '#{name}' not registered")
5
+ end
6
+ end
7
+ end
@@ -1,9 +1,9 @@
1
- require 'spec_helper'
2
- require 'ioc'
1
+ require "spec_helper"
2
+ require "ioc"
3
3
 
4
4
  describe IOC::Container do
5
- context 'when class is registered' do
6
- it 'resolves a class instance' do
5
+ context "when class is registered" do
6
+ it "resolves a class instance" do
7
7
  container = define_container
8
8
  myclass = define_class
9
9
  container.register(:myclass, myclass)
@@ -11,7 +11,7 @@ describe IOC::Container do
11
11
  inst.must_be_instance_of(myclass)
12
12
  end
13
13
 
14
- it 'caches resolved instance' do
14
+ it "caches resolved instance" do
15
15
  container = define_container
16
16
  myclass = define_class
17
17
  container.register(:myclass, myclass)
@@ -20,8 +20,8 @@ describe IOC::Container do
20
20
  inst1.must_equal(inst2)
21
21
  end
22
22
 
23
- context 'when class has dependencies' do
24
- it 'injects dependencies into instance' do
23
+ context "when class has dependencies" do
24
+ it "injects dependencies into instance" do
25
25
  container = define_container
26
26
 
27
27
  engine_class = define_class
@@ -34,7 +34,7 @@ describe IOC::Container do
34
34
  car.engine.must_be_instance_of(engine_class)
35
35
  end
36
36
 
37
- it 'caches dependencies' do
37
+ it "caches dependencies" do
38
38
  container = define_container
39
39
 
40
40
  engine_class = define_class
@@ -51,23 +51,23 @@ describe IOC::Container do
51
51
  end
52
52
  end
53
53
 
54
- context 'when block is registered' do
55
- it 'returns result of block' do
56
- myobject = 'a string object'
54
+ context "when block is registered" do
55
+ it "returns result of block" do
56
+ myobject = "a string object"
57
57
  container = define_container
58
58
  container.register(:myobject){|c| myobject }
59
59
  container.resolve(:myobject).must_equal(myobject)
60
60
  end
61
61
  end
62
62
 
63
- it 'raises error when service not found' do
63
+ it "raises error when service not found" do
64
64
  container = define_container
65
65
  proc {
66
66
  container.resolve(:some_service)
67
67
  }.must_raise(ArgumentError)
68
68
  end
69
69
 
70
- it 'raises error when service registered more than once' do
70
+ it "raises error when service registered more than once" do
71
71
  myclass = define_class
72
72
  container = define_container
73
73
  container.register(:myclass, myclass)
@@ -76,7 +76,7 @@ describe IOC::Container do
76
76
  }.must_raise(ArgumentError)
77
77
  end
78
78
 
79
- it 'raises error when object registered as class' do
79
+ it "raises error when object registered as class" do
80
80
  myclass = define_class
81
81
  myobject = myclass.new
82
82
  container = define_container
@@ -85,18 +85,7 @@ describe IOC::Container do
85
85
  }.must_raise(ArgumentError)
86
86
  end
87
87
 
88
- it 'can register components using an installer' do
89
- installer_class = Class.new do
90
- def self.install(cont)
91
- cont.register(:myobj){|c| 'I was resolved'}
92
- end
93
- end
94
-
95
- container = IOC::Container.install(installer_class)
96
- container.resolve(:myobj).must_equal('I was resolved')
97
- end
98
-
99
- it 'supports resolving via hash syntax' do
88
+ it "supports resolving via hash syntax" do
100
89
  container = define_container
101
90
  myclass = Class.new
102
91
  container.register(:myclass, myclass)
@@ -104,6 +93,15 @@ describe IOC::Container do
104
93
  inst.must_be_instance_of(myclass)
105
94
  end
106
95
 
96
+ it "can resolve service from parent container" do
97
+ myobject = Object.new
98
+ parent_container = define_container
99
+ parent_container.register(:myobject){ myobject }
100
+
101
+ child_container = define_container(parent_container)
102
+ child_container.resolve(:myobject).must_equal(myobject)
103
+ end
104
+
107
105
  def define_container(*args)
108
106
  IOC::Container.new(*args)
109
107
  end
@@ -1,4 +1,4 @@
1
- require 'minitest/autorun'
1
+ require "minitest/autorun"
2
2
 
3
3
  def context *args, &block
4
4
  describe *args, &block
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ioc
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 4.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Lott
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-06 00:00:00.000000000 Z
11
+ date: 2014-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -53,7 +53,8 @@ files:
53
53
  - lib/ioc/container.rb
54
54
  - lib/ioc/service_block.rb
55
55
  - lib/ioc/service_class.rb
56
- - spec/ioc_spec.rb
56
+ - lib/ioc/unresolvable_container.rb
57
+ - spec/container_spec.rb
57
58
  - spec/spec_helper.rb
58
59
  homepage: ''
59
60
  licenses:
@@ -80,5 +81,5 @@ signing_key:
80
81
  specification_version: 4
81
82
  summary: Minimal inversion of control container for Ruby
82
83
  test_files:
83
- - spec/ioc_spec.rb
84
+ - spec/container_spec.rb
84
85
  - spec/spec_helper.rb