BuildScript/scripts/parser/SettingsParser/SettingsParser.py

60 lines
1.3 KiB
Python

from parser.SettingsParser.SettingsLineParser import SettingsLineParser
class SettingsParser:
def __init__(self):
self.settings = {}
def parse(self, content):
assert content is not None
lines = content.splitlines()
for line in lines:
stripped = line.strip(' \t\n\r')
print (line, stripped)
if len(stripped) == 0:
continue
if stripped.startswith("#"):
continue
self.processLine(stripped)
def processLine(self, line):
parser = SettingsLineParser()
setting = parser.parseLine(line)
self.mergeSetting(setting)
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)