summaryrefslogtreecommitdiff
path: root/misc/openlayers/tools/toposort.py
diff options
context:
space:
mode:
authorChris Schlaeger <chris@linux.com>2014-08-12 21:56:44 +0200
committerChris Schlaeger <chris@linux.com>2014-08-12 21:56:44 +0200
commitea346a785dc1b3f7c156f6fc33da634e1f1a627b (patch)
treeaf67530553d20b6e82ad60fd79593e9c4abf5565 /misc/openlayers/tools/toposort.py
parent59741cd535c47f25971bf8c32b25da25ceadc6d5 (diff)
downloadpostrunner-fb1989bda5d3e0a5472ba7644d57cae197733a8f.zip
Adding jquery, flot and openlayers to be included with the GEM.v0.0.4
Diffstat (limited to 'misc/openlayers/tools/toposort.py')
-rw-r--r--misc/openlayers/tools/toposort.py35
1 files changed, 35 insertions, 0 deletions
diff --git a/misc/openlayers/tools/toposort.py b/misc/openlayers/tools/toposort.py
new file mode 100644
index 0000000..ba586ef
--- /dev/null
+++ b/misc/openlayers/tools/toposort.py
@@ -0,0 +1,35 @@
+"""
+toposort.py
+Sorts dictionary keys based on lists of dependencies.
+"""
+
+class MissingDependency(Exception):
+ """Exception raised when a listed dependency is not in the dictionary."""
+
+class Sorter(object):
+ def __init__(self, dependencies):
+ self.dependencies = dependencies
+ self.visited = set()
+ self.sorted = ()
+
+ def sort(self):
+ for key in self.dependencies:
+ self._visit(key)
+ return self.sorted
+
+ def _visit(self, key):
+ if key not in self.visited:
+ self.visited.add(key)
+ if not self.dependencies.has_key(key):
+ raise MissingDependency(key)
+ for depends in self.dependencies[key]:
+ self._visit(depends)
+ self.sorted += (key,)
+
+def toposort(dependencies):
+ """Returns a tuple of the dependencies dictionary keys sorted by entries
+ in the dependency lists. Given circular dependencies, sort will impose
+ an order. Raises MissingDependency if a key is not found.
+ """
+ s = Sorter(dependencies)
+ return s.sort()