reflexive 0.0.6 → 0.1.0
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.
- data/Gemfile +9 -7
- data/Rakefile +10 -4
- data/config.ru +1 -1
- data/lib/reflexive/application.rb +50 -30
- data/lib/reflexive/coderay_html_encoder.rb +1 -1
- data/lib/reflexive/coderay_ruby_scanner.rb +2 -0
- data/lib/reflexive/core_ext/module/reflexive_instance_methods.rb +44 -0
- data/lib/reflexive/descendants.rb +12 -2
- data/lib/reflexive/helpers.rb +26 -9
- data/lib/reflexive/method_lookup.rb +199 -0
- data/lib/reflexive/methods.rb +3 -2
- data/lib/reflexive/parse_tree_top_down_walker.rb +69 -8
- data/lib/reflexive/reflexive_ripper.rb +5 -2
- data/lib/reflexive/routing_helpers.rb +74 -53
- data/public/stylesheets/reflexive/reflexive.css +5 -0
- data/reflexive.gemspec +9 -6
- data/spec/coderay_html_encoder_spec.rb +8 -2
- data/spec/integration_spec.rb +227 -0
- data/spec/integration_spec_fixture.rb +87 -0
- data/spec/method_lookup_spec.rb +348 -0
- data/spec/methods_spec.rb +246 -28
- data/spec/rails_integration_spec.rb +7 -0
- data/spec/rails_integration_spec_helper.rb +21 -11
- data/spec/reflexive_ripper_spec.rb +57 -19
- data/spec/reflexive_spec.rb +15 -0
- data/views/constants_show.erb +18 -1
- data/views/dashboard.erb +3 -4
- data/views/layout.erb +10 -0
- data/views/methods_apidock.erb +9 -1
- data/views/methods_choose.erb +19 -0
- metadata +76 -40
@@ -0,0 +1,87 @@
|
|
1
|
+
require "ostruct"
|
2
|
+
|
3
|
+
module IntegrationSpecFixture
|
4
|
+
module TestBaseModule
|
5
|
+
end
|
6
|
+
|
7
|
+
module TestModule
|
8
|
+
include TestBaseModule
|
9
|
+
def module_meth
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.module_class_meth
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class TestBaseClass
|
17
|
+
def inherited_meth
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.inherited_class_meth
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.another_inherited_class_meth
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class TestClass < TestBaseClass
|
28
|
+
include TestModule
|
29
|
+
|
30
|
+
another_inherited_class_meth
|
31
|
+
|
32
|
+
def self.class_meth
|
33
|
+
inherited_class_meth
|
34
|
+
end
|
35
|
+
|
36
|
+
def public_meth
|
37
|
+
inherited_meth
|
38
|
+
end
|
39
|
+
|
40
|
+
class_eval do
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
def protected_meth
|
45
|
+
local_var = 42
|
46
|
+
another_local_var = 42 + local_var
|
47
|
+
not_defined_meth
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
def private_meth
|
52
|
+
end
|
53
|
+
|
54
|
+
class NestedClass
|
55
|
+
def meth
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
module HeuristicLookupBaseModule
|
61
|
+
end
|
62
|
+
|
63
|
+
class HeuristicLookupIncludingClass1
|
64
|
+
include HeuristicLookupBaseModule
|
65
|
+
def meth
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
class HeuristicLookupIncludingClass2
|
70
|
+
include HeuristicLookupBaseModule
|
71
|
+
def meth
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
class HeuristicLookupBaseClass
|
76
|
+
end
|
77
|
+
|
78
|
+
class HeuristicLookupInheritingClass1 < HeuristicLookupBaseClass
|
79
|
+
def meth
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
class HeuristicLookupInheritingClass2 < HeuristicLookupBaseClass
|
84
|
+
def meth
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,348 @@
|
|
1
|
+
require "reflexive/method_lookup"
|
2
|
+
|
3
|
+
class TestBaseClass
|
4
|
+
def self.inherited_class_meth
|
5
|
+
end
|
6
|
+
|
7
|
+
def inherited_instance_meth
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class TestClass < TestBaseClass
|
12
|
+
def initialize
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.class_meth
|
16
|
+
end
|
17
|
+
|
18
|
+
def instance_meth
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
module TestBaseModule
|
23
|
+
def inherited_module_meth
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
module TestModule
|
28
|
+
include TestBaseModule
|
29
|
+
|
30
|
+
def self.class_module_meth
|
31
|
+
end
|
32
|
+
|
33
|
+
def instance_module_meth
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class TestCoreMethodsCallingClass
|
38
|
+
# # Module is class
|
39
|
+
# # Module class
|
40
|
+
# Module.new
|
41
|
+
# Module.nesting
|
42
|
+
# Module.constants
|
43
|
+
#
|
44
|
+
# # Module instance
|
45
|
+
# class_eval do
|
46
|
+
#
|
47
|
+
# end
|
48
|
+
# # many more...
|
49
|
+
#
|
50
|
+
# # Class class
|
51
|
+
# Class.inherited
|
52
|
+
# Class.new
|
53
|
+
#
|
54
|
+
# # Class instance
|
55
|
+
# allocate
|
56
|
+
# new
|
57
|
+
# superclass
|
58
|
+
#
|
59
|
+
# # Object instance
|
60
|
+
# Object.new # single
|
61
|
+
#
|
62
|
+
# # Object instance
|
63
|
+
# clone
|
64
|
+
# dup
|
65
|
+
# freeze
|
66
|
+
#
|
67
|
+
# # Kernel is module
|
68
|
+
# # Kernel instance
|
69
|
+
# Array
|
70
|
+
# caller
|
71
|
+
# # many more...
|
72
|
+
end
|
73
|
+
|
74
|
+
describe Reflexive::MethodLookup do
|
75
|
+
def ml(*args)
|
76
|
+
Reflexive::MethodLookup.new(*args)
|
77
|
+
end
|
78
|
+
|
79
|
+
def lookup_definitions(klass, level, name)
|
80
|
+
Reflexive::MethodLookup.new(klass: klass, level: level, name: name).definitions
|
81
|
+
end
|
82
|
+
|
83
|
+
def lookup_documentations(klass, level, name)
|
84
|
+
Reflexive::MethodLookup.new(klass: klass, level: level, name: name).documentations
|
85
|
+
end
|
86
|
+
|
87
|
+
it "requires :klass, :level, :name as constructor arguments" do
|
88
|
+
proc { ml }.should raise_error(ArgumentError)
|
89
|
+
proc { ml(klass: TestClass) }.should raise_error(ArgumentError)
|
90
|
+
proc { ml(level: :instance) }.should raise_error(ArgumentError)
|
91
|
+
proc { ml(name: :meth) }.should raise_error(ArgumentError)
|
92
|
+
proc { ml(klass: TestClass, level: :class) }.should raise_error(ArgumentError)
|
93
|
+
proc { ml(klass: TestClass, level: :class, name: "meth") }.should_not raise_error
|
94
|
+
end
|
95
|
+
|
96
|
+
it "finds defined inherited instance methods for class" do
|
97
|
+
lookup_definitions(TestClass, :instance, :inherited_instance_meth).should ==
|
98
|
+
[[TestClass, :instance, :inherited_instance_meth]]
|
99
|
+
end
|
100
|
+
|
101
|
+
it "handles level and module names passed as strings normalizing them to symbols" do
|
102
|
+
lookup_definitions(TestClass, "instance", "inherited_instance_meth").should ==
|
103
|
+
[[TestClass, :instance, :inherited_instance_meth]]
|
104
|
+
end
|
105
|
+
|
106
|
+
it "finds defined inherited instance methods for module" do
|
107
|
+
lookup_definitions(TestModule, :instance, :inherited_module_meth).should ==
|
108
|
+
[[TestModule, :instance, :inherited_module_meth]]
|
109
|
+
end
|
110
|
+
|
111
|
+
it "finds defined owned instance methods for class" do
|
112
|
+
lookup_definitions(TestClass, :instance, :instance_meth).should ==
|
113
|
+
[[TestClass, :instance, :instance_meth]]
|
114
|
+
end
|
115
|
+
|
116
|
+
it "finds defined owned instance methods for module" do
|
117
|
+
lookup_definitions(TestModule, :instance, :instance_module_meth).should ==
|
118
|
+
[[TestModule, :instance, :instance_module_meth]]
|
119
|
+
end
|
120
|
+
|
121
|
+
it "finds defined inherited class methods" do
|
122
|
+
lookup_definitions(TestClass, :class, :inherited_class_meth).should ==
|
123
|
+
[[TestClass, :class, :inherited_class_meth]]
|
124
|
+
end
|
125
|
+
|
126
|
+
it "finds defined owned class methods for class" do
|
127
|
+
lookup_definitions(TestClass, :class, :class_meth).should ==
|
128
|
+
[[TestClass, :class, :class_meth]]
|
129
|
+
end
|
130
|
+
|
131
|
+
it "finds defined owned class methods for module" do
|
132
|
+
lookup_definitions(TestModule, :class, :class_module_meth).should ==
|
133
|
+
[[TestModule, :class, :class_module_meth]]
|
134
|
+
end
|
135
|
+
|
136
|
+
it "redirects class new method to instance initialize for classes" do
|
137
|
+
lookup_definitions(TestClass, :class, :new).should ==
|
138
|
+
[[TestClass, :instance, :initialize]]
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "lookup of core native methods" do
|
142
|
+
it "for Kernel always redirects to instance methods" do
|
143
|
+
lookup_documentations(TestClass, :class, :require).should ==
|
144
|
+
[[Kernel, :instance, :require]]
|
145
|
+
|
146
|
+
lookup_documentations(TestClass, :instance, :require).should ==
|
147
|
+
[[Kernel, :instance, :require]]
|
148
|
+
end
|
149
|
+
|
150
|
+
it "for Module redirects to instance methods mostly" do
|
151
|
+
lookup_documentations(TestClass, :class, :class_eval).should ==
|
152
|
+
[[Module, :instance, :class_eval]]
|
153
|
+
|
154
|
+
lookup_documentations(Module, :class, :nesting).should ==
|
155
|
+
[[Module, :class, :nesting]]
|
156
|
+
|
157
|
+
# lookup_documentations(TestClass, :instance, :require).should ==
|
158
|
+
# [[Kernel, :instance, :require]]
|
159
|
+
end
|
160
|
+
|
161
|
+
it "for Class redirects to instance methods mostly" do
|
162
|
+
lookup_documentations(TestClass, :class, :superclass).should ==
|
163
|
+
[[Class, :instance, :superclass]]
|
164
|
+
|
165
|
+
|
166
|
+
# lookup_documentations(TestClass, :instance, :require).should ==
|
167
|
+
# [[Kernel, :instance, :require]]
|
168
|
+
end
|
169
|
+
|
170
|
+
class InheritedFromDir < Dir
|
171
|
+
end
|
172
|
+
|
173
|
+
it "doesn't handle normal library classes in a specific way" do
|
174
|
+
lookup_documentations(File, :class, :expand_path).should ==
|
175
|
+
[[File, :class, :expand_path]]
|
176
|
+
lookup_documentations(Dir, :instance, :path).should ==
|
177
|
+
[[Dir, :instance, :path]]
|
178
|
+
lookup_documentations(InheritedFromDir, :instance, :path).should ==
|
179
|
+
[[Dir, :instance, :path]]
|
180
|
+
lookup_documentations(InheritedFromDir, :class, :entries).should ==
|
181
|
+
[[Dir, :class, :entries]]
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
describe "heuristic lookup" do
|
186
|
+
|
187
|
+
describe "for just included module" do
|
188
|
+
module JustIncludedModule
|
189
|
+
def module_instance_meth
|
190
|
+
instance_meth
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
class IncludesJustIncludedModule
|
195
|
+
include JustIncludedModule
|
196
|
+
|
197
|
+
def instance_meth
|
198
|
+
42
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
class IncludesJustIncludedModuleAnother
|
203
|
+
include JustIncludedModule
|
204
|
+
|
205
|
+
def instance_meth
|
206
|
+
43
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
class IncludesJustIncludedModuleYetAnother
|
211
|
+
include JustIncludedModule
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should setup sane fixture" do
|
215
|
+
IncludesJustIncludedModule.new.module_instance_meth.should == 42
|
216
|
+
IncludesJustIncludedModuleAnother.new.module_instance_meth.should == 43
|
217
|
+
end
|
218
|
+
|
219
|
+
it "finds instance_meth" do
|
220
|
+
lookup_definitions(JustIncludedModule, :instance, :instance_meth).should =~
|
221
|
+
[[IncludesJustIncludedModule, :instance, :instance_meth],
|
222
|
+
[IncludesJustIncludedModuleAnother, :instance, :instance_meth]]
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
describe "for module included in singleton class" do
|
227
|
+
module JustIncludedInSingletonModule
|
228
|
+
def module_class_meth
|
229
|
+
class_meth
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
class IncludesJustIncludedInSingletonModule
|
234
|
+
extend JustIncludedInSingletonModule
|
235
|
+
|
236
|
+
def self.class_meth
|
237
|
+
42
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
it "should setup sane fixture" do
|
242
|
+
IncludesJustIncludedInSingletonModule.module_class_meth.should == 42
|
243
|
+
end
|
244
|
+
|
245
|
+
it "finds class_meth" do
|
246
|
+
lookup_definitions(JustIncludedInSingletonModule, :instance, :class_meth).should ==
|
247
|
+
[[IncludesJustIncludedInSingletonModule, :class, :class_meth]]
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
describe "for module included in module included in class in turn" do
|
252
|
+
module IncludedInModuleIncludedInClass
|
253
|
+
def module_instance_meth
|
254
|
+
class_instance_meth
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
module IncludesIncludedInModuleIncludedInClass
|
259
|
+
include IncludedInModuleIncludedInClass
|
260
|
+
end
|
261
|
+
|
262
|
+
class IncludesIncludesIncludedInModuleIncludedInClass
|
263
|
+
include IncludesIncludedInModuleIncludedInClass
|
264
|
+
def class_instance_meth
|
265
|
+
42
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
it "should setup sane fixture" do
|
270
|
+
IncludesIncludesIncludedInModuleIncludedInClass.new.module_instance_meth.should == 42
|
271
|
+
end
|
272
|
+
|
273
|
+
it "finds class_instance_meth" do
|
274
|
+
lookup_definitions(IncludedInModuleIncludedInClass, :instance, :class_instance_meth).should ==
|
275
|
+
[[IncludesIncludesIncludedInModuleIncludedInClass, :instance, :class_instance_meth]]
|
276
|
+
end
|
277
|
+
end
|
278
|
+
|
279
|
+
describe "for base class instance methods" do
|
280
|
+
class HeuristicLookupBaseClassInstanceMethods
|
281
|
+
def base_class_instance_meth
|
282
|
+
inherited_class_instance_meth
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
class HeuristicLookupInheritedClassInstanceMethods < HeuristicLookupBaseClassInstanceMethods
|
287
|
+
def inherited_class_instance_meth
|
288
|
+
42
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
class HeuristicLookupInheritedClassInstanceMethodsAnother < HeuristicLookupBaseClassInstanceMethods
|
293
|
+
def inherited_class_instance_meth
|
294
|
+
43
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
it "should setup sane fixture" do
|
299
|
+
HeuristicLookupInheritedClassInstanceMethods.new.base_class_instance_meth.should == 42
|
300
|
+
end
|
301
|
+
|
302
|
+
it "finds inherited_class_instance_meth" do
|
303
|
+
lookup_definitions(HeuristicLookupBaseClassInstanceMethods, :instance, :inherited_class_instance_meth).should =~
|
304
|
+
[[HeuristicLookupInheritedClassInstanceMethods, :instance, :inherited_class_instance_meth],
|
305
|
+
[HeuristicLookupInheritedClassInstanceMethodsAnother, :instance, :inherited_class_instance_meth]]
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
describe "for base class class methods" do
|
310
|
+
class HeuristicLookupBaseClassClassMethods
|
311
|
+
def self.base_class_class_meth
|
312
|
+
inherited_class_class_meth
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
class HeuristicLookupInheritedClassClassMethods < HeuristicLookupBaseClassClassMethods
|
317
|
+
def self.inherited_class_class_meth
|
318
|
+
42
|
319
|
+
end
|
320
|
+
end
|
321
|
+
|
322
|
+
it "should setup sane fixture" do
|
323
|
+
HeuristicLookupInheritedClassClassMethods.base_class_class_meth.should == 42
|
324
|
+
end
|
325
|
+
|
326
|
+
it "finds inherited_class_class_meth" do
|
327
|
+
lookup_definitions(HeuristicLookupBaseClassClassMethods, :class, :inherited_class_class_meth).should ==
|
328
|
+
[[HeuristicLookupInheritedClassClassMethods, :class, :inherited_class_class_meth]]
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
describe "last resort lookup" do
|
333
|
+
module LastResortTestModule
|
334
|
+
end
|
335
|
+
|
336
|
+
class LastResortTestClass
|
337
|
+
def some_really_uniq_instance_method
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
it "finds some_really_uniq_instance_method" do
|
342
|
+
lookup_definitions(LastResortTestModule, :instance, :some_really_uniq_instance_method).should ==
|
343
|
+
[[LastResortTestClass, :instance, :some_really_uniq_instance_method]]
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
data/spec/methods_spec.rb
CHANGED
@@ -14,26 +14,243 @@ Rspec::Matchers.define :generate_methods do |expected|
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
+
describe "Ruby reflection capabilities" do
|
18
|
+
describe "for Modules" do
|
19
|
+
describe "#singleton_class" do
|
20
|
+
specify ".public_instance_methods(false) returns empty list for empty module" do
|
21
|
+
Module.new.singleton_class.
|
22
|
+
reflexive_public_instance_methods(false).should == []
|
23
|
+
end
|
24
|
+
|
25
|
+
specify ".protected_instance_methods(false) returns empty list for empty module" do
|
26
|
+
Module.new.singleton_class.
|
27
|
+
reflexive_protected_instance_methods(false).should == []
|
28
|
+
end
|
29
|
+
|
30
|
+
specify ".private_instance_methods(false) returns empty list for empty module" do
|
31
|
+
Module.new.singleton_class.
|
32
|
+
reflexive_private_instance_methods(false).should == []
|
33
|
+
end
|
34
|
+
|
35
|
+
specify ".public_instance_methods(false) returns public methods" do
|
36
|
+
Module.new { def self.m; end }.singleton_class.
|
37
|
+
reflexive_public_instance_methods(false).should == [:m]
|
38
|
+
end
|
39
|
+
|
40
|
+
specify ".protected_instance_methods(false) returns protected methods" do
|
41
|
+
Module.new { class << self; protected; def m; end end }.singleton_class.
|
42
|
+
reflexive_protected_instance_methods(false).should == [:m]
|
43
|
+
end
|
44
|
+
|
45
|
+
specify ".private_instance_methods(false) returns private methods" do
|
46
|
+
Module.new { class << self; private; def m; end end }.singleton_class.
|
47
|
+
reflexive_private_instance_methods(false).should == [:m]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
specify ".public_instance_methods(false) returns empty list for empty module" do
|
52
|
+
Module.new.
|
53
|
+
reflexive_public_instance_methods(false).should == []
|
54
|
+
end
|
55
|
+
|
56
|
+
specify ".protected_instance_methods(false) returns empty list for empty module" do
|
57
|
+
Module.new.
|
58
|
+
reflexive_protected_instance_methods(false).should == []
|
59
|
+
end
|
60
|
+
|
61
|
+
specify ".private_instance_methods(false) returns empty list for empty module" do
|
62
|
+
Module.new.
|
63
|
+
reflexive_private_instance_methods(false).should == []
|
64
|
+
end
|
65
|
+
|
66
|
+
specify ".public_instance_methods(false) returns public methods" do
|
67
|
+
Module.new { def m; end }.
|
68
|
+
reflexive_public_instance_methods(false).should == [:m]
|
69
|
+
end
|
70
|
+
|
71
|
+
specify ".protected_instance_methods(false) returns protected methods" do
|
72
|
+
Module.new { protected; def m; end }.
|
73
|
+
reflexive_protected_instance_methods(false).should == [:m]
|
74
|
+
end
|
75
|
+
|
76
|
+
specify ".private_instance_methods(false) returns private methods" do
|
77
|
+
Module.new { private; def m; end }.
|
78
|
+
reflexive_private_instance_methods(false).should == [:m]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe "for Classes" do
|
83
|
+
class ::RubyReflectionCapabilitiesEmptyClass
|
84
|
+
end
|
85
|
+
|
86
|
+
class ::RubyReflectionCapabilitiesSingletonMethodsClass
|
87
|
+
class << self
|
88
|
+
def publ
|
89
|
+
end
|
90
|
+
protected
|
91
|
+
def prot
|
92
|
+
end
|
93
|
+
private
|
94
|
+
def priv
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
class ::RubyReflectionCapabilitiesInstanceMethodsClass
|
100
|
+
def publ
|
101
|
+
end
|
102
|
+
protected
|
103
|
+
def prot
|
104
|
+
end
|
105
|
+
private
|
106
|
+
def priv
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe "#singleton_class" do
|
111
|
+
specify ".public_instance_methods(false) returns empty list for empty class" do
|
112
|
+
RubyReflectionCapabilitiesEmptyClass.singleton_class.
|
113
|
+
reflexive_public_instance_methods(false).should == []
|
114
|
+
end
|
115
|
+
|
116
|
+
specify ".protected_instance_methods(false) returns empty list for empty class" do
|
117
|
+
RubyReflectionCapabilitiesEmptyClass.singleton_class.
|
118
|
+
reflexive_protected_instance_methods(false).should == []
|
119
|
+
end
|
120
|
+
|
121
|
+
specify ".private_instance_methods(false) returns empty list for empty class" do
|
122
|
+
RubyReflectionCapabilitiesEmptyClass.singleton_class.
|
123
|
+
reflexive_private_instance_methods(false).should == []
|
124
|
+
end
|
125
|
+
|
126
|
+
specify ".public_instance_methods(false) returns public methods" do
|
127
|
+
RubyReflectionCapabilitiesSingletonMethodsClass.singleton_class.
|
128
|
+
reflexive_public_instance_methods(false).should == [:publ]
|
129
|
+
end
|
130
|
+
|
131
|
+
specify ".protected_instance_methods(false) returns protected methods" do
|
132
|
+
RubyReflectionCapabilitiesSingletonMethodsClass.singleton_class.
|
133
|
+
reflexive_protected_instance_methods(false).should == [:prot]
|
134
|
+
end
|
135
|
+
|
136
|
+
specify ".private_instance_methods(false) returns private methods" do
|
137
|
+
RubyReflectionCapabilitiesSingletonMethodsClass.singleton_class.
|
138
|
+
reflexive_private_instance_methods(false).should == [:priv]
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
describe "#" do
|
143
|
+
specify ".public_instance_methods(false) returns empty list for empty class" do
|
144
|
+
RubyReflectionCapabilitiesEmptyClass.
|
145
|
+
reflexive_public_instance_methods(false).should == []
|
146
|
+
end
|
147
|
+
|
148
|
+
specify ".protected_instance_methods(false) returns empty list for empty class" do
|
149
|
+
RubyReflectionCapabilitiesEmptyClass.
|
150
|
+
reflexive_protected_instance_methods(false).should == []
|
151
|
+
end
|
152
|
+
|
153
|
+
specify ".private_instance_methods(false) returns empty list for empty class" do
|
154
|
+
RubyReflectionCapabilitiesEmptyClass.
|
155
|
+
reflexive_private_instance_methods(false).should == []
|
156
|
+
end
|
157
|
+
|
158
|
+
specify ".public_instance_methods(false) returns public methods" do
|
159
|
+
RubyReflectionCapabilitiesInstanceMethodsClass.
|
160
|
+
reflexive_public_instance_methods(false).should == [:publ]
|
161
|
+
end
|
162
|
+
|
163
|
+
specify ".protected_instance_methods(false) returns protected methods" do
|
164
|
+
RubyReflectionCapabilitiesInstanceMethodsClass.
|
165
|
+
reflexive_protected_instance_methods(false).should == [:prot]
|
166
|
+
end
|
167
|
+
|
168
|
+
specify ".private_instance_methods(false) returns private methods" do
|
169
|
+
RubyReflectionCapabilitiesInstanceMethodsClass.
|
170
|
+
reflexive_private_instance_methods(false).should == [:priv]
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
17
176
|
describe Reflexive::Methods do
|
177
|
+
describe "#trite_singleton_ancestors" do
|
178
|
+
it "returns some common trite objects" do
|
179
|
+
Reflexive::Methods.new(nil).
|
180
|
+
send(:trite_singleton_ancestors).
|
181
|
+
should(include(Class, Module, Object, BasicObject, Kernel))
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
describe "#trite_ancestors" do
|
186
|
+
it "returns some common trite objects" do
|
187
|
+
Reflexive::Methods.new(nil).
|
188
|
+
send(:trite_ancestors).
|
189
|
+
should(include(Object, Kernel, BasicObject))
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
describe "#collect_instance_methods" do
|
194
|
+
class ::CollectInstanceMethodsC
|
195
|
+
def public_instance_meth
|
196
|
+
end
|
197
|
+
protected
|
198
|
+
def protected_instance_meth
|
199
|
+
end
|
200
|
+
private
|
201
|
+
def private_instance_meth
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
it "collects own (defined in class) instance methods for class" do
|
206
|
+
Reflexive::Methods.new(nil).
|
207
|
+
send(:collect_instance_methods, ::CollectInstanceMethodsC).
|
208
|
+
should == { :public => [ :public_instance_meth ],
|
209
|
+
:protected => [ :protected_instance_meth ],
|
210
|
+
:private => [ :private_instance_meth ] }
|
211
|
+
end
|
212
|
+
|
213
|
+
module ::CollectInstanceMethodsEmptyM
|
214
|
+
end
|
215
|
+
|
216
|
+
it "reports empty own instance methods for empty module" do
|
217
|
+
Reflexive::Methods.new(nil).
|
218
|
+
send(:collect_instance_methods, ::CollectInstanceMethodsEmptyM).
|
219
|
+
should == nil
|
220
|
+
end
|
221
|
+
|
222
|
+
it "reports empty own class methods for empty module" do
|
223
|
+
Reflexive::Methods.new(nil).
|
224
|
+
send(:collect_instance_methods, ::CollectInstanceMethodsEmptyM.singleton_class).
|
225
|
+
should == nil
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
18
229
|
describe "ModuleInclusionC" do
|
19
|
-
module ModuleInclusionA
|
230
|
+
module ::ModuleInclusionA
|
20
231
|
def module_instance_from_A_WTF!
|
21
232
|
end
|
22
233
|
end
|
23
234
|
|
24
|
-
module ModuleInclusionB
|
25
|
-
include ModuleInclusionA
|
235
|
+
module ::ModuleInclusionB
|
236
|
+
include ::ModuleInclusionA
|
26
237
|
|
27
238
|
def module_instance_from_B_WTF!
|
28
239
|
end
|
29
240
|
end
|
30
241
|
|
31
|
-
module ModuleInclusionC
|
32
|
-
include ModuleInclusionB
|
242
|
+
module ::ModuleInclusionC
|
243
|
+
include ::ModuleInclusionB
|
244
|
+
end
|
245
|
+
|
246
|
+
it "has ModuleInclusionA and ModuleInclusionB ancestors" do
|
247
|
+
ModuleInclusionC.ancestors.should =~ [ ModuleInclusionC,
|
248
|
+
ModuleInclusionA,
|
249
|
+
ModuleInclusionB ]
|
33
250
|
end
|
34
251
|
|
35
252
|
it "works" do
|
36
|
-
ModuleInclusionC.should generate_methods(<<-METHODS_PP)
|
253
|
+
::ModuleInclusionC.should generate_methods(<<-METHODS_PP)
|
37
254
|
[{"[M] ModuleInclusionB"=>
|
38
255
|
{:instance=>{:public=>[:module_instance_from_B_WTF!]}}},
|
39
256
|
{"[M] ModuleInclusionA"=>
|
@@ -41,16 +258,17 @@ describe Reflexive::Methods do
|
|
41
258
|
METHODS_PP
|
42
259
|
end
|
43
260
|
end
|
261
|
+
|
44
262
|
describe "Inheritance" do
|
45
|
-
class InheritanceA
|
263
|
+
class ::InheritanceA
|
46
264
|
def self.singleton_inherited_from_A_WTF!
|
47
265
|
end
|
48
266
|
end
|
49
267
|
|
50
|
-
class InheritanceB < InheritanceA
|
268
|
+
class ::InheritanceB < ::InheritanceA
|
51
269
|
end
|
52
270
|
|
53
|
-
class InheritanceC < InheritanceB
|
271
|
+
class ::InheritanceC < ::InheritanceB
|
54
272
|
def test
|
55
273
|
end
|
56
274
|
end
|
@@ -64,19 +282,19 @@ describe Reflexive::Methods do
|
|
64
282
|
end
|
65
283
|
|
66
284
|
describe "SingletonAndInstance" do
|
67
|
-
module M
|
285
|
+
module ::M
|
68
286
|
def instance_from_moduleWTF!
|
69
287
|
end
|
70
288
|
end
|
71
289
|
|
72
|
-
module SM
|
290
|
+
module ::SM
|
73
291
|
def singleton_from_moduleWTF!
|
74
292
|
end
|
75
293
|
end
|
76
294
|
|
77
|
-
class SingletonAndInstanceTest
|
78
|
-
include M
|
79
|
-
extend SM
|
295
|
+
class ::SingletonAndInstanceTest
|
296
|
+
include ::M
|
297
|
+
extend ::SM
|
80
298
|
|
81
299
|
def self.singletonWTF!
|
82
300
|
end
|
@@ -97,7 +315,7 @@ describe Reflexive::Methods do
|
|
97
315
|
end
|
98
316
|
|
99
317
|
describe "ExtendWithInstanceAndClass" do
|
100
|
-
module ExtendWithInstanceAndClassM
|
318
|
+
module ::ExtendWithInstanceAndClassM
|
101
319
|
def self.singleton_WTF!
|
102
320
|
end
|
103
321
|
|
@@ -105,19 +323,19 @@ describe Reflexive::Methods do
|
|
105
323
|
end
|
106
324
|
end
|
107
325
|
|
108
|
-
class ExtendWithInstanceAndClass
|
109
|
-
extend ExtendWithInstanceAndClassM
|
326
|
+
class ::ExtendWithInstanceAndClass
|
327
|
+
extend ::ExtendWithInstanceAndClassM
|
110
328
|
end
|
111
329
|
|
112
330
|
it "works" do
|
113
|
-
ExtendWithInstanceAndClass.should generate_methods(<<-METHODS_PP)
|
331
|
+
::ExtendWithInstanceAndClass.should generate_methods(<<-METHODS_PP)
|
114
332
|
[{"S[M] ExtendWithInstanceAndClassM"=>{:class=>{:public=>[:instance_WTF!]}}}]
|
115
333
|
METHODS_PP
|
116
334
|
end
|
117
335
|
end
|
118
336
|
|
119
337
|
describe "SingletonVisibility" do
|
120
|
-
class SingletonVisibility
|
338
|
+
class ::SingletonVisibility
|
121
339
|
def self.class_method
|
122
340
|
end
|
123
341
|
|
@@ -138,7 +356,7 @@ describe Reflexive::Methods do
|
|
138
356
|
end
|
139
357
|
|
140
358
|
it "works" do
|
141
|
-
SingletonVisibility.should generate_methods(<<-METHODS_PP)
|
359
|
+
::SingletonVisibility.should generate_methods(<<-METHODS_PP)
|
142
360
|
[{"[C] SingletonVisibility"=>
|
143
361
|
{:class=>
|
144
362
|
{:public=>[:class_method, :public_singleton_method],
|
@@ -149,28 +367,28 @@ describe Reflexive::Methods do
|
|
149
367
|
end
|
150
368
|
|
151
369
|
describe "SingletonOverrides" do
|
152
|
-
class SingletonOverridesA
|
370
|
+
class ::SingletonOverridesA
|
153
371
|
def self.overriden
|
154
372
|
puts "A"
|
155
373
|
# super
|
156
374
|
end
|
157
375
|
end
|
158
376
|
|
159
|
-
module SingletonOverridesMB
|
377
|
+
module ::SingletonOverridesMB
|
160
378
|
def overriden
|
161
379
|
puts " MB"
|
162
380
|
super
|
163
381
|
end
|
164
382
|
end
|
165
383
|
|
166
|
-
class SingletonOverridesB < SingletonOverridesA
|
167
|
-
extend SingletonOverridesMB
|
384
|
+
class ::SingletonOverridesB < ::SingletonOverridesA
|
385
|
+
extend ::SingletonOverridesMB
|
168
386
|
|
169
387
|
def self.overriden
|
170
388
|
end
|
171
389
|
end
|
172
390
|
|
173
|
-
module SingletonOverridesMC
|
391
|
+
module ::SingletonOverridesMC
|
174
392
|
def overriden
|
175
393
|
end
|
176
394
|
|
@@ -178,8 +396,8 @@ describe Reflexive::Methods do
|
|
178
396
|
end
|
179
397
|
end
|
180
398
|
|
181
|
-
class SingletonOverridesC < SingletonOverridesB
|
182
|
-
extend SingletonOverridesMC
|
399
|
+
class ::SingletonOverridesC < ::SingletonOverridesB
|
400
|
+
extend ::SingletonOverridesMC
|
183
401
|
|
184
402
|
def self.class_WTF
|
185
403
|
end
|
@@ -189,7 +407,7 @@ describe Reflexive::Methods do
|
|
189
407
|
end
|
190
408
|
|
191
409
|
it "works" do
|
192
|
-
SingletonOverridesC.should generate_methods(<<-METHODS_PP)
|
410
|
+
::SingletonOverridesC.should generate_methods(<<-METHODS_PP)
|
193
411
|
[{"[C] SingletonOverridesC"=>{:class=>{:public=>[:class_WTF, :overriden]}}},
|
194
412
|
{"S[M] SingletonOverridesMC"=>
|
195
413
|
{:class=>{:public=>[:overriden, :singleton_WTF]}}},
|