diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-12-05 12:51:24 -0500 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2010-12-05 12:51:24 -0500 |
| commit | 1f9029597caf3d9d9e64e5a326508babfca60ebb (patch) | |
| tree | d61b888173b7a0a6b6d4f061a3afad734812e1da /lib/sqlalchemy/topological.py | |
| parent | 49145a6940062486a6eec66bfe5c9d95c5f76c7a (diff) | |
| download | sqlalchemy-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.py | 83 |
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] - ]) |
