From b348b35b40aa6c4f58ac0a0a9cbddc733aa908af Mon Sep 17 00:00:00 2001 From: rzaitov Date: Thu, 31 Oct 2013 20:35:18 +0400 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=20bu?= =?UTF-8?q?ildConfigProvider=20=E2=80=93=20=D0=B2=20=D0=B5=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=20=D0=B2=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=B8=D1=82=20=D0=B2=D1=8B=D0=B4=D0=B0=D1=82=D1=8C=20=D1=81?= =?UTF-8?q?=D1=81=D1=8B=D0=BB=D0=BA=D0=B8=20=D0=BD=D0=B0=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BD=D1=84=D0=B8=D0=B3=D1=83=D1=80=D0=B0=D1=86=D0=B8=D0=B8=20?= =?UTF-8?q?=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B5=20=D0=BD=D0=B5=D0=BE?= =?UTF-8?q?=D0=B1=D1=85=D0=BE=D0=B4=D0=B8=D0=BC=D0=BE=20=D1=81=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D1=82=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UnitTests/BuildConfigProvider/__init__.py | 1 + .../test_BuildConfigProvider.py | 59 +++++++++++++++++++ scripts/utils/configs/BuildConfigProvider.py | 50 +++++++++++++--- 3 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 scripts/UnitTests/BuildConfigProvider/__init__.py create mode 100644 scripts/UnitTests/BuildConfigProvider/test_BuildConfigProvider.py diff --git a/scripts/UnitTests/BuildConfigProvider/__init__.py b/scripts/UnitTests/BuildConfigProvider/__init__.py new file mode 100644 index 0000000..cc31abc --- /dev/null +++ b/scripts/UnitTests/BuildConfigProvider/__init__.py @@ -0,0 +1 @@ +__author__ = 'rzaitov' diff --git a/scripts/UnitTests/BuildConfigProvider/test_BuildConfigProvider.py b/scripts/UnitTests/BuildConfigProvider/test_BuildConfigProvider.py new file mode 100644 index 0000000..7508361 --- /dev/null +++ b/scripts/UnitTests/BuildConfigProvider/test_BuildConfigProvider.py @@ -0,0 +1,59 @@ +import unittest +from utils.configs.BuildConfigProvider import BuildConfigProvider + + +class TestBuildConfigProvider(unittest.TestCase): + def setUp(self): + self.provider = BuildConfigProvider() + + def test_getAncestorsFor(self): + wr0 = {'parent': None} + wr1 = {'parent': wr0} + wr2 = {'parent': wr1} + + ancestors = self.provider.getAncestorsFor(wr2) + + self.assertEqual(wr0, ancestors[0]) + self.assertEqual(wr1, ancestors[1]) + self.assertEqual(wr2, ancestors[2]) + + def test_unionConfig(self): + wr0 = { + 'parent': None, + 'dict': { + 'key1': 'a', + 'key2': 'b', + 'key3': 'c', + 'key4': 'd' + } + } + wr1 = { + 'parent': wr0, + 'dict':{ + 'key2': 'bb', + 'key3': 'cc', + 'key4': 'dd', + + 'key5': 'ee' + } + } + wr2 = { + 'parent': wr1, + 'dict':{ + 'key3': 'ccc', + 'key4': 'ddd', + + 'key6': 'fff' + } + } + + config = self.provider.fetchConfigFromLeafWrapper(wr2) + expected = { + 'key1': 'a', + 'key2': 'bb', + 'key3': 'ccc', + 'key4': 'ddd', + 'key5': 'ee', + 'key6': 'fff' + } + self.assertDictEqual(expected, config) diff --git a/scripts/utils/configs/BuildConfigProvider.py b/scripts/utils/configs/BuildConfigProvider.py index 16f20c8..02c3f07 100644 --- a/scripts/utils/configs/BuildConfigProvider.py +++ b/scripts/utils/configs/BuildConfigProvider.py @@ -1,16 +1,48 @@ class BuildConfigProvider: - def getBuildReadyConfigs(self, settingsDict, buildReadyList): - assert settingsDict is not None - assert buildReadyList is not None + def getConfigs(self, rootConfig): + leafs = [] + self.traverseDict(None, rootConfig, leafs) - for key in settingsDict: - value = settingsDict[key] + configs = [] + for l in leafs: + config = self.fetchConfigFromLeafWrapper(l) + configs.append(config) + + return configs + + def traverseDict(self, parent, dictForTraverse, leafs): + wrapper = { + 'parent' : parent, + 'dict' : dictForTraverse + } + + isLeaf = True + for key in dictForTraverse: + value = dictForTraverse[key] if type(value) is dict: - self.getBuildReadyConfigs(value, buildReadyList) + isLeaf = False + self.traverseDict(wrapper, value, leafs) - elif key == 'build_ready' and value == 'true': - buildReadyList.append(settingsDict) - break + if isLeaf: + leafs.append(wrapper) + def fetchConfigFromLeafWrapper(self, leafWrapper): + ancestors = self.getAncestorsFor(leafWrapper) + unionConf = {} + for a in ancestors: + unionConf.update(a['dict']) + + return unionConf + + def getAncestorsFor(self, leaf): + ancestors = [leaf] + parent = leaf['parent'] + + while parent is not None: + ancestors.append(parent) + parent = parent['parent'] + + ancestors.reverse() + return ancestors \ No newline at end of file