copland 0.8.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 (184) hide show
  1. data/doc/README +88 -0
  2. data/doc/manual-html/chapter-1.html +454 -0
  3. data/doc/manual-html/chapter-10.html +399 -0
  4. data/doc/manual-html/chapter-11.html +600 -0
  5. data/doc/manual-html/chapter-12.html +406 -0
  6. data/doc/manual-html/chapter-2.html +382 -0
  7. data/doc/manual-html/chapter-3.html +424 -0
  8. data/doc/manual-html/chapter-4.html +432 -0
  9. data/doc/manual-html/chapter-5.html +381 -0
  10. data/doc/manual-html/chapter-6.html +364 -0
  11. data/doc/manual-html/chapter-7.html +434 -0
  12. data/doc/manual-html/chapter-8.html +373 -0
  13. data/doc/manual-html/chapter-9.html +324 -0
  14. data/doc/manual-html/copland.png +0 -0
  15. data/doc/manual-html/index.html +331 -0
  16. data/doc/manual-html/manual.css +179 -0
  17. data/doc/manual-html/tutorial-1.html +407 -0
  18. data/doc/manual-html/tutorial-2.html +451 -0
  19. data/doc/manual-html/tutorial-3.html +484 -0
  20. data/doc/manual-html/tutorial-4.html +446 -0
  21. data/doc/manual-html/tutorial-5.html +520 -0
  22. data/doc/manual/chapter.erb +18 -0
  23. data/doc/manual/example.erb +18 -0
  24. data/doc/manual/img/copland.png +0 -0
  25. data/doc/manual/index.erb +30 -0
  26. data/doc/manual/manual.css +179 -0
  27. data/doc/manual/manual.rb +239 -0
  28. data/doc/manual/manual.yml +2643 -0
  29. data/doc/manual/page.erb +102 -0
  30. data/doc/manual/tutorial.erb +30 -0
  31. data/doc/packages/copland.html +764 -0
  32. data/doc/packages/copland.lib.html +439 -0
  33. data/doc/packages/copland.remote.html +2096 -0
  34. data/doc/packages/copland.webrick.html +925 -0
  35. data/doc/packages/index.html +49 -0
  36. data/doc/packages/packrat.css +125 -0
  37. data/examples/calc/calc.rb +47 -0
  38. data/examples/calc/package.yml +35 -0
  39. data/examples/calc/services.rb +74 -0
  40. data/examples/solitaire-cipher/README +11 -0
  41. data/examples/solitaire-cipher/Rakefile +57 -0
  42. data/examples/solitaire-cipher/bin/main.rb +14 -0
  43. data/examples/solitaire-cipher/lib/cipher.rb +230 -0
  44. data/examples/solitaire-cipher/lib/cli.rb +24 -0
  45. data/examples/solitaire-cipher/lib/package.yml +106 -0
  46. data/examples/solitaire-cipher/test/tc_deck.rb +30 -0
  47. data/examples/solitaire-cipher/test/tc_key-stream.rb +19 -0
  48. data/examples/solitaire-cipher/test/tc_keying-algorithms.rb +31 -0
  49. data/examples/solitaire-cipher/test/tc_solitaire-cipher.rb +66 -0
  50. data/examples/solitaire-cipher/test/tc_unkeyed-algorithm.rb +17 -0
  51. data/examples/solitaire-cipher/test/tests.rb +2 -0
  52. data/lib/copland.rb +56 -0
  53. data/lib/copland/class-factory.rb +95 -0
  54. data/lib/copland/configuration-point.rb +38 -0
  55. data/lib/copland/configuration-point/common.rb +203 -0
  56. data/lib/copland/configuration-point/errors.rb +44 -0
  57. data/lib/copland/configuration-point/list.rb +59 -0
  58. data/lib/copland/configuration-point/map.rb +59 -0
  59. data/lib/copland/configuration/errors.rb +43 -0
  60. data/lib/copland/configuration/loader.rb +113 -0
  61. data/lib/copland/configuration/yaml/configuration-point.rb +87 -0
  62. data/lib/copland/configuration/yaml/implementor.rb +134 -0
  63. data/lib/copland/configuration/yaml/interceptor.rb +63 -0
  64. data/lib/copland/configuration/yaml/listener.rb +56 -0
  65. data/lib/copland/configuration/yaml/loader.rb +122 -0
  66. data/lib/copland/configuration/yaml/package.rb +125 -0
  67. data/lib/copland/configuration/yaml/parser.rb +71 -0
  68. data/lib/copland/configuration/yaml/schema.rb +165 -0
  69. data/lib/copland/configuration/yaml/service-point.rb +116 -0
  70. data/lib/copland/configuration/yaml/utils.rb +82 -0
  71. data/lib/copland/default-schema-processor.rb +144 -0
  72. data/lib/copland/errors.rb +82 -0
  73. data/lib/copland/event-producer.rb +95 -0
  74. data/lib/copland/impl/builder-factory.rb +112 -0
  75. data/lib/copland/impl/copland-config.yml +1 -0
  76. data/lib/copland/impl/include-exclude.rb +140 -0
  77. data/lib/copland/impl/logging-interceptor.rb +106 -0
  78. data/lib/copland/impl/package.yml +217 -0
  79. data/lib/copland/impl/startup.rb +116 -0
  80. data/lib/copland/impl/symbol-source-manager.rb +131 -0
  81. data/lib/copland/impl/symbol-source.rb +63 -0
  82. data/lib/copland/instantiator.rb +38 -0
  83. data/lib/copland/instantiator/abstract.rb +91 -0
  84. data/lib/copland/instantiator/complex.rb +96 -0
  85. data/lib/copland/instantiator/identity.rb +58 -0
  86. data/lib/copland/instantiator/simple.rb +68 -0
  87. data/lib/copland/interceptor-chain.rb +166 -0
  88. data/lib/copland/interceptor.rb +139 -0
  89. data/lib/copland/log-factory.rb +206 -0
  90. data/lib/copland/models.rb +39 -0
  91. data/lib/copland/models/abstract.rb +78 -0
  92. data/lib/copland/models/prototype-deferred.rb +58 -0
  93. data/lib/copland/models/prototype.rb +58 -0
  94. data/lib/copland/models/proxy.rb +100 -0
  95. data/lib/copland/models/singleton-deferred.rb +59 -0
  96. data/lib/copland/models/singleton.rb +77 -0
  97. data/lib/copland/models/threaded.rb +65 -0
  98. data/lib/copland/ordering.rb +123 -0
  99. data/lib/copland/package.rb +246 -0
  100. data/lib/copland/registry.rb +368 -0
  101. data/lib/copland/schema.rb +206 -0
  102. data/lib/copland/service-point.rb +282 -0
  103. data/lib/copland/utils.rb +221 -0
  104. data/lib/copland/version.rb +47 -0
  105. data/test/conf-test/list-bad-key.yml +30 -0
  106. data/test/conf-test/list-bad-missing.yml +28 -0
  107. data/test/conf-test/list-bad-type.yml +28 -0
  108. data/test/conf-test/list-good.yml +29 -0
  109. data/test/conf-test/map-bad-key.yml +25 -0
  110. data/test/conf-test/map-bad-missing.yml +24 -0
  111. data/test/conf-test/map-bad-type.yml +23 -0
  112. data/test/conf-test/map-good.yml +25 -0
  113. data/test/configuration-point/package.yml +52 -0
  114. data/test/configuration/yaml/config/copland-config.yml +2 -0
  115. data/test/configuration/yaml/config/module.yml +2 -0
  116. data/test/configuration/yaml/config/subdir/copland-config.yml +2 -0
  117. data/test/configuration/yaml/config/subdir/package.yml +4 -0
  118. data/test/configuration/yaml/defaults/package.yml +5 -0
  119. data/test/configuration/yaml/defaults/subdir/package.yml +4 -0
  120. data/test/configuration/yaml/tc_config-loader.rb +86 -0
  121. data/test/configuration/yaml/tc_configuration-point-processor.rb +134 -0
  122. data/test/configuration/yaml/tc_implementor-processor.rb +104 -0
  123. data/test/configuration/yaml/tc_interceptor-processor.rb +85 -0
  124. data/test/configuration/yaml/tc_listener-processor.rb +69 -0
  125. data/test/configuration/yaml/tc_loader.rb +74 -0
  126. data/test/configuration/yaml/tc_package-processor.rb +120 -0
  127. data/test/configuration/yaml/tc_parser.rb +94 -0
  128. data/test/configuration/yaml/tc_schema-parser.rb +160 -0
  129. data/test/configuration/yaml/tc_service-point-processor.rb +104 -0
  130. data/test/configuration/yaml/tc_type-validator.rb +90 -0
  131. data/test/custom-logger.yml +3 -0
  132. data/test/impl/logging/package.yml +44 -0
  133. data/test/impl/logging/services.rb +84 -0
  134. data/test/impl/startup/package.yml +46 -0
  135. data/test/impl/startup/services.rb +47 -0
  136. data/test/impl/symbols/package.yml +24 -0
  137. data/test/impl/symbols/services.rb +38 -0
  138. data/test/impl/tc_builder-factory.rb +173 -0
  139. data/test/impl/tc_logging-interceptor.rb +148 -0
  140. data/test/impl/tc_startup.rb +59 -0
  141. data/test/impl/tc_symbol-sources.rb +61 -0
  142. data/test/logger.yml +6 -0
  143. data/test/mock.rb +201 -0
  144. data/test/schema/bad-package.yml +65 -0
  145. data/test/schema/package.yml +102 -0
  146. data/test/schema/services.rb +5 -0
  147. data/test/services/package.yml +79 -0
  148. data/test/services/simple.rb +87 -0
  149. data/test/tc_class-factory.rb +93 -0
  150. data/test/tc_complex-instantiator.rb +107 -0
  151. data/test/tc_configuration-point-contrib.rb +74 -0
  152. data/test/tc_configuration-point-schema.rb +122 -0
  153. data/test/tc_configuration-point.rb +91 -0
  154. data/test/tc_default-schema-processor.rb +297 -0
  155. data/test/tc_identity-instantiator.rb +61 -0
  156. data/test/tc_interceptors.rb +84 -0
  157. data/test/tc_logger.rb +131 -0
  158. data/test/tc_models.rb +176 -0
  159. data/test/tc_package.rb +165 -0
  160. data/test/tc_proxy.rb +65 -0
  161. data/test/tc_registry.rb +141 -0
  162. data/test/tc_schema.rb +78 -0
  163. data/test/tc_service-point.rb +178 -0
  164. data/test/tc_service.rb +70 -0
  165. data/test/tc_simple-instantiator.rb +61 -0
  166. data/test/tests.rb +93 -0
  167. data/tutorial/01/main.rb +7 -0
  168. data/tutorial/01/package.yml +8 -0
  169. data/tutorial/01/tutorial.rb +7 -0
  170. data/tutorial/02/main.rb +10 -0
  171. data/tutorial/02/package.yml +27 -0
  172. data/tutorial/02/tutorial.rb +46 -0
  173. data/tutorial/03/main.rb +24 -0
  174. data/tutorial/03/package.yml +29 -0
  175. data/tutorial/03/tutorial.rb +48 -0
  176. data/tutorial/04/main.rb +24 -0
  177. data/tutorial/04/package.yml +35 -0
  178. data/tutorial/04/tutorial.rb +48 -0
  179. data/tutorial/05/functions/package.yml +16 -0
  180. data/tutorial/05/functions/services.rb +15 -0
  181. data/tutorial/05/main.rb +10 -0
  182. data/tutorial/05/package.yml +35 -0
  183. data/tutorial/05/tutorial.rb +53 -0
  184. metadata +260 -0
@@ -0,0 +1,70 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # * Redistributions of source code must retain the above copyright notice,
10
+ # this list of conditions and the following disclaimer.
11
+ #
12
+ # * Redistributions in binary form must reproduce the above copyright
13
+ # notice, this list of conditions and the following disclaimer in the
14
+ # documentation and/or other materials provided with the distribution.
15
+ #
16
+ # * The names of its contributors may not be used to endorse or promote
17
+ # products derived from this software without specific prior written
18
+ # permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ # =============================================================================
32
+ #++
33
+
34
+ $:.unshift "../lib"
35
+
36
+ require 'test/unit'
37
+ require 'copland/registry'
38
+
39
+ class TC_Service < Test::Unit::TestCase
40
+
41
+ def setup
42
+ @registry = Copland::Registry.build(
43
+ File.join( File.dirname( __FILE__ ), "services" )
44
+ )
45
+ end
46
+
47
+ def test_listener
48
+ message = ""
49
+
50
+ listener = @registry.service( "service-test.Listener" )
51
+ producer = @registry.service( "service-test.Producer" )
52
+
53
+ listener.responder_callback do |msg, svc|
54
+ message = "[#{msg}] callback from #{svc.class}"
55
+ end
56
+
57
+ assert_equal "", message
58
+ producer.fire_event :custom_event
59
+ assert_equal "[custom event] callback from Producer", message
60
+
61
+ @registry.shutdown
62
+ assert_equal "[registry shutdown] callback from Copland::Registry", message
63
+ end
64
+
65
+ def test_block_initializer
66
+ svc = @registry.service( "service-test.Simple" ) { @attr1 = "test" }
67
+ assert_equal "test", svc.attr1
68
+ end
69
+
70
+ end
@@ -0,0 +1,61 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # * Redistributions of source code must retain the above copyright notice,
10
+ # this list of conditions and the following disclaimer.
11
+ #
12
+ # * Redistributions in binary form must reproduce the above copyright
13
+ # notice, this list of conditions and the following disclaimer in the
14
+ # documentation and/or other materials provided with the distribution.
15
+ #
16
+ # * The names of its contributors may not be used to endorse or promote
17
+ # products derived from this software without specific prior written
18
+ # permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ # =============================================================================
32
+ #++
33
+
34
+ $:.unshift "../lib"
35
+
36
+ require 'test/unit'
37
+ require 'copland/class-factory'
38
+ require 'copland/errors'
39
+ require 'copland/instantiator'
40
+ require 'mock'
41
+
42
+ class TC_SimpleInstantiator < Test::Unit::TestCase
43
+
44
+ def setup
45
+ @factory = Factory.new( Copland::Instantiator::POOL_NAME )
46
+ end
47
+
48
+ def test_get
49
+ assert_nothing_raised do
50
+ @factory.get( "simple", nil, "services/simple/Simple" )
51
+ end
52
+ end
53
+
54
+ def test_instantiate
55
+ inst = @factory.get( "simple", nil, "services/simple/Simple" )
56
+ svc = inst.instantiate
57
+ assert_respond_to svc, :echo
58
+ assert_equal "a", svc.echo( "a" )
59
+ end
60
+
61
+ end
@@ -0,0 +1,93 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are met:
8
+ #
9
+ # * Redistributions of source code must retain the above copyright notice,
10
+ # this list of conditions and the following disclaimer.
11
+ #
12
+ # * Redistributions in binary form must reproduce the above copyright
13
+ # notice, this list of conditions and the following disclaimer in the
14
+ # documentation and/or other materials provided with the distribution.
15
+ #
16
+ # * The names of its contributors may not be used to endorse or promote
17
+ # products derived from this software without specific prior written
18
+ # permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
+ # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24
+ # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25
+ # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26
+ # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27
+ # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28
+ # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29
+ # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30
+ # POSSIBILITY OF SUCH DAMAGE.
31
+ # =============================================================================
32
+ #++
33
+
34
+ require 'test/unit/testsuite'
35
+
36
+ Dir.chdir( File.dirname( __FILE__ ) )
37
+ Dir["**/tc_*.rb"].each { |file| load file }
38
+
39
+ class TS_AllTests
40
+ def self.suite
41
+ suite = Test::Unit::TestSuite.new( "All Copland Unit Tests" )
42
+
43
+ ObjectSpace.each_object( Class ) do |unit_test|
44
+ next unless unit_test.name =~ /^T[CS]_/ &&
45
+ unit_test.superclass == Test::Unit::TestCase
46
+ suite << unit_test.suite
47
+ end
48
+
49
+ return suite
50
+ end
51
+ end
52
+
53
+ require 'test/unit/ui/console/testrunner'
54
+ test_runner = Test::Unit::UI::Console::TestRunner
55
+
56
+ case ARGV[0]
57
+ when "GTK"
58
+ require 'test/unit/ui/gtk/testrunner'
59
+ test_runner = Test::Unit::UI::GTK::TestRunner
60
+ when "GTK2"
61
+ require 'test/unit/ui/gtk2/testrunner'
62
+ test_runner = Test::Unit::UI::GTK2::TestRunner
63
+ when "Fox"
64
+ require 'test/unit/ui/fox/testrunner'
65
+ test_runner = Test::Unit::UI::Fox::TestRunner
66
+ when "Tk"
67
+ require 'test/unit/ui/tk/testrunner'
68
+ test_runner = Test::Unit::Tk::Fox::TestRunner
69
+ end
70
+
71
+ use_reporter = ARGV.find { |arg| arg.downcase == "report" }
72
+
73
+ if use_reporter
74
+ begin
75
+ require 'test/unit/util/reporter'
76
+ rescue LoadError => l
77
+ use_reporter = false
78
+ end
79
+ end
80
+
81
+ if use_reporter
82
+ require 'fileutils'
83
+ path = File.join( File.dirname( __FILE__ ), "..", "report" )
84
+ FileUtils.mkdir_p path
85
+ Test::Unit::Util::Reporter.run( test_runner, TS_AllTests.suite, path, :html )
86
+ puts "An HTML report of these unit tests has been written to #{path}"
87
+ else
88
+ test_runner.run( TS_AllTests )
89
+ end
90
+
91
+ # delete all generated log files
92
+
93
+ Dir["**/*.log"].each { |file| File.delete( file ) }
@@ -0,0 +1,7 @@
1
+ require 'copland'
2
+
3
+ registry = Copland::Registry.build
4
+
5
+ adder = registry.service( "tutorial.Adder" )
6
+
7
+ puts adder.add( "5", 7 )
@@ -0,0 +1,8 @@
1
+ ---
2
+ id: tutorial
3
+ description: This is the package for the Copland tutorials.
4
+
5
+ service-points:
6
+
7
+ Adder:
8
+ implementor: tutorial/Adder
@@ -0,0 +1,7 @@
1
+ class Adder
2
+
3
+ def add( a, b )
4
+ a.to_f + b.to_f
5
+ end
6
+
7
+ end
@@ -0,0 +1,10 @@
1
+ require 'copland'
2
+
3
+ registry = Copland::Registry.build
4
+
5
+ calc = registry.service( "tutorial.Calculator" )
6
+
7
+ puts calc.add( "5", 7 )
8
+ puts calc.subtract( "5", 7 )
9
+ puts calc.multiply( "5", 7 )
10
+ puts calc.divide( "5", 7 )
@@ -0,0 +1,27 @@
1
+ ---
2
+ id: tutorial
3
+ description: This is the package for the Copland tutorials.
4
+
5
+ service-points:
6
+
7
+ Adder:
8
+ implementor: tutorial/Adder
9
+
10
+ Subtractor:
11
+ implementor: tutorial/Subtractor
12
+
13
+ Multiplier:
14
+ implementor: tutorial/Multiplier
15
+
16
+ Divider:
17
+ implementor: tutorial/Divider
18
+
19
+ Calculator:
20
+ implementor:
21
+ factory: copland.BuilderFactory
22
+ class: tutorial/Calculator
23
+ properties:
24
+ adder: !!service Adder
25
+ subtractor: !!service Subtractor
26
+ divider: !!service Divider
27
+ multiplier: !!service Multiplier
@@ -0,0 +1,46 @@
1
+ class Adder
2
+ def add( a, b )
3
+ a.to_f + b.to_f
4
+ end
5
+ end
6
+
7
+ class Subtractor
8
+ def subtract( a, b )
9
+ a.to_f - b.to_f
10
+ end
11
+ end
12
+
13
+ class Multiplier
14
+ def multiply( a, b )
15
+ a.to_f * b.to_f
16
+ end
17
+ end
18
+
19
+ class Divider
20
+ def divide( a, b )
21
+ a.to_f / b.to_f
22
+ end
23
+ end
24
+
25
+ class Calculator
26
+ attr_writer :adder
27
+ attr_writer :subtractor
28
+ attr_writer :multiplier
29
+ attr_writer :divider
30
+
31
+ def add( a, b )
32
+ @adder.add( a, b )
33
+ end
34
+
35
+ def subtract( a, b )
36
+ @subtractor.subtract( a, b )
37
+ end
38
+
39
+ def multiply( a, b )
40
+ @multiplier.multiply( a, b )
41
+ end
42
+
43
+ def divide( a, b )
44
+ @divider.divide( a, b )
45
+ end
46
+ end
@@ -0,0 +1,24 @@
1
+ require 'copland'
2
+
3
+ registry = Copland::Registry.build
4
+
5
+ calc1 = registry.service( "tutorial.Calculator" )
6
+ calc2 = registry.service( "tutorial.Calculator" )
7
+
8
+ puts "Multiples:"
9
+ 10.times do
10
+ puts "#{calc1.memory}\t#{calc2.memory}"
11
+ calc1.memory = calc1.add( 5 )
12
+ calc2.memory = calc2.add( 2 )
13
+ end
14
+
15
+ calc1.memory = 1.0
16
+ calc2.memory = 1.0
17
+
18
+ puts
19
+ puts "Powers:"
20
+ 10.times do
21
+ puts "#{calc1.memory}\t#{calc2.memory}"
22
+ calc1.memory = calc1.multiply( 5 )
23
+ calc2.memory = calc2.multiply( 2 )
24
+ end
@@ -0,0 +1,29 @@
1
+ ---
2
+ id: tutorial
3
+ description: This is the package for the Copland tutorials.
4
+
5
+ service-points:
6
+
7
+ Adder:
8
+ implementor: tutorial/Adder
9
+
10
+ Subtractor:
11
+ implementor: tutorial/Subtractor
12
+
13
+ Multiplier:
14
+ implementor: tutorial/Multiplier
15
+
16
+ Divider:
17
+ implementor: tutorial/Divider
18
+
19
+ Calculator:
20
+ model: prototype
21
+ implementor:
22
+ factory: copland.BuilderFactory
23
+ class: tutorial/Calculator
24
+ properties:
25
+ adder: !!service Adder
26
+ subtractor: !!service Subtractor
27
+ divider: !!service Divider
28
+ multiplier: !!service Multiplier
29
+ memory: 0
@@ -0,0 +1,48 @@
1
+ class Adder
2
+ def add( a, b )
3
+ a.to_f + b.to_f
4
+ end
5
+ end
6
+
7
+ class Subtractor
8
+ def subtract( a, b )
9
+ a.to_f - b.to_f
10
+ end
11
+ end
12
+
13
+ class Multiplier
14
+ def multiply( a, b )
15
+ a.to_f * b.to_f
16
+ end
17
+ end
18
+
19
+ class Divider
20
+ def divide( a, b )
21
+ a.to_f / b.to_f
22
+ end
23
+ end
24
+
25
+ class Calculator
26
+ attr_writer :adder
27
+ attr_writer :subtractor
28
+ attr_writer :multiplier
29
+ attr_writer :divider
30
+
31
+ attr_accessor :memory
32
+
33
+ def add( a, b=memory )
34
+ @adder.add( a, b )
35
+ end
36
+
37
+ def subtract( a, b=memory )
38
+ @subtractor.subtract( a, b )
39
+ end
40
+
41
+ def multiply( a, b=memory )
42
+ @multiplier.multiply( a, b )
43
+ end
44
+
45
+ def divide( a, b=memory )
46
+ @divider.divide( a, b )
47
+ end
48
+ end