metaruby 1.0.0.rc1 → 1.0.0.rc2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
-