ioc 2.2.0 → 3.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 +13 -18
- data/lib/ioc.rb +0 -9
- data/lib/ioc/container.rb +15 -14
- data/lib/ioc/service_block.rb +11 -0
- data/lib/ioc/service_class.rb +16 -0
- data/spec/ioc_spec.rb +61 -98
- data/spec/spec_helper.rb +0 -1
- metadata +7 -28
- data/.gitignore +0 -17
- data/Gemfile +0 -4
- data/Guardfile +0 -9
- data/lib/ioc/exceptions.rb +0 -6
- data/lib/ioc/resolver_factory.rb +0 -8
- data/lib/ioc/resolvers/abstract_resolver.rb +0 -12
- data/lib/ioc/resolvers/class_resolver.rb +0 -27
- data/lib/ioc/resolvers/instance_resolver.rb +0 -13
- data/lib/ioc/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: daea0d62d1d33b2d291e60e8ded2d3e22ea64434
|
4
|
+
data.tar.gz: 8e58e246b0b6f1ca08f0aa1475e25423db9307f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 92df3344bbe775ce4ce55ec7a28c043a31151baa1310aa272d69120786b45e3f1c6b27b196a85609323fe6a61e7dcdb5e4a3a0c4135fdea93a95377744957153
|
7
|
+
data.tar.gz: 0dff485f90b20931e6715e2d08ac55509791813aa3c8041386b3b3303f641fe7b56fa9187aedae61b98e1bd5d230ddecba49fb86a47829d2f06ddb2f99658491
|
data/ioc.gemspec
CHANGED
@@ -1,24 +1,19 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'ioc/version'
|
5
2
|
|
6
3
|
Gem::Specification.new do |spec|
|
7
|
-
spec.name =
|
8
|
-
spec.version =
|
9
|
-
spec.authors = [
|
10
|
-
spec.email = [
|
11
|
-
spec.
|
12
|
-
spec.
|
13
|
-
spec.
|
14
|
-
spec.
|
15
|
-
|
16
|
-
spec.files
|
17
|
-
spec.
|
18
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
4
|
+
spec.name = 'ioc'
|
5
|
+
spec.version = '3.0.0'
|
6
|
+
spec.authors = ['Erik Lott']
|
7
|
+
spec.email = ['erik.lott@kodio.io']
|
8
|
+
spec.summary = 'Minimal inversion of control container for Ruby'
|
9
|
+
spec.homepage = ''
|
10
|
+
spec.license = 'MIT'
|
11
|
+
spec.files = ['LICENSE.txt', 'README.md', 'Rakefile', 'ioc.gemspec']
|
12
|
+
spec.files += Dir.glob('lib/**/*.rb')
|
13
|
+
spec.files += Dir.glob('spec/**/*')
|
14
|
+
spec.test_files = Dir.glob('spec/**/*')
|
19
15
|
spec.require_paths = ["lib"]
|
20
16
|
|
21
|
-
spec.add_development_dependency "bundler", "~> 1.
|
17
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
22
18
|
spec.add_development_dependency "rake"
|
23
|
-
|
24
|
-
end
|
19
|
+
end
|
data/lib/ioc.rb
CHANGED
data/lib/ioc/container.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'ioc/service_class'
|
2
|
+
require 'ioc/service_block'
|
3
|
+
|
1
4
|
module IOC
|
2
5
|
class Container
|
3
6
|
def self.install(*installers)
|
@@ -12,23 +15,21 @@ module IOC
|
|
12
15
|
@cache = {}
|
13
16
|
end
|
14
17
|
|
15
|
-
def register(
|
16
|
-
raise(
|
17
|
-
@resolvers[
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
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] =
|
21
|
+
if klass
|
22
|
+
ServiceClass.new(klass)
|
23
|
+
elsif block_given?
|
24
|
+
ServiceBlock.new(block)
|
25
|
+
else
|
26
|
+
raise(ArgumentError, 'expected service')
|
27
|
+
end
|
23
28
|
end
|
24
29
|
|
25
30
|
def resolve(name)
|
26
|
-
raise(
|
27
|
-
@cache[name] ||= @resolvers[name].resolve
|
28
|
-
end
|
29
|
-
|
30
|
-
def resolve_anonymous(klass)
|
31
|
-
ClassResolver.new(klass, self).resolve
|
31
|
+
raise(ArgumentError, "Service '#{name}' not registered") unless @resolvers.key?(name)
|
32
|
+
@cache[name] ||= @resolvers[name].resolve(self)
|
32
33
|
end
|
33
34
|
|
34
35
|
def [](key)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module IOC
|
2
|
+
class ServiceClass
|
3
|
+
def initialize(klass)
|
4
|
+
klass.instance_method(:initialize)
|
5
|
+
@klass = klass
|
6
|
+
rescue NoMethodError => e
|
7
|
+
raise(ArgumentError, 'Expected initialize method on registered service')
|
8
|
+
end
|
9
|
+
|
10
|
+
def resolve(container)
|
11
|
+
dependencies = @klass.instance_method(:initialize).parameters.map(&:last)
|
12
|
+
resolved_dependencies = dependencies.map{ |dependency| container.resolve(dependency) }
|
13
|
+
@klass.new(*resolved_dependencies)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/spec/ioc_spec.rb
CHANGED
@@ -2,60 +2,32 @@ require 'spec_helper'
|
|
2
2
|
require 'ioc'
|
3
3
|
|
4
4
|
describe IOC::Container do
|
5
|
-
context 'when
|
6
|
-
it '
|
7
|
-
container =
|
8
|
-
|
9
|
-
container.register(:
|
10
|
-
container.resolve(:
|
5
|
+
context 'when class is registered' do
|
6
|
+
it 'resolves a class instance' do
|
7
|
+
container = define_container
|
8
|
+
myclass = define_class
|
9
|
+
container.register(:myclass, myclass)
|
10
|
+
inst = container.resolve(:myclass)
|
11
|
+
inst.must_be_instance_of(myclass)
|
11
12
|
end
|
12
|
-
end
|
13
|
-
|
14
|
-
context 'when service is registered as a class' do
|
15
|
-
context 'when class has no dependencies' do
|
16
|
-
it 'resolves to instance' do
|
17
|
-
container = new_container
|
18
|
-
myclass = new_class
|
19
|
-
container.register(:myclass, myclass)
|
20
|
-
container.resolve(:myclass).must_be_instance_of(myclass)
|
21
|
-
end
|
22
13
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
14
|
+
it 'caches resolved instance' do
|
15
|
+
container = define_container
|
16
|
+
myclass = define_class
|
17
|
+
container.register(:myclass, myclass)
|
18
|
+
inst1 = container.resolve(:myclass)
|
19
|
+
inst2 = container.resolve(:myclass)
|
20
|
+
inst1.must_equal(inst2)
|
30
21
|
end
|
31
22
|
|
32
23
|
context 'when class has dependencies' do
|
33
|
-
it 'resolves to instance' do
|
34
|
-
container = new_container
|
35
|
-
engine_class = new_class
|
36
|
-
car_class = new_class_with_dependency
|
37
|
-
container.register(:engine, engine_class)
|
38
|
-
container.register(:car, car_class)
|
39
|
-
|
40
|
-
container.resolve(:car).must_be_instance_of(car_class)
|
41
|
-
end
|
42
|
-
|
43
|
-
it 'caches resolved instance' do
|
44
|
-
container = new_container
|
45
|
-
engine_class = new_class
|
46
|
-
car_class = new_class_with_dependency
|
47
|
-
container.register(:engine, engine_class)
|
48
|
-
container.register(:car, car_class)
|
49
|
-
|
50
|
-
car = container.resolve(:car)
|
51
|
-
container.resolve(:car).must_equal(car)
|
52
|
-
end
|
53
|
-
|
54
24
|
it 'injects dependencies into instance' do
|
55
|
-
container =
|
56
|
-
|
57
|
-
|
25
|
+
container = define_container
|
26
|
+
|
27
|
+
engine_class = define_class
|
58
28
|
container.register(:engine, engine_class)
|
29
|
+
|
30
|
+
car_class = define_class_with_engine_dependency
|
59
31
|
container.register(:car, car_class)
|
60
32
|
|
61
33
|
car = container.resolve(:car)
|
@@ -63,54 +35,60 @@ describe IOC::Container do
|
|
63
35
|
end
|
64
36
|
|
65
37
|
it 'caches dependencies' do
|
66
|
-
container =
|
67
|
-
|
68
|
-
|
38
|
+
container = define_container
|
39
|
+
|
40
|
+
engine_class = define_class
|
69
41
|
container.register(:engine, engine_class)
|
42
|
+
|
43
|
+
car_class = define_class_with_engine_dependency
|
70
44
|
container.register(:car, car_class)
|
71
45
|
|
72
46
|
car = container.resolve(:car)
|
73
|
-
engine =
|
74
|
-
|
47
|
+
engine = container.resolve(:engine)
|
48
|
+
|
49
|
+
car.engine.must_equal(engine)
|
75
50
|
end
|
76
51
|
end
|
77
52
|
end
|
78
53
|
|
79
|
-
context 'when
|
80
|
-
it '
|
81
|
-
|
82
|
-
|
54
|
+
context 'when block is registered' do
|
55
|
+
it 'returns result of block' do
|
56
|
+
myobject = 'a string object'
|
57
|
+
container = define_container
|
58
|
+
container.register(:myobject){|c| myobject }
|
59
|
+
container.resolve(:myobject).must_equal(myobject)
|
83
60
|
end
|
84
61
|
end
|
85
62
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
container.
|
90
|
-
|
91
|
-
end
|
63
|
+
it 'raises error when service not found' do
|
64
|
+
container = define_container
|
65
|
+
proc {
|
66
|
+
container.resolve(:some_service)
|
67
|
+
}.must_raise(ArgumentError)
|
92
68
|
end
|
93
69
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
70
|
+
it 'raises error when service registered more than once' do
|
71
|
+
myclass = define_class
|
72
|
+
container = define_container
|
73
|
+
container.register(:myclass, myclass)
|
74
|
+
proc {
|
75
|
+
container.register(:myclass, myclass)
|
76
|
+
}.must_raise(ArgumentError)
|
101
77
|
end
|
102
78
|
|
103
|
-
it '
|
104
|
-
|
105
|
-
|
106
|
-
container
|
107
|
-
|
79
|
+
it 'raises error when object registered as class' do
|
80
|
+
myclass = define_class
|
81
|
+
myobject = myclass.new
|
82
|
+
container = define_container
|
83
|
+
proc {
|
84
|
+
container.register(:myclass, myobject)
|
85
|
+
}.must_raise(ArgumentError)
|
108
86
|
end
|
109
87
|
|
110
88
|
it 'can register components using an installer' do
|
111
89
|
installer_class = Class.new do
|
112
|
-
def self.install(
|
113
|
-
|
90
|
+
def self.install(cont)
|
91
|
+
cont.register(:myobj){|c| 'I was resolved'}
|
114
92
|
end
|
115
93
|
end
|
116
94
|
|
@@ -119,33 +97,18 @@ describe IOC::Container do
|
|
119
97
|
end
|
120
98
|
|
121
99
|
it 'supports resolving via hash syntax' do
|
122
|
-
container =
|
123
|
-
myclass =
|
100
|
+
container = define_container
|
101
|
+
myclass = Class.new
|
124
102
|
container.register(:myclass, myclass)
|
125
|
-
container[:myclass]
|
126
|
-
|
127
|
-
|
128
|
-
it 'can resolve anonymous class' do
|
129
|
-
container = new_container
|
130
|
-
myobj = stub
|
131
|
-
anon_class = Class.new do
|
132
|
-
attr_reader :myobj
|
133
|
-
def initialize(myobj)
|
134
|
-
@myobj = myobj
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
container.register(:myobj, myobj, :as => :instance)
|
139
|
-
inst = container.resolve_anonymous(anon_class)
|
140
|
-
inst.must_be_instance_of(anon_class)
|
141
|
-
inst.myobj.must_equal(myobj)
|
103
|
+
inst = container[:myclass]
|
104
|
+
inst.must_be_instance_of(myclass)
|
142
105
|
end
|
143
106
|
|
144
|
-
def
|
107
|
+
def define_container(*args)
|
145
108
|
IOC::Container.new(*args)
|
146
109
|
end
|
147
110
|
|
148
|
-
def
|
111
|
+
def define_class_with_engine_dependency
|
149
112
|
Class.new do
|
150
113
|
attr_reader :engine
|
151
114
|
|
@@ -155,7 +118,7 @@ describe IOC::Container do
|
|
155
118
|
end
|
156
119
|
end
|
157
120
|
|
158
|
-
def
|
121
|
+
def define_class
|
159
122
|
Class.new
|
160
123
|
end
|
161
124
|
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: 3.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-08-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.5'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,42 +38,21 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
|
42
|
-
name: mocha
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: 0.14.0
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: 0.14.0
|
55
|
-
description: Minimal inversion of control container for Ruby
|
41
|
+
description:
|
56
42
|
email:
|
57
43
|
- erik.lott@kodio.io
|
58
44
|
executables: []
|
59
45
|
extensions: []
|
60
46
|
extra_rdoc_files: []
|
61
47
|
files:
|
62
|
-
- ".gitignore"
|
63
|
-
- Gemfile
|
64
|
-
- Guardfile
|
65
48
|
- LICENSE.txt
|
66
49
|
- README.md
|
67
50
|
- Rakefile
|
68
51
|
- ioc.gemspec
|
69
52
|
- lib/ioc.rb
|
70
53
|
- lib/ioc/container.rb
|
71
|
-
- lib/ioc/
|
72
|
-
- lib/ioc/
|
73
|
-
- lib/ioc/resolvers/abstract_resolver.rb
|
74
|
-
- lib/ioc/resolvers/class_resolver.rb
|
75
|
-
- lib/ioc/resolvers/instance_resolver.rb
|
76
|
-
- lib/ioc/version.rb
|
54
|
+
- lib/ioc/service_block.rb
|
55
|
+
- lib/ioc/service_class.rb
|
77
56
|
- spec/ioc_spec.rb
|
78
57
|
- spec/spec_helper.rb
|
79
58
|
homepage: ''
|
data/.gitignore
DELETED
data/Gemfile
DELETED
data/Guardfile
DELETED
@@ -1,9 +0,0 @@
|
|
1
|
-
# A sample Guardfile
|
2
|
-
# More info at https://github.com/guard/guard#readme
|
3
|
-
|
4
|
-
guard :minitest, :all_on_start => false do
|
5
|
-
# with Minitest::Spec
|
6
|
-
watch(%r{^spec/(.*)_spec\.rb})
|
7
|
-
watch(%r{^lib/(.+)\.rb}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
8
|
-
watch(%r{^spec/spec_helper\.rb}) { 'spec' }
|
9
|
-
end
|
data/lib/ioc/exceptions.rb
DELETED
data/lib/ioc/resolver_factory.rb
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
module IOC
|
2
|
-
class ClassResolver < AbstractResolver
|
3
|
-
def resolve
|
4
|
-
instance
|
5
|
-
end
|
6
|
-
|
7
|
-
private
|
8
|
-
|
9
|
-
def instance
|
10
|
-
klass.new(*resolved_dependencies)
|
11
|
-
end
|
12
|
-
|
13
|
-
def klass
|
14
|
-
@object
|
15
|
-
end
|
16
|
-
|
17
|
-
def dependencies
|
18
|
-
klass.instance_method(:initialize).parameters.map(&:last)
|
19
|
-
rescue NoMethodError => e
|
20
|
-
raise(ResolverError, "Service '#{klass}' missing initialize method ")
|
21
|
-
end
|
22
|
-
|
23
|
-
def resolved_dependencies
|
24
|
-
dependencies.map{ |dependency| @container.resolve(dependency) }
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
data/lib/ioc/version.rb
DELETED