needle 1.1.0 → 1.2.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.
- data/benchmarks/instantiation.rb +39 -0
- data/doc/faq/faq.yml +137 -102
- data/doc/manual-html/chapter-1.html +15 -19
- data/doc/manual-html/chapter-2.html +52 -23
- data/doc/manual-html/chapter-3.html +7 -9
- data/doc/manual-html/chapter-4.html +6 -8
- data/doc/manual-html/chapter-5.html +16 -19
- data/doc/manual-html/chapter-6.html +31 -8
- data/doc/manual-html/chapter-7.html +19 -8
- data/doc/manual-html/chapter-8.html +8 -11
- data/doc/manual-html/chapter-9.html +7 -6
- data/doc/manual-html/index.html +5 -3
- data/doc/manual/manual.yml +2 -1
- data/doc/manual/parts/01_alternatives.txt +2 -1
- data/doc/manual/parts/02_services.txt +33 -0
- data/doc/manual/parts/logging_logfactory.txt +9 -0
- data/doc/manual/parts/models_models.txt +4 -0
- data/doc/manual/parts/models_pipelines.txt +1 -0
- data/lib/needle/container.rb +64 -19
- data/lib/needle/definition-context.rb +34 -6
- data/lib/needle/lifecycle/multiton.rb +64 -0
- data/lib/needle/lifecycle/singleton.rb +2 -2
- data/lib/needle/lifecycle/threaded.rb +4 -3
- data/lib/needle/pipeline/collection.rb +10 -1
- data/lib/needle/pipeline/element.rb +6 -0
- data/lib/needle/registry.rb +18 -5
- data/lib/needle/service-point.rb +21 -10
- data/lib/needle/version.rb +1 -1
- data/test/lifecycle/tc_multiton.rb +43 -0
- data/test/lifecycle/tc_singleton.rb +18 -2
- data/test/lifecycle/tc_threaded.rb +12 -6
- data/test/pipeline/tc_collection.rb +26 -2
- data/test/services.rb +8 -0
- data/test/tc_container.rb +82 -0
- data/test/tc_definition_context.rb +63 -7
- data/test/tc_registry.rb +13 -1
- data/test/tc_service_point.rb +49 -0
- metadata +4 -2
@@ -24,10 +24,22 @@ class TC_DefinitionContext < Test::Unit::TestCase
|
|
24
24
|
|
25
25
|
class MockContainer
|
26
26
|
attr_reader :events
|
27
|
-
|
27
|
+
attr_reader :defaults
|
28
|
+
def initialize; @events = []; @defaults = Hash.new; end
|
28
29
|
def method_missing(s,*a,&b)
|
29
30
|
@events << { :name => s, :args => a, :block => b }
|
30
31
|
end
|
32
|
+
def use!( opts )
|
33
|
+
orig = @defaults
|
34
|
+
@defaults = opts
|
35
|
+
|
36
|
+
if block_given?
|
37
|
+
yield self
|
38
|
+
@defaults = orig
|
39
|
+
end
|
40
|
+
|
41
|
+
orig
|
42
|
+
end
|
31
43
|
end
|
32
44
|
|
33
45
|
def setup
|
@@ -44,17 +56,17 @@ class TC_DefinitionContext < Test::Unit::TestCase
|
|
44
56
|
assert_not_nil @container.events[0][:block]
|
45
57
|
end
|
46
58
|
|
47
|
-
def
|
48
|
-
|
49
|
-
|
50
|
-
|
59
|
+
def test_reference_missing_parameterized
|
60
|
+
@ctx.hello( :arg )
|
61
|
+
assert_equal( { :name => :get, :args => [ :hello, :arg ], :block => nil },
|
62
|
+
@container.events[0] )
|
51
63
|
end
|
52
64
|
|
53
|
-
def
|
65
|
+
def test_reference_missing_empty
|
54
66
|
assert_nothing_raised do
|
55
67
|
@ctx.hello
|
56
68
|
end
|
57
|
-
assert_equal :
|
69
|
+
assert_equal :get, @container.events[0][:name]
|
58
70
|
assert_equal [ :hello ], @container.events[0][:args]
|
59
71
|
assert_nil @container.events[0][:block]
|
60
72
|
end
|
@@ -72,4 +84,48 @@ class TC_DefinitionContext < Test::Unit::TestCase
|
|
72
84
|
assert_equal @container, @ctx.this_container
|
73
85
|
end
|
74
86
|
|
87
|
+
def test_use_bang_without_block
|
88
|
+
@ctx.use! :foo => :bar
|
89
|
+
assert_equal :bar, @container.defaults[:foo]
|
90
|
+
@ctx.use! :blah => :baz
|
91
|
+
assert_equal :baz, @container.defaults[:blah]
|
92
|
+
assert_nil @container.defaults[:foo]
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_use_bang_with_block
|
96
|
+
@ctx.use! :foo => :bar do |r|
|
97
|
+
assert_equal r.object_id, @ctx.object_id
|
98
|
+
assert_equal :bar, @container.defaults[:foo]
|
99
|
+
@ctx.use! :blah => :baz do
|
100
|
+
assert_nil @container.defaults[:foo]
|
101
|
+
assert_equal :baz, @container.defaults[:blah]
|
102
|
+
end
|
103
|
+
assert_nil @container.defaults[:blah]
|
104
|
+
assert_equal :bar, @container.defaults[:foo]
|
105
|
+
end
|
106
|
+
assert_nil @container.defaults[:foo]
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_use_without_block
|
110
|
+
@ctx.use :foo => :bar
|
111
|
+
assert_equal :bar, @container.defaults[:foo]
|
112
|
+
@ctx.use :blah => :baz
|
113
|
+
assert_equal :baz, @container.defaults[:blah]
|
114
|
+
assert_equal :bar, @container.defaults[:foo]
|
115
|
+
end
|
116
|
+
|
117
|
+
def test_use_with_block
|
118
|
+
@ctx.use :foo => :bar do |r|
|
119
|
+
assert_equal r.object_id, @ctx.object_id
|
120
|
+
assert_equal :bar, @container.defaults[:foo]
|
121
|
+
@ctx.use :blah => :baz do
|
122
|
+
assert_equal :bar, @container.defaults[:foo]
|
123
|
+
assert_equal :baz, @container.defaults[:blah]
|
124
|
+
end
|
125
|
+
assert_nil @container.defaults[:blah]
|
126
|
+
assert_equal :bar, @container.defaults[:foo]
|
127
|
+
end
|
128
|
+
assert_nil @container.defaults[:foo]
|
129
|
+
end
|
130
|
+
|
75
131
|
end
|
data/test/tc_registry.rb
CHANGED
@@ -28,7 +28,7 @@ class TC_Registry < Test::Unit::TestCase
|
|
28
28
|
def test_bootstrap
|
29
29
|
assert_respond_to @registry, :service_models
|
30
30
|
assert_instance_of Hash, @registry.service_models
|
31
|
-
assert_equal
|
31
|
+
assert_equal 16, @registry.service_models.length
|
32
32
|
end
|
33
33
|
|
34
34
|
def test_define_no_options
|
@@ -109,4 +109,16 @@ class TC_Registry < Test::Unit::TestCase
|
|
109
109
|
assert !inner.has_key?( :pipeline_elements )
|
110
110
|
end
|
111
111
|
|
112
|
+
def test_parameterized_service
|
113
|
+
reg = Needle::Registry.define do |b|
|
114
|
+
b.require 'services', "A::B::C", :register_parameterized_services
|
115
|
+
end
|
116
|
+
|
117
|
+
assert_raise( ArgumentError ) do
|
118
|
+
reg.baz1 "a", :b, 3
|
119
|
+
end
|
120
|
+
|
121
|
+
assert_equal "a:b:3", reg.baz2( "a", :b, 3 )
|
122
|
+
end
|
123
|
+
|
112
124
|
end
|
data/test/tc_service_point.rb
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
|
17
17
|
$:.unshift "../lib"
|
18
18
|
|
19
|
+
require 'needle'
|
19
20
|
require 'needle/interceptor'
|
20
21
|
require 'needle/pipeline/interceptor'
|
21
22
|
require 'needle/service-point'
|
@@ -39,13 +40,26 @@ class TC_ServicePoint < Test::Unit::TestCase
|
|
39
40
|
def <=>( item )
|
40
41
|
priority <=> item.priority
|
41
42
|
end
|
43
|
+
def reset!
|
44
|
+
end
|
42
45
|
end
|
43
46
|
|
44
47
|
class Container
|
48
|
+
def initialize( descended=true )
|
49
|
+
@descended = descended
|
50
|
+
end
|
51
|
+
|
45
52
|
def root
|
46
53
|
self
|
47
54
|
end
|
48
55
|
|
56
|
+
def non_public_services_exist?
|
57
|
+
true
|
58
|
+
end
|
59
|
+
|
60
|
+
def non_public_services_exist=( flag )
|
61
|
+
end
|
62
|
+
|
49
63
|
def []( name )
|
50
64
|
case name
|
51
65
|
when :service_models
|
@@ -58,6 +72,10 @@ class TC_ServicePoint < Test::Unit::TestCase
|
|
58
72
|
def fullname
|
59
73
|
"container"
|
60
74
|
end
|
75
|
+
|
76
|
+
def descended_from?( c )
|
77
|
+
@descended
|
78
|
+
end
|
61
79
|
end
|
62
80
|
|
63
81
|
class Interceptor
|
@@ -142,4 +160,35 @@ class TC_ServicePoint < Test::Unit::TestCase
|
|
142
160
|
assert_instance_of Needle::InterceptorChainBuilder::InterceptedServiceProxy, inst
|
143
161
|
end
|
144
162
|
|
163
|
+
def test_interceptor_after_instance
|
164
|
+
reg = Needle::Registry.new
|
165
|
+
reg.define.foo { "hello" }
|
166
|
+
|
167
|
+
events = []
|
168
|
+
reg.intercept( :foo ).doing do |ch,ctx|
|
169
|
+
events << "first"
|
170
|
+
ch.process_next ctx
|
171
|
+
end
|
172
|
+
reg.intercept( :foo ).doing do |ch,ctx|
|
173
|
+
events << "second"
|
174
|
+
ch.process_next ctx
|
175
|
+
end
|
176
|
+
|
177
|
+
obj1 = reg.foo
|
178
|
+
obj1.length
|
179
|
+
assert_equal [ "first", "second" ], events
|
180
|
+
|
181
|
+
events = []
|
182
|
+
reg.intercept( :foo ).doing do |ch,ctx|
|
183
|
+
events << "third"
|
184
|
+
ch.process_next ctx
|
185
|
+
end
|
186
|
+
|
187
|
+
obj2 = reg.foo
|
188
|
+
obj2.length
|
189
|
+
assert_equal [ "first", "second", "third" ], events
|
190
|
+
|
191
|
+
assert_not_same obj1, obj2
|
192
|
+
end
|
193
|
+
|
145
194
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.1
|
|
3
3
|
specification_version: 1
|
4
4
|
name: needle
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.
|
7
|
-
date: 2004-11-
|
6
|
+
version: 1.2.0
|
7
|
+
date: 2004-11-18
|
8
8
|
summary: Needle is a Dependency Injection/Inversion of Control container for Ruby. It supports both type-2 (setter) and type-3 (constructor) injection. It takes advantage of the dynamic nature of Ruby to provide a rich and flexible approach to injecting dependencies.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -112,6 +112,7 @@ files:
|
|
112
112
|
- lib/needle/pipeline/interceptor.rb
|
113
113
|
- lib/needle/pipeline/collection.rb
|
114
114
|
- lib/needle/pipeline/element.rb
|
115
|
+
- lib/needle/lifecycle/multiton.rb
|
115
116
|
- lib/needle/lifecycle/singleton.rb
|
116
117
|
- lib/needle/lifecycle/deferred.rb
|
117
118
|
- lib/needle/lifecycle/initialize.rb
|
@@ -134,6 +135,7 @@ files:
|
|
134
135
|
- test/lifecycle/tc_singleton.rb
|
135
136
|
- test/lifecycle/tc_threaded.rb
|
136
137
|
- test/lifecycle/tc_initialize.rb
|
138
|
+
- test/lifecycle/tc_multiton.rb
|
137
139
|
- test/lifecycle/tc_deferred.rb
|
138
140
|
- test/lifecycle/tc_proxy.rb
|
139
141
|
- test/models/tc_singleton_deferred_initialize.rb
|