From 1258d1ed9e8064e08fd77d2dc3938fcebc130800 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 31 Mar 2010 13:52:57 -0400 Subject: - 'cycle' is a stack here - needs to be a list. --- lib/sqlalchemy/topological.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/sqlalchemy/topological.py') diff --git a/lib/sqlalchemy/topological.py b/lib/sqlalchemy/topological.py index d35213f6b..9e584ff4e 100644 --- a/lib/sqlalchemy/topological.py +++ b/lib/sqlalchemy/topological.py @@ -270,7 +270,7 @@ def _find_cycles(edges): for (n, key) in edges.edges_by_parent(node): if key in cycle: continue - cycle.add(key) + cycle.append(key) if key is goal: cycset = set(cycle) for x in cycle: @@ -287,7 +287,7 @@ def _find_cycles(edges): cycle.pop() for parent in edges.get_parents(): - traverse(parent, set(), parent) + traverse(parent, [], parent) unique_cycles = set(tuple(s) for s in cycles.values()) -- cgit v1.2.1 From 3b7ef1b32dfd8e9d93ffd99f4c40a1d020b083d1 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Thu, 1 Apr 2010 12:45:51 -0400 Subject: - id(obj) is no longer used internally within topological.py, as the sorting functions now require hashable objects only. [ticket:1756] --- lib/sqlalchemy/topological.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'lib/sqlalchemy/topological.py') diff --git a/lib/sqlalchemy/topological.py b/lib/sqlalchemy/topological.py index 9e584ff4e..d061aec04 100644 --- a/lib/sqlalchemy/topological.py +++ b/lib/sqlalchemy/topological.py @@ -161,21 +161,20 @@ def _sort(tuples, allitems, allow_cycles=False, ignore_self_cycles=False): edges = _EdgeCollection() for item in list(allitems) + [t[0] for t in tuples] + [t[1] for t in tuples]: - item_id = id(item) - if item_id not in nodes: - nodes[item_id] = _Node(item) + if item not in nodes: + nodes[item] = _Node(item) for t in tuples: - id0, id1 = id(t[0]), id(t[1]) - if t[0] is t[1]: + t0, t1 = t[0], t[1] + if t0 is t1: if allow_cycles: - n = nodes[id0] + n = nodes[t0] n.cycles = set([n]) elif not ignore_self_cycles: raise CircularDependencyError("Self-referential dependency detected: %r" % t) continue - childnode = nodes[id1] - parentnode = nodes[id0] + childnode = nodes[t1] + parentnode = nodes[t0] edges.add((parentnode, childnode)) queue = [] @@ -207,11 +206,11 @@ def _sort(tuples, allitems, allow_cycles=False, ignore_self_cycles=False): continue else: # long cycles not allowed - raise CircularDependencyError("Circular dependency detected: %r %r " % (edges, queue)) + raise CircularDependencyError("Circular dependency detected: %r" % edges) node = queue.pop() if not hasattr(node, '_cyclical'): output.append(node) - del nodes[id(node.item)] + del nodes[node.item] for childnode in edges.pop_node(node): queue.append(childnode) return output -- cgit v1.2.1