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
|
import sys
from importlib.metadata import version
from importlib.resources import path as rpath
from datetime import datetime, timezone
from logging import Logger, getLogger
from .utils import get_expanded_path
from .yaml_parser import get_parsed_yaml
log: Logger = getLogger(__name__)
DEFAULT_CONFIG_PATH: str = '$XDG_CONFIG_HOME/pyssg/config.yaml'
VERSION: str = version('pyssg')
def __check_well_formed_config(config: dict) -> None:
log.debug('checking that config file is well formed (at least contains mandatory fields')
mandatory_config: dict = get_parsed_yaml('mandatory_config.yaml', 'pyssg.plt')[0]
for section in mandatory_config.keys():
log.debug('checking section "%s"', section)
if not config[section]:
log.error('config does not have section "%s"', section)
sys.exit(1)
# the case for elements that don't have nested elements
if not mandatory_config[section]:
log.debug('section "%s" doesn\'t need nested elements', section)
continue
for option in mandatory_config[section].keys():
log.debug('checking option "%s"', option)
if option not in config[section] or not config[section][option]:
log.error('config does not have option "%s" in section "%s"', option, section)
sys.exit(1)
def __expand_all_paths(config: dict) -> None:
log.debug('expanding all path options: %s', config['path'].keys())
for option in config['path'].keys():
config['path'][option] = get_expanded_path(config['path'][option])
# not necessary to type deeper than the first dict
def get_parsed_config(path: str) -> list[dict]:
log.debug('reading config file "%s"', path)
config: list[dict] = get_parsed_yaml(path) # type: ignore
log.info('found %s document(s) for configuration "%s"', len(config), path)
__check_well_formed_config(config[0])
__expand_all_paths(config[0])
return config
# not necessary to type deeper than the first dict,
# static config means config that shouldn't be changed by the user
def get_static_config() -> dict[str, dict]:
log.debug('reading and setting static config')
config: dict = get_parsed_yaml('static_config.yaml', 'pyssg.plt')[0] # type: ignore
config['info']['version'] = VERSION
config['info']['rss_run_date'] = datetime.now(tz=timezone.utc)\
.strftime(config['fmt']['rss_date'])
config['info']['sitemap_run_date'] = datetime.now(tz=timezone.utc)\
.strftime(config['fmt']['sitemap_date'])
return config
|