summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/topological.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2010-12-05 12:51:24 -0500
committerMike Bayer <mike_mp@zzzcomputing.com>2010-12-05 12:51:24 -0500
commit1f9029597caf3d9d9e64e5a326508babfca60ebb (patch)
treed61b888173b7a0a6b6d4f061a3afad734812e1da /lib/sqlalchemy/topological.py
parent49145a6940062486a6eec66bfe5c9d95c5f76c7a (diff)
downloadsqlalchemy-1f9029597caf3d9d9e64e5a326508babfca60ebb.tar.gz
- move topological, queue into util
- move function_named into test.lib.util - use @decorator for all decorators in test/
Diffstat (limited to 'lib/sqlalchemy/topological.py')
-rw-r--r--lib/sqlalchemy/topological.py83
1 files changed, 0 insertions, 83 deletions
diff --git a/lib/sqlalchemy/topological.py b/lib/sqlalchemy/topological.py
deleted file mode 100644
index 0f4f32461..000000000
--- a/lib/sqlalchemy/topological.py
+++ /dev/null
@@ -1,83 +0,0 @@
-# topological.py
-# Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Michael Bayer mike_mp@zzzcomputing.com
-#
-# This module is part of SQLAlchemy and is released under
-# the MIT License: http://www.opensource.org/licenses/mit-license.php
-
-"""Topological sorting algorithms."""
-
-from sqlalchemy.exc import CircularDependencyError
-from sqlalchemy import util
-
-
-__all__ = ['sort', 'sort_as_subsets', 'find_cycles']
-
-def sort_as_subsets(tuples, allitems):
-
- edges = util.defaultdict(set)
- for parent, child in tuples:
- edges[child].add(parent)
-
- todo = set(allitems)
-
- while todo:
- output = set()
- for node in list(todo):
- if not todo.intersection(edges[node]):
- output.add(node)
-
- if not output:
- raise CircularDependencyError(
- "Circular dependency detected",
- find_cycles(tuples, allitems),
- _gen_edges(edges)
- )
-
- todo.difference_update(output)
- yield output
-
-def sort(tuples, allitems):
- """sort the given list of items by dependency.
-
- 'tuples' is a list of tuples representing a partial ordering.
- """
-
- for set_ in sort_as_subsets(tuples, allitems):
- for s in set_:
- yield s
-
-def find_cycles(tuples, allitems):
- # straight from gvr with some mods
- todo = set(allitems)
-
- edges = util.defaultdict(set)
- for parent, child in tuples:
- edges[parent].add(child)
-
- output = set()
-
- while todo:
- node = todo.pop()
- stack = [node]
- while stack:
- top = stack[-1]
- for node in edges[top]:
- if node in stack:
- cyc = stack[stack.index(node):]
- todo.difference_update(cyc)
- output.update(cyc)
-
- if node in todo:
- stack.append(node)
- todo.remove(node)
- break
- else:
- node = stack.pop()
- return output
-
-def _gen_edges(edges):
- return set([
- (right, left)
- for left in edges
- for right in edges[left]
- ])