ClassBrowser 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ClassBrowser.rb +107 -13
- data/lib/ClassNode.rb +25 -21
- data/lib/HierarchyWriter.rb +1 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 170630389503dadbd207003e5886dd06af6df094
|
4
|
+
data.tar.gz: 2272dbe3b246fc93fa22f0aaa5c70b65f4aa52e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b8c380fdc955225981e230b92c43de7c02170d7dc25306c8fee260382af3ad1f03bd699eae5a3ec8778c99046c3a6d6a2b60de78f4bb8e2c00b0e6e31309102
|
7
|
+
data.tar.gz: 8b7dfc565e50d41017c4c32c401fad923dd36e510036043f92186fcc2ee511af10b1ed35c35ceb84c5bea00b12c1d0f947c874ef5be02ccac97dd37976bdd0a8
|
data/lib/ClassBrowser.rb
CHANGED
@@ -3,33 +3,121 @@ require_relative 'HierarchyWriter'
|
|
3
3
|
|
4
4
|
class ClassBrowser
|
5
5
|
attr_reader :class_root_node
|
6
|
+
attr_reader :show_help
|
6
7
|
attr_reader :depth
|
8
|
+
attr_reader :show_modules
|
9
|
+
attr_reader :show_methods
|
7
10
|
|
8
11
|
def initialize root_class = Object
|
9
12
|
@class_root_node = ClassNode.new root_class
|
13
|
+
@show_help = false
|
10
14
|
@depth = :depth_immediate
|
15
|
+
@show_modules = false
|
16
|
+
@show_methods = :methods_none
|
11
17
|
end
|
12
18
|
|
13
19
|
def dump_hierarchy
|
14
20
|
HierarchyWriter::dump_hierarchy_of @class_root_node, @depth
|
15
21
|
end
|
16
22
|
|
17
|
-
def
|
18
|
-
|
19
|
-
|
23
|
+
def pretty_print prefix, methods, suffix = ""
|
24
|
+
methods.sort_by { |m| m.to_s }
|
25
|
+
width = ENV['COLUMNS'].to_i
|
26
|
+
col = 0
|
27
|
+
methods.each do |m|
|
28
|
+
msg = '%-24.24s' % "#{prefix}#{m.to_s}#{suffix}"
|
29
|
+
col += msg.length
|
30
|
+
if col >= width
|
31
|
+
print "\n"
|
32
|
+
col = msg.length
|
33
|
+
end
|
34
|
+
print msg
|
35
|
+
end
|
36
|
+
print "\n"
|
37
|
+
end
|
38
|
+
|
39
|
+
def dump_modules
|
40
|
+
if @class_root_node.klass && @show_modules
|
41
|
+
|
42
|
+
modules = @class_root_node.klass.ancestors.select { |a| a.class == Module }
|
43
|
+
pretty_print "[", modules, "]"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def dump_methods
|
48
|
+
if @class_root_node.klass && @show_methods != :methods_none
|
49
|
+
if @show_methods == :methods_all || @show_methods == :methods_class
|
50
|
+
methods = @class_root_node.klass.singleton_methods
|
51
|
+
pretty_print "::", methods
|
52
|
+
end
|
53
|
+
if @show_methods == :methods_all || @show_methods == :methods_instance
|
54
|
+
methods = @class_root_node.klass.instance_methods(false)
|
55
|
+
pretty_print "#", methods
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def show_help
|
61
|
+
if @show_help
|
62
|
+
puts "Usage: ClassBrowser [class] [switches]
|
63
|
+
Where:
|
64
|
+
class is a Class or Module name
|
65
|
+
switches may be:
|
66
|
+
-h: show this message
|
67
|
+
-da: show the all descendants of this class
|
68
|
+
-di: show the immediate descendants of this class
|
69
|
+
-dn: do not show the descendants of this class
|
70
|
+
-m: show the Modules included by this Class or Module
|
71
|
+
-ma: show all methods of this Class or Module
|
72
|
+
-mi: show the instance methods of this Class
|
73
|
+
-mc: show the class methods of this Class
|
74
|
+
-mn: do not show any methods of this Class or Module
|
75
|
+
ClassBrowser with no arguments enters interactive mode
|
76
|
+
"
|
77
|
+
true
|
78
|
+
else
|
79
|
+
false
|
20
80
|
end
|
21
|
-
|
22
|
-
|
81
|
+
end
|
82
|
+
|
83
|
+
def dump
|
84
|
+
if !show_help
|
85
|
+
dump_hierarchy
|
86
|
+
dump_modules
|
87
|
+
dump_methods
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
def parse_arguments argv
|
93
|
+
flags = {
|
94
|
+
"-h" => lambda { @show_help = true },
|
95
|
+
"-di" => lambda { @depth = :depth_immediate },
|
96
|
+
"-da" => lambda { @depth = :depth_all },
|
97
|
+
"-dn" => lambda { @depth = :depth_none },
|
98
|
+
"-m" => lambda { @show_modules = true },
|
99
|
+
"-mn" => lambda { @show_methods = :methods_none },
|
100
|
+
"-ma" => lambda { @show_methods = :methods_all },
|
101
|
+
"-mi" => lambda { @show_methods = :methods_instance },
|
102
|
+
"-mc" => lambda { @show_methods = :methods_class },
|
103
|
+
}
|
104
|
+
|
105
|
+
argv.each do |arg|
|
106
|
+
l = flags[arg]
|
107
|
+
if l
|
108
|
+
l.call
|
109
|
+
end
|
23
110
|
end
|
24
111
|
|
25
112
|
class_name_index = argv.index{ |o| !o.start_with?("-") }
|
26
113
|
if class_name_index
|
27
114
|
class_name = argv[class_name_index]
|
28
|
-
klass =
|
115
|
+
klass = nil
|
29
116
|
begin
|
30
117
|
klass = Object.const_get(class_name)
|
31
118
|
rescue
|
32
|
-
|
119
|
+
puts "Unknown class"
|
120
|
+
klass = nil
|
33
121
|
end
|
34
122
|
@class_root_node = ClassNode.new klass
|
35
123
|
end
|
@@ -40,25 +128,31 @@ class ClassBrowser
|
|
40
128
|
failsafe = 1
|
41
129
|
|
42
130
|
loop do
|
43
|
-
|
131
|
+
print "\n#{@class_root_node.name}> "
|
132
|
+
args = gets.split(/\s+/)
|
44
133
|
|
45
134
|
if args == nil || args.length == 0
|
46
135
|
break
|
47
136
|
end
|
48
137
|
|
49
138
|
parse_arguments args
|
50
|
-
|
139
|
+
dump
|
51
140
|
|
52
141
|
failsafe += 1
|
53
142
|
break if failsafe > 100
|
54
143
|
end
|
55
144
|
end
|
56
145
|
end
|
57
|
-
|
58
|
-
#modules = cls.ancestors.select { |a| a.class == Module }.to_s
|
59
146
|
|
60
147
|
def main
|
61
148
|
browser = ClassBrowser.new
|
62
|
-
|
63
|
-
|
149
|
+
if ARGV.length > 0
|
150
|
+
browser.parse_arguments ARGV
|
151
|
+
browser.dump
|
152
|
+
else
|
153
|
+
browser.interactive
|
154
|
+
puts "Bye!"
|
155
|
+
end
|
64
156
|
end
|
157
|
+
|
158
|
+
main
|
data/lib/ClassNode.rb
CHANGED
@@ -6,40 +6,44 @@ class ClassNode
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def name
|
9
|
-
@klass
|
9
|
+
if @klass
|
10
|
+
@klass.name
|
11
|
+
else
|
12
|
+
"*Unknown class*"
|
13
|
+
end
|
10
14
|
end
|
11
15
|
|
12
16
|
def ancestors
|
13
17
|
class_nodes = []
|
14
|
-
@klass
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
+
if @klass
|
19
|
+
@klass.ancestors[1..-1].each do |c|
|
20
|
+
if c.class == Class
|
21
|
+
class_node = ClassNode.new c
|
22
|
+
class_nodes.insert 0, class_node
|
23
|
+
end
|
18
24
|
end
|
19
25
|
end
|
20
26
|
class_nodes
|
21
27
|
end
|
22
28
|
|
23
29
|
def descendants
|
24
|
-
klass = @klass
|
25
|
-
|
26
|
-
klasses = ObjectSpace.each_object(Class).select do |c|
|
27
|
-
c.superclass == klass
|
28
|
-
end
|
29
|
-
|
30
|
-
klasses.reject! { |c| c.name == nil }
|
31
|
-
|
32
|
-
klasses.sort_by do |c|
|
33
|
-
c.name
|
34
|
-
end
|
35
|
-
|
36
30
|
class_nodes = []
|
31
|
+
if @klass
|
32
|
+
klasses = ObjectSpace.each_object(Class).select do |c|
|
33
|
+
c.superclass == @klass
|
34
|
+
end
|
37
35
|
|
38
|
-
|
39
|
-
class_node = ClassNode.new c
|
40
|
-
class_nodes << class_node
|
41
|
-
end
|
36
|
+
klasses.reject! { |c| c.name == nil }
|
42
37
|
|
38
|
+
klasses.sort_by do |c|
|
39
|
+
c.name
|
40
|
+
end
|
41
|
+
|
42
|
+
klasses.each do |c|
|
43
|
+
class_node = ClassNode.new c
|
44
|
+
class_nodes << class_node
|
45
|
+
end
|
46
|
+
end
|
43
47
|
class_nodes
|
44
48
|
end
|
45
49
|
|
data/lib/HierarchyWriter.rb
CHANGED