ruby_ex 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. data/AUTHORS +51 -0
  2. data/ChangeLog +1763 -0
  3. data/NEWS +3 -0
  4. data/README +1 -0
  5. data/Rakefile +8 -0
  6. data/SPEC.dyn.yml +10 -0
  7. data/SPEC.gem.yml +269 -0
  8. data/SPEC.yml +36 -0
  9. data/src/abstract.rb +253 -0
  10. data/src/abstract_node.rb +85 -0
  11. data/src/algorithms.rb +12 -0
  12. data/src/algorithms/simulated_annealing.rb +142 -0
  13. data/src/ask.rb +100 -0
  14. data/src/attributed_class.rb +303 -0
  15. data/src/cache.rb +350 -0
  16. data/src/checkout.rb +12 -0
  17. data/src/choose.rb +271 -0
  18. data/src/commands.rb +20 -0
  19. data/src/commands/command.rb +492 -0
  20. data/src/commands/datas.rb +16 -0
  21. data/src/commands/datas/composite.rb +31 -0
  22. data/src/commands/datas/data.rb +65 -0
  23. data/src/commands/datas/factory.rb +69 -0
  24. data/src/commands/datas/temp.rb +26 -0
  25. data/src/commands/factory.rb +67 -0
  26. data/src/commands/helpers.rb +81 -0
  27. data/src/commands/pipe.rb +66 -0
  28. data/src/commands/runners.rb +16 -0
  29. data/src/commands/runners/exec.rb +50 -0
  30. data/src/commands/runners/fork.rb +130 -0
  31. data/src/commands/runners/runner.rb +140 -0
  32. data/src/commands/runners/system.rb +57 -0
  33. data/src/commands/seq.rb +32 -0
  34. data/src/config_file.rb +95 -0
  35. data/src/const_regexp.rb +57 -0
  36. data/src/daemon.rb +135 -0
  37. data/src/diff.rb +665 -0
  38. data/src/dlogger.rb +62 -0
  39. data/src/drb/drb_observable.rb +95 -0
  40. data/src/drb/drb_observable_pool.rb +27 -0
  41. data/src/drb/drb_service.rb +44 -0
  42. data/src/drb/drb_undumped_attributes.rb +56 -0
  43. data/src/drb/drb_undumped_indexed_object.rb +55 -0
  44. data/src/drb/insecure_protected_methods.rb +101 -0
  45. data/src/drb_ex.rb +12 -0
  46. data/src/dumpable_proc.rb +57 -0
  47. data/src/filetype.rb +229 -0
  48. data/src/generate_id.rb +44 -0
  49. data/src/histogram.rb +222 -0
  50. data/src/hookable.rb +283 -0
  51. data/src/hooker.rb +54 -0
  52. data/src/indexed_node.rb +65 -0
  53. data/src/io_marshal.rb +99 -0
  54. data/src/ioo.rb +193 -0
  55. data/src/labeled_node.rb +62 -0
  56. data/src/logger_observer.rb +24 -0
  57. data/src/md5sum.rb +70 -0
  58. data/src/module/autoload_tree.rb +65 -0
  59. data/src/module/hierarchy.rb +334 -0
  60. data/src/module/instance_method_visibility.rb +71 -0
  61. data/src/node.rb +81 -0
  62. data/src/object_monitor.rb +143 -0
  63. data/src/object_monitor_activity.rb +34 -0
  64. data/src/observable.rb +138 -0
  65. data/src/observable_pool.rb +291 -0
  66. data/src/orderedhash.rb +252 -0
  67. data/src/pp_hierarchy.rb +30 -0
  68. data/src/random_generators.rb +29 -0
  69. data/src/random_generators/random_generator.rb +33 -0
  70. data/src/random_generators/ruby.rb +25 -0
  71. data/src/ruby_ex.rb +124 -0
  72. data/src/safe_eval.rb +346 -0
  73. data/src/sendmail.rb +214 -0
  74. data/src/service_manager.rb +122 -0
  75. data/src/shuffle.rb +30 -0
  76. data/src/spring.rb +134 -0
  77. data/src/spring_set.rb +134 -0
  78. data/src/symtbl.rb +108 -0
  79. data/src/synflow.rb +474 -0
  80. data/src/thread_mutex.rb +11 -0
  81. data/src/timeout_ex.rb +79 -0
  82. data/src/trace.rb +26 -0
  83. data/src/uri/druby.rb +78 -0
  84. data/src/uri/file.rb +63 -0
  85. data/src/uri/ftp_ex.rb +36 -0
  86. data/src/uri/http_ex.rb +41 -0
  87. data/src/uri/pgsql.rb +136 -0
  88. data/src/uri/ssh.rb +87 -0
  89. data/src/uri/svn.rb +113 -0
  90. data/src/uri_ex.rb +71 -0
  91. data/src/verbose_object.rb +70 -0
  92. data/src/yaml/basenode_ext.rb +63 -0
  93. data/src/yaml/chop_header.rb +24 -0
  94. data/src/yaml/transform.rb +450 -0
  95. data/src/yaml/yregexpath.rb +76 -0
  96. data/test/algorithms/simulated_annealing_test.rb +102 -0
  97. data/test/check-pkg-ruby_ex.yml +15 -0
  98. data/test/check-ruby_ex.yml +12 -0
  99. data/test/resources/autoload_tree/A.rb +11 -0
  100. data/test/resources/autoload_tree/B.rb +10 -0
  101. data/test/resources/autoload_tree/foo/C.rb +18 -0
  102. data/test/resources/foo.txt +6 -0
  103. data/test/sanity-suite.yml +12 -0
  104. data/test/sanity/multiple-requires.yml +20 -0
  105. data/test/sanity/single-requires.yml +24 -0
  106. data/test/test-unit-setup.rb +6 -0
  107. data/test/unit-suite.yml +14 -0
  108. metadata +269 -0
data/NEWS ADDED
@@ -0,0 +1,3 @@
1
+ = New in 0.1, 2005-05-31:
2
+
3
+ Initial Release.
data/README ADDED
@@ -0,0 +1 @@
1
+ Coming Soon.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ # Author:: The TTK Team. -*- ruby -*-
2
+ # Copyright:: Copyright (c) 2005 TTK team. All rights reserved.
3
+ # License:: Ruby License
4
+ # Revision:: $Id$
5
+
6
+ require 'rubygems'
7
+ require_gem 'core_ex'
8
+ load 'core_ex/rakefile_base.rf'
data/SPEC.dyn.yml ADDED
@@ -0,0 +1,10 @@
1
+ --- !ruby/object:OpenStruct
2
+ table:
3
+ :date: "Fri, 03 Jun 2005"
4
+ :version_id: ''
5
+ :version: !ruby/object:Version
6
+ build: 1
7
+ major: 0
8
+ minor: 1
9
+ revision: 276
10
+ :url: svn://svn.feydakins.org/ruby_ex/trunk
data/SPEC.gem.yml ADDED
@@ -0,0 +1,269 @@
1
+ --- !ruby/object:Gem::Specification
2
+ rubygems_version: 0.8.10
3
+ specification_version: 1
4
+ name: ruby_ex
5
+ version: !ruby/object:Gem::Version
6
+ version: 0.1.1
7
+ date: 2005-06-03
8
+ summary: RubyEx contains general purpose Ruby extensions.
9
+ require_paths:
10
+ - lib
11
+ email:
12
+ - nicolas.despres@gmail.com
13
+ - ertai@feydakins.org
14
+ homepage: http://api.feydakins.org/ruby_ex
15
+ rubyforge_project: ruby_ex
16
+ description: ''
17
+ autorequire:
18
+ default_executable:
19
+ bindir: bin
20
+ has_rdoc: true
21
+ required_ruby_version: !ruby/object:Gem::Version::Requirement
22
+ requirements:
23
+ -
24
+ - ">"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.0
27
+ version:
28
+ platform: ruby
29
+ authors:
30
+ -
31
+ - Nicolas Despr�s
32
+ - Nicolas Pouillard
33
+ files:
34
+ - src/abstract.rb
35
+ - src/abstract_node.rb
36
+ - src/algorithms.rb
37
+ - src/ask.rb
38
+ - src/attributed_class.rb
39
+ - src/cache.rb
40
+ - src/checkout.rb
41
+ - src/choose.rb
42
+ - src/commands.rb
43
+ - src/config_file.rb
44
+ - src/const_regexp.rb
45
+ - src/daemon.rb
46
+ - src/diff.rb
47
+ - src/dlogger.rb
48
+ - src/drb_ex.rb
49
+ - src/dumpable_proc.rb
50
+ - src/filetype.rb
51
+ - src/generate_id.rb
52
+ - src/histogram.rb
53
+ - src/hookable.rb
54
+ - src/hooker.rb
55
+ - src/indexed_node.rb
56
+ - src/io_marshal.rb
57
+ - src/ioo.rb
58
+ - src/labeled_node.rb
59
+ - src/logger_observer.rb
60
+ - src/md5sum.rb
61
+ - src/node.rb
62
+ - src/object_monitor.rb
63
+ - src/object_monitor_activity.rb
64
+ - src/observable.rb
65
+ - src/observable_pool.rb
66
+ - src/orderedhash.rb
67
+ - src/pp_hierarchy.rb
68
+ - src/random_generators.rb
69
+ - src/ruby_ex.rb
70
+ - src/safe_eval.rb
71
+ - src/sendmail.rb
72
+ - src/service_manager.rb
73
+ - src/shuffle.rb
74
+ - src/spring.rb
75
+ - src/spring_set.rb
76
+ - src/symtbl.rb
77
+ - src/synflow.rb
78
+ - src/thread_mutex.rb
79
+ - src/timeout_ex.rb
80
+ - src/trace.rb
81
+ - src/uri_ex.rb
82
+ - src/verbose_object.rb
83
+ - src/algorithms/simulated_annealing.rb
84
+ - src/commands/command.rb
85
+ - src/commands/datas.rb
86
+ - src/commands/factory.rb
87
+ - src/commands/helpers.rb
88
+ - src/commands/pipe.rb
89
+ - src/commands/runners.rb
90
+ - src/commands/seq.rb
91
+ - src/commands/datas/composite.rb
92
+ - src/commands/datas/data.rb
93
+ - src/commands/datas/factory.rb
94
+ - src/commands/datas/temp.rb
95
+ - src/commands/runners/exec.rb
96
+ - src/commands/runners/fork.rb
97
+ - src/commands/runners/runner.rb
98
+ - src/commands/runners/system.rb
99
+ - src/drb/drb_observable.rb
100
+ - src/drb/drb_observable_pool.rb
101
+ - src/drb/drb_service.rb
102
+ - src/drb/drb_undumped_attributes.rb
103
+ - src/drb/drb_undumped_indexed_object.rb
104
+ - src/drb/insecure_protected_methods.rb
105
+ - src/module/autoload_tree.rb
106
+ - src/module/hierarchy.rb
107
+ - src/module/instance_method_visibility.rb
108
+ - src/random_generators/random_generator.rb
109
+ - src/random_generators/ruby.rb
110
+ - src/uri/druby.rb
111
+ - src/uri/file.rb
112
+ - src/uri/ftp_ex.rb
113
+ - src/uri/http_ex.rb
114
+ - src/uri/pgsql.rb
115
+ - src/uri/ssh.rb
116
+ - src/uri/svn.rb
117
+ - src/yaml/basenode_ext.rb
118
+ - src/yaml/chop_header.rb
119
+ - src/yaml/transform.rb
120
+ - src/yaml/yregexpath.rb
121
+ - test/algorithms
122
+ - test/check-pkg-ruby_ex.yml
123
+ - test/check-ruby_ex.yml
124
+ - test/resources
125
+ - test/sanity
126
+ - test/sanity-suite.yml
127
+ - test/test-unit-setup.rb
128
+ - test/unit-suite.yml
129
+ - test/algorithms/simulated_annealing_test.rb
130
+ - test/resources/autoload_tree
131
+ - test/resources/foo.txt
132
+ - test/resources/autoload_tree/A.rb
133
+ - test/resources/autoload_tree/B.rb
134
+ - test/resources/autoload_tree/foo
135
+ - test/resources/autoload_tree/foo/C.rb
136
+ - test/sanity/multiple-requires.yml
137
+ - test/sanity/single-requires.yml
138
+ - AUTHORS
139
+ - ChangeLog
140
+ - NEWS
141
+ - Rakefile
142
+ - README
143
+ - SPEC.dyn.yml
144
+ - SPEC.gem.yml
145
+ - SPEC.yml
146
+ test_files: []
147
+ rdoc_options:
148
+ - "--inline-source"
149
+ - "--main"
150
+ - README
151
+ - "--title"
152
+ - "RubyEx -- General purpose Ruby extensions."
153
+ - "-T"
154
+ - html
155
+ extra_rdoc_files:
156
+ - README
157
+ - AUTHORS
158
+ - NEWS
159
+ - src/abstract.rb
160
+ - src/abstract_node.rb
161
+ - src/algorithms.rb
162
+ - src/ask.rb
163
+ - src/attributed_class.rb
164
+ - src/cache.rb
165
+ - src/checkout.rb
166
+ - src/choose.rb
167
+ - src/commands.rb
168
+ - src/config_file.rb
169
+ - src/const_regexp.rb
170
+ - src/daemon.rb
171
+ - src/diff.rb
172
+ - src/dlogger.rb
173
+ - src/drb_ex.rb
174
+ - src/dumpable_proc.rb
175
+ - src/filetype.rb
176
+ - src/generate_id.rb
177
+ - src/histogram.rb
178
+ - src/hookable.rb
179
+ - src/hooker.rb
180
+ - src/indexed_node.rb
181
+ - src/io_marshal.rb
182
+ - src/ioo.rb
183
+ - src/labeled_node.rb
184
+ - src/logger_observer.rb
185
+ - src/md5sum.rb
186
+ - src/node.rb
187
+ - src/object_monitor.rb
188
+ - src/object_monitor_activity.rb
189
+ - src/observable.rb
190
+ - src/observable_pool.rb
191
+ - src/orderedhash.rb
192
+ - src/pp_hierarchy.rb
193
+ - src/random_generators.rb
194
+ - src/ruby_ex.rb
195
+ - src/safe_eval.rb
196
+ - src/sendmail.rb
197
+ - src/service_manager.rb
198
+ - src/shuffle.rb
199
+ - src/spring.rb
200
+ - src/spring_set.rb
201
+ - src/symtbl.rb
202
+ - src/synflow.rb
203
+ - src/thread_mutex.rb
204
+ - src/timeout_ex.rb
205
+ - src/trace.rb
206
+ - src/uri_ex.rb
207
+ - src/verbose_object.rb
208
+ - src/algorithms/simulated_annealing.rb
209
+ - src/commands/command.rb
210
+ - src/commands/datas.rb
211
+ - src/commands/factory.rb
212
+ - src/commands/helpers.rb
213
+ - src/commands/pipe.rb
214
+ - src/commands/runners.rb
215
+ - src/commands/seq.rb
216
+ - src/commands/datas/composite.rb
217
+ - src/commands/datas/data.rb
218
+ - src/commands/datas/factory.rb
219
+ - src/commands/datas/temp.rb
220
+ - src/commands/runners/exec.rb
221
+ - src/commands/runners/fork.rb
222
+ - src/commands/runners/runner.rb
223
+ - src/commands/runners/system.rb
224
+ - src/drb/drb_observable.rb
225
+ - src/drb/drb_observable_pool.rb
226
+ - src/drb/drb_service.rb
227
+ - src/drb/drb_undumped_attributes.rb
228
+ - src/drb/drb_undumped_indexed_object.rb
229
+ - src/drb/insecure_protected_methods.rb
230
+ - src/module/autoload_tree.rb
231
+ - src/module/hierarchy.rb
232
+ - src/module/instance_method_visibility.rb
233
+ - src/random_generators/random_generator.rb
234
+ - src/random_generators/ruby.rb
235
+ - src/uri/druby.rb
236
+ - src/uri/file.rb
237
+ - src/uri/ftp_ex.rb
238
+ - src/uri/http_ex.rb
239
+ - src/uri/pgsql.rb
240
+ - src/uri/ssh.rb
241
+ - src/uri/svn.rb
242
+ - src/yaml/basenode_ext.rb
243
+ - src/yaml/chop_header.rb
244
+ - src/yaml/transform.rb
245
+ - src/yaml/yregexpath.rb
246
+ executables: []
247
+ extensions: []
248
+ requirements: []
249
+ dependencies:
250
+ - !ruby/object:Gem::Dependency
251
+ name: core_ex
252
+ version_requirement:
253
+ version_requirements: !ruby/object:Gem::Version::Requirement
254
+ requirements:
255
+ -
256
+ - "~>"
257
+ - !ruby/object:Gem::Version
258
+ version: 0.1.2
259
+ version:
260
+ - !ruby/object:Gem::Dependency
261
+ name: activesupport
262
+ version_requirement:
263
+ version_requirements: !ruby/object:Gem::Version::Requirement
264
+ requirements:
265
+ -
266
+ - "~>"
267
+ - !ruby/object:Gem::Version
268
+ version: 1.0.4
269
+ version:
data/SPEC.yml ADDED
@@ -0,0 +1,36 @@
1
+ ---
2
+ Author: The TTK Team.
3
+ License: Ruby License
4
+ Revision: '$Id$'
5
+
6
+ name: ruby_ex
7
+
8
+ title: RubyEx -- General purpose Ruby extensions.
9
+ summary: RubyEx contains general purpose Ruby extensions.
10
+ description: ""
11
+ homepage: http://api.feydakins.org/ruby_ex
12
+ rubyforge_project: ttk
13
+ rubyforge_sub_package_name: ruby_ex
14
+
15
+ root_test_suite: test/check-pkg-ruby_ex.yml
16
+ rdoc_dir: doc/html
17
+ tags_url: svn://svn.feydakins.org/ruby_ex/tags
18
+
19
+ commit_command: rxci
20
+
21
+ rdoc_files: !filelist
22
+ - README
23
+ - AUTHORS
24
+ - NEWS
25
+ - src/**/*.rb
26
+
27
+ pkg_files: !filelist
28
+ - src/**/*.rb
29
+ - test/**/*
30
+ - '[A-Z]*'
31
+
32
+ dependencies:
33
+ core_ex: ~> 0.1.2
34
+ activesupport: ~> 1.0.4
35
+ # ttk: ~> 0.2.0
36
+
data/src/abstract.rb ADDED
@@ -0,0 +1,253 @@
1
+ # Copyright: Copyright (c) 2004 Nicolas Despres. All rights reserved.
2
+ # Author: Nicolas Despres <polrop@lrde.epita.fr>.
3
+ # License: Gnu General Public License.
4
+
5
+ # $LastChangedBy: ertai $
6
+ # $Id: abstract.rb 266 2005-06-01 14:27:18Z ertai $
7
+
8
+
9
+ #FIXME: find a way to be thread safe.
10
+
11
+
12
+ require 'module/instance_method_visibility'
13
+ require 'ruby_ex'
14
+
15
+
16
+ module Concrete; end
17
+
18
+
19
+ # When this module is included into a class, this class can't be instantiate
20
+ # any more until the Concrete module is included too. This module cannot be
21
+ # included if the Concrete module has been included before in one of the
22
+ # class' superclass.
23
+ module Abstract
24
+
25
+ def self.included(klass)
26
+ super
27
+ if klass.include?(Concrete)
28
+ raise(TypeError, "#{klass} - cannot make abstract a concrete class")
29
+ end
30
+ klass.module_eval do
31
+ class << self
32
+ unless private_method_defined?(:concrete_new)
33
+ alias_method :concrete_new, :new
34
+ visibility = instance_method_visibility('new')
35
+ def new(*args, &block)
36
+ raise(TypeError, "cannot instantiate an abstract class #{name}")
37
+ end
38
+ send(visibility, :new)
39
+ private :concrete_new
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ end # module Abstract
46
+
47
+
48
+ # Include this module in an abstract class to make it concrete and so, to be
49
+ # able to instantiate it again. This module can be included if and only if the
50
+ # Abstract module has been included before in one of the class' superclass.
51
+ module Concrete
52
+
53
+ def self.included(klass)
54
+ super
55
+ unless klass.include?(Abstract)
56
+ raise(TypeError, "#{klass} - not an abstract class")
57
+ end
58
+ klass.module_eval do
59
+ class << self
60
+ visibility = instance_method_visibility('new')
61
+ def new(*args, &block)
62
+ concrete_new(*args, &block)
63
+ end
64
+ send(visibility, :new)
65
+ end
66
+
67
+ def is_a?(klass)
68
+ klass == Abstract ? false : super(klass)
69
+ end
70
+ end
71
+ end
72
+
73
+ end # module Concrete
74
+
75
+
76
+ class Class
77
+
78
+ def abstract
79
+ include Abstract
80
+ end
81
+
82
+ def concrete
83
+ include Concrete
84
+ end
85
+
86
+ def abstract?
87
+ include?(Abstract) ? (not include?(Concrete)) : false;
88
+ end
89
+
90
+ end # class Class
91
+
92
+
93
+ test_section __FILE__ do
94
+
95
+
96
+ require 'singleton'
97
+
98
+
99
+ class AbstractTest < Test::Unit::TestCase
100
+
101
+ class R; end
102
+
103
+ class A
104
+ include Abstract
105
+
106
+ attr_reader :initialized
107
+
108
+ def initialize(toto=nil)
109
+ @initialized = true
110
+ end
111
+
112
+ end
113
+
114
+ class B < A; end
115
+
116
+ def test_abstract
117
+ assert_nothing_raised { R.new }
118
+ assert(A.include?(Abstract))
119
+ assert_raises(TypeError) { A.new }
120
+ assert_raises(TypeError) { B.new }
121
+ assert_raises(TypeError) do
122
+ AbstractTest.module_eval %q{
123
+ class D
124
+ include Concrete
125
+ include Abstract
126
+ end
127
+ }
128
+ end
129
+ end
130
+
131
+ class C < A
132
+ include Concrete
133
+
134
+ attr_reader :toto
135
+
136
+ def initialize(toto=nil)
137
+ super
138
+ @toto = toto
139
+ end
140
+ end
141
+
142
+ class CC < C; end
143
+
144
+ def test_concrete
145
+ assert_raises(TypeError) do
146
+ AbstractTest.module_eval %q{ class D; include Concrete; end }
147
+ end
148
+ assert(C.new.initialized)
149
+ assert_nil(C.new.toto)
150
+ assert_equal('toto', C.new('toto').toto)
151
+ assert(CC.new.initialized)
152
+ assert_equal(SC.instance, SC.instance)
153
+ assert_equal(SCC.instance, SCC.instance)
154
+ assert_not_equal(SC.instance, SCC.instance)
155
+ end
156
+
157
+ class SA
158
+ include Singleton
159
+ include Abstract
160
+
161
+ attr_reader :initialized
162
+
163
+ def initialize(toto=nil)
164
+ @initialized = true
165
+ end
166
+
167
+ end
168
+
169
+ class SB < SA; end
170
+
171
+ def test_abstract_singleton
172
+ assert(SA.include?(Abstract))
173
+ assert_raises(NoMethodError) { SA.new }
174
+ assert_raises(TypeError) { SA.instance }
175
+ assert_raises(NoMethodError) { SB.new }
176
+ assert_raises(TypeError) { SB.instance }
177
+ assert_raises(TypeError) do
178
+ AbstractTest.module_eval %q{
179
+ class SD; include Concrete; include Abstract; end
180
+ }
181
+ end
182
+ end
183
+
184
+ class SC < SA
185
+ include Concrete
186
+
187
+ end
188
+
189
+ class SCC < SC; end
190
+
191
+ def test_concrete_singleton
192
+ assert_raises(TypeError) do
193
+ AbstractTest.module_eval %q{ class SD; include Concrete; end }
194
+ end
195
+ assert_raises(NoMethodError) { SC.new }
196
+ assert(SC.instance.initialized)
197
+ assert(SCC.instance.initialized)
198
+ assert_equal(SC.instance, SC.instance)
199
+ assert_equal(SCC.instance, SCC.instance)
200
+ assert_not_equal(SC.instance, SCC.instance)
201
+ end
202
+
203
+ class IsA; include Abstract; end
204
+ class IsB < IsA; include Concrete; end
205
+
206
+ def test_is_a
207
+ assert(! IsB.new.is_a?(Abstract))
208
+ assert(IsB.new.is_a?(IsA))
209
+ assert(IsB.include?(Abstract))
210
+ end
211
+
212
+ def test_abstract?
213
+ assert(IsA.abstract?)
214
+ assert(! IsB.abstract?)
215
+ end
216
+
217
+ class AArg
218
+ include Abstract
219
+
220
+ attr_reader :arg
221
+
222
+ def initialize(arg)
223
+ @arg = arg
224
+ end
225
+
226
+ end
227
+
228
+ class CArg < AArg
229
+ include Concrete
230
+ end
231
+
232
+ def test_arg
233
+ assert_nothing_raised { CArg.new('toto') }
234
+ assert_raises(ArgumentError) { CArg.new }
235
+ end
236
+
237
+ class AA_; include Abstract; end
238
+ class BB_ < AA_; include Abstract; end
239
+ class CC_ < BB_; include Concrete; end
240
+ class DD_ < CC_; include Concrete; end
241
+
242
+ def test_double_abstract
243
+ assert_raises(TypeError) { AA_.new }
244
+ assert_raises(TypeError) { BB_.new }
245
+ assert_nothing_raised { CC_.new }
246
+ assert_nothing_raised { DD_.new }
247
+ end
248
+
249
+ end # class AbstractTest
250
+
251
+
252
+ end
253
+