.. -*-doctest-*-

=================================
Circular Import Step Dependencies
=================================

Unit tests for is_cyclic from b_mathieu.

    >>> from collective.gsqi import gs
    >>> steps = dict([('base', ()),
    ...               (u'my-final', (u'plone-final', u'portlets')),
    ...               (u'plone-final', (u'portlets',)),
    ...               (u'portlets', (u'content',)),
    ...               (u'content', (u'plone-final',)),
    ...              ])
    >>> gs.is_cyclic(u'base', steps)
    False
    >>> gs.is_cyclic(u'plone-final', steps)
    True
    >>> gs.is_cyclic(u'portlets', steps)
    True
    >>> gs.is_cyclic(u'content', steps)
    True
    >>> gs.is_cyclic(u'my-final', steps)
    False

Unit tests for the topo sort from b_mathieu.

    >>> from Products.GenericSetup import utils
    >>> steps = [{'id': u'base', 'dependencies': ()},
    ...          {'id': u'final', 'dependencies': (u'intermediate',)},
    ...          {'id': u'intermediate', 'dependencies': (u'base',)}
    ...          ]
    >>> utils._computeTopologicalSort(steps)
    [u'base', u'intermediate', u'final']

now 'my-final' will depend on 'plone-final' and 'portlets', which are
both involved in a cycle. We want 'my-final' to be placed after both.

    >>> steps = [{'id': u'base', 'dependencies': ()},
    ...          {'id': u'my-final', 'dependencies': (u'plone-final', u'portlets')},
    ...          {'id': u'plone-final', 'dependencies': (u'portlets',)},
    ...          {'id': u'portlets', 'dependencies': (u'content',)},
    ...          {'id': u'content', 'dependencies': (u'plone-final',)},
    ...          ]
    >>> utils._computeTopologicalSort(steps)
    [u'base', u'content', u'plone-final', u'portlets', u'my-final']
