-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.py
132 lines (107 loc) · 3.92 KB
/
config.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
from os.path import *
import iniparser2
import logging
#os.path.dirname(os.path.realpath(__file__))
CFG_MAP = {
"main": {
"version": 1,
"src": "",
}
}
class Config:
parser : iniparser2.INI
cfgPath : str = "config.ini"
logger = logging.getLogger("main")
isLoaded : bool = False
@staticmethod
def initConfigObject():
Config.parser = iniparser2.INI()
@staticmethod
def init():
Config.logger.info("Initialize config reader")
Config.initConfigObject()
#check if config file exists
if exists(Config.cfgPath):
Config.readConfig()
else:
Config.createConfig()
ver = Config.parser.get_int("version","main")
Config.logger.info(f"Loaded config version: {ver}")
if (ver != CFG_MAP["main"]["version"]):
Config.logger.info(f"Version not actual; Old: {ver}; New: {CFG_MAP['main']['version']}")
Config.updateConfig()
if Config.parser.get_str("sdkdir",'main') == "do_locate_dir":
Config.logger.info("Detect sdk source directory...")
Config.parser.set('sdkdir',Config.getFileManager().allocateSDKSourceDir(),'main')
Config.logger.info(f"Config initialized (version {ver})")
Config.isLoaded = True
@staticmethod
def readConfig():
Config.logger.info("Reading config")
Config.parser.read_file(Config.cfgPath)
@staticmethod
def updateConfig():
# проход по секциям конфигов в файле. несуществующие удаляем
allSections = CFG_MAP.keys()
for sectionName in Config.parser.sections():
if sectionName not in allSections:
Config.parser.remove_section(sectionName)
Config.logger.debug(f"Removed old section {sectionName}")
# проход по секциям конфигов в конфиге. несуществующие добавляем
for sectionName,sectionItems in CFG_MAP.items():
if not Config.parser.has_section(sectionName):
Config.parser.set_section(sectionName)
Config.logger.debug(f"Added new section {sectionName}")
#register values
# Register values in the existing section
for key, value in sectionItems.items():
Config.parser.set(key, value, section=sectionName)
Config.logger.debug(f"Registered value {key} in section {sectionName}")
else:
Config.logger.debug(f"Validating section {sectionName} values")
for key, value in sectionItems.items():
existsProp = Config.parser.has_property(key, sectionName)
equalVals = existsProp and value == Config.parser.get(key, sectionName)
if not existsProp or not equalVals:
Config.parser.set(key, value, section=sectionName)
Config.logger.debug(f"Property updated [{sectionName}]{key} -> (exists: {existsProp}, equals: {equalVals})")
Config.logger.info("Config updated")
@staticmethod
def createConfig():
Config.logger.info("Creating new config")
parser = Config.parser
#clear config
for sect in Config.parser.sections().copy():
parser.remove_section(sect)
# insert config values from configValues
for key in CFG_MAP:
parser.set_section(key)
for kint in CFG_MAP[key]:
parser.set(kint,CFG_MAP[key][kint],section=key)
#print(parser)
@staticmethod
def saveConfig():
if not Config.isLoaded: return
Config.parser.write(Config.cfgPath)
Config.logger.info("Config saved")
@staticmethod
def get(key,section="main"):
return Config.parser.get(key,section)
@staticmethod
def set(key,value,section="main"):
if isinstance(value,str) and value=="":
#raise ValueError(f"[{section}]{key}: Value can't be empty string")
Config.logger.error(f"[{section}]{key}: Value can't be empty string")
Config.parser.set(key,value,section)
@staticmethod
def get_int(key,section="main"):
return Config.parser.get_int(key,section)
@staticmethod
def get_float(key,section="main"):
return Config.parser.get_float(key,section)
@staticmethod
def get_str(key,section="main"):
return Config.parser.get_str(key,section)
@staticmethod
def get_bool(key,section="main"):
return Config.parser.get_bool(key,section)