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 +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
|