Thread: [Sqlalchemy-commits] sqlalchemy: some apparent refactorings
Brought to you by:
zzzeek
From: <co...@sq...> - 2010-03-21 16:58:27
|
details: http://hg.sqlalchemy.org/sqlalchemy/sqlalchemy/rev/fc2bf216d907 changeset: 6343:fc2bf216d907 user: zzzeek date: Sun Mar 21 12:58:14 2010 -0400 description: some apparent refactorings diffstat: lib/sqlalchemy/orm/unitofwork.py | 1 + lib/sqlalchemy/topological.py | 23 +++++++++-------------- 2 files changed, 10 insertions(+), 14 deletions(-) diffs (75 lines): diff -r 07f975b69fd3 -r fc2bf216d907 lib/sqlalchemy/orm/unitofwork.py --- a/lib/sqlalchemy/orm/unitofwork.py Sat Mar 20 22:01:12 2010 -0600 +++ b/lib/sqlalchemy/orm/unitofwork.py Sun Mar 21 12:58:14 2010 -0400 @@ -483,6 +483,7 @@ per-mapper topological structure is found to have cycles. """ + dependencies = {} def set_processor_for_state(state, depprocessor, target_state, isdelete): if state not in dependencies: diff -r 07f975b69fd3 -r fc2bf216d907 lib/sqlalchemy/topological.py --- a/lib/sqlalchemy/topological.py Sat Mar 20 22:01:12 2010 -0600 +++ b/lib/sqlalchemy/topological.py Sun Mar 21 12:58:14 2010 -0400 @@ -172,7 +172,7 @@ n = nodes[id0] n.cycles = set([n]) elif not ignore_self_cycles: - raise CircularDependencyError("Self-referential dependency detected " + repr(t)) + raise CircularDependencyError("Self-referential dependency detected: %r" % t) continue childnode = nodes[id1] parentnode = nodes[id0] @@ -207,7 +207,7 @@ continue else: # long cycles not allowed - raise CircularDependencyError("Circular dependency detected " + repr(edges) + repr(queue)) + raise CircularDependencyError("Circular dependency detected: %r %r " % (edges, queue)) node = queue.pop() if not hasattr(node, '_cyclical'): output.append(node) @@ -264,35 +264,30 @@ return (head.item, [n.item for n in head.cycles or []], head.children) def _find_cycles(edges): - involved_in_cycles = set() cycles = {} - def traverse(node, goal=None, cycle=None): - if goal is None: - goal = node - cycle = [] - elif node is goal: - return True + def traverse(node, cycle, goal): for (n, key) in edges.edges_by_parent(node): if key in cycle: continue - cycle.append(key) - if traverse(key, goal, cycle): + cycle.add(key) + if key is goal: cycset = set(cycle) for x in cycle: - involved_in_cycles.add(x) if x in cycles: existing_set = cycles[x] - [existing_set.add(y) for y in cycset] + existing_set.update(cycset) for y in existing_set: cycles[y] = existing_set cycset = existing_set else: cycles[x] = cycset + else: + traverse(key, cycle, goal) cycle.pop() for parent in edges.get_parents(): - traverse(parent) + traverse(parent, set(), parent) unique_cycles = set(tuple(s) for s in cycles.values()) |