-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdependencies.rb
60 lines (48 loc) · 1.02 KB
/
dependencies.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class Node
attr_accessor :name, :edge_hash
def initialize(name)
self.name = name
self.edge_hash = {}
end
def add_edge(node)
self.edge_hash[node.name] = true
end
def related_to?(node)
self.edge_hash.has_key?(node.name)
end
def edges
self.edge_hash.keys
end
end
class Dependencies
attr_accessor :nodes
def initialize
@nodes = {}
end
# Build the graph out of nodes w/ edges
def add_direct(key,deps)
unless @nodes.has_key?(key)
@nodes[key] = Node.new(key)
end
deps.each do |n|
self.add_direct(n,[])
@nodes[key].add_edge(@nodes[n])
end
end
# Travese the graph, strting with the passed in node
def dependencies_for(key)
@visited = {}
deps = {}
deps = self.dfs(key,deps)
return deps.keys.sort
end
def dfs(key,list)
@visited[key] = true
@nodes[key].edges.each do |edge|
next if @visited.has_key?(edge)
list.merge self.dfs(@nodes[edge].name,list)
list[edge] = true
end
return list
end
end