реализовал класс узла для графа зависимостей. Написал тест разрешения зависимостей для односвязанного графа
This commit is contained in:
parent
5293ab0aab
commit
f415ff5df5
|
|
@ -0,0 +1,38 @@
|
||||||
|
class DependencyResolver:
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def resolve(self, unresolved):
|
||||||
|
assert unresolved is not None
|
||||||
|
resolved = []
|
||||||
|
|
||||||
|
while len(unresolved) > 0:
|
||||||
|
node = unresolved[0]
|
||||||
|
self.resolveNode(node, resolved, unresolved, [])
|
||||||
|
|
||||||
|
return resolved
|
||||||
|
|
||||||
|
def resolveNode(self, node, resolved, unresolved, seen):
|
||||||
|
assert node is not None
|
||||||
|
assert resolved is not None
|
||||||
|
assert seen is not None
|
||||||
|
|
||||||
|
seen.append(node)
|
||||||
|
|
||||||
|
for dependency in node.edges:
|
||||||
|
if dependency not in resolved:
|
||||||
|
self.guardNotCircularReference(node, dependency, seen)
|
||||||
|
self.resolveNode(dependency, resolved, unresolved, seen)
|
||||||
|
|
||||||
|
resolved.append(node)
|
||||||
|
unresolved.remove(node)
|
||||||
|
seen.remove(node)
|
||||||
|
|
||||||
|
def guardNotCircularReference(self, start, dependency, seen):
|
||||||
|
assert start is not None
|
||||||
|
assert dependency is not None
|
||||||
|
assert seen is not None
|
||||||
|
|
||||||
|
if dependency in seen:
|
||||||
|
raise Exception('Circular reference detected: {0} -> {1}'.format(start.name, dependency.name))
|
||||||
|
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
class Node:
|
||||||
|
def __init__(self, name):
|
||||||
|
assert name is not None
|
||||||
|
|
||||||
|
self.name = name
|
||||||
|
self.edges = []
|
||||||
|
|
||||||
|
def addEdge(self, node):
|
||||||
|
assert node is not None
|
||||||
|
assert node not in self.edges
|
||||||
|
|
||||||
|
self.edges.append(node)
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
__author__ = 'rzaitov'
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
__author__ = 'rzaitov'
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
import unittest
|
||||||
|
from Core.DependencyResolver.DependencyResolver import DependencyResolver
|
||||||
|
from Core.DependencyResolver.Node import Node
|
||||||
|
|
||||||
|
|
||||||
|
class TestDependencyResolver(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.resolver = DependencyResolver()
|
||||||
|
|
||||||
|
def test_OneConnectedness(self):
|
||||||
|
node1 = Node('node1')
|
||||||
|
node2 = Node('node2')
|
||||||
|
|
||||||
|
node3 = Node('node3')
|
||||||
|
node3.addEdge(node1)
|
||||||
|
node3.addEdge(node2)
|
||||||
|
|
||||||
|
node4 = Node('node4')
|
||||||
|
node4.addEdge(node3)
|
||||||
|
node4.addEdge(node1)
|
||||||
|
|
||||||
|
unresolved = [node4, node3, node2, node1]
|
||||||
|
resolved = self.resolver.resolve(unresolved)
|
||||||
|
|
||||||
|
self.assertEqual(4, len(resolved))
|
||||||
|
|
||||||
|
self.assertEqual(node1, resolved[0])
|
||||||
|
self.assertEqual(node2, resolved[1])
|
||||||
|
self.assertEqual(node3, resolved[2])
|
||||||
|
self.assertEqual(node4, resolved[3])
|
||||||
|
|
||||||
Loading…
Reference in New Issue