|
@@ -10,6 +10,8 @@ class ConfigSaver(object): |
|
|
|
|
|
|
|
|
def __init__(self, file_path): |
|
|
def __init__(self, file_path): |
|
|
self.file_path = file_path |
|
|
self.file_path = file_path |
|
|
|
|
|
if not os.path.exists(self.file_path): |
|
|
|
|
|
raise FileNotFoundError("file {} NOT found!".__format__(self.file_path)) |
|
|
|
|
|
|
|
|
def save_section(self, section_name, section): |
|
|
def save_section(self, section_name, section): |
|
|
cfg = configparser.ConfigParser() |
|
|
cfg = configparser.ConfigParser() |
|
@@ -33,3 +35,119 @@ class ConfigSaver(object): |
|
|
logger.warning("this is a warning #TODO") |
|
|
logger.warning("this is a warning #TODO") |
|
|
cfg.set(section_name,key, section[key]) |
|
|
cfg.set(section_name,key, section[key]) |
|
|
cfg.write(open(self.file_path, 'w')) |
|
|
cfg.write(open(self.file_path, 'w')) |
|
|
|
|
|
|
|
|
|
|
|
def save_config_file(self, section_name, section): |
|
|
|
|
|
|
|
|
|
|
|
def get_section(file_path, sect_name): |
|
|
|
|
|
sect = ConfigSection() |
|
|
|
|
|
ConfigLoader("", "").load_config(file_path, {sect_name: sect}) |
|
|
|
|
|
return sect |
|
|
|
|
|
|
|
|
|
|
|
def read_section(file_path): |
|
|
|
|
|
sect_name = None |
|
|
|
|
|
|
|
|
|
|
|
sect_list = {} |
|
|
|
|
|
sect_key_list = [] |
|
|
|
|
|
|
|
|
|
|
|
single_section = {} |
|
|
|
|
|
single_section_key = [] |
|
|
|
|
|
|
|
|
|
|
|
with open(file_path, 'r') as f: |
|
|
|
|
|
lines = f.readlines() |
|
|
|
|
|
|
|
|
|
|
|
for line in lines: |
|
|
|
|
|
if line.startswith('[') and line.endswith(']\n'): |
|
|
|
|
|
if sect_name is None: |
|
|
|
|
|
pass |
|
|
|
|
|
else: |
|
|
|
|
|
sect_list[sect_name] = single_section, single_section_key |
|
|
|
|
|
single_section = {} |
|
|
|
|
|
single_section_key = [] |
|
|
|
|
|
sect_key_list.append(sect_name) |
|
|
|
|
|
sect_name = line[1: -2] |
|
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
if line.startswith('#'): |
|
|
|
|
|
single_section[line] = '#' |
|
|
|
|
|
single_section_key.append(line) |
|
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
if line.startswith('\n'): |
|
|
|
|
|
single_section_key.append('\n') |
|
|
|
|
|
continue |
|
|
|
|
|
|
|
|
|
|
|
if '=' not in line: |
|
|
|
|
|
log = create_logger(__name__, './config_saver.log') |
|
|
|
|
|
log.error("can NOT load config file [%s]" % file_path) |
|
|
|
|
|
raise RuntimeError("can NOT load config file {}".__format__(file_path)) |
|
|
|
|
|
|
|
|
|
|
|
key = line.split('=', maxsplit=1)[0].strip() |
|
|
|
|
|
value = line.split('=', maxsplit=1)[1].strip() + '\n' |
|
|
|
|
|
single_section[key] = value |
|
|
|
|
|
single_section_key.append(key) |
|
|
|
|
|
|
|
|
|
|
|
if sect_name is not None: |
|
|
|
|
|
sect_list[sect_name] = single_section, single_section_key |
|
|
|
|
|
sect_key_list.append(sect_name) |
|
|
|
|
|
|
|
|
|
|
|
return sect_list, sect_key_list |
|
|
|
|
|
|
|
|
|
|
|
def write_section(file_path, sect_list, sect_key_list): |
|
|
|
|
|
with open(file_path, 'w') as f: |
|
|
|
|
|
for sect_key in sect_key_list: |
|
|
|
|
|
single_section, single_section_key = sect_list[sect_key] |
|
|
|
|
|
f.write('[' + sect_key + ']\n') |
|
|
|
|
|
for key in single_section_key: |
|
|
|
|
|
if key == '\n': |
|
|
|
|
|
f.write('\n') |
|
|
|
|
|
continue |
|
|
|
|
|
if single_section[key] == '#': |
|
|
|
|
|
f.write(key) |
|
|
|
|
|
continue |
|
|
|
|
|
f.write(key + ' = ' + single_section[key]) |
|
|
|
|
|
f.write('\n') |
|
|
|
|
|
|
|
|
|
|
|
section_file = get_section(self.file_path, section_name) |
|
|
|
|
|
if len(section_file.__dict__.keys()) == 0:#the section not in file before |
|
|
|
|
|
with open(self.file_path, 'a') as f: |
|
|
|
|
|
f.write('[' + section_name + ']\n') |
|
|
|
|
|
for k in section.__dict__.keys(): |
|
|
|
|
|
f.write(k + ' = ') |
|
|
|
|
|
if isinstance(section[k], str): |
|
|
|
|
|
f.write('\"' + str(section[k]) + '\"\n\n') |
|
|
|
|
|
else: |
|
|
|
|
|
f.write(str(section[k]) + '\n\n') |
|
|
|
|
|
else: |
|
|
|
|
|
change_file = False |
|
|
|
|
|
for k in section.__dict__.keys(): |
|
|
|
|
|
if k not in section_file: |
|
|
|
|
|
change_file = True |
|
|
|
|
|
break |
|
|
|
|
|
if section_file[k] != section[k]: |
|
|
|
|
|
logger = create_logger(__name__, "./config_loader.log") |
|
|
|
|
|
logger.warning("section [%s] in config file [%s] has been changed" % ( |
|
|
|
|
|
section_name, self.file_path |
|
|
|
|
|
)) |
|
|
|
|
|
change_file = True |
|
|
|
|
|
break |
|
|
|
|
|
if not change_file: |
|
|
|
|
|
return |
|
|
|
|
|
|
|
|
|
|
|
sect_list, sect_key_list = read_section(self.file_path) |
|
|
|
|
|
if section_name not in sect_key_list: |
|
|
|
|
|
raise AttributeError() |
|
|
|
|
|
|
|
|
|
|
|
sect, sect_key = sect_list[section_name] |
|
|
|
|
|
for k in section.__dict__.keys(): |
|
|
|
|
|
if k not in sect_key: |
|
|
|
|
|
sect_key.append('\n') |
|
|
|
|
|
sect_key.append(k) |
|
|
|
|
|
sect[k] = str(section[k]) |
|
|
|
|
|
if isinstance(section[k], str): |
|
|
|
|
|
sect[k] = "\"" + sect[k] + "\"" |
|
|
|
|
|
sect[k] = sect[k] + "\n" |
|
|
|
|
|
sect_list[section_name] = sect, sect_key |
|
|
|
|
|
write_section(self.file_path, sect_list, sect_key_list) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|