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 +4 -4
- data/ioc.gemspec +1 -1
- data/lib/ioc.rb +1 -1
- data/lib/ioc/container.rb +16 -16
- data/lib/ioc/service_class.rb +1 -1
- data/lib/ioc/unresolvable_container.rb +7 -0
- data/spec/{ioc_spec.rb → container_spec.rb} +24 -26
- data/spec/spec_helper.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 88f7a749eb3e62a7f4633a46b76fc0d353315588
|
4
|
+
data.tar.gz: 23827f1f2cb06e3f27240287edaf5d5ce3ab890d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1c72d08fb16c77a1c40145e4f05a828c370c2974fc5a6673f5b090bdbcf5be929139171ed3500aa40c8484317a7de0c16c8d95bb9f0444cf6b59feafb7082d55
|
7
|
+
data.tar.gz: 5e59363962cd2c7823d71a1647eb32dd8d7a4a6e9fbc4fccce34479a15b9abd3b2e25e0b135458f895a62a4c9e440b78b78974185f7980a3d53687fb662d2483
|
data/ioc.gemspec
CHANGED
data/lib/ioc.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require "ioc/container"
|
data/lib/ioc/container.rb
CHANGED
@@ -1,39 +1,39 @@
|
|
1
|
-
require
|
2
|
-
require
|
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
|
7
|
-
|
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 @
|
20
|
-
@
|
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,
|
21
|
+
raise(ArgumentError, "expected service")
|
27
22
|
end
|
28
23
|
end
|
29
24
|
|
30
25
|
def resolve(name)
|
31
|
-
|
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
|
data/lib/ioc/service_class.rb
CHANGED
@@ -4,7 +4,7 @@ module IOC
|
|
4
4
|
klass.instance_method(:initialize)
|
5
5
|
@klass = klass
|
6
6
|
rescue NoMethodError => e
|
7
|
-
raise(ArgumentError,
|
7
|
+
raise(ArgumentError, "Expected initialize method on registered service")
|
8
8
|
end
|
9
9
|
|
10
10
|
def resolve(container)
|
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "spec_helper"
|
2
|
+
require "ioc"
|
3
3
|
|
4
4
|
describe IOC::Container do
|
5
|
-
context
|
6
|
-
it
|
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
|
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
|
24
|
-
it
|
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
|
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
|
55
|
-
it
|
56
|
-
myobject =
|
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
|
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
|
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
|
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
|
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
|
data/spec/spec_helper.rb
CHANGED
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:
|
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-
|
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
|
-
-
|
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/
|
84
|
+
- spec/container_spec.rb
|
84
85
|
- spec/spec_helper.rb
|