Source code for vcorelib.io.encode
"""
A module implementing various data-file encoders.
"""
# built-in
from configparser import ConfigParser
from json import dump
from logging import getLogger
from os import linesep
from typing import cast as _cast
# third-party
from ruamel.yaml import YAML
from tomli_w import dumps
# internal
from vcorelib import DEFAULT_INDENT as _DEFAULT_INDENT
from vcorelib.dict import GenericStrDict as _GenericStrDict
from vcorelib.dict import consume
from vcorelib.io.types import DataStream as _DataStream
from vcorelib.io.types import JsonObject as _JsonObject
from vcorelib.logging import LoggerType
from vcorelib.math.time import TIMER as _TIMER
_LOG = getLogger(__name__)
[docs]
def encode_json(
configs: _JsonObject, ostream: _DataStream, _: LoggerType = _LOG, **kwargs
) -> int:
"""Write config data as JSON to the output stream."""
with _TIMER.measure_ns() as token:
# Normalize arguments with some defaults.
dump(
configs,
ostream,
indent=consume(kwargs, "indent", _DEFAULT_INDENT),
sort_keys=consume(kwargs, "sort_keys", True),
**kwargs,
)
return _TIMER.result(token)
[docs]
def encode_yaml(
configs: _JsonObject,
ostream: _DataStream,
_: LoggerType = _LOG,
sequence: int = 4,
offset: int = 2,
mapping: int = 2,
document_start: bool = True,
**kwargs,
) -> int:
"""Write config data as YAML to the output stream."""
with _TIMER.measure_ns() as token:
with YAML(output=ostream) as yaml:
yaml.indent(sequence=sequence, offset=offset, mapping=mapping)
if document_start:
ostream.write("---" + linesep)
yaml.dump(configs, **kwargs)
return _TIMER.result(token)
[docs]
def encode_ini(
configs: _JsonObject, ostream: _DataStream, _: LoggerType = _LOG, **kwargs
) -> int:
"""Write config data as INI to the output stream."""
with _TIMER.measure_ns() as token:
cparser = ConfigParser(
interpolation=consume(kwargs, "interpolation"), **kwargs
)
cparser.read_dict(_cast(_GenericStrDict, configs))
cparser.write(ostream)
return _TIMER.result(token)
[docs]
def encode_toml(
configs: _JsonObject, ostream: _DataStream, _: LoggerType = _LOG, **kwargs
) -> int:
"""Write config data as TOML to the output stream."""
with _TIMER.measure_ns() as token:
ostream.write(dumps(configs, **kwargs))
return _TIMER.result(token)