Change config loading method.
This commit is contained in:
parent
69b11d513a
commit
39923a0c5f
1 changed files with 49 additions and 19 deletions
68
main.py
68
main.py
|
@ -19,10 +19,11 @@ logger = logging.getLogger(f'wp_cal')
|
||||||
|
|
||||||
class BaseConfig(dict):
|
class BaseConfig(dict):
|
||||||
|
|
||||||
def __init__(self, file, defaults, *args, **kwargs):
|
def __init__(self, file, defaults, overrides, *args, **kwargs):
|
||||||
self._ex = None
|
self._ex = None
|
||||||
self.file = file
|
self.file = file
|
||||||
self.defaults = defaults
|
self.defaults = defaults
|
||||||
|
self.overrides = overrides
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
try:
|
try:
|
||||||
self._load()
|
self._load()
|
||||||
|
@ -55,6 +56,12 @@ class BaseConfig(dict):
|
||||||
repl = value if (i == len(keylist) - 1) else {}
|
repl = value if (i == len(keylist) - 1) else {}
|
||||||
d[key] = d.get(key, repl)
|
d[key] = d.get(key, repl)
|
||||||
d = d[key]
|
d = d[key]
|
||||||
|
for keylist, value in self.overrides:
|
||||||
|
d = self
|
||||||
|
for key in keylist[:-1]:
|
||||||
|
d[key] = d.get(key, {})
|
||||||
|
d = d[key]
|
||||||
|
d[keylist[-1]] = value
|
||||||
|
|
||||||
def _save(self):
|
def _save(self):
|
||||||
with open(self.file, 'w') as fp:
|
with open(self.file, 'w') as fp:
|
||||||
|
@ -88,7 +95,7 @@ class Config(BaseConfig):
|
||||||
.range: the range in the format <nnn><u>, where n are digits and u is the unit; valid units: 'smhdw' <-> seconds minutes hours days weeks
|
.range: the range in the format <nnn><u>, where n are digits and u is the unit; valid units: 'smhdw' <-> seconds minutes hours days weeks
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, file, defaults, *args, **kwargs):
|
def __init__(self, file, defaults, overrides, converters, *args, **kwargs):
|
||||||
defaults += [
|
defaults += [
|
||||||
('google.calendar_id', '#TODO insert google calendar id'),
|
('google.calendar_id', '#TODO insert google calendar id'),
|
||||||
('google.credentials', {}),
|
('google.credentials', {}),
|
||||||
|
@ -99,9 +106,28 @@ class Config(BaseConfig):
|
||||||
('wordpress.calendar.translations', {'en': '#TODO insert english translation'}),
|
('wordpress.calendar.translations', {'en': '#TODO insert english translation'}),
|
||||||
('wordpress.credentials.user', '#TODO insert wordpress username'),
|
('wordpress.credentials.user', '#TODO insert wordpress username'),
|
||||||
('wordpress.credentials.password', '#TODO insert wordpress password'),
|
('wordpress.credentials.password', '#TODO insert wordpress password'),
|
||||||
|
('logging.level', ':WARNING,wp_cal:INFO'),
|
||||||
|
('range', '365d'),
|
||||||
]
|
]
|
||||||
defaults = [(x[0].split('.'), x[1]) for x in defaults]
|
defaults = [(x[0].split('.'), x[1]) for x in defaults]
|
||||||
super().__init__(file, defaults, *args, **kwargs)
|
overrides = [(x[0].split('.'), x[1]) for x in overrides]
|
||||||
|
self.converters = converters
|
||||||
|
super().__init__(file, defaults, overrides, *args, **kwargs)
|
||||||
|
|
||||||
|
def value(self, k):
|
||||||
|
if isinstance(k, str):
|
||||||
|
sel = k.split('.')
|
||||||
|
elif isinstance(k, list):
|
||||||
|
sel = k
|
||||||
|
k = '.'.join(k)
|
||||||
|
else:
|
||||||
|
raise TypeError('invalid type for parameter k')
|
||||||
|
v = self
|
||||||
|
for s in sel:
|
||||||
|
v = v[s]
|
||||||
|
if k in self.converters:
|
||||||
|
return self.converters[k](v)
|
||||||
|
return v
|
||||||
|
|
||||||
def range_str_to_timedelta(value):
|
def range_str_to_timedelta(value):
|
||||||
valid_units = 'smhdw'
|
valid_units = 'smhdw'
|
||||||
|
@ -150,15 +176,20 @@ def set_logging_level(level: str):
|
||||||
logging.getLogger(module).setLevel(level)
|
logging.getLogger(module).setLevel(level)
|
||||||
|
|
||||||
@click.command()
|
@click.command()
|
||||||
@click.option('--level', '-l', envvar='WP_CAL_LEVEL', default=':WARNING,wp_cal:INFO', help='The log level for the application')
|
|
||||||
@click.option('--config', '-c', envvar='WP_CAL_CONFIG', default='-', help='The configuration file')
|
@click.option('--config', '-c', envvar='WP_CAL_CONFIG', default='-', help='The configuration file')
|
||||||
@click.option('--dryrun', '-d', envvar='WP_CAL_DRYRUN', is_flag=True, help="Don't actually post any data, just show it")
|
@click.option('--dryrun', '-d', envvar='WP_CAL_DRYRUN', is_flag=True, help="Don't actually post any data, just show it")
|
||||||
@click.option('--range', '-r', envvar='WP_CAL_RANGE', default='365d', help='The time range from start to start + range to synchronize events')
|
@click.option('--level', '-l', envvar='WP_CAL_LEVEL', default=None, help='The log level for the application')
|
||||||
def main(level, config, dryrun, range):
|
@click.option('--range', '-r', envvar='WP_CAL_RANGE', default=None, help='The time range from start to start + range to synchronize events')
|
||||||
|
def main(config, dryrun, level, range):
|
||||||
init_logging()
|
init_logging()
|
||||||
set_logging_level(level)
|
set_logging_level(level)
|
||||||
|
|
||||||
config = Config(config, [('logging.level', level), ('range', range)])
|
config_overrides = [('logging.level', level), ('range', range)]
|
||||||
|
config_overrides = [x for x in config_overrides if x[1] is not None]
|
||||||
|
converters = {
|
||||||
|
'range': range_str_to_timedelta,
|
||||||
|
}
|
||||||
|
config = Config(config, [], config_overrides, converters)
|
||||||
if config.exception():
|
if config.exception():
|
||||||
logger.info('config not found, trying to generate template')
|
logger.info('config not found, trying to generate template')
|
||||||
try:
|
try:
|
||||||
|
@ -169,25 +200,24 @@ def main(level, config, dryrun, range):
|
||||||
logger.info('generated config at "%s"', config.file)
|
logger.info('generated config at "%s"', config.file)
|
||||||
return
|
return
|
||||||
|
|
||||||
set_logging_level(config['logging']['level'])
|
set_logging_level(str(config.value('logging.level')))
|
||||||
config['range'] = range_str_to_timedelta(config['range'])
|
|
||||||
|
|
||||||
g = Google(
|
g = Google(
|
||||||
config['google']['calendar_id'],
|
config.value('google.calendar_id'),
|
||||||
credentials=config['google']['credentials'],
|
credentials=config.value('google.credentials'),
|
||||||
token_file=config['google']['token_file'],
|
token_file=config.value('google.token_file'),
|
||||||
)
|
)
|
||||||
w = Wordpress(
|
w = Wordpress(
|
||||||
config['wordpress']['url'],
|
config.value('wordpress.url'),
|
||||||
calendar_metadata=CalendarMetadata(
|
calendar_metadata=CalendarMetadata(
|
||||||
id=config['wordpress']['calendar']['id'],
|
id=config.value('wordpress.calendar.id'),
|
||||||
name=config['wordpress']['calendar']['name'],
|
name=config.value('wordpress.calendar.name'),
|
||||||
translations=config['wordpress']['calendar']['translations'],
|
translations=config.value('wordpress.calendar.translations'),
|
||||||
),
|
),
|
||||||
credentials=config['wordpress']['credentials'],
|
credentials=config.value('wordpress.credentials'),
|
||||||
)
|
)
|
||||||
g.login()
|
g.login()
|
||||||
events = g.get_events(until=config['range'])
|
events = g.get_events(until=config.value('range'))
|
||||||
logger.info("syncing %d events", len(events))
|
logger.info("syncing %d events", len(events))
|
||||||
if not w.login():
|
if not w.login():
|
||||||
logger.info('failed to login to wordpress')
|
logger.info('failed to login to wordpress')
|
||||||
|
@ -195,7 +225,7 @@ def main(level, config, dryrun, range):
|
||||||
if dryrun:
|
if dryrun:
|
||||||
logger.info("dryrun; would post events: %s", events)
|
logger.info("dryrun; would post events: %s", events)
|
||||||
else:
|
else:
|
||||||
if not w.post_events(events, until=config['range']):
|
if not w.post_events(events, until=config.value('range')):
|
||||||
logger.info('failed to post event data')
|
logger.info('failed to post event data')
|
||||||
return 1
|
return 1
|
||||||
logger.info("done")
|
logger.info("done")
|
||||||
|
|
Loading…
Reference in a new issue