jackbox 0.9.6.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.yardopts +5 -0
- data/CHANGES.txt +108 -0
- data/LICENSE.lic +0 -0
- data/LICENSE.txt +13 -0
- data/README.md +1395 -0
- data/Rakefile +6 -0
- data/bin/jackup +248 -0
- data/jackbox.gemspec +27 -0
- data/jackbox.jpg +0 -0
- data/lib/.document +0 -0
- data/lib/jackbox.rb +2 -0
- data/lib/jackbox/examples/dir.rb +80 -0
- data/lib/jackbox/examples/dx.rb +182 -0
- data/lib/jackbox/examples/transformers.rb +101 -0
- data/lib/jackbox/injectors.rb +2 -0
- data/lib/jackbox/rake.rb +2 -0
- data/lib/jackbox/tools/prefs.rb +2 -0
- data/lib/jackbox/version.rb +4 -0
- data/rgloader/loader.rb +23 -0
- data/rgloader/rgloader.darwin.bundle +0 -0
- data/rgloader/rgloader.freebsd.so +0 -0
- data/rgloader/rgloader.freebsd.x86_64.so +0 -0
- data/rgloader/rgloader.linux.so +0 -0
- data/rgloader/rgloader.linux.x86_64.so +0 -0
- data/rgloader/rgloader.mingw.so +0 -0
- data/rgloader/rgloader19.darwin.bundle +0 -0
- data/rgloader/rgloader19.freebsd.so +0 -0
- data/rgloader/rgloader19.freebsd.x86_64.so +0 -0
- data/rgloader/rgloader19.linux.so +0 -0
- data/rgloader/rgloader19.linux.x86_64.so +0 -0
- data/rgloader/rgloader19.mingw.so +0 -0
- data/rgloader/rgloader191.mingw.so +0 -0
- data/rgloader/rgloader192.darwin.bundle +0 -0
- data/rgloader/rgloader192.freebsd.so +0 -0
- data/rgloader/rgloader192.freebsd.x86_64.so +0 -0
- data/rgloader/rgloader192.linux.so +0 -0
- data/rgloader/rgloader192.linux.x86_64.so +0 -0
- data/rgloader/rgloader192.mingw.so +0 -0
- data/rgloader/rgloader193.darwin.bundle +0 -0
- data/rgloader/rgloader193.freebsd.so +0 -0
- data/rgloader/rgloader193.freebsd.x86_64.so +0 -0
- data/rgloader/rgloader193.linux.so +0 -0
- data/rgloader/rgloader193.linux.x86_64.so +0 -0
- data/rgloader/rgloader193.mingw.so +0 -0
- data/rgloader/rgloader20.darwin.bundle +0 -0
- data/rgloader/rgloader20.freebsd.so +0 -0
- data/rgloader/rgloader20.freebsd.x86_64.so +0 -0
- data/rgloader/rgloader20.linux.so +0 -0
- data/rgloader/rgloader20.linux.x86_64.so +0 -0
- data/rgloader/rgloader20.mingw.so +0 -0
- data/rgloader/rgloader20.mingw.x64.so +0 -0
- data/rgloader/rgloader21.darwin.bundle +0 -0
- data/rgloader/rgloader21.freebsd.so +0 -0
- data/rgloader/rgloader21.freebsd.x86_64.so +0 -0
- data/rgloader/rgloader21.linux.so +0 -0
- data/rgloader/rgloader21.linux.x86_64.so +0 -0
- data/rgloader/rgloader21.mingw.so +0 -0
- data/rgloader/rgloader21.mingw.x64.so +0 -0
- data/rgloader/rgloader22.darwin.bundle +0 -0
- data/rgloader/rgloader22.freebsd.so +0 -0
- data/rgloader/rgloader22.linux.so +0 -0
- data/rgloader/rgloader22.linux.x86_64.so +0 -0
- data/rgloader/rgloader22.mingw.so +0 -0
- data/rgloader/rgloader22.mingw.x64.so +0 -0
- data/spec/bin/jackup_cmd_shared.rb +176 -0
- data/spec/bin/jackup_cmd_spec.rb +292 -0
- data/spec/lib/abtract_spec.rb +56 -0
- data/spec/lib/jackbox/examples/dir_spec.rb +112 -0
- data/spec/lib/jackbox/examples/dx_spec.rb +346 -0
- data/spec/lib/jackbox/examples/result.xml +15 -0
- data/spec/lib/jackbox/examples/source1.xml +11 -0
- data/spec/lib/jackbox/examples/source2.xml +15 -0
- data/spec/lib/jackbox/examples/source3.xml +11 -0
- data/spec/lib/jackbox/examples/trasnformers_spec.rb +35 -0
- data/spec/lib/jackbox/injector_composition_spec.rb +950 -0
- data/spec/lib/jackbox/injector_directives_spec.rb +266 -0
- data/spec/lib/jackbox/injector_inheritance_spec.rb +799 -0
- data/spec/lib/jackbox/injector_introspection_spec.rb +614 -0
- data/spec/lib/jackbox/injector_namespacing_spec.rb +345 -0
- data/spec/lib/jackbox/injector_spec.rb +847 -0
- data/spec/lib/jackbox/injector_versioning_spec.rb +334 -0
- data/spec/lib/jackbox/patterns_spec.rb +410 -0
- data/spec/lib/jackbox/prefs_spec.rb +212 -0
- data/spec/lib/jackbox/reclassing_spec.rb +394 -0
- data/spec/lib/jackbox_spec.rb +595 -0
- data/spec/spec_helper.rb +139 -0
- metadata +218 -0
@@ -0,0 +1,212 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
=begin rdoc
|
3
|
+
prefs_spec
|
4
|
+
author: Lou Henry
|
5
|
+
:nodoc:all
|
6
|
+
=end
|
7
|
+
|
8
|
+
include Injectors
|
9
|
+
|
10
|
+
describe 'what Prefs does' do
|
11
|
+
|
12
|
+
it 'creates module level attribute methods' do
|
13
|
+
module Tester
|
14
|
+
extend Prefs
|
15
|
+
|
16
|
+
pref :pref1 => 10
|
17
|
+
end
|
18
|
+
|
19
|
+
lambda{
|
20
|
+
Tester.pref1.should == 10
|
21
|
+
|
22
|
+
}.should_not raise_error()
|
23
|
+
lambda{
|
24
|
+
Tester.pref1=( 2 )
|
25
|
+
|
26
|
+
}.should_not raise_error()
|
27
|
+
Tester.pref1.should == 2
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'should work the same on inclusion' do
|
31
|
+
lambda {
|
32
|
+
module Fester
|
33
|
+
include Prefs
|
34
|
+
|
35
|
+
pref :location => :file_system
|
36
|
+
end
|
37
|
+
}.should_not raise_error()
|
38
|
+
Fester.location.should == :file_system
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'allows resetting prefs to their original/default values' do
|
42
|
+
module Jester
|
43
|
+
extend Prefs
|
44
|
+
|
45
|
+
pref :value => 10
|
46
|
+
end
|
47
|
+
Jester.value.should == 10
|
48
|
+
Jester.value = 3
|
49
|
+
Jester.value.should == 3
|
50
|
+
Jester.reset :value
|
51
|
+
Jester.value.should == 10
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'persists across processes' do
|
55
|
+
# we run a process and make settings
|
56
|
+
launch %{
|
57
|
+
require 'jackbox'
|
58
|
+
|
59
|
+
class Application
|
60
|
+
include Prefs
|
61
|
+
|
62
|
+
pref :data_path => "#{ENV['HOME']}/tmp/jackbox"
|
63
|
+
|
64
|
+
def foo
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
#...
|
69
|
+
|
70
|
+
Application.data_path = "#{ENV['HOME']}/tmp/foo"
|
71
|
+
}
|
72
|
+
Process.waitall
|
73
|
+
|
74
|
+
# After the previous invocation
|
75
|
+
class Application
|
76
|
+
include Prefs
|
77
|
+
|
78
|
+
pref :data_path => "#{ENV['HOME']}/tmp/jackbox"
|
79
|
+
|
80
|
+
def foo
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# ...
|
85
|
+
|
86
|
+
Application.data_path.should == "#{ENV['HOME']}/tmp/foo"
|
87
|
+
|
88
|
+
# ...
|
89
|
+
|
90
|
+
Application.reset
|
91
|
+
Application.data_path.should == "#{ENV['HOME']}/tmp/jackbox"
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should allow definition of prefs outside the module definition' do
|
95
|
+
lambda{
|
96
|
+
Tester.pref :new_prop => 3
|
97
|
+
|
98
|
+
}.should_not raise_error()
|
99
|
+
Tester.pref :someprop => 'tester'
|
100
|
+
|
101
|
+
lambda{
|
102
|
+
Tester.someprop
|
103
|
+
|
104
|
+
}.should_not raise_error
|
105
|
+
Tester.someprop.should == 'tester'
|
106
|
+
end
|
107
|
+
|
108
|
+
it 'should not pass-on definitions to descendants' do
|
109
|
+
module Tester
|
110
|
+
include Prefs
|
111
|
+
pref :pref1 => 10
|
112
|
+
end
|
113
|
+
lambda{Tester.pref1}.should_not raise_error
|
114
|
+
module Descendant
|
115
|
+
include Tester
|
116
|
+
end
|
117
|
+
lambda{Descendant.pref1}.should raise_error(NoMethodError)
|
118
|
+
module Offspring
|
119
|
+
extend Tester
|
120
|
+
end
|
121
|
+
lambda{Offspring.pref1}.should raise_error(NoMethodError)
|
122
|
+
class Child
|
123
|
+
include Tester
|
124
|
+
extend Tester
|
125
|
+
end
|
126
|
+
lambda{Child.pref1}.should raise_error(NoMethodError)
|
127
|
+
lambda{Child.new.pref1}.should raise_error(NoMethodError)
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'should allow all of the following' do
|
131
|
+
lambda{
|
132
|
+
module Master
|
133
|
+
extend Prefs
|
134
|
+
|
135
|
+
pref :tester => 10
|
136
|
+
end
|
137
|
+
|
138
|
+
Master.pref :boo => 45
|
139
|
+
Master.boo = [23,45,32,56]
|
140
|
+
Master.tester = 30
|
141
|
+
Master.reset :tester
|
142
|
+
Master.pref :second => 'second'
|
143
|
+
Master.second = 'first'
|
144
|
+
|
145
|
+
module Extras
|
146
|
+
extend Prefs
|
147
|
+
|
148
|
+
pref :a => 10
|
149
|
+
pref :reminders_on => true
|
150
|
+
pref :interval => 60
|
151
|
+
pref :log_file => "/d/workspace"
|
152
|
+
pref :tester => :mary
|
153
|
+
|
154
|
+
self.a = :b
|
155
|
+
#TODO: problem: local variables override prefs
|
156
|
+
a = 'c'
|
157
|
+
self.reminders_on = false
|
158
|
+
self.interval=45
|
159
|
+
end
|
160
|
+
}.should_not raise_error
|
161
|
+
|
162
|
+
lambda {
|
163
|
+
module Tester
|
164
|
+
extend Prefs
|
165
|
+
|
166
|
+
pref :foo => true
|
167
|
+
pref :faa => :is_not_error
|
168
|
+
end}.should_not raise_error
|
169
|
+
Tester.foo.should == true
|
170
|
+
Tester.faa.should == :is_not_error
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'should also allow classes to be used' do
|
175
|
+
class C
|
176
|
+
extend Prefs
|
177
|
+
|
178
|
+
pref :boo => "something"
|
179
|
+
end
|
180
|
+
C.boo.should == 'something'
|
181
|
+
lambda{C.boo=(3)}.should_not raise_error
|
182
|
+
lambda{C.new.boo}.should raise_error(NoMethodError)
|
183
|
+
end
|
184
|
+
|
185
|
+
it 'should be possible to reset the prefs to their defaults' do
|
186
|
+
lambda{Tester.reset}.should_not raise_error
|
187
|
+
end
|
188
|
+
|
189
|
+
it 'should allow definition of prefs store location' do
|
190
|
+
class One
|
191
|
+
extend Prefs
|
192
|
+
prefs_path 'spec/some_path'
|
193
|
+
|
194
|
+
pref :gaga => 3456
|
195
|
+
end
|
196
|
+
One.gaga.should == 3456
|
197
|
+
|
198
|
+
File.should exist('spec/some_path/prefs')
|
199
|
+
end
|
200
|
+
|
201
|
+
the 'Prefs module also works with Injectors' do
|
202
|
+
|
203
|
+
injector :prefs_tester do
|
204
|
+
extend Prefs
|
205
|
+
pref :some_pref => 'value'
|
206
|
+
end
|
207
|
+
|
208
|
+
prefs_tester.some_pref.should == 'value'
|
209
|
+
end
|
210
|
+
|
211
|
+
end
|
212
|
+
|
@@ -0,0 +1,394 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
=begin rdoc
|
3
|
+
This file represents a new approach to refining a class using Jackbox modular closures.
|
4
|
+
|
5
|
+
lha
|
6
|
+
=end
|
7
|
+
|
8
|
+
# Jackbox Reclassings
|
9
|
+
############################################
|
10
|
+
|
11
|
+
# RubyProf.start
|
12
|
+
|
13
|
+
injector :StringExtensions do # define injector
|
14
|
+
def to_s
|
15
|
+
super + '++++'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# debugger
|
20
|
+
lets String do # apply to class
|
21
|
+
include StringExtensions()
|
22
|
+
end
|
23
|
+
|
24
|
+
assert( String('boo').to_s == 'boo++++' )
|
25
|
+
assert( String("").class == String )
|
26
|
+
|
27
|
+
describe :String do
|
28
|
+
it 'should pass' do
|
29
|
+
String('boo').to_s.should == 'boo++++'
|
30
|
+
end
|
31
|
+
# introspecting on Type
|
32
|
+
it 'should be class String' do
|
33
|
+
String('boo').class.should be(String)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
# Another Reclassing
|
39
|
+
|
40
|
+
jack :ArrayExtensions do
|
41
|
+
def to_s
|
42
|
+
super + '####'
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
lets Array do
|
47
|
+
inject ArrayExtensions()
|
48
|
+
end
|
49
|
+
|
50
|
+
assert(Array(3).to_s == "[nil, nil, nil]####")
|
51
|
+
assert(Array(3).class == Array)
|
52
|
+
|
53
|
+
describe :Array do
|
54
|
+
it 'allows the following' do
|
55
|
+
Array(3).to_s.should == "[nil, nil, nil]####"
|
56
|
+
end
|
57
|
+
# introspecting on Type
|
58
|
+
it 'should be Array' do
|
59
|
+
Array(3).class.should be(Array)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# ORIGINAL CLASSES REMAIN UNTOUCHED!!!
|
64
|
+
##################################################
|
65
|
+
assert( String.new.to_s == '' ) #
|
66
|
+
assert( Array.new(3).to_s == '[nil, nil, nil]' ) #
|
67
|
+
#
|
68
|
+
describe String do #
|
69
|
+
it 'should remain untouched' do #
|
70
|
+
String.new('bar').should == 'bar' #
|
71
|
+
end #
|
72
|
+
end #
|
73
|
+
#
|
74
|
+
describe Array do #
|
75
|
+
it 'should remain untouched' do #
|
76
|
+
Array.new(3).should == [nil, nil, nil] #
|
77
|
+
end #
|
78
|
+
end #
|
79
|
+
##################################################
|
80
|
+
# ORIGINAL CLASSES REMAIN UNTOUCHED!!!
|
81
|
+
|
82
|
+
# ORIGINAL KERNEL METHODS REMAIN UNTOUCHED!!!
|
83
|
+
##################################################
|
84
|
+
assert( Kernel.String(123) == '123' ) #
|
85
|
+
assert( Kernel.Array(3) == [3]) #
|
86
|
+
#
|
87
|
+
describe :'Kernel.String' do #
|
88
|
+
it 'should reamain untouched' do #
|
89
|
+
Kernel.String(123).should == '123' #
|
90
|
+
end #
|
91
|
+
end #
|
92
|
+
#
|
93
|
+
describe :'Kernel.Array' do #
|
94
|
+
it 'should reamain untouched' do #
|
95
|
+
Kernel.Array([1,2,3]).should == [1,2,3] #
|
96
|
+
end #
|
97
|
+
end #
|
98
|
+
##################################################
|
99
|
+
# ORIGINAL KERNEL METHODS REMAIN UNTOUCHED!!!
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
# Namespaced Reclassings
|
106
|
+
##################################################
|
107
|
+
|
108
|
+
jack :NameSpacedArrayExtensions do
|
109
|
+
def to_s
|
110
|
+
super + '!!!!'
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
module M7
|
115
|
+
|
116
|
+
# Internal reclassing
|
117
|
+
|
118
|
+
lets Array do
|
119
|
+
inject NameSpacedArrayExtensions()
|
120
|
+
end
|
121
|
+
|
122
|
+
def foo_bar
|
123
|
+
Array(2)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
class A6
|
128
|
+
include M7
|
129
|
+
end
|
130
|
+
|
131
|
+
|
132
|
+
describe "Internal Array()" do
|
133
|
+
it 'should pass' do
|
134
|
+
A6.new.foo_bar.to_s.should == '[nil, nil]!!!!'
|
135
|
+
end
|
136
|
+
# introspecting on Type
|
137
|
+
it 'should be an Array' do
|
138
|
+
A6.new.foo_bar.class.should be(Array)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
|
143
|
+
|
144
|
+
|
145
|
+
# Further Introspection
|
146
|
+
##################################################
|
147
|
+
# debugger
|
148
|
+
assert( A6.new.foo_bar.injectors.by_name == [:NameSpacedArrayExtensions] )
|
149
|
+
|
150
|
+
describe "introspection" do
|
151
|
+
|
152
|
+
# introspecting on capabilities
|
153
|
+
|
154
|
+
it 'should allow injector introspection' do
|
155
|
+
# # top level re-class
|
156
|
+
Array() do
|
157
|
+
injectors.by_name.should == [:ArrayExtensions]
|
158
|
+
end
|
159
|
+
# debugger
|
160
|
+
Array(){injectors.by_name}.should == [:ArrayExtensions]
|
161
|
+
|
162
|
+
# top level re-class instances
|
163
|
+
Array(1).injectors.by_name == [:ArrayExtensions]
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
it 'works on namespaced reclassings' do
|
168
|
+
module M7
|
169
|
+
# debugger
|
170
|
+
Array() do
|
171
|
+
injectors.by_name.should == [:NameSpacedArrayExtensions]
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
it 'can test the existence of a re-classing' do
|
177
|
+
|
178
|
+
reclass?(String).should == true
|
179
|
+
reclass?(Array).should == true
|
180
|
+
|
181
|
+
module M7
|
182
|
+
reclass? Array
|
183
|
+
end.should == true
|
184
|
+
|
185
|
+
module M8
|
186
|
+
reclass? Array
|
187
|
+
end.should == false
|
188
|
+
|
189
|
+
module M9
|
190
|
+
reclass? String
|
191
|
+
end.should == false
|
192
|
+
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'works' do
|
196
|
+
|
197
|
+
# Injector declaration
|
198
|
+
|
199
|
+
jack :StringRefinements do
|
200
|
+
lets String do
|
201
|
+
with singleton_class do
|
202
|
+
alias _new new
|
203
|
+
def new *args, &code
|
204
|
+
super(*args, &code) + ' is a special string'
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
class OurClass
|
211
|
+
include StringRefinements()
|
212
|
+
|
213
|
+
def foo_bar
|
214
|
+
String('foo and bar')
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
c = OurClass.new
|
219
|
+
c.foo_bar.class.should == String
|
220
|
+
c.foo_bar.should == 'foo and bar is a special string'
|
221
|
+
expect{c.foo_bar.extra.should == :extra}.to raise_error(NoMethodError)
|
222
|
+
|
223
|
+
StringRefinements do
|
224
|
+
String() do
|
225
|
+
def extra
|
226
|
+
:extra
|
227
|
+
end
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
c.foo_bar.should == 'foo and bar is a special string'
|
232
|
+
c.foo_bar.class.should == String
|
233
|
+
c.foo_bar.extra.should == :extra
|
234
|
+
|
235
|
+
SR = StringRefinements do # New Version
|
236
|
+
lets String do
|
237
|
+
def to_s
|
238
|
+
super + '****'
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
# c is still the same
|
244
|
+
|
245
|
+
c.foo_bar.should == 'foo and bar is a special string'
|
246
|
+
c.foo_bar.class.should == String
|
247
|
+
c.foo_bar.extra.should == :extra
|
248
|
+
|
249
|
+
|
250
|
+
class OurOtherClass
|
251
|
+
include SR # Apply new version
|
252
|
+
# to another class
|
253
|
+
def foo_bar
|
254
|
+
String('foo and bar')
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
d = OurOtherClass.new
|
259
|
+
d.foo_bar.should == 'foo and bar'
|
260
|
+
d.foo_bar.to_s.should == 'foo and bar****'
|
261
|
+
expect{ d.extra }.to raise_error(NoMethodError)
|
262
|
+
|
263
|
+
end
|
264
|
+
end
|
265
|
+
|
266
|
+
|
267
|
+
|
268
|
+
|
269
|
+
|
270
|
+
# Calls deeper down the hierarchy
|
271
|
+
##################################################
|
272
|
+
|
273
|
+
module M5
|
274
|
+
def self.foo
|
275
|
+
String('foo').to_s
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
assert( M5.foo == 'foo++++' )
|
280
|
+
|
281
|
+
describe M5 do
|
282
|
+
it 'works' do
|
283
|
+
M5.foo.should == 'foo++++'
|
284
|
+
end
|
285
|
+
it 'should be String' do
|
286
|
+
M5.foo.class.should be(String)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
# even deeper
|
291
|
+
|
292
|
+
class A5
|
293
|
+
module M6
|
294
|
+
def meth arg
|
295
|
+
String(arg).to_s
|
296
|
+
end
|
297
|
+
end
|
298
|
+
include M6
|
299
|
+
end
|
300
|
+
|
301
|
+
assert(A5.new.meth("meth")== 'meth++++')
|
302
|
+
|
303
|
+
describe A5 do
|
304
|
+
it "shold pass" do
|
305
|
+
A5.new.meth("meth").should == 'meth++++'
|
306
|
+
end
|
307
|
+
# introspecting on Type
|
308
|
+
it 'should be a String' do
|
309
|
+
A5.new.meth("meth").class.should be(String)
|
310
|
+
end
|
311
|
+
|
312
|
+
it 'should hold access to top level re-class' do
|
313
|
+
class A5
|
314
|
+
module M6
|
315
|
+
String(){injectors.by_name}.should == [:StringExtensions]
|
316
|
+
end
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
|
322
|
+
|
323
|
+
|
324
|
+
# re- Reclassing
|
325
|
+
################################################
|
326
|
+
|
327
|
+
MyStringExtensions = StringExtensions() do
|
328
|
+
def to_s
|
329
|
+
super + '----'
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
describe 're-reclassing' do
|
334
|
+
it 'should pass' do
|
335
|
+
String() do
|
336
|
+
update MyStringExtensions
|
337
|
+
end
|
338
|
+
|
339
|
+
String('standard').to_s.should == 'standard----'
|
340
|
+
end
|
341
|
+
# introspecting on Type
|
342
|
+
it 'should be a String' do
|
343
|
+
String('standard').class.should be(String)
|
344
|
+
end
|
345
|
+
|
346
|
+
it 'should introspect' do
|
347
|
+
String(){injectors}.first.should == MyStringExtensions
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
|
352
|
+
|
353
|
+
# TOP LEVEL RECLASSINGS REMAIN UNTOUCHED!!!
|
354
|
+
##################################################
|
355
|
+
#
|
356
|
+
assert( String('test').to_s == 'test++++' ) #
|
357
|
+
assert( Array(3).to_s == '[nil, nil, nil]####' ) #
|
358
|
+
#
|
359
|
+
##################################################
|
360
|
+
# TOP LEVEL RECLASSINGS REMAIN UNTOUCHED!!!
|
361
|
+
|
362
|
+
# TOP LEVEL RECLASSING TYPES REMAIN UNTOUCHED!!!
|
363
|
+
##################################################
|
364
|
+
#
|
365
|
+
assert( String('test').class == String ) #
|
366
|
+
assert( Array(3).class == Array ) #
|
367
|
+
#
|
368
|
+
##################################################
|
369
|
+
# TOP LEVEL RECLASSING TYPES REMAIN UNTOUCHED!!!
|
370
|
+
|
371
|
+
# ORIGINAL CLASSES REMAIN UNTOUCHED!!!
|
372
|
+
##################################################
|
373
|
+
#
|
374
|
+
assert(String.new.to_s == '') #
|
375
|
+
assert(Array.new(3).to_s == '[nil, nil, nil]') #
|
376
|
+
#
|
377
|
+
##################################################
|
378
|
+
# ORIGINAL CLASSES REMAIN UNTOUCHED!!!
|
379
|
+
|
380
|
+
# ORIGINAL KERNEL METHODS REMAIN UNTOUCHED!!!
|
381
|
+
##################################################
|
382
|
+
#
|
383
|
+
assert( Kernel.String(123) == '123' ) #
|
384
|
+
assert( Kernel.Array(3) == [3]) #
|
385
|
+
#
|
386
|
+
##################################################
|
387
|
+
# ORIGINAL KERNEL METHODS REMAIN UNTOUCHED!!!
|
388
|
+
|
389
|
+
# profile = RubyProf.stop
|
390
|
+
# RubyProf::FlatPrinter.new(profile).print(STDOUT)
|
391
|
+
# RubyProf::GraphHtmlPrinter.new(profile).print(open('profile.html', 'w+'))
|
392
|
+
# RubyProf::CallStackPrinter.new(profile).print(open('profile.html', 'w+'))
|
393
|
+
|
394
|
+
|