Реализовал класс для разрешения макросов в настройках
This commit is contained in:
parent
f415ff5df5
commit
df7e61b816
|
|
@ -0,0 +1,60 @@
|
|||
from Core.DependencyResolver.DependencyResolver import DependencyResolver
|
||||
from Core.DependencyResolver.Node import Node
|
||||
from Core.LineConveyor.MacroResolver import MacroResolver
|
||||
from commands.ValueProvider import ValueProvider
|
||||
from utils.MacroProcessor import MacroProcessor
|
||||
|
||||
|
||||
class SettingsResolver:
|
||||
def __init__(self, settingsDictionary):
|
||||
assert settingsDictionary is not None
|
||||
|
||||
self.settings = settingsDictionary.copy()
|
||||
self.nodeStorage = {}
|
||||
self.macroProcessor = MacroProcessor()
|
||||
|
||||
self.valueProvider = ValueProvider()
|
||||
self.valueProvider.setConfig(self.settings)
|
||||
|
||||
|
||||
def resolveSettings(self):
|
||||
|
||||
self.fillNodesStorage()
|
||||
unresolved = self.nodeStorage.values()
|
||||
|
||||
dependencyResolver = DependencyResolver()
|
||||
resolved = dependencyResolver.resolve(unresolved)
|
||||
|
||||
self.resolveSettingValues(resolved)
|
||||
return self.settings
|
||||
|
||||
def fillNodesStorage(self):
|
||||
|
||||
for key in self.settings:
|
||||
node = self.fetchNodeByKey(key)
|
||||
|
||||
value = self.settings[key]
|
||||
macroNames = self.macroProcessor.getSymbols(value)
|
||||
|
||||
for symbol in macroNames:
|
||||
name = self.macroProcessor.getNameByMacroName(symbol)
|
||||
dependency = self.fetchNodeByKey(name)
|
||||
|
||||
node.addEdge(dependency)
|
||||
|
||||
def fetchNodeByKey(self, key):
|
||||
assert key is not Node
|
||||
|
||||
node = self.nodeStorage.get(key, Node(key))
|
||||
self.nodeStorage[key] = node
|
||||
|
||||
return node
|
||||
|
||||
def resolveSettingValues(self, resolvedDependencies):
|
||||
macroResolver = MacroResolver(self.macroProcessor, self.valueProvider)
|
||||
|
||||
for node in resolvedDependencies:
|
||||
unresolvedSettingValue = self.settings[node.name]
|
||||
resolvedSettingValue = macroResolver.processText(unresolvedSettingValue)
|
||||
|
||||
self.settings[node.name] = resolvedSettingValue
|
||||
|
|
@ -29,3 +29,35 @@ class TestDependencyResolver(unittest.TestCase):
|
|||
self.assertEqual(node3, resolved[2])
|
||||
self.assertEqual(node4, resolved[3])
|
||||
|
||||
def test_TwoConnectedness(self):
|
||||
# first
|
||||
node1 = Node('node1')
|
||||
node2 = Node('node2')
|
||||
|
||||
node3 = Node('node3')
|
||||
node3.addEdge(node1)
|
||||
node3.addEdge(node2)
|
||||
|
||||
node4 = Node('node4')
|
||||
node4.addEdge(node3)
|
||||
node4.addEdge(node1)
|
||||
|
||||
# second
|
||||
node5 = Node('node5')
|
||||
|
||||
node6 = Node('node6')
|
||||
node6.addEdge(node5)
|
||||
|
||||
unresolved = [node4, node3, node2, node1, node6, node5]
|
||||
resolved = self.resolver.resolve(unresolved)
|
||||
|
||||
self.assertEqual(6, len(resolved))
|
||||
|
||||
self.assertEqual(node1, resolved[0])
|
||||
self.assertEqual(node2, resolved[1])
|
||||
self.assertEqual(node3, resolved[2])
|
||||
self.assertEqual(node4, resolved[3])
|
||||
self.assertEqual(node5, resolved[4])
|
||||
self.assertEqual(node6, resolved[5])
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
__author__ = 'rzaitov'
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
import unittest
|
||||
from Core.DependencyResolver.SettingsResolver import SettingsResolver
|
||||
|
||||
|
||||
class TestSettingsResolver(unittest.TestCase):
|
||||
def test_resolveSettings(self):
|
||||
unresolvedSettings = {
|
||||
'key1': 'value1',
|
||||
'key2': 'value2',
|
||||
'key3': '{@key1} {@key2}',
|
||||
'key4': '{@key1} {@key3}',
|
||||
|
||||
'key5': 'value5',
|
||||
'key6': '{@key5} value6'
|
||||
}
|
||||
|
||||
settingsResolver = SettingsResolver(unresolvedSettings)
|
||||
resolvedSettings = settingsResolver.resolveSettings()
|
||||
|
||||
self.assertEqual('value1', resolvedSettings['key1'])
|
||||
self.assertEqual('value2', resolvedSettings['key2'])
|
||||
self.assertEqual('value1 value2', resolvedSettings['key3'])
|
||||
self.assertEqual('value1 value1 value2', resolvedSettings['key4'])
|
||||
|
||||
self.assertEqual('value5', resolvedSettings['key5'])
|
||||
self.assertEqual('value5 value6', resolvedSettings['key6'])
|
||||
|
|
@ -16,6 +16,11 @@ class MacroProcessor:
|
|||
|
||||
return macro[1:-1]
|
||||
|
||||
def getNameByMacroName(self, macroName):
|
||||
assert macroName.startswith('@')
|
||||
|
||||
return macroName[1:]
|
||||
|
||||
def getSymbols(self, line):
|
||||
assert line is not None
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue