metaruby 1.0.0.rc1 → 1.0.0.rc2

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.
@@ -1,12 +1,9 @@
1
1
  <package>
2
- <description brief="Modelling using the Ruby language as a metamodel">
2
+ <description brief="">
3
3
  </description>
4
4
  <maintainer>Sylvain Joyeux/sylvain.joyeux@m4x.org</maintainer>
5
5
  <license>LGPLv3</license>
6
6
 
7
7
  <depend package="utilrb" />
8
8
  <depend package="kramdown" optional="1" />
9
-
10
- <test_depend package="minitest" />
11
- <test_depend package="flexmock" />
12
9
  </package>
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'metaruby/version'
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "metaruby"
8
+ s.version = MetaRuby::VERSION
9
+ s.authors = ["Sylvain Joyeux"]
10
+ s.email = "sylvain.joyeux@m4x.org"
11
+ s.summary = "Modelling using the Ruby language as a metamodel"
12
+ s.description = "MetaRuby is a set of module and classes that help one use the Ruby type system as a basis for modelling."
13
+ s.homepage = "http://rock-robotics.org"
14
+ s.licenses = ["BSD"]
15
+
16
+ s.require_paths = ["lib"]
17
+ s.extensions = []
18
+ s.extra_rdoc_files = ["README.md"]
19
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+
21
+ s.add_runtime_dependency "utilrb", ">= 2.1.0.a"
22
+ s.add_runtime_dependency "kramdown"
23
+ s.add_development_dependency "flexmock", ">= 2.0.0"
24
+ s.add_development_dependency "minitest", ">= 5.0", "~> 5.0"
25
+ s.add_development_dependency "coveralls"
26
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metaruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.rc1
4
+ version: 1.0.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sylvain Joyeux
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-13 00:00:00.000000000 Z
11
+ date: 2015-09-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: utilrb
@@ -16,84 +16,90 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 1.3.4
19
+ version: 2.1.0.a
20
20
  type: :runtime
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.3.4
26
+ version: 2.1.0.a
27
27
  - !ruby/object:Gem::Dependency
28
- name: hoe-yard
28
+ name: kramdown
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 0.1.2
34
- type: :development
33
+ version: '0'
34
+ type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 0.1.2
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rake
42
+ name: flexmock
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '0.8'
47
+ version: 2.0.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '0.8'
54
+ version: 2.0.0
55
55
  - !ruby/object:Gem::Dependency
56
- name: hoe
56
+ name: minitest
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '5.0'
59
62
  - - "~>"
60
63
  - !ruby/object:Gem::Version
61
- version: '3.13'
64
+ version: '5.0'
62
65
  type: :development
63
66
  prerelease: false
64
67
  version_requirements: !ruby/object:Gem::Requirement
65
68
  requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '5.0'
66
72
  - - "~>"
67
73
  - !ruby/object:Gem::Version
68
- version: '3.13'
69
- description: |-
70
- This page will describe the various functionality that metaruby provides to help
71
- modelling in Ruby.
72
-
73
- This page will reuse one of the most overused example of modelling: a car and
74
- colors.
75
-
76
- ## Models
77
-
78
- Using MetaRuby, models can either be represented by Ruby classes or by Ruby
79
- modules. You use the first one when you want to model something from which an
80
- object can be created, in our example: a car. You use the second for things that
81
- cannot be instanciated, but can be used as attributes of another object, in our
82
- example: a color.
83
- email:
84
- - sylvain.joyeux@m4x.org
74
+ version: '5.0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: coveralls
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :development
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ description: MetaRuby is a set of module and classes that help one use the Ruby type
90
+ system as a basis for modelling.
91
+ email: sylvain.joyeux@m4x.org
85
92
  executables: []
86
93
  extensions: []
87
94
  extra_rdoc_files:
88
- - History.txt
89
- - Manifest.txt
90
95
  - README.md
91
96
  files:
92
- - ".gemtest"
93
- - History.txt
94
- - Manifest.txt
97
+ - ".gitignore"
98
+ - ".travis.yml"
99
+ - Gemfile
95
100
  - README.md
96
101
  - Rakefile
102
+ - bin/.gitattributes
97
103
  - lib/metaruby.rb
98
104
  - lib/metaruby/class.rb
99
105
  - lib/metaruby/dsls.rb
@@ -105,6 +111,7 @@ files:
105
111
  - lib/metaruby/gui/html/button.rb
106
112
  - lib/metaruby/gui/html/collection.rb
107
113
  - lib/metaruby/gui/html/exception_view.css
114
+ - lib/metaruby/gui/html/fragment.rhtml
108
115
  - lib/metaruby/gui/html/jquery.min.js
109
116
  - lib/metaruby/gui/html/jquery.selectfilter.js
110
117
  - lib/metaruby/gui/html/jquery.tagcloud.min.js
@@ -123,22 +130,16 @@ files:
123
130
  - lib/metaruby/module.rb
124
131
  - lib/metaruby/registration.rb
125
132
  - lib/metaruby/test.rb
133
+ - lib/metaruby/version.rb
134
+ - lib/yard-metaruby.rb
126
135
  - manifest.xml
127
- - test/suite.rb
128
- - test/test_attributes.rb
129
- - test/test_class.rb
130
- - test/test_dsls.rb
131
- - test/test_module.rb
132
- - test/test_registration.rb
133
- homepage: https://gitorious.org/rock-toolchain/metaruby
136
+ - metaruby.gemspec
137
+ homepage: http://rock-robotics.org
134
138
  licenses:
135
- - LGPLv3+
139
+ - BSD
136
140
  metadata: {}
137
141
  post_install_message:
138
- rdoc_options:
139
- - "--title"
140
- - TestMetaruby Documentation
141
- - "--quiet"
142
+ rdoc_options: []
142
143
  require_paths:
143
144
  - lib
144
145
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -153,8 +154,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
153
154
  version: 1.3.1
154
155
  requirements: []
155
156
  rubyforge_project:
156
- rubygems_version: 2.2.2
157
+ rubygems_version: 2.2.3
157
158
  signing_key:
158
159
  specification_version: 4
159
160
  summary: Modelling using the Ruby language as a metamodel
160
161
  test_files: []
162
+ has_rdoc:
@@ -1 +0,0 @@
1
- ===
@@ -1,40 +0,0 @@
1
- History.txt
2
- Manifest.txt
3
- README.md
4
- Rakefile
5
- lib/metaruby.rb
6
- lib/metaruby/class.rb
7
- lib/metaruby/dsls.rb
8
- lib/metaruby/dsls/doc.rb
9
- lib/metaruby/dsls/find_through_method_missing.rb
10
- lib/metaruby/gui.rb
11
- lib/metaruby/gui/exception_view.rb
12
- lib/metaruby/gui/html.rb
13
- lib/metaruby/gui/html/button.rb
14
- lib/metaruby/gui/html/collection.rb
15
- lib/metaruby/gui/html/exception_view.css
16
- lib/metaruby/gui/html/jquery.min.js
17
- lib/metaruby/gui/html/jquery.selectfilter.js
18
- lib/metaruby/gui/html/jquery.tagcloud.min.js
19
- lib/metaruby/gui/html/jquery.tinysort.min.js
20
- lib/metaruby/gui/html/list.rhtml
21
- lib/metaruby/gui/html/page.css
22
- lib/metaruby/gui/html/page.rb
23
- lib/metaruby/gui/html/page.rhtml
24
- lib/metaruby/gui/html/page_body.rhtml
25
- lib/metaruby/gui/html/rock-website.css
26
- lib/metaruby/gui/model_browser.rb
27
- lib/metaruby/gui/model_selector.rb
28
- lib/metaruby/gui/rendering_manager.rb
29
- lib/metaruby/gui/ruby_constants_item_model.rb
30
- lib/metaruby/inherited_attribute.rb
31
- lib/metaruby/module.rb
32
- lib/metaruby/registration.rb
33
- lib/metaruby/test.rb
34
- manifest.xml
35
- test/suite.rb
36
- test/test_attributes.rb
37
- test/test_class.rb
38
- test/test_dsls.rb
39
- test/test_module.rb
40
- test/test_registration.rb
@@ -1,15 +0,0 @@
1
- # Coverage is enabled by default when running the whole suite
2
- ENV['TEST_ENABLE_COVERAGE'] ||= '1'
3
-
4
- # Require all your test files here. Always prepend ./ and use the relative path
5
- # to the Ruby library root
6
- require 'metaruby/test'
7
- require './test/test_class'
8
- require './test/test_module'
9
- require './test/test_attributes'
10
- require './test/test_registration'
11
- require './test/test_dsls'
12
-
13
- # Put the root logger to DEBUG so that all debug blocks are executed
14
- MetaRuby.logger = Logger.new(File.open("/dev/null", 'w'))
15
- MetaRuby.logger.level = Logger::DEBUG
@@ -1,323 +0,0 @@
1
- require 'metaruby/test'
2
-
3
- class TC_Models < MiniTest::Test
4
- def test_inherited_attribute_class
5
- a = Class.new do
6
- class << self
7
- extend MetaRuby::Attributes
8
- inherited_attribute(:signature, :signatures) { Array.new }
9
- inherited_attribute(:mapped, :map, :map => true) { Hash.new }
10
- end
11
- end
12
- b = Class.new(a) do
13
- include Module.new # include an empty module between a and b to check that the module
14
- # is skipped transparently
15
- singleton_class.inherited_attribute(:child_attribute) { Array.new }
16
- end
17
- check_inherited_attribute(a, b)
18
-
19
- # Test for singleton class support
20
- object = b.new
21
- assert(object.singleton_class.respond_to?(:signatures))
22
- object.singleton_class.signatures << :in_singleton
23
- assert_equal([:in_singleton], object.singleton_class.signatures)
24
- end
25
-
26
- def check_inherited_attribute(base, derived)
27
- assert(base.respond_to?(:each_signature))
28
- assert(base.respond_to?(:signatures))
29
- assert(!base.respond_to?(:has_signature?))
30
- assert(!base.respond_to?(:find_signatures))
31
-
32
- assert(base.respond_to?(:each_mapped))
33
- assert(base.respond_to?(:map))
34
- assert(base.respond_to?(:has_mapped?))
35
-
36
- base.signatures << :in_base
37
- base.map[:base] = 10
38
- base.map[:overriden] = 20
39
- assert_equal([:in_base], base.enum_for(:each_signature).to_a)
40
- assert_equal([10].to_set, base.enum_for(:each_mapped, :base, false).to_set)
41
-
42
- assert(!base.respond_to?(:child_attribute))
43
- assert(!base.respond_to?(:each_child_attribute))
44
- assert(derived.respond_to?(:child_attribute))
45
- assert(derived.respond_to?(:each_child_attribute))
46
-
47
- derived.signatures << :in_derived
48
-
49
- derived.map[:overriden] = 15
50
- derived.map[:derived] = 25
51
-
52
- assert_equal([:in_derived, :in_base], derived.enum_for(:each_signature).to_a)
53
- assert_equal([20, 15].to_set, derived.enum_for(:each_mapped, :overriden, false).to_set)
54
- assert_equal([15].to_set, derived.enum_for(:each_mapped, :overriden, true).to_set)
55
- assert_equal([25].to_set, derived.enum_for(:each_mapped, :derived).to_set)
56
- assert_equal([[:base, 10], [:overriden, 20], [:overriden, 15], [:derived, 25]].to_set, derived.enum_for(:each_mapped, nil, false).to_set)
57
- assert_equal([[:base, 10], [:overriden, 15], [:derived, 25]].to_set, derived.enum_for(:each_mapped, nil, true).to_set)
58
- end
59
-
60
- def test_inherited_attribute_non_mapping_promote
61
- a = Class.new do
62
- class << self
63
- extend MetaRuby::Attributes
64
- def promote_value(v)
65
- v
66
- end
67
- inherited_attribute(:value, :values) { Array.new }
68
- end
69
- end
70
- b = flexmock(Class.new(a), 'b')
71
- c = flexmock(Class.new(b), 'c')
72
- d = flexmock(Class.new(c), 'd')
73
-
74
- c.should_receive(:promote_value).with(10).and_return("10_b_c").once.ordered
75
- d.should_receive(:promote_value).with("10_b_c").and_return(12).once.ordered
76
- c.should_receive(:promote_value).with(11).and_return("11_b_c").once.ordered
77
- d.should_receive(:promote_value).with("11_b_c").and_return(13).once.ordered
78
- b.should_receive(:promote_value).with(0).and_return("0_b_c").once.ordered
79
- c.should_receive(:promote_value).with("0_b_c").and_return("0_c_d").once.ordered
80
- d.should_receive(:promote_value).with("0_c_d").and_return(2).once.ordered
81
- b.should_receive(:promote_value).with(1).and_return("1_b_c").once.ordered
82
- c.should_receive(:promote_value).with("1_b_c").and_return("1_c_d").once.ordered
83
- d.should_receive(:promote_value).with("1_c_d").and_return(3).once.ordered
84
-
85
- a.values << 0 << 1
86
- b.values << 10 << 11
87
- # Do NOT add anything at the level of C. Its promote_value method should
88
- # still be called, though
89
- d.values << 100 << 110
90
- assert_equal [0, 1], a.each_value.to_a
91
- assert_equal [100, 110, 12, 13, 2, 3], d.each_value.to_a
92
- end
93
-
94
- def test_inherited_attribute_mapping_promote
95
- a = Class.new do
96
- class << self
97
- extend MetaRuby::Attributes
98
- def promote_value(key, v)
99
- end
100
- def name; 'A' end
101
- inherited_attribute(:value, :values, :map => true) { Hash.new }
102
- end
103
- end
104
- b = Class.new(a)
105
- c = Class.new(b)
106
- d = Class.new(c)
107
-
108
- flexmock(c).should_receive(:promote_value).with('b', 2).and_return("b2_b_c").once.ordered
109
- flexmock(d).should_receive(:promote_value).with('b', "b2_b_c").and_return(15).once.ordered
110
-
111
- flexmock(c).should_receive(:promote_value).with('c', 3).and_return("c3_b_c").once.ordered
112
- flexmock(d).should_receive(:promote_value).with('c', "c3_b_c").and_return(16).once.ordered
113
-
114
- flexmock(b).should_receive(:promote_value).with('a', 0).and_return("a0_a_b").once.ordered
115
- flexmock(c).should_receive(:promote_value).with('a', "a0_a_b").and_return("a0_b_c").once.ordered
116
- flexmock(d).should_receive(:promote_value).with('a', "a0_b_c").and_return(10).once.ordered
117
-
118
- a.values.merge!('a' => 0, 'b' => 1)
119
- b.values.merge!('b' => 2, 'c' => 3, 'd' => 4)
120
- d.values.merge!('d' => 5, 'e' => 6)
121
- assert_equal [['d', 5], ['e', 6], ['b', 15], ['c', 16], ['a', 10]], d.each_value.to_a
122
- end
123
-
124
- def test_inherited_attribute_mapping_promote_non_uniq
125
- a = Class.new do
126
- class << self
127
- extend MetaRuby::Attributes
128
- def promote_value(key, v)
129
- end
130
- inherited_attribute(:value, :values, :map => true) { Hash.new }
131
- end
132
- end
133
- b = flexmock(Class.new(a), 'b')
134
- c = flexmock(Class.new(b), 'c')
135
- d = flexmock(Class.new(c), 'd')
136
-
137
- c.should_receive(:promote_value).with('b', 2).and_return("b2_b_c").once.ordered
138
- d.should_receive(:promote_value).with('b', "b2_b_c").and_return(12).once.ordered
139
-
140
- c.should_receive(:promote_value).with('c', 3).and_return("c3_b_c").once.ordered
141
- d.should_receive(:promote_value).with('c', "c3_b_c").and_return(13).once.ordered
142
-
143
- c.should_receive(:promote_value).with('d', 4).and_return("d4_b_c").once.ordered
144
- d.should_receive(:promote_value).with('d', "d4_b_c").and_return(14).once.ordered
145
-
146
- b.should_receive(:promote_value).with('a', 0).and_return("a0_a_b").once.ordered
147
- c.should_receive(:promote_value).with('a', "a0_a_b").and_return("a0_b_c").once.ordered
148
- d.should_receive(:promote_value).with('a', "a0_b_c").and_return(10).once.ordered
149
-
150
- b.should_receive(:promote_value).with('b', 1).and_return("b1_a_b").once.ordered
151
- c.should_receive(:promote_value).with('b', "b1_a_b").and_return("b1_b_c").once.ordered
152
- d.should_receive(:promote_value).with('b', "b1_b_c").and_return(11).once.ordered
153
-
154
- a.values.merge!('a' => 0, 'b' => 1)
155
- b.values.merge!('b' => 2, 'c' => 3, 'd' => 4)
156
- d.values.merge!('d' => 5, 'e' => 6)
157
- assert_equal [['d', 5], ['e', 6], ['b', 12], ['c', 13], ['d', 14], ['a', 10], ['b', 11]], d.each_value(nil, false).to_a
158
- end
159
-
160
- def test_inherited_attribute_mapping_promote_with_key_uniq
161
- a = Class.new do
162
- class << self
163
- extend MetaRuby::Attributes
164
- def promote_value(key, v)
165
- end
166
- inherited_attribute(:value, :values, :map => true) { Hash.new }
167
- end
168
- end
169
- b = flexmock(Class.new(a), 'b')
170
- c = flexmock(Class.new(b), 'c')
171
- d = flexmock(Class.new(c), 'd')
172
-
173
- c.should_receive(:promote_value).with('b', 2).and_return("b2_b_c").once.ordered
174
- d.should_receive(:promote_value).with('b', "b2_b_c").and_return(12).once.ordered
175
-
176
- a.values.merge!('a' => 0, 'b' => 1)
177
- b.values.merge!('b' => 2, 'c' => 3, 'd' => 4)
178
- d.values.merge!('d' => 5, 'e' => 6)
179
- assert_equal [12], d.each_value('b', true).to_a
180
- end
181
-
182
- def test_inherited_attribute_mapping_promote_with_key_non_uniq
183
- a = Class.new do
184
- class << self
185
- extend MetaRuby::Attributes
186
- def promote_value(key, v)
187
- end
188
- inherited_attribute(:value, :values, :map => true) { Hash.new }
189
- end
190
- end
191
- b = flexmock(Class.new(a), 'b')
192
- c = flexmock(Class.new(b), 'c')
193
- d = flexmock(Class.new(c), 'd')
194
-
195
- c.should_receive(:promote_value).with('b', 2).and_return("b2_b_c").once.ordered
196
- d.should_receive(:promote_value).with('b', "b2_b_c").and_return(12).once.ordered
197
-
198
- b.should_receive(:promote_value).with('b', 1).and_return("b1_a_b").once.ordered
199
- c.should_receive(:promote_value).with('b', "b1_a_b").and_return("b1_b_c").once.ordered
200
- d.should_receive(:promote_value).with('b', "b1_b_c").and_return(11).once.ordered
201
-
202
- a.values.merge!('a' => 0, 'b' => 1)
203
- b.values.merge!('b' => 2, 'c' => 3, 'd' => 4)
204
- d.values.merge!('d' => 5, 'e' => 6)
205
- assert_equal [12, 11], d.each_value('b', false).to_a
206
- end
207
- end
208
-
209
- describe MetaRuby::Attributes do
210
- describe "#inherited_single_value_attribute" do
211
- attr_reader :base, :sub, :subsub
212
- describe "plain" do
213
- before do
214
- @base = Class.new do
215
- class << self
216
- extend MetaRuby::Attributes
217
- inherited_single_value_attribute :var
218
- end
219
- end
220
- @sub = Class.new(base)
221
- @subsub = Class.new(sub)
222
- end
223
-
224
- it "should set the value if given an argument" do
225
- base.var(10)
226
- assert_equal 10, base.var
227
- end
228
- it "should return the value from the parent model if not set" do
229
- base.var(10)
230
- assert_equal 10, sub.var
231
- end
232
- it "should return nil if the instance variable is explicitly set to nil" do
233
- base.var 10
234
- sub.var nil
235
- assert_equal nil, subsub.var
236
- end
237
- end
238
-
239
- describe "with default" do
240
- before do
241
- @base = Class.new do
242
- class << self
243
- extend MetaRuby::Attributes
244
- inherited_single_value_attribute(:var) { 10 }
245
- end
246
- end
247
- @sub = Class.new(base)
248
- @subsub = Class.new(sub)
249
- end
250
-
251
- it "should be accessible at each level" do
252
- assert_equal 10, base.var
253
- assert_equal 10, sub.var
254
- assert_equal 10, subsub.var
255
- end
256
-
257
- it "should set only the bottom class" do
258
- assert_equal 10, base.var
259
- sub.var(nil)
260
- assert_equal nil, sub.var
261
- assert_equal nil, subsub.var
262
- end
263
- end
264
-
265
- describe "with promotion" do
266
- before do
267
- @base = Class.new do
268
- class << self
269
- extend MetaRuby::Attributes
270
- def promote_var(value); value * 2 end
271
- inherited_single_value_attribute(:var)
272
- end
273
- end
274
- @sub = Class.new(base) do
275
- class << self
276
- def promote_var(value); value * 4 end
277
- end
278
- end
279
- @subsub = Class.new(sub) do
280
- class << self
281
- def promote_var(value); value - 10 end
282
- end
283
- end
284
- end
285
-
286
- it "should apply the promotion method at each level" do
287
- base.var(10)
288
- assert_equal 10, base.var
289
- assert_equal 40, sub.var
290
- assert_equal 30, subsub.var
291
- end
292
- end
293
-
294
- describe "with default with promotion" do
295
- before do
296
- @base = Class.new do
297
- class << self
298
- extend MetaRuby::Attributes
299
- def promote_var(value); value * 2 end
300
- inherited_single_value_attribute(:var) { 10 }
301
- end
302
- end
303
- @sub = Class.new(base) do
304
- class << self
305
- def promote_var(value); value * 4 end
306
- end
307
- end
308
- @subsub = Class.new(sub) do
309
- class << self
310
- def promote_var(value); value - 10 end
311
- end
312
- end
313
- end
314
-
315
- it "should apply the promotion method at each level" do
316
- assert_equal 10, base.var
317
- assert_equal 40, sub.var
318
- assert_equal 30, subsub.var
319
- end
320
- end
321
- end
322
- end
323
-