summaryrefslogtreecommitdiff
path: root/core/dep.py
blob: dcb15cbecdaa20c295fbda68be9eea4851761d18 (plain)
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
#!/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)