Source code for file_config.handlers.ini
# Copyright (c) 2019 Stephen Bunn <stephen@bunn.io>
# ISC License <https://opensource.org/licenses/isc>
import warnings
from ._common import BaseHandler
from ..contrib.ini_parser import INIParser
[docs]class INIHandler(BaseHandler):
""" The INI serialization handler.
.. important:: INI files **cannot** support arrays of mappings.
Using these in your config and trying to dump to ini will throw a
:class:`ValueError` and will fail serialization.
If you need to use a config with arrays of mappings use
`toml <https://github.com/toml-lang/toml>`_ instead.
This use case is one of the many things toml does better than traditional
config files.
"""
name = "ini"
packages = ("configparser",)
options = {"root": None, "delimiter": ":", "empty_sections": False}
[docs] def on_configparser_dumps(self, configparser, config, dictionary, **kwargs):
""" The :mod:`configparser` dumps method.
:param module configparser: The ``configparser`` module
:param class config: The instance's config class
:param dict dictionary: The dictionary instance to serialize
:param str root: The top-level section of the ini file,
defaults to ``config.__name__``, optional
:param str delimiter: The delimiter character used for representing nested
dictionaries, defaults to ":", optional
:return: The ini serialization of the given ``dictionary``
:rtype: str
"""
root_section = kwargs.pop("root")
if not isinstance(root_section, str):
root_section = config.__name__
delimiter = kwargs.pop("delimiter", ":")
if delimiter in root_section:
warnings.warn(
f"root section {root_section!r} contains delimiter character "
f"{delimiter!r}, loading from the resulting content will likely fail"
)
try:
return INIParser.from_dict(
dictionary,
root_section=root_section,
delimiter=kwargs.pop("delimiter", ":"),
empty_sections=kwargs.pop("empty_sections", False),
).to_ini()
except ValueError:
raise ValueError("INI cannot handle this config, try using toml instead")
[docs] def on_configparser_loads(self, configparser, config, content, **kwargs):
""" The :mod:`configparser` loads method.
:param module configparser: The ``configparser`` module
:param class config: The loading config class
:param str content: The content to deserialize
:return: The deserialized dictionary
:rtype: dict
"""
return INIParser.from_ini(content).to_dict(
delimiter=kwargs.pop("delimiter", ":")
)