From df7e61b8167bded04af0eec225add09c69d2d9c8 Mon Sep 17 00:00:00 2001 From: rzaitov Date: Mon, 11 Nov 2013 15:45:51 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B7=D1=80=D0=B5=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BC=D0=B0=D0=BA=D1=80=D0=BE=D1=81=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B2=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA?= =?UTF-8?q?=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DependencyResolver/SettingsResolver.py | 60 +++++++++++++++++++ .../DependencyResolver/test_resolver.py | 32 ++++++++++ .../UnitTests/SettingsResolver/__init__.py | 1 + .../SettingsResolver/test_settingsResolver.py | 26 ++++++++ scripts/TouchinBuild/utils/MacroProcessor.py | 5 ++ 5 files changed, 124 insertions(+) create mode 100644 scripts/TouchinBuild/Core/DependencyResolver/SettingsResolver.py create mode 100644 scripts/TouchinBuild/Tests/UnitTests/SettingsResolver/__init__.py create mode 100644 scripts/TouchinBuild/Tests/UnitTests/SettingsResolver/test_settingsResolver.py diff --git a/scripts/TouchinBuild/Core/DependencyResolver/SettingsResolver.py b/scripts/TouchinBuild/Core/DependencyResolver/SettingsResolver.py new file mode 100644 index 0000000..3b3c50f --- /dev/null +++ b/scripts/TouchinBuild/Core/DependencyResolver/SettingsResolver.py @@ -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 \ No newline at end of file diff --git a/scripts/TouchinBuild/Tests/UnitTests/DependencyResolver/test_resolver.py b/scripts/TouchinBuild/Tests/UnitTests/DependencyResolver/test_resolver.py index 23834c6..ff9b717 100644 --- a/scripts/TouchinBuild/Tests/UnitTests/DependencyResolver/test_resolver.py +++ b/scripts/TouchinBuild/Tests/UnitTests/DependencyResolver/test_resolver.py @@ -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]) + + diff --git a/scripts/TouchinBuild/Tests/UnitTests/SettingsResolver/__init__.py b/scripts/TouchinBuild/Tests/UnitTests/SettingsResolver/__init__.py new file mode 100644 index 0000000..cc31abc --- /dev/null +++ b/scripts/TouchinBuild/Tests/UnitTests/SettingsResolver/__init__.py @@ -0,0 +1 @@ +__author__ = 'rzaitov' diff --git a/scripts/TouchinBuild/Tests/UnitTests/SettingsResolver/test_settingsResolver.py b/scripts/TouchinBuild/Tests/UnitTests/SettingsResolver/test_settingsResolver.py new file mode 100644 index 0000000..0a6cc15 --- /dev/null +++ b/scripts/TouchinBuild/Tests/UnitTests/SettingsResolver/test_settingsResolver.py @@ -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']) \ No newline at end of file diff --git a/scripts/TouchinBuild/utils/MacroProcessor.py b/scripts/TouchinBuild/utils/MacroProcessor.py index 911647d..614d6ff 100644 --- a/scripts/TouchinBuild/utils/MacroProcessor.py +++ b/scripts/TouchinBuild/utils/MacroProcessor.py @@ -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