57 lines
2.2 KiB
Python
57 lines
2.2 KiB
Python
|
|
from typing import Any, Dict, Iterable, List, Union
|
|
|
|
import os
|
|
from configparser import ConfigParser
|
|
|
|
|
|
def parse_config_file(paths: Union[str, Iterable[str]]) -> Dict[str, Any]:
|
|
"""
|
|
Parse the configuration file at the given path.
|
|
|
|
:param paths: The config file(s) to parse.
|
|
:return: A dictionary containing the parsed configuration.
|
|
"""
|
|
# Set up default values
|
|
config: Dict[str, Any] = {
|
|
# Address to listen on
|
|
'listen': '::',
|
|
# TCP port to listen on
|
|
'port': 80,
|
|
# Root directory of statically served content
|
|
'staticroot': '/var/matemat/static',
|
|
# Root directory of Jinja2 templates
|
|
'templateroot': '/var/matemat/templates',
|
|
# Variables passed to pagelets
|
|
'pagelet_variables': dict()
|
|
}
|
|
|
|
# Initialize the config parser
|
|
parser: ConfigParser = ConfigParser()
|
|
# Replace the original option transformation by a string constructor to preserve the case of config keys
|
|
parser.optionxform = str
|
|
# Normalize the input argument (turn a scalar into a list and expand ~ in paths)
|
|
files: List[str] = list()
|
|
if isinstance(paths, str):
|
|
files.append(os.path.expanduser(paths))
|
|
else:
|
|
for path in paths:
|
|
if not isinstance(path, str):
|
|
raise TypeError(f'Not a string: {path}')
|
|
files.append(os.path.expanduser(path))
|
|
# Read the configuration files
|
|
parser.read(files, 'utf-8')
|
|
|
|
# Read values from the [Matemat] section, if present, falling back to default values
|
|
if 'Matemat' in parser.sections():
|
|
config['listen'] = parser['Matemat'].get('Address', config['listen'])
|
|
config['port'] = int(parser['Matemat'].get('Port', config['port']))
|
|
config['staticroot'] = parser['Matemat'].get('StaticPath', os.path.expanduser(config['staticroot']))
|
|
config['templateroot'] = parser['Matemat'].get('TemplatePath', os.path.expanduser(config['templateroot']))
|
|
|
|
# Read all values from the [Pagelets] section, if present. These values are passed to pagelet functions
|
|
if 'Pagelets' in parser.sections():
|
|
for k, v in parser['Pagelets'].items():
|
|
config['pagelet_variables'][k] = v
|
|
|
|
return config
|