58 lines
1.5 KiB
Python
58 lines
1.5 KiB
Python
|
|
import os
|
||
|
|
import json
|
||
|
|
import yaml
|
||
|
|
import logging
|
||
|
|
|
||
|
|
logger = logging.getLogger(__name__)
|
||
|
|
|
||
|
|
|
||
|
|
class SimpleConfig(dict):
|
||
|
|
|
||
|
|
def __key(self, key):
|
||
|
|
return "" if key is None else key.lower()
|
||
|
|
|
||
|
|
def __str__(self):
|
||
|
|
return json.dumps(self)
|
||
|
|
|
||
|
|
def __setattr__(self, key, value):
|
||
|
|
self[self.__key(key)] = value
|
||
|
|
|
||
|
|
def __getattr__(self, key):
|
||
|
|
return self.get(self.__key(key))
|
||
|
|
|
||
|
|
def __getitem__(self, key):
|
||
|
|
return super().get(self.__key(key))
|
||
|
|
|
||
|
|
def __setitem__(self, key, value):
|
||
|
|
return super().__setitem__(self.__key(key), value)
|
||
|
|
|
||
|
|
|
||
|
|
class Config(SimpleConfig):
|
||
|
|
|
||
|
|
def __init__(self, filename=None):
|
||
|
|
super().__init__()
|
||
|
|
self.filename = filename
|
||
|
|
|
||
|
|
### startup
|
||
|
|
self.mode = "cli"
|
||
|
|
self.stream = False
|
||
|
|
|
||
|
|
self.load()
|
||
|
|
|
||
|
|
def load(self):
|
||
|
|
if self.filename is not None and os.path.exists(self.filename):
|
||
|
|
if self.filename.endswith(".json"):
|
||
|
|
with open(self.filename, 'r') as f:
|
||
|
|
self.update(json.load(f))
|
||
|
|
elif self.filename.endswith(".yaml"):
|
||
|
|
with open(self.filename, 'r') as f:
|
||
|
|
self.update(yaml.safe_load(f))
|
||
|
|
else:
|
||
|
|
logger.warning(f"Config file {self.filename} not found")
|
||
|
|
|
||
|
|
def save(self):
|
||
|
|
if self.filename is not None:
|
||
|
|
with open(self.filename, 'w') as f:
|
||
|
|
json.dump(self, f, indent=4)
|
||
|
|
logger.info(f"Config file {self.filename} saved")
|