graph 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.autotest +3 -19
- data/History.txt +20 -0
- data/Manifest.txt +1 -0
- data/Rakefile +6 -3
- data/lib/dep_analyzer.rb +1 -1
- data/lib/graph.rb +145 -31
- data/lib/macports_analyzer.rb +1 -1
- data/lib/rake_analyzer.rb +31 -0
- data/test/test_graph.rb +96 -10
- metadata +51 -32
- data.tar.gz.sig +0 -1
- metadata.gz.sig +0 -0
data/.autotest
CHANGED
@@ -3,22 +3,6 @@
|
|
3
3
|
require 'autotest/restart'
|
4
4
|
require 'autotest/rcov'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
# at.libs << ":../some/external"
|
10
|
-
#
|
11
|
-
# at.add_exception 'vendor'
|
12
|
-
#
|
13
|
-
# at.add_mapping(/dependency.rb/) do |f, _|
|
14
|
-
# at.files_matching(/test_.*rb$/)
|
15
|
-
# end
|
16
|
-
#
|
17
|
-
# %w(TestA TestB).each do |klass|
|
18
|
-
# at.extra_class_map[klass] = "test/test_misc.rb"
|
19
|
-
# end
|
20
|
-
# end
|
21
|
-
|
22
|
-
# Autotest.add_hook :run_command do |at|
|
23
|
-
# system "rake build"
|
24
|
-
# end
|
6
|
+
Autotest.add_hook :initialize do |at|
|
7
|
+
at.testlib = "minitest/autorun"
|
8
|
+
end
|
data/History.txt
CHANGED
@@ -1,3 +1,23 @@
|
|
1
|
+
=== 1.2.0 / 2010-03-30
|
2
|
+
|
3
|
+
* 10 minor enhancements:
|
4
|
+
|
5
|
+
* Added rake_analyzer.rb to help visualize rake dependencies. YAY!
|
6
|
+
* Added #boxes to convert all nodes to boxes.
|
7
|
+
* Added #global_attrib to set attribs on all nodes.
|
8
|
+
* Added #nodes to return all nodes (even if not part of from-edge).
|
9
|
+
* Added #normalize to remove duplicate edges.
|
10
|
+
* Added #orient to set graph orientation.
|
11
|
+
* Added #rotate as LR alias to #orient.
|
12
|
+
* Added full rdoc for Graph.
|
13
|
+
* Switched to minitest.
|
14
|
+
* Updated Hoe setup.
|
15
|
+
|
16
|
+
* 2 bug fixes:
|
17
|
+
|
18
|
+
* Fixed inherited #clear to ensure ivars cleared as well.
|
19
|
+
* Fixed scanner to work with new macports deps output
|
20
|
+
|
1
21
|
=== 1.1.0 / 2009-04-16
|
2
22
|
|
3
23
|
* 3 minor enhancements:
|
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
@@ -4,9 +4,12 @@ require 'rubygems'
|
|
4
4
|
require 'hoe'
|
5
5
|
require './lib/graph.rb'
|
6
6
|
|
7
|
-
Hoe.
|
8
|
-
|
9
|
-
|
7
|
+
Hoe.plugin :seattlerb
|
8
|
+
|
9
|
+
Hoe.spec 'graph' do
|
10
|
+
developer 'Ryan Davis', 'ryand-ruby@zenspider.com'
|
11
|
+
|
12
|
+
self.rubyforge_name = 'seattlerb'
|
10
13
|
end
|
11
14
|
|
12
15
|
# vim: syntax=Ruby
|
data/lib/dep_analyzer.rb
CHANGED
data/lib/graph.rb
CHANGED
@@ -1,38 +1,106 @@
|
|
1
1
|
#!/usr/local/bin/ruby -w
|
2
2
|
|
3
|
+
##
|
4
|
+
# Graph is a type of hash that outputs in graphviz's dot format.
|
5
|
+
|
3
6
|
class Graph < Hash
|
4
|
-
VERSION = '1.
|
7
|
+
VERSION = '1.2.0' # :nodoc:
|
8
|
+
|
9
|
+
##
|
10
|
+
# A Hash of arrays of attributes for each node. Eg:
|
11
|
+
#
|
12
|
+
# graph.attribs["a"] << "color = red"
|
13
|
+
#
|
14
|
+
# Will color node "a" red.
|
5
15
|
|
6
16
|
attr_reader :attribs
|
7
|
-
|
17
|
+
|
18
|
+
##
|
19
|
+
# An array of the order of traversal / definition of the nodes.
|
20
|
+
#
|
21
|
+
# You (generally) should leave this alone.
|
22
|
+
|
8
23
|
attr_reader :order
|
9
|
-
attr_reader :edge
|
10
24
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
@attribs = Hash.new { |h,k| h[k] = [] }
|
16
|
-
@edge = Hash.new { |h,k| h[k] = Hash.new { |h2,k2| h2[k2] = [] } }
|
17
|
-
end
|
25
|
+
##
|
26
|
+
# An array of attributes to add to the front of the graph source. Eg:
|
27
|
+
#
|
28
|
+
# graph.prefix << "ratio = 1.5"
|
18
29
|
|
19
|
-
|
30
|
+
attr_reader :prefix
|
31
|
+
|
32
|
+
##
|
33
|
+
# A Hash of a Hashes of Arrays of attributes for an edge. Eg:
|
34
|
+
#
|
35
|
+
# graph.edge["a"]["b"] << "color = blue"
|
36
|
+
#
|
37
|
+
# Will color the edge between a and b blue.
|
38
|
+
|
39
|
+
attr_reader :edge
|
40
|
+
|
41
|
+
def []= key, val # :nodoc:
|
20
42
|
@order << key unless self.has_key? key
|
21
43
|
super
|
22
44
|
end
|
23
45
|
|
24
|
-
def
|
25
|
-
@order.delete key
|
46
|
+
def clear # :nodoc:
|
26
47
|
super
|
48
|
+
@prefix.clear
|
49
|
+
@order.clear
|
50
|
+
@attribs.clear
|
51
|
+
@edge.clear
|
27
52
|
end
|
28
53
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
54
|
+
##
|
55
|
+
# Return all nodes (aka the set of all keys and values).
|
56
|
+
|
57
|
+
def nodes
|
58
|
+
(keys + values).flatten.uniq
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# A convenience method to set every node to be a box. Especially
|
63
|
+
# good for longer text nodes.
|
64
|
+
|
65
|
+
def boxes
|
66
|
+
prefix << "node [ shape = box ]"
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
# A convenience method to set an attribute on all nodes.
|
71
|
+
|
72
|
+
def global_attrib attrib
|
73
|
+
nodes.each do |key|
|
74
|
+
attribs[key] << attrib
|
33
75
|
end
|
34
76
|
end
|
35
77
|
|
78
|
+
##
|
79
|
+
# Returns a Hash with a count of the outgoing edges for each node.
|
80
|
+
|
81
|
+
def counts
|
82
|
+
result = Hash.new 0
|
83
|
+
each_pair do |from, to|
|
84
|
+
result[from] += 1
|
85
|
+
end
|
86
|
+
result
|
87
|
+
end
|
88
|
+
|
89
|
+
def delete key # :nodoc:
|
90
|
+
@order.delete key
|
91
|
+
# TODO: prolly needs to go clean up attribs
|
92
|
+
super
|
93
|
+
end
|
94
|
+
|
95
|
+
##
|
96
|
+
# Overrides Hash#each_pair to go over each _edge_. Eg:
|
97
|
+
#
|
98
|
+
# g["a"] << "b"
|
99
|
+
# g["a"] << "b"
|
100
|
+
# g.each_pair { |from, to| ... }
|
101
|
+
#
|
102
|
+
# goes over a -> b *twice*.
|
103
|
+
|
36
104
|
def each_pair
|
37
105
|
@order.each do |from|
|
38
106
|
self[from].each do |to|
|
@@ -41,6 +109,27 @@ class Graph < Hash
|
|
41
109
|
end
|
42
110
|
end
|
43
111
|
|
112
|
+
##
|
113
|
+
# Deletes nodes that have less than minimum number of outgoing edges.
|
114
|
+
|
115
|
+
def filter_size minimum
|
116
|
+
counts.each do |node, count|
|
117
|
+
next unless count < minimum
|
118
|
+
delete node
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def initialize # :nodoc:
|
123
|
+
super { |h,k| h[k] = [] }
|
124
|
+
@prefix = []
|
125
|
+
@order = []
|
126
|
+
@attribs = Hash.new { |h,k| h[k] = [] }
|
127
|
+
@edge = Hash.new { |h,k| h[k] = Hash.new { |h2,k2| h2[k2] = [] } }
|
128
|
+
end
|
129
|
+
|
130
|
+
##
|
131
|
+
# Creates a new Graph whose edges point the other direction.
|
132
|
+
|
44
133
|
def invert
|
45
134
|
result = self.class.new
|
46
135
|
each_pair do |from, to|
|
@@ -49,18 +138,50 @@ class Graph < Hash
|
|
49
138
|
result
|
50
139
|
end
|
51
140
|
|
52
|
-
|
53
|
-
|
54
|
-
each_pair do |from, to|
|
55
|
-
result[from] += 1
|
56
|
-
end
|
57
|
-
result
|
58
|
-
end
|
141
|
+
##
|
142
|
+
# Returns a list of keys sorted by number of outgoing edges.
|
59
143
|
|
60
144
|
def keys_by_count
|
61
145
|
counts.sort_by { |key, count| -count }.map {|key, count| key }
|
62
146
|
end
|
63
147
|
|
148
|
+
##
|
149
|
+
# Specify the orientation of the graph. Defaults to the graphviz default "TB".
|
150
|
+
|
151
|
+
def orient dir = "TB"
|
152
|
+
prefix << "rankdir = #{dir}"
|
153
|
+
end
|
154
|
+
|
155
|
+
##
|
156
|
+
# Really just an alias for #orient but with "LR" as the default value.
|
157
|
+
|
158
|
+
def rotate dir = "LR"
|
159
|
+
orient dir
|
160
|
+
end
|
161
|
+
|
162
|
+
##
|
163
|
+
# Remove all duplicate edges.
|
164
|
+
|
165
|
+
def normalize
|
166
|
+
each do |k,v|
|
167
|
+
v.uniq!
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
##
|
172
|
+
# Saves out both a dot file to path and an image for the specified type.
|
173
|
+
# Specify type as nil to skip exporting an image.
|
174
|
+
|
175
|
+
def save path, type="png"
|
176
|
+
File.open "#{path}.dot", "w" do |f|
|
177
|
+
f.write self.to_s
|
178
|
+
end
|
179
|
+
system "dot -T#{type} #{path}.dot > #{path}.#{type}" if type
|
180
|
+
end
|
181
|
+
|
182
|
+
##
|
183
|
+
# Outputs a graphviz graph.
|
184
|
+
|
64
185
|
def to_s
|
65
186
|
result = []
|
66
187
|
result << "digraph absent"
|
@@ -83,11 +204,4 @@ class Graph < Hash
|
|
83
204
|
result << " }"
|
84
205
|
result.join "\n"
|
85
206
|
end
|
86
|
-
|
87
|
-
def save path, type="png"
|
88
|
-
File.open "#{path}.dot", "w" do |f|
|
89
|
-
f.write self.to_s
|
90
|
-
end
|
91
|
-
system "dot -T#{type} #{path}.dot > #{path}.#{type}" if type
|
92
|
-
end
|
93
207
|
end
|
data/lib/macports_analyzer.rb
CHANGED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'dep_analyzer'
|
2
|
+
|
3
|
+
class RakeAnalyzer < DepAnalyzer
|
4
|
+
def run
|
5
|
+
require 'graph'
|
6
|
+
g = Graph.new
|
7
|
+
g.rotate
|
8
|
+
|
9
|
+
current = nil
|
10
|
+
`rake -P -s`.each_line do |line|
|
11
|
+
case line
|
12
|
+
when /^rake (.+)/
|
13
|
+
name = $1
|
14
|
+
# current = (name =~ /pkg/) ? nil : name
|
15
|
+
current = name
|
16
|
+
g[current] if current # force the node to exist, in case of a leaf
|
17
|
+
when /^\s+(.+)/
|
18
|
+
dep = $1
|
19
|
+
next if current =~ /pkg/ and File.file? dep
|
20
|
+
g[current] << dep if current
|
21
|
+
else
|
22
|
+
warn "unparsed: #{line.chomp}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
g.boxes
|
28
|
+
g.save "#{self.class}"
|
29
|
+
system "open #{self.class}.png"
|
30
|
+
end
|
31
|
+
end
|
data/test/test_graph.rb
CHANGED
@@ -1,15 +1,43 @@
|
|
1
|
-
require "
|
1
|
+
require "minitest/autorun"
|
2
2
|
require "tmpdir"
|
3
3
|
require "graph"
|
4
4
|
|
5
|
-
class TestGraph <
|
5
|
+
class TestGraph < MiniTest::Unit::TestCase
|
6
6
|
def setup
|
7
7
|
@graph = Graph.new
|
8
8
|
@graph["a"] << "b"
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
12
|
-
|
11
|
+
def test_boxes
|
12
|
+
expected = util_dot('"a" -> "b"')
|
13
|
+
assert_equal expected, @graph.to_s
|
14
|
+
|
15
|
+
@graph.boxes
|
16
|
+
|
17
|
+
expected = util_dot('node [ shape = box ]',
|
18
|
+
'"a" -> "b"')
|
19
|
+
assert_equal expected, @graph.to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_clear
|
23
|
+
@graph.clear
|
24
|
+
|
25
|
+
assert_empty @graph.prefix, "prefix"
|
26
|
+
assert_empty @graph.order, "order"
|
27
|
+
assert_empty @graph.attribs, "attribs"
|
28
|
+
assert_empty @graph.edge, "edge"
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_counts
|
32
|
+
expect = { "a" => 1, }
|
33
|
+
assert_equal expect, @graph.counts
|
34
|
+
|
35
|
+
@graph["a"] << "b"
|
36
|
+
@graph["a"] << "c"
|
37
|
+
@graph["b"] << "c"
|
38
|
+
|
39
|
+
expect = { "a" => 3, "b" => 1, }
|
40
|
+
assert_equal expect, @graph.counts
|
13
41
|
end
|
14
42
|
|
15
43
|
def test_delete
|
@@ -22,6 +50,18 @@ class TestGraph < Test::Unit::TestCase
|
|
22
50
|
assert @graph.empty?
|
23
51
|
end
|
24
52
|
|
53
|
+
def test_global_attrib
|
54
|
+
expected = util_dot('"a" -> "b"')
|
55
|
+
assert_equal expected, @graph.to_s
|
56
|
+
|
57
|
+
@graph.global_attrib "color = blue"
|
58
|
+
|
59
|
+
expected = util_dot('"a" [ color = blue ]',
|
60
|
+
'"b" [ color = blue ]',
|
61
|
+
'"a" -> "b"')
|
62
|
+
assert_equal expected, @graph.to_s
|
63
|
+
end
|
64
|
+
|
25
65
|
def test_invert
|
26
66
|
@graph["a"] << "c"
|
27
67
|
invert = @graph.invert
|
@@ -35,10 +75,52 @@ class TestGraph < Test::Unit::TestCase
|
|
35
75
|
assert_equal %w(d a), @graph.keys_by_count
|
36
76
|
end
|
37
77
|
|
78
|
+
def test_nodes
|
79
|
+
assert_equal %w(a), @graph.keys.sort
|
80
|
+
assert_equal %w(a b), @graph.nodes.sort
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_normalize
|
84
|
+
@graph.clear
|
85
|
+
@graph["a"] << "b" << "b" << "b" # 3 edges from a to b
|
86
|
+
|
87
|
+
expect = { "a" => %w(b b b) }
|
88
|
+
assert_equal expect, @graph
|
89
|
+
|
90
|
+
@graph.normalize # clear all but one edge
|
91
|
+
|
92
|
+
expect = { "a" => %w(b) }
|
93
|
+
assert_equal expect, @graph
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_orient
|
97
|
+
@graph.orient "blah"
|
98
|
+
|
99
|
+
assert_equal ["rankdir = blah"], @graph.prefix
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_orient_default
|
103
|
+
@graph.orient
|
104
|
+
|
105
|
+
assert_equal ["rankdir = TB"], @graph.prefix
|
106
|
+
end
|
107
|
+
|
38
108
|
def test_order
|
39
109
|
assert_equal %w(a), @graph.order
|
40
110
|
end
|
41
111
|
|
112
|
+
def test_rotate
|
113
|
+
@graph.rotate "blah"
|
114
|
+
|
115
|
+
assert_equal ["rankdir = blah"], @graph.prefix
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_rotate_default
|
119
|
+
@graph.rotate
|
120
|
+
|
121
|
+
assert_equal ["rankdir = LR"], @graph.prefix
|
122
|
+
end
|
123
|
+
|
42
124
|
def test_save
|
43
125
|
util_save "png"
|
44
126
|
end
|
@@ -57,19 +139,23 @@ class TestGraph < Test::Unit::TestCase
|
|
57
139
|
assert_equal expected, @graph.to_s
|
58
140
|
end
|
59
141
|
|
60
|
-
def
|
61
|
-
@graph.
|
142
|
+
def test_to_s_attrib
|
143
|
+
@graph.attribs["a"] << "color = blue"
|
62
144
|
@graph["a"] << "c"
|
63
145
|
|
64
|
-
expected = util_dot('
|
146
|
+
expected = util_dot('"a" [ color = blue ]', '"a" -> "b"', '"a" -> "c"')
|
65
147
|
assert_equal expected, @graph.to_s
|
66
148
|
end
|
67
149
|
|
68
|
-
def
|
69
|
-
|
150
|
+
def test_to_s_empty
|
151
|
+
assert_equal util_dot, Graph.new.to_s
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_to_s_prefix
|
155
|
+
@graph.prefix << "blah"
|
70
156
|
@graph["a"] << "c"
|
71
157
|
|
72
|
-
expected = util_dot('
|
158
|
+
expected = util_dot('blah', '"a" -> "b"', '"a" -> "c"')
|
73
159
|
assert_equal expected, @graph.to_s
|
74
160
|
end
|
75
161
|
|
metadata
CHANGED
@@ -1,48 +1,64 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 2
|
8
|
+
- 0
|
9
|
+
version: 1.2.0
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Ryan Davis
|
8
13
|
autorequire:
|
9
14
|
bindir: bin
|
10
|
-
cert_chain:
|
11
|
-
- |
|
12
|
-
-----BEGIN CERTIFICATE-----
|
13
|
-
MIIDPjCCAiagAwIBAgIBADANBgkqhkiG9w0BAQUFADBFMRMwEQYDVQQDDApyeWFu
|
14
|
-
ZC1ydWJ5MRkwFwYKCZImiZPyLGQBGRYJemVuc3BpZGVyMRMwEQYKCZImiZPyLGQB
|
15
|
-
GRYDY29tMB4XDTA5MDMwNjE4NTMxNVoXDTEwMDMwNjE4NTMxNVowRTETMBEGA1UE
|
16
|
-
AwwKcnlhbmQtcnVieTEZMBcGCgmSJomT8ixkARkWCXplbnNwaWRlcjETMBEGCgmS
|
17
|
-
JomT8ixkARkWA2NvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALda
|
18
|
-
b9DCgK+627gPJkB6XfjZ1itoOQvpqH1EXScSaba9/S2VF22VYQbXU1xQXL/WzCkx
|
19
|
-
taCPaLmfYIaFcHHCSY4hYDJijRQkLxPeB3xbOfzfLoBDbjvx5JxgJxUjmGa7xhcT
|
20
|
-
oOvjtt5P8+GSK9zLzxQP0gVLS/D0FmoE44XuDr3iQkVS2ujU5zZL84mMNqNB1znh
|
21
|
-
GiadM9GHRaDiaxuX0cIUBj19T01mVE2iymf9I6bEsiayK/n6QujtyCbTWsAS9Rqt
|
22
|
-
qhtV7HJxNKuPj/JFH0D2cswvzznE/a5FOYO68g+YCuFi5L8wZuuM8zzdwjrWHqSV
|
23
|
-
gBEfoTEGr7Zii72cx+sCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
|
24
|
-
HQYDVR0OBBYEFEfFe9md/r/tj/Wmwpy+MI8d9k/hMA0GCSqGSIb3DQEBBQUAA4IB
|
25
|
-
AQAY59gYvDxqSqgC92nAP9P8dnGgfZgLxP237xS6XxFGJSghdz/nI6pusfCWKM8m
|
26
|
-
vzjjH2wUMSSf3tNudQ3rCGLf2epkcU13/rguI88wO6MrE0wi4ZqLQX+eZQFskJb/
|
27
|
-
w6x9W1ur8eR01s397LSMexySDBrJOh34cm2AlfKr/jokKCTwcM0OvVZnAutaovC0
|
28
|
-
l1SVZ0ecg88bsWHA0Yhh7NFxK1utWoIhtB6AFC/+trM0FQEB/jZkIS8SaNzn96Rl
|
29
|
-
n0sZEf77FLf5peR8TP/PtmIg7Cyqz23sLM4mCOoTGIy5OcZ8TdyiyINUHtb5ej/T
|
30
|
-
FBHgymkyj/AOSqKRIpXPhjC6
|
31
|
-
-----END CERTIFICATE-----
|
15
|
+
cert_chain: []
|
32
16
|
|
33
|
-
date:
|
17
|
+
date: 2010-03-30 00:00:00 -07:00
|
34
18
|
default_executable:
|
35
19
|
dependencies:
|
36
20
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
21
|
+
name: rubyforge
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 2
|
29
|
+
- 0
|
30
|
+
- 4
|
31
|
+
version: 2.0.4
|
32
|
+
type: :development
|
33
|
+
version_requirements: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
name: minitest
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - ">="
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 1
|
43
|
+
- 6
|
44
|
+
- 0
|
45
|
+
version: 1.6.0
|
38
46
|
type: :development
|
39
|
-
|
40
|
-
|
47
|
+
version_requirements: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: hoe
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
41
52
|
requirements:
|
42
53
|
- - ">="
|
43
54
|
- !ruby/object:Gem::Version
|
44
|
-
|
45
|
-
|
55
|
+
segments:
|
56
|
+
- 2
|
57
|
+
- 6
|
58
|
+
- 0
|
59
|
+
version: 2.6.0
|
60
|
+
type: :development
|
61
|
+
version_requirements: *id003
|
46
62
|
description: |-
|
47
63
|
Graph is a type of hash that outputs in graphviz's dot format. It
|
48
64
|
comes with a command-line interface that is easily pluggable.
|
@@ -71,6 +87,7 @@ files:
|
|
71
87
|
- lib/freebsd_analyzer.rb
|
72
88
|
- lib/graph.rb
|
73
89
|
- lib/macports_analyzer.rb
|
90
|
+
- lib/rake_analyzer.rb
|
74
91
|
- lib/rubygems/commands/graph_command.rb
|
75
92
|
- lib/rubygems_analyzer.rb
|
76
93
|
- lib/rubygems_plugin.rb
|
@@ -89,18 +106,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
89
106
|
requirements:
|
90
107
|
- - ">="
|
91
108
|
- !ruby/object:Gem::Version
|
109
|
+
segments:
|
110
|
+
- 0
|
92
111
|
version: "0"
|
93
|
-
version:
|
94
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
113
|
requirements:
|
96
114
|
- - ">="
|
97
115
|
- !ruby/object:Gem::Version
|
116
|
+
segments:
|
117
|
+
- 0
|
98
118
|
version: "0"
|
99
|
-
version:
|
100
119
|
requirements: []
|
101
120
|
|
102
121
|
rubyforge_project: seattlerb
|
103
|
-
rubygems_version: 1.3.
|
122
|
+
rubygems_version: 1.3.6
|
104
123
|
signing_key:
|
105
124
|
specification_version: 3
|
106
125
|
summary: Graph is a type of hash that outputs in graphviz's dot format
|
data.tar.gz.sig
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
I�[ �"O����V��+o�!Q�d�fc"7�sj��_�Piu�_,��w��y�m���pO��!L��ެ���T��"Akv�Ӛ�v�v
|
metadata.gz.sig
DELETED
Binary file
|