diff --git a/scripts/UnitTests/SettingsParser/test_PathParser.py b/scripts/UnitTests/SettingsParser/test_PathParser.py index 46e678c..96471aa 100644 --- a/scripts/UnitTests/SettingsParser/test_PathParser.py +++ b/scripts/UnitTests/SettingsParser/test_PathParser.py @@ -8,7 +8,7 @@ class TestPathParser(unittest.TestCase): def test_parseValidInput(self): propertyPath = '123.abc.some_name' - segments = self.parser.parsePath(propertyPath) + segments = self.parser.parse(propertyPath) self.assertEqual(3, len(segments)) self.assertEqual('123', segments[0]) diff --git a/scripts/UnitTests/SettingsParser/test_SettingsParser.py b/scripts/UnitTests/SettingsParser/test_SettingsParser.py new file mode 100644 index 0000000..f515880 --- /dev/null +++ b/scripts/UnitTests/SettingsParser/test_SettingsParser.py @@ -0,0 +1,25 @@ +import unittest +from parser.SettingsParser.SettingsParser import SettingsParser + + + +class TestSettingsParser(unittest.TestCase): + def setUp(self): + self.parser = SettingsParser() + + def test_getSettingsDictByPath(self): + + len0 = len(self.parser.settings) + self.assertEqual(0, len0) + + self.parser.getSettingsDictByPath(['one']) + len1 = len(self.parser.settings) + self.assertEqual(1, len1) + + self.parser.getSettingsDictByPath(['one', 'two']) + len1 = len(self.parser.settings) + self.assertEqual(1, len1) + + self.parser.getSettingsDictByPath(['another', 'two']) + len2 = len(self.parser.settings) + self.assertEqual(2, len2) \ No newline at end of file diff --git a/scripts/parser/SettingsParser/PathParser.py b/scripts/parser/SettingsParser/PathParser.py index fac8e87..6ac3a6b 100644 --- a/scripts/parser/SettingsParser/PathParser.py +++ b/scripts/parser/SettingsParser/PathParser.py @@ -1,5 +1,5 @@ class PathParser: - def parsePath(self, line): + def parse(self, line): assert line is not None pathSegments = line.split('.') diff --git a/scripts/parser/SettingsParser/SettingsLineParser.py b/scripts/parser/SettingsParser/SettingsLineParser.py index 72909b6..b75da52 100644 --- a/scripts/parser/SettingsParser/SettingsLineParser.py +++ b/scripts/parser/SettingsParser/SettingsLineParser.py @@ -1,14 +1,26 @@ from parser.LineParser import LineParser import re +from parser.SettingsParser.PathParser import PathParser + class SettingsLineParser(LineParser): def parseLine(self, line): assert line is not None pathAndValue = self.splitToPathAndValue(line) - propertyPath = pathAndValue[0] - value = [1] + path = pathAndValue[0] + value = pathAndValue[1] + + pathParser = PathParser() + pathSegments = pathParser.parse(path) + + result = { + 'segments' : pathSegments, + 'value' : value + } + + return result def splitToPathAndValue(self, line): diff --git a/scripts/parser/SettingsParser/SettingsParser.py b/scripts/parser/SettingsParser/SettingsParser.py index 559794e..dcc2275 100644 --- a/scripts/parser/SettingsParser/SettingsParser.py +++ b/scripts/parser/SettingsParser/SettingsParser.py @@ -1,4 +1,49 @@ +from parser.SettingsParser.SettingsLineParser import SettingsLineParser + + class SettingsParser: - def __init__(self, content): + def __init__(self): + self.settings = {} + + def parse(self, content): assert content is not None - pass + + lines = content.splitlines() + for line in lines: + self.processLine(line) + + def processLine(self, line): + + parser = SettingsLineParser() + result = parser.parseLine(line) + + def mergeSetting(self, setting): + value = setting['value'] + segments = setting['segments'] + + propPath = segments[0:-1] + propName = segments[-1] + + settingsDict = self.getSettingsDictByPath(propPath) + self.overrideGuard(settingsDict, propName, propPath) + + settingsDict[propName] = value + + def getSettingsDictByPath(self, pathToSettingsDict): + + settingsDict = self.settings + for segment in pathToSettingsDict: + + if segment not in settingsDict: + settingsDict[segment] = {} + + settingsDict = settingsDict[segment] + + return settingsDict + + def overrideGuard(self, dict, key, path): + if key in dict: + pathStr = '.'.joun(path) + msg = 'settings with name {0} by path {1} already exists with value {3}'.format(key, dict[key], pathStr) + raise Exception(msg) +