/
dep.py
91 lines (84 loc) · 3.31 KB
/
dep.py
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/python
# hierarchical dependency resolution system
# Bryan Bishop kanzure@gmail.com http://heybryan.org/
# 2009-06-27
import graph as pygraph
import unittest
import yaml
# node class
class Dependency(yaml.YAMLObject):
def __init__(self, graph, name="dependency name here"):
self.name = name
self.graph = graph
self.met = False
#self.dependencies = []
self.dependencysets = {}
def __repr__(self):
return ("%s, m:%s, approaches:%d" % (self.name, self.met, len(self.dependencysets)))
def solved(self):
# note: if all dependencies of this dependency are solved,
# then this dependency should be by definition 'solved'.
# FIXME: check for whether or not all dependencies are solved.
return self.met
#def dependencies(self):
# return self.neighbors()
def step(self):
# note: if all dependencies of this dependency are solved,
# then this dependency should be by definition 'solved'.
# check whether or not all of the dependencies are solved
if len(self.dependencysets) > 0:
totallybroken = False
for each in self.dependencysets:
broken = False
if len(self.dependencysets[each]) > 0:
for dependence in self.dependencysets[each]:
dependence.step()
if not dependence.met: broken = True
if not broken: self.met = True # FIXME: keep track of which set of dependencies actually work
def add_dependency(self, setname, dependency):
# self depends on from1
if self.dependencysets.has_key(setname):
self.dependencysets[setname].append(dependency)
else:
self.dependencysets[setname] = [[dependency]]
class Resolver(yaml.YAMLObject, pygraph.digraph):
def __init__(self):
self.node_neighbors = {}
self.node_incidence = {}
self.node_attr = {}
self.edge_properties = {}
self.edge_attr = {}
return
def run(self):
for each in self.nodes():
each.step()
def dependencies(self,node):
return self.neighbors(node)
def unmets(self,node):
# return unmet dependencies
return
def add_dependency(self, setname, dependency, root):
'''
setname is the setname or index of to1's dependencyset list where this dependency is to be appended
'''
#from1.add_edge(from1, to1)
root.add_dependency(setname, dependency)
pygraph.digraph.add_edge(self, root, dependency) #dependency, root)
class TestResolver(unittest.TestCase):
def test_Dependency(self):
g = Resolver()
fuel = Dependency(g,name="fuel")
transportation = Dependency(g,name="transportation device")
g.add_node(fuel)
g.add_node(transportation)
g.add_dependency("The Typical Approach", fuel, transportation)
# a dependency of d1 is d2 (er, at least in name)
self.assertTrue(g.dependencies((g.nodes())[0])==[fuel])
print "grabbing the approaches to solving the 'transportation device': "
print transportation.dependencysets
print "\n\n\nyaml testing\n\n"
print yaml.dump(g)
def test_Resolver(self):
pass
if __name__ == '__main__':
unittest.main()