Начал реализацию SettingsParser

This commit is contained in:
rzaitov 2013-10-31 17:21:47 +04:00
parent 2b6436e9f4
commit 3e8b59bbf4
5 changed files with 88 additions and 6 deletions

View File

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

View File

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

View File

@ -1,5 +1,5 @@
class PathParser:
def parsePath(self, line):
def parse(self, line):
assert line is not None
pathSegments = line.split('.')

View File

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

View File

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