needle 0.5.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.
Files changed (60) hide show
  1. data/doc/LICENSE-BSD +27 -0
  2. data/doc/LICENSE-GPL +280 -0
  3. data/doc/LICENSE-RUBY +56 -0
  4. data/doc/README +70 -0
  5. data/doc/manual/chapter.erb +18 -0
  6. data/doc/manual/index.erb +29 -0
  7. data/doc/manual/manual.css +192 -0
  8. data/doc/manual/manual.rb +240 -0
  9. data/doc/manual/manual.yml +48 -0
  10. data/doc/manual/page.erb +86 -0
  11. data/doc/manual/parts/01_license.txt +5 -0
  12. data/doc/manual/parts/01_support.txt +1 -0
  13. data/doc/manual/parts/01_use_cases.txt +141 -0
  14. data/doc/manual/parts/01_what_is_needle.txt +1 -0
  15. data/doc/manual/parts/02_creating.txt +9 -0
  16. data/doc/manual/parts/02_namespaces.txt +47 -0
  17. data/doc/manual/parts/02_overview.txt +3 -0
  18. data/doc/manual/parts/02_services.txt +44 -0
  19. data/doc/manual/tutorial.erb +30 -0
  20. data/doc/manual-html/chapter-1.html +354 -0
  21. data/doc/manual-html/chapter-2.html +310 -0
  22. data/doc/manual-html/chapter-3.html +154 -0
  23. data/doc/manual-html/chapter-4.html +154 -0
  24. data/doc/manual-html/chapter-5.html +154 -0
  25. data/doc/manual-html/chapter-6.html +154 -0
  26. data/doc/manual-html/chapter-7.html +154 -0
  27. data/doc/manual-html/index.html +177 -0
  28. data/doc/manual-html/manual.css +192 -0
  29. data/lib/needle/container.rb +318 -0
  30. data/lib/needle/errors.rb +32 -0
  31. data/lib/needle/include-exclude.rb +116 -0
  32. data/lib/needle/interceptor-chain.rb +162 -0
  33. data/lib/needle/interceptor.rb +189 -0
  34. data/lib/needle/log-factory.rb +207 -0
  35. data/lib/needle/logger.rb +161 -0
  36. data/lib/needle/logging-interceptor.rb +62 -0
  37. data/lib/needle/models/prototype-deferred.rb +41 -0
  38. data/lib/needle/models/prototype.rb +39 -0
  39. data/lib/needle/models/proxy.rb +84 -0
  40. data/lib/needle/models/singleton-deferred.rb +57 -0
  41. data/lib/needle/models/singleton.rb +56 -0
  42. data/lib/needle/models.rb +44 -0
  43. data/lib/needle/registry.rb +110 -0
  44. data/lib/needle/service-point.rb +109 -0
  45. data/lib/needle/version.rb +28 -0
  46. data/lib/needle.rb +54 -0
  47. data/test/ALL-TESTS.rb +21 -0
  48. data/test/models/tc_prototype.rb +53 -0
  49. data/test/models/tc_prototype_deferred.rb +54 -0
  50. data/test/models/tc_proxy.rb +51 -0
  51. data/test/models/tc_singleton.rb +53 -0
  52. data/test/models/tc_singleton_deferred.rb +54 -0
  53. data/test/tc_container.rb +246 -0
  54. data/test/tc_interceptor.rb +92 -0
  55. data/test/tc_interceptor_chain.rb +181 -0
  56. data/test/tc_logger.rb +181 -0
  57. data/test/tc_models.rb +44 -0
  58. data/test/tc_registry.rb +34 -0
  59. data/test/tc_service_point.rb +100 -0
  60. metadata +107 -0
data/test/tc_logger.rb ADDED
@@ -0,0 +1,181 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # This source file is distributed as part of the Needle dependency injection
7
+ # library for Ruby. This file (and the library as a whole) may be used only as
8
+ # allowed by either the BSD license, or the Ruby license (or, by association
9
+ # with the Ruby license, the GPL). See the "doc" subdirectory of the Needle
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # needle website : http://needle.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/needle
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../lib"
18
+
19
+ require 'needle/log-factory'
20
+ require 'test/unit'
21
+ require 'stringio'
22
+
23
+ class TC_Logger < Test::Unit::TestCase
24
+
25
+ class MockLogIO
26
+ attr_reader :message
27
+
28
+ def initialize
29
+ clear
30
+ end
31
+
32
+ def write( message )
33
+ @message << message << "\n"
34
+ end
35
+
36
+ def clear
37
+ @message = ""
38
+ end
39
+
40
+ def close
41
+ @message = "<closed>"
42
+ end
43
+ end
44
+
45
+ def test_log_filename
46
+ factory = Needle::LogFactory.new
47
+ assert_equal Needle::LogFactory::DEFAULT_LOG_FILENAME,
48
+ factory.device.filename
49
+ factory.close
50
+ assert factory.closed?
51
+
52
+ factory = Needle::LogFactory.new :filename => './sample.log'
53
+ assert_equal "./sample.log", factory.device.filename
54
+ factory.close
55
+
56
+ factory = Needle::LogFactory.new :device => STDOUT
57
+ assert_equal STDOUT, factory.device
58
+ factory.close
59
+
60
+ assert !STDOUT.closed?
61
+ end
62
+
63
+ def test_log_options
64
+ factory = Needle::LogFactory.new :default_date_format => "%Y",
65
+ :default_level => Logger::FATAL
66
+ assert_equal "%Y", factory.default_date_format
67
+ assert_equal Logger::FATAL, factory.default_level
68
+ factory.close
69
+ end
70
+
71
+ def test_log_get
72
+ factory = Needle::LogFactory.new
73
+
74
+ log1a = factory.get( "test.log1" )
75
+ log2 = factory.get( "test.log2" )
76
+ log1b = factory.get( "test.log1" )
77
+
78
+ assert_equal log1a.object_id, log1b.object_id
79
+ assert_not_equal log1a.object_id, log2.object_id
80
+
81
+ factory.close
82
+ end
83
+
84
+ def test_log_write
85
+ io = MockLogIO.new
86
+ factory = Needle::LogFactory.new(
87
+ :device => io,
88
+ :levels => {
89
+ "test.*" => :INFO
90
+ } )
91
+
92
+ log = factory.get( "test.log1" )
93
+
94
+ # the factory has DEBUG turned off...
95
+ log.debug "test"
96
+ assert_equal "", io.message
97
+
98
+ log.info "test"
99
+ assert_match( /\[INFO \] .* -- test.log1: test/, io.message )
100
+
101
+ factory.close
102
+ assert_equal "<closed>", io.message
103
+ end
104
+
105
+ def test_levels
106
+ io = MockLogIO.new
107
+ factory = Needle::LogFactory.new :device => io,
108
+ :levels => {
109
+ "level.*" => :WARN,
110
+ "level.test.*" => :DEBUG
111
+ }
112
+
113
+ log = factory.get( "level.log1" )
114
+
115
+ log.info "test"
116
+ assert_equal "", io.message
117
+
118
+ log = factory.get( "level.test.log1" )
119
+
120
+ log.debug "test"
121
+ assert_match( /\[DEBUG\] .* -- level.test.log1: test/, io.message )
122
+
123
+ factory.close
124
+ end
125
+
126
+ def test_message_format
127
+ io = MockLogIO.new
128
+ factory = Needle::LogFactory.new :device => io,
129
+ :default_message_format => "%c %C [%-5p] %F %m %M %t %% %$"
130
+
131
+ log = factory.get( "message.log1" )
132
+ log.info "test"
133
+ assert_match(
134
+ /log1 message.log1 \[INFO \] \S*tc_logger.rb test test_message_format #{Thread.current.__id__} % #{$$}\n/,
135
+ io.message
136
+ )
137
+ end
138
+
139
+ def test_logger_write_to
140
+ io = StringIO.new
141
+ io2 = StringIO.new
142
+
143
+ factory = Needle::LogFactory.new :device => io,
144
+ :default_message_format => "%m"
145
+
146
+ log = factory.get( "test.write-to" )
147
+ log.info "test"
148
+ log.info "another"
149
+ assert_match( /\Atest\nanother/, io.string )
150
+
151
+ log.write_to io2
152
+ log.info "howdy"
153
+ assert_match( /\Atest/, io.string )
154
+ assert_match( /\Ahowdy/, io2.string )
155
+ end
156
+
157
+ def test_log_factory_write_to
158
+ io = StringIO.new
159
+ io2 = StringIO.new
160
+
161
+ factory = Needle::LogFactory.new :device => io,
162
+ :default_message_format => "%m"
163
+
164
+ log1 = factory.get( "test.write-to" )
165
+ log2 = factory.get( "test.write-to2" )
166
+
167
+ log1.info "test"
168
+ log2.info "another"
169
+
170
+ assert_match( /\Atest\nanother/, io.string )
171
+
172
+ factory.write_to io2
173
+ assert io.closed?
174
+
175
+ log1.info "howdy"
176
+ log2.info "world"
177
+
178
+ assert_match( /\Ahowdy\nworld/, io2.string )
179
+ end
180
+
181
+ end
data/test/tc_models.rb ADDED
@@ -0,0 +1,44 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # This source file is distributed as part of the Needle dependency injection
7
+ # library for Ruby. This file (and the library as a whole) may be used only as
8
+ # allowed by either the BSD license, or the Ruby license (or, by association
9
+ # with the Ruby license, the GPL). See the "doc" subdirectory of the Needle
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # needle website : http://needle.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/needle
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../lib"
18
+
19
+ require 'needle/models'
20
+ require 'test/unit'
21
+
22
+ class TC_Models < Test::Unit::TestCase
23
+
24
+ class Registry < Hash
25
+ def register( name, opts={}, &callback )
26
+ self[name] = callback.call( self )
27
+ end
28
+ end
29
+
30
+ def test_register
31
+ registry = Registry.new
32
+
33
+ Needle::Models.register( registry )
34
+ assert_equal 1, registry.length
35
+ assert registry.has_key?( :service_models )
36
+
37
+ models = registry[:service_models]
38
+
39
+ assert_equal 4, models.length
40
+ assert_equal [:prototype, :prototype_deferred, :singleton, :singleton_deferred],
41
+ models.keys.sort {|a,b| a.to_s <=> b.to_s}
42
+ end
43
+
44
+ end
@@ -0,0 +1,34 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # This source file is distributed as part of the Needle dependency injection
7
+ # library for Ruby. This file (and the library as a whole) may be used only as
8
+ # allowed by either the BSD license, or the Ruby license (or, by association
9
+ # with the Ruby license, the GPL). See the "doc" subdirectory of the Needle
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # needle website : http://needle.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/needle
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../lib"
18
+
19
+ require 'needle/registry'
20
+ require 'test/unit'
21
+
22
+ class TC_Registry < Test::Unit::TestCase
23
+
24
+ def setup
25
+ @registry = Needle::Registry.new
26
+ end
27
+
28
+ def test_bootstrap
29
+ assert_respond_to @registry, :service_models
30
+ assert_instance_of Hash, @registry.service_models
31
+ assert_equal 4, @registry.service_models.length
32
+ end
33
+
34
+ end
@@ -0,0 +1,100 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # This source file is distributed as part of the Needle dependency injection
7
+ # library for Ruby. This file (and the library as a whole) may be used only as
8
+ # allowed by either the BSD license, or the Ruby license (or, by association
9
+ # with the Ruby license, the GPL). See the "doc" subdirectory of the Needle
10
+ # distribution for the texts of these licenses.
11
+ # -----------------------------------------------------------------------------
12
+ # needle website : http://needle.rubyforge.org
13
+ # project website: http://rubyforge.org/projects/needle
14
+ # =============================================================================
15
+ #++
16
+
17
+ $:.unshift "../lib"
18
+
19
+ require 'needle/interceptor'
20
+ require 'needle/service-point'
21
+ require 'test/unit'
22
+
23
+ class TC_ServicePoint < Test::Unit::TestCase
24
+
25
+ class Model
26
+ def initialize(container,opts={},&callback)
27
+ @callback = callback
28
+ end
29
+ def instance
30
+ @callback.call
31
+ end
32
+ end
33
+
34
+ class Container
35
+ def root
36
+ self
37
+ end
38
+
39
+ def service_models
40
+ { :mock => Model }
41
+ end
42
+
43
+ def fullname
44
+ "container"
45
+ end
46
+ end
47
+
48
+ class Interceptor
49
+ def initialize( point, opts )
50
+ end
51
+ def process( chain, context )
52
+ chain.process_next( context )
53
+ end
54
+ end
55
+
56
+ def setup
57
+ @container = Container.new
58
+ end
59
+
60
+ def test_initialize
61
+ point = nil
62
+
63
+ assert_nothing_raised do
64
+ point =
65
+ Needle::ServicePoint.new( @container, "test", :model => :mock ) {
66
+ Hash.new }
67
+ end
68
+
69
+ assert_equal "test", point.name
70
+ assert_equal "container.test", point.fullname
71
+
72
+ assert_nothing_raised do
73
+ point =
74
+ Needle::ServicePoint.new( @container, "test", :model => Model ) {
75
+ Hash.new }
76
+ end
77
+ end
78
+
79
+ def test_instance
80
+ point =
81
+ Needle::ServicePoint.new( @container, "test", :model => :mock ) {
82
+ Hash.new }
83
+
84
+ inst = point.instance
85
+ assert_instance_of Hash, inst
86
+ end
87
+
88
+ def test_interceptor
89
+ point =
90
+ Needle::ServicePoint.new( @container, "test", :model => :mock ) {
91
+ Hash.new }
92
+
93
+ interceptor = Needle::Interceptor.new.with { Interceptor }
94
+ point.interceptor interceptor
95
+
96
+ inst = point.instance
97
+ assert_instance_of Needle::InterceptorChainBuilder::InterceptedServiceProxy, inst
98
+ end
99
+
100
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.1
3
+ specification_version: 1
4
+ name: needle
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.5.0
7
+ date: 2004-10-14
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
+ require_paths:
10
+ - lib
11
+ author: Jamis Buck
12
+ email: jgb3@email.byu.edu
13
+ homepage: http://needle.rubyforge.org
14
+ rubyforge_project:
15
+ description:
16
+ autorequire: needle
17
+ default_executable:
18
+ bindir: bin
19
+ has_rdoc: true
20
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
21
+ requirements:
22
+ -
23
+ - ">"
24
+ - !ruby/object:Gem::Version
25
+ version: 0.0.0
26
+ version:
27
+ platform: ruby
28
+ files:
29
+ - doc/README
30
+ - doc/LICENSE-RUBY
31
+ - doc/manual-html
32
+ - doc/LICENSE-BSD
33
+ - doc/LICENSE-GPL
34
+ - doc/manual
35
+ - doc/manual-html/manual.css
36
+ - doc/manual-html/chapter-1.html
37
+ - doc/manual-html/chapter-2.html
38
+ - doc/manual-html/chapter-3.html
39
+ - doc/manual-html/chapter-4.html
40
+ - doc/manual-html/chapter-5.html
41
+ - doc/manual-html/chapter-6.html
42
+ - doc/manual-html/chapter-7.html
43
+ - doc/manual-html/index.html
44
+ - doc/manual/img
45
+ - doc/manual/manual.css
46
+ - doc/manual/manual.yml
47
+ - doc/manual/tutorial.erb
48
+ - doc/manual/parts
49
+ - doc/manual/chapter.erb
50
+ - doc/manual/page.erb
51
+ - doc/manual/index.erb
52
+ - doc/manual/manual.rb
53
+ - doc/manual/parts/02_namespaces.txt
54
+ - doc/manual/parts/01_support.txt
55
+ - doc/manual/parts/02_services.txt
56
+ - doc/manual/parts/01_what_is_needle.txt
57
+ - doc/manual/parts/02_creating.txt
58
+ - doc/manual/parts/01_license.txt
59
+ - doc/manual/parts/01_use_cases.txt
60
+ - doc/manual/parts/02_overview.txt
61
+ - lib/needle.rb
62
+ - lib/needle
63
+ - lib/needle/interceptor.rb
64
+ - lib/needle/service-point.rb
65
+ - lib/needle/logger.rb
66
+ - lib/needle/models.rb
67
+ - lib/needle/registry.rb
68
+ - lib/needle/interceptor-chain.rb
69
+ - lib/needle/models
70
+ - lib/needle/include-exclude.rb
71
+ - lib/needle/container.rb
72
+ - lib/needle/logging-interceptor.rb
73
+ - lib/needle/version.rb
74
+ - lib/needle/log-factory.rb
75
+ - lib/needle/errors.rb
76
+ - lib/needle/models/prototype.rb
77
+ - lib/needle/models/singleton.rb
78
+ - lib/needle/models/singleton-deferred.rb
79
+ - lib/needle/models/prototype-deferred.rb
80
+ - lib/needle/models/proxy.rb
81
+ - test/tc_service_point.rb
82
+ - test/tc_registry.rb
83
+ - test/tc_interceptor.rb
84
+ - test/ALL-TESTS.rb
85
+ - test/models
86
+ - test/tc_interceptor_chain.rb
87
+ - test/tc_logger.rb
88
+ - test/tc_models.rb
89
+ - test/tc_container.rb
90
+ - test/models/tc_prototype.rb
91
+ - test/models/tc_singleton.rb
92
+ - test/models/tc_singleton_deferred.rb
93
+ - test/models/tc_prototype_deferred.rb
94
+ - test/models/tc_proxy.rb
95
+ test_files:
96
+ - test/ALL-TESTS.rb
97
+ rdoc_options:
98
+ - "--title"
99
+ - "Needle -- Dependency Injection for Ruby"
100
+ - "--main"
101
+ - doc/README
102
+ extra_rdoc_files:
103
+ - doc/README
104
+ executables: []
105
+ extensions: []
106
+ requirements: []
107
+ dependencies: []