ClassBrowser 1.0.1
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/bin/ClassBrowser +5 -0
- data/lib/ClassBrowser.rb +64 -0
- data/lib/ClassNode.rb +49 -0
- data/lib/HierarchyWriter.rb +63 -0
- metadata +49 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2212f8e9247ef7b04d813d71cec1e7a6d86d1d1f
|
4
|
+
data.tar.gz: bf29e15f87efe4cbdce77fc103890beeabe6f6f6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ab6d006238797bb1b703829bb4ab3833407bb334e4f8a3fedf35d72740a13dee9f663f1a6510d21ddca6f6bd6be5b700070d81111a6cc22438ccbaeafe8fc5dd
|
7
|
+
data.tar.gz: 14815e27cefe3a983179a11c927470641d1510a9e976d61c6f4c20b781be522b1ad5c9fad1d0826ae23446cbc485926bfd93f983a5525e13c590d1714ddd274b
|
data/bin/ClassBrowser
ADDED
data/lib/ClassBrowser.rb
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
require_relative "ClassNode"
|
2
|
+
require_relative 'HierarchyWriter'
|
3
|
+
|
4
|
+
class ClassBrowser
|
5
|
+
attr_reader :class_root_node
|
6
|
+
attr_reader :depth
|
7
|
+
|
8
|
+
def initialize root_class = Object
|
9
|
+
@class_root_node = ClassNode.new root_class
|
10
|
+
@depth = :depth_immediate
|
11
|
+
end
|
12
|
+
|
13
|
+
def dump_hierarchy
|
14
|
+
HierarchyWriter::dump_hierarchy_of @class_root_node, @depth
|
15
|
+
end
|
16
|
+
|
17
|
+
def parse_arguments argv
|
18
|
+
if argv.include? "-di"
|
19
|
+
@depth = :depth_immediate
|
20
|
+
end
|
21
|
+
if argv.include? "-da"
|
22
|
+
@depth = :depth_all
|
23
|
+
end
|
24
|
+
|
25
|
+
class_name_index = argv.index{ |o| !o.start_with?("-") }
|
26
|
+
if class_name_index
|
27
|
+
class_name = argv[class_name_index]
|
28
|
+
klass = Object
|
29
|
+
begin
|
30
|
+
klass = Object.const_get(class_name)
|
31
|
+
rescue
|
32
|
+
klass = Object
|
33
|
+
end
|
34
|
+
@class_root_node = ClassNode.new klass
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def interactive
|
39
|
+
|
40
|
+
failsafe = 1
|
41
|
+
|
42
|
+
loop do
|
43
|
+
args = gets.split(" ")
|
44
|
+
|
45
|
+
if args == nil || args.length == 0
|
46
|
+
break
|
47
|
+
end
|
48
|
+
|
49
|
+
parse_arguments args
|
50
|
+
dump_hierarchy
|
51
|
+
|
52
|
+
failsafe += 1
|
53
|
+
break if failsafe > 100
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
#modules = cls.ancestors.select { |a| a.class == Module }.to_s
|
59
|
+
|
60
|
+
def main
|
61
|
+
browser = ClassBrowser.new
|
62
|
+
browser.parse_arguments ARGV
|
63
|
+
browser.dump_hierarchy
|
64
|
+
end
|
data/lib/ClassNode.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
class ClassNode
|
2
|
+
attr_reader :klass
|
3
|
+
|
4
|
+
def initialize klass
|
5
|
+
@klass = klass
|
6
|
+
end
|
7
|
+
|
8
|
+
def name
|
9
|
+
@klass.name
|
10
|
+
end
|
11
|
+
|
12
|
+
def ancestors
|
13
|
+
class_nodes = []
|
14
|
+
@klass.ancestors[1..-1].each do |c|
|
15
|
+
if c.class == Class
|
16
|
+
class_node = ClassNode.new c
|
17
|
+
class_nodes.insert 0, class_node
|
18
|
+
end
|
19
|
+
end
|
20
|
+
class_nodes
|
21
|
+
end
|
22
|
+
|
23
|
+
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
|
+
class_nodes = []
|
37
|
+
|
38
|
+
klasses.each do |c|
|
39
|
+
class_node = ClassNode.new c
|
40
|
+
class_nodes << class_node
|
41
|
+
end
|
42
|
+
|
43
|
+
class_nodes
|
44
|
+
end
|
45
|
+
|
46
|
+
def == other
|
47
|
+
@klass == other.klass
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
class HierarchyWriter
|
2
|
+
|
3
|
+
# print the descendants of node as a tree using line drawing characters
|
4
|
+
# node is expected to respond to #name and #descendants
|
5
|
+
def self.dump_descendants_of node, indent = [], depth = :depth_all
|
6
|
+
indent.each_with_index do |draw, index|
|
7
|
+
last = index == indent.size - 1
|
8
|
+
if draw
|
9
|
+
print last ? "└" : " "
|
10
|
+
else
|
11
|
+
print last ? "├" : "│"
|
12
|
+
end
|
13
|
+
print last ? "─" : " "
|
14
|
+
end
|
15
|
+
|
16
|
+
puts "○ " + node.name
|
17
|
+
|
18
|
+
if depth != :depth_none
|
19
|
+
desc = node.descendants
|
20
|
+
if desc
|
21
|
+
if depth == :depth_immediate
|
22
|
+
depth = :depth_none
|
23
|
+
end
|
24
|
+
desc.each_with_index do |c, index|
|
25
|
+
last = index == desc.size - 1
|
26
|
+
self.dump_descendants_of c, indent.clone.push(last), depth
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# print the ancestors of node as a tree using line drawing characters
|
33
|
+
# node is expected to respond to #name and #ancestors
|
34
|
+
# returns the indent array which can be passed to dump_descendants_of
|
35
|
+
def self.dump_ancestors_of node
|
36
|
+
|
37
|
+
indent = []
|
38
|
+
ansc = node.ancestors
|
39
|
+
|
40
|
+
ansc.each_with_index do |c, index|
|
41
|
+
indent.each_with_index do |draw, index|
|
42
|
+
if index > 0
|
43
|
+
print " "
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
if index != 0
|
48
|
+
print "└─"
|
49
|
+
end
|
50
|
+
puts "○ " + c.name
|
51
|
+
last = index == indent.size - 1
|
52
|
+
indent.push !last
|
53
|
+
end
|
54
|
+
|
55
|
+
indent
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.dump_hierarchy_of node, depth = :depth_all
|
59
|
+
indent = HierarchyWriter::dump_ancestors_of node
|
60
|
+
HierarchyWriter::dump_descendants_of node, indent, depth
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ClassBrowser
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Tom Underhill
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-12-07 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: ClassBrowser is an interactive class browser that lets you view the current
|
14
|
+
ObjectSpace's class and module hierarchy.
|
15
|
+
email: tunderhill@gmail.com
|
16
|
+
executables:
|
17
|
+
- ClassBrowser
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- bin/ClassBrowser
|
22
|
+
- lib/ClassBrowser.rb
|
23
|
+
- lib/ClassNode.rb
|
24
|
+
- lib/HierarchyWriter.rb
|
25
|
+
homepage: http://www.tomunderhill.cu.cc
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.4.5
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: A Ruby class browser
|
49
|
+
test_files: []
|