64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from configparser import DEFAULTSECT as default_section
|
|
from configparser import ConfigParser
|
|
from io import StringIO
|
|
|
|
from benedict.serializers.abstract import AbstractSerializer
|
|
from benedict.utils import type_util
|
|
|
|
|
|
class INISerializer(AbstractSerializer):
|
|
"""
|
|
This class describes an ini serializer.
|
|
"""
|
|
|
|
def __init__(self):
|
|
super(INISerializer, self).__init__(
|
|
extensions=[
|
|
"ini",
|
|
],
|
|
)
|
|
|
|
@staticmethod
|
|
def _get_section_option_value(parser, section, option):
|
|
value = None
|
|
funcs = [parser.getint, parser.getfloat, parser.getboolean, parser.get]
|
|
for func in funcs:
|
|
try:
|
|
value = func(section, option)
|
|
break
|
|
except ValueError:
|
|
continue
|
|
return value
|
|
|
|
def decode(self, s, **kwargs):
|
|
parser = ConfigParser(**kwargs)
|
|
parser.read_string(s)
|
|
data = {}
|
|
for option, _ in parser.defaults().items():
|
|
data[option] = self._get_section_option_value(
|
|
parser, default_section, option
|
|
)
|
|
for section in parser.sections():
|
|
data[section] = {}
|
|
for option, _ in parser.items(section):
|
|
data[section][option] = self._get_section_option_value(
|
|
parser, section, option
|
|
)
|
|
return data
|
|
|
|
def encode(self, d, **kwargs):
|
|
parser = ConfigParser(**kwargs)
|
|
for key, value in d.items():
|
|
if not type_util.is_dict(value):
|
|
parser.set(default_section, key, f"{value}")
|
|
continue
|
|
section = key
|
|
parser.add_section(section)
|
|
for option_key, option_value in value.items():
|
|
parser.set(section, option_key, f"{option_value}")
|
|
str_data = StringIO()
|
|
parser.write(str_data)
|
|
return str_data.getvalue()
|