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 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
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/ClassBrowser.rb"
4
+
5
+ main
@@ -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: []