ioc 3.0.0 → 4.0.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 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