| Conditions | 3 |
| Total Lines | 35 |
| Lines | 0 |
| Ratio | 0 % |
| 1 | class CircularDependencyError(Exception): |
||
| 12 | |||
| 13 | return cls("Circular dependency detected: " + " -> ".join(bear_names)) |
||
| 14 | |||
| 15 | |||
| 16 | def _resolve(bears, resolved_bears, seen): |
||
| 17 | for bear in bears: |
||
| 18 | if bear in resolved_bears: |
||
| 19 | continue |
||
| 20 | |||
| 21 | missing = bear.missing_dependencies(resolved_bears) |
||
| 22 | if missing == []: |
||
| 23 | resolved_bears.append(bear) |
||
| 24 | continue |
||
| 25 | |||
| 26 | if bear in seen: |
||
| 27 | seen.append(bear) |
||
| 28 | raise CircularDependencyError.for_bears(seen) |
||
| 29 | |||
| 30 | seen.append(bear) |
||
| 31 | resolved_bears = _resolve(missing, resolved_bears, seen) |
||
| 32 | resolved_bears.append(bear) |
||
| 33 | seen.remove(bear) # Already resolved, no candidate for circular dep |
||
| 34 | |||
| 35 | return resolved_bears |
||
| 36 | |||
| 37 | |||
| 38 | def resolve(bears): |
||
| 39 | """ |
||
| 40 | Collects all dependencies of the given bears. This will also remove |
||
| 41 | duplicates. |
||
| 42 | |||
| 43 | :param bears: The given bears. Will not be modified. |
||
| 44 | :return: The new list of bears, sorted so that it can be executed |
||
| 45 | sequentially without dependency issues. |
||
| 46 | """ |
||
| 47 | return _resolve(bears, [], []) |
||
| 48 |