rdepend 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +4 -2
- data/lib/rdepend/printer.rb +16 -75
- data/lib/rdepend/trace.rb +6 -7
- data/lib/rdepend/version.rb +1 -1
- metadata +1 -2
- data/lib/rdepend/trace_event.rb +0 -54
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f7a2efdd9fdd2cc0310465cac7a761bb95e403e
|
4
|
+
data.tar.gz: 98dbb422eaa304892d3e6e867d3172b1f6273693
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 60c1b739a32928b6ccb592fffcf98f67edc58e9c8b6930d0762b5f2cca81484d699bb37848b5a8b17870711550e1d1b0a3bba1a9dc47871cd6e1f874743edd76
|
7
|
+
data.tar.gz: 008ea25590dbffccaebbdf9105cf1737b8e5699030e8de43b8dfbceaa8b7089bd43ed5b7483341ae080a3865bb6dd45a36045736df620fa972c4291ad2302a8a
|
data/README.md
CHANGED
@@ -4,9 +4,9 @@ Mind that this Gem is very experimental, a work in progress
|
|
4
4
|
|
5
5
|
It generates a graph visualization of the dependencies in your codebase.
|
6
6
|
|
7
|
-
A lot of incoming links
|
7
|
+
A lot of incoming links is good, as that means that a module is
|
8
8
|
re-used a lot.
|
9
|
-
A lot of outgoing links
|
9
|
+
A lot of outgoing links is bad, as that means that that part of the code has
|
10
10
|
a lot of dependencies.
|
11
11
|
|
12
12
|
See also http://www.whiteboxtest.com/information-flow-metrics.php
|
@@ -36,6 +36,8 @@ Rdepend.with_trace do
|
|
36
36
|
end
|
37
37
|
```
|
38
38
|
|
39
|
+
or
|
40
|
+
|
39
41
|
```ruby
|
40
42
|
Rdepend.trace
|
41
43
|
@een = Een.new
|
data/lib/rdepend/printer.rb
CHANGED
@@ -1,71 +1,27 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
|
3
2
|
require 'set'
|
4
3
|
|
5
4
|
module Rdepend
|
6
|
-
# Generates a graphviz graph in dot format.
|
7
|
-
# To use the dot printer:
|
8
|
-
#
|
9
|
-
# result = RubyProf.profile do
|
10
|
-
# [code to profile]
|
11
|
-
# end
|
12
|
-
#
|
13
|
-
# printer = RubyProf::Printer.new(result)
|
14
|
-
# printer.print(STDOUT)
|
15
|
-
#
|
16
|
-
# You can use either dot viewer such as GraphViz, or the dot command line tool
|
17
|
-
# to reformat the output into a wide variety of outputs:
|
18
|
-
#
|
19
|
-
# dot -Tpng graph.dot > graph.png
|
20
|
-
#
|
21
5
|
class Printer < RubyProf::AbstractPrinter
|
22
6
|
CLASS_COLOR = '"#666666"'
|
23
7
|
EDGE_COLOR = '"#666666"'
|
24
8
|
|
25
|
-
# Creates the Printer using a RubyProf::Result.
|
26
9
|
def initialize(result)
|
27
10
|
super(result)
|
28
11
|
@seen_methods = Set.new
|
29
12
|
end
|
30
13
|
|
31
|
-
|
32
|
-
#
|
33
|
-
# output - Any IO object, including STDOUT or a file. The default value is
|
34
|
-
# STDOUT.
|
35
|
-
#
|
36
|
-
# options - Hash of print options. See #setup_options
|
37
|
-
# for more information.
|
38
|
-
#
|
39
|
-
# When profiling results that cover a large number of method calls it
|
40
|
-
# helps to use the :min_percent option, for example:
|
41
|
-
#
|
42
|
-
# Printer.new(result).print(STDOUT, :min_percent=>5)
|
43
|
-
#
|
44
|
-
def print(output = STDOUT, options = {})
|
14
|
+
def print(output, options = {})
|
45
15
|
setup_options(options)
|
46
|
-
add('digraph "Profile" {')
|
47
|
-
#add("label=\"#{mode_name} >=#{min_percent}%\\nTotal: #{total_time}\";"
|
48
|
-
add("labelloc=t;")
|
49
|
-
add("labeljust=l;")
|
16
|
+
add('digraph "Profile" {', 'labelloc=t;', 'labeljust=l;')
|
50
17
|
print_threads
|
51
18
|
add('}')
|
52
|
-
|
53
|
-
@output = File.open(output, 'w')
|
54
|
-
else
|
55
|
-
File.open(output, 'w') { |file| file.write(@contents.join("\n")) }
|
56
|
-
end
|
19
|
+
File.open(output, 'w') { |file| file.write(@contents.join("\n")) }
|
57
20
|
`dot -Tsvg #{output} > #{output}.svg`
|
58
21
|
end
|
59
22
|
|
60
23
|
private
|
61
24
|
|
62
|
-
# Something of a hack, figure out which constant went with the
|
63
|
-
# RubyProf.measure_mode so that we can display it. Otherwise it's easy to
|
64
|
-
# forget what measurement was made.
|
65
|
-
def mode_name
|
66
|
-
RubyProf.constants.find{|c| RubyProf.const_get(c) == RubyProf.measure_mode}
|
67
|
-
end
|
68
|
-
|
69
25
|
def print_threads
|
70
26
|
@result.threads.each do |thread|
|
71
27
|
add("subgraph \"Thread #{thread.id}\" {")
|
@@ -75,20 +31,12 @@ module Rdepend
|
|
75
31
|
end
|
76
32
|
end
|
77
33
|
|
78
|
-
# Determines an ID to use to represent the subject in the Dot file.
|
79
|
-
def dot_id(subject)
|
80
|
-
subject.object_id
|
81
|
-
end
|
82
|
-
|
83
34
|
def print_thread(thread)
|
84
|
-
total_time = thread.total_time
|
85
35
|
thread.methods.sort_by(&sort_method).reverse_each do |method|
|
86
|
-
total_percentage = (method.total_time/total_time) * 100
|
87
|
-
next if total_percentage < min_percent
|
88
36
|
name = method_name(method).split("#").last
|
89
|
-
add("#{
|
37
|
+
add("#{method.object_id} [label=\"#{name}\"];")
|
90
38
|
@seen_methods << method
|
91
|
-
print_edges(
|
39
|
+
print_edges(method)
|
92
40
|
end
|
93
41
|
end
|
94
42
|
|
@@ -96,34 +44,27 @@ module Rdepend
|
|
96
44
|
grouped = {}
|
97
45
|
thread.methods.each{|m| grouped[m.klass_name] ||= []; grouped[m.klass_name] << m}
|
98
46
|
grouped.each do |cls, methods2|
|
99
|
-
|
100
|
-
big_methods = methods2.select{|m| @seen_methods.include? m}
|
47
|
+
big_methods = methods2.select { |m| @seen_methods.include?(m) }
|
101
48
|
if !big_methods.empty?
|
102
49
|
add("subgraph cluster_#{cls.object_id} {")
|
103
|
-
add("label = \"#{cls}\";")
|
104
|
-
add("
|
105
|
-
add("
|
106
|
-
add("color = #{CLASS_COLOR};")
|
107
|
-
big_methods.each do |m|
|
108
|
-
add("#{m.object_id};")
|
109
|
-
end
|
50
|
+
add("label = \"#{cls}\";", "fontcolor = #{CLASS_COLOR};")
|
51
|
+
add("fontsize = 16;", "color = #{CLASS_COLOR};")
|
52
|
+
big_methods.each { |m| add("#{m.object_id};") }
|
110
53
|
add("}")
|
111
54
|
end
|
112
55
|
end
|
113
56
|
end
|
114
57
|
|
115
|
-
def print_edges(
|
116
|
-
method.aggregate_children.
|
117
|
-
|
118
|
-
|
119
|
-
#
|
120
|
-
add("#{dot_id(method)} -> #{dot_id(child.target)} [label=\"#{child.called}/#{child.target.called}\" fontsize=10 fontcolor=#{EDGE_COLOR}];")
|
58
|
+
def print_edges(method)
|
59
|
+
method.aggregate_children.each do |child|
|
60
|
+
label = "#{child.called}/#{child.target.called}"
|
61
|
+
label = "label=\"#{label}\" fontsize=10 fontcolor=#{EDGE_COLOR}"
|
62
|
+
add("#{method.object_id} -> #{child.target.object_id} [#{label}];")
|
121
63
|
end
|
122
64
|
end
|
123
65
|
|
124
|
-
|
125
|
-
|
126
|
-
(@contents ||= []) << str
|
66
|
+
def add(*args)
|
67
|
+
@contents = (@contents || []) + [args].flatten
|
127
68
|
end
|
128
69
|
end
|
129
70
|
end
|
data/lib/rdepend/trace.rb
CHANGED
@@ -1,11 +1,7 @@
|
|
1
|
-
at_exit do
|
2
|
-
Rdepend::Trace.halt_with_message
|
3
|
-
end
|
4
|
-
|
5
1
|
module Rdepend
|
6
2
|
class Trace
|
7
3
|
def self.exec(&block)
|
8
|
-
self.
|
4
|
+
self.init
|
9
5
|
yield
|
10
6
|
self.stop
|
11
7
|
end
|
@@ -17,9 +13,8 @@ module Rdepend
|
|
17
13
|
def self.stop
|
18
14
|
result = RubyProf.stop
|
19
15
|
result.eliminate_methods!([/Integer#times/])
|
20
|
-
printer = Rdepend::Printer.new(result)
|
21
16
|
puts "Writing Ꝛdepend graph to #{$0}.dot.svg"
|
22
|
-
|
17
|
+
Rdepend::Printer.new(result).print("#{$0}.dot")
|
23
18
|
end
|
24
19
|
|
25
20
|
def self.halt_with_message
|
@@ -28,3 +23,7 @@ module Rdepend
|
|
28
23
|
end
|
29
24
|
end
|
30
25
|
end
|
26
|
+
|
27
|
+
at_exit do
|
28
|
+
Rdepend::Trace.halt_with_message
|
29
|
+
end
|
data/lib/rdepend/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdepend
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jarra
|
@@ -88,7 +88,6 @@ files:
|
|
88
88
|
- lib/rdepend/main.rb
|
89
89
|
- lib/rdepend/printer.rb
|
90
90
|
- lib/rdepend/trace.rb
|
91
|
-
- lib/rdepend/trace_event.rb
|
92
91
|
- lib/rdepend/version.rb
|
93
92
|
- rdepend.gemspec
|
94
93
|
homepage: ''
|
data/lib/rdepend/trace_event.rb
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
Rdepend::TraceEvent = Struct.new(:event_type, :defined_class,
|
2
|
-
:method_id, :path, :lineno) do
|
3
|
-
def event_class
|
4
|
-
"Rdepend::Event::#{event_type.to_s.classify}".constantize
|
5
|
-
end
|
6
|
-
|
7
|
-
def key
|
8
|
-
"#{path}:#{method_id}"
|
9
|
-
end
|
10
|
-
|
11
|
-
def root?
|
12
|
-
method_id == '<main>'
|
13
|
-
end
|
14
|
-
|
15
|
-
def defined_class
|
16
|
-
self[:defined_class].to_s
|
17
|
-
end
|
18
|
-
|
19
|
-
def instance?
|
20
|
-
!klass?
|
21
|
-
end
|
22
|
-
|
23
|
-
def klass?
|
24
|
-
defined_class =~ /^#<(Module|Class):\w*.*>$/
|
25
|
-
end
|
26
|
-
|
27
|
-
def klass
|
28
|
-
name.klass
|
29
|
-
end
|
30
|
-
|
31
|
-
def method
|
32
|
-
name.method
|
33
|
-
end
|
34
|
-
|
35
|
-
def label
|
36
|
-
if root?
|
37
|
-
'main'
|
38
|
-
else
|
39
|
-
method_id
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
private
|
44
|
-
|
45
|
-
def name
|
46
|
-
if root?
|
47
|
-
Rdepend::Event::RootName.new(self)
|
48
|
-
elsif instance?
|
49
|
-
Rdepend::Event::InstanceName.new(self)
|
50
|
-
else
|
51
|
-
Rdepend::Event::KlassName.new(self)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|