jackbox 0.9.6.2
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.
- 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
|
+
|