Skip to content

Instantly share code, notes, and snippets.

@svalleru
Last active October 16, 2015 19:39
Show Gist options
  • Save svalleru/f5898e8eab6bb96cb26f to your computer and use it in GitHub Desktop.
Save svalleru/f5898e8eab6bb96cb26f to your computer and use it in GitHub Desktop.
PackageInstaller | DependencyWalker
class Node(object):
def __init__(self, name):
self.name = name
self.deps = []
def make_dep(self, node):
if node not in self.deps:
self.deps.append(node)
def install(self):
# install all depedencies & pkg
resolved = []
Node.resolver(self, resolved, [])
for node in resolved:
print "Installing..", node.name
def remove(self):
# remove all depedencies & pkg
# TBD: olny remove unshared deps
resolved = []
Node.resolver(self, resolved, [])
for node in resolved:
print "Removing..", node.name
def resolver(node, resolved, unresolved):
unresolved.append(node)
for dep in node.deps:
if dep not in resolved: # check if a dep is already resolved
if dep in unresolved: # check for circular depedency
raise Exception('Circular depedencies detected: %s -> %s' % (node.name, dep.name))
Node.resolver(dep, resolved, unresolved)
resolved.append(node)
unresolved.remove(node)
a = Node('a')
b = Node('b')
c = Node('c')
d = Node('d')
e = Node('e')
a.make_dep(b) # a depends on b
a.make_dep(d) # a depends on d
b.make_dep(c) # b depends on c
b.make_dep(e) # b depends on e
c.make_dep(d) # c depends on d
c.make_dep(e) # c depends on e
b.install()
b.remove()
#OUTPUT###
Installing.. d
Installing.. e
Installing.. c
Installing.. b
Removing.. d
Removing.. e
Removing.. c
Removing.. b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment