Реализовал класс для разрешения макросов в настройках

This commit is contained in:
rzaitov 2013-11-11 15:45:51 +04:00
parent f415ff5df5
commit df7e61b816
5 changed files with 124 additions and 0 deletions

View File

@ -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

View File

@ -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])

View File

@ -0,0 +1 @@
__author__ = 'rzaitov'

View File

@ -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'])

View File

@ -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