Начал реализацию SettingsParser
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
class PathParser:
|
||||
def parsePath(self, line):
|
||||
def parse(self, line):
|
||||
assert line is not None
|
||||
|
||||
pathSegments = line.split('.')
|
||||
|
||||
@@ -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):
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user