| Total Complexity | 6 |
| Total Lines | 35 |
| Duplicated Lines | 0 % |
| Changes | 1 | ||
| Bugs | 0 | Features | 0 |
| 1 | class CircularDependencyError(Exception): |
||
| 13 | class Dependencies: |
||
| 14 | |||
| 15 | @classmethod |
||
| 16 | def _resolve(cls, 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 not missing: |
||
| 23 | resolved_bears.append(bear) |
||
| 24 | continue |
||
| 25 | |||
| 26 | if bear in seen: |
||
| 27 | seen.append(bear) |
||
| 28 | raise CircularDependencyError(seen) |
||
| 29 | |||
| 30 | seen.append(bear) |
||
| 31 | resolved_bears = cls._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 | @classmethod |
||
| 38 | def check_circular_dependency(cls, 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 cls._resolve(bears, [], []) |
||
| 48 |