# HG changeset patch # User Augie Fackler # Date 1384713200 18000 # Node ID c65a6937b828c0a111584805751e2120b4bce902 # Parent 957b43371928c688313b912d3739420fee219610 import-checker: try a little harder to show fewer cycles This makes sure that all cycles begin with the lexicographically first module, so that we're less likely to show overlapping cycles in the final analysis. diff -r 957b43371928 -r c65a6937b828 contrib/import-checker.py --- a/contrib/import-checker.py Sun Nov 17 16:58:18 2013 -0500 +++ b/contrib/import-checker.py Sun Nov 17 13:33:20 2013 -0500 @@ -153,6 +153,15 @@ continue check_one_mod(i, imports, path=path, ignore=ignore) +def rotatecycle(cycle): + """arrange a cycle so that the lexicographically first module listed first + + >>> rotatecycle(['foo', 'bar', 'foo']) + ['bar', 'foo', 'bar'] + """ + lowest = min(cycle) + idx = cycle.index(lowest) + return cycle[idx:] + cycle[1:idx] + [lowest] def find_cycles(imports): """Find cycles in an already-loaded import graph. @@ -162,8 +171,8 @@ ... 'top.baz': ['foo'], ... 'top.qux': ['foo']} >>> print '\\n'.join(sorted(find_cycles(imports))) - top.bar -> top.baz -> top.foo -> top.bar - top.foo -> top.qux -> top.foo + top.bar -> top.baz -> top.foo -> top.bar -> top.bar + top.foo -> top.qux -> top.foo -> top.foo """ cycles = {} for mod in sorted(imports.iterkeys()):