Getting started with toml_dataclass

Toml and Python Dataclass serialization.

Features

  • Preserve the in-memory representation of Python dataclasses

Examples

Creating a dataclass with support to toml serialization.

>>> from danoan.toml_dataclass import TomlDataClassIO
>>> from dataclasses import dataclass

>>> @dataclass
... class Plugin(TomlDataClassIO):
...    name: str
...    version: str
...    description: str


>>> jpg_plugin = Plugin("image-jpg", "1.0", "Conversion functions to jpg type.")
>>> with open("jpg-plugin.toml", "w") as fw:
...     jpg_plugin.write(fw)

Here it is what it looks like the written toml.

>>> with open("jpg-plugin.toml", "r") as fr:
...     print(fr.read())
name = "image-jpg"
version = "1.0"
description = "Conversion functions to jpg type."

Preserve the in-memory representation of Python dataclasses after reading.

>>> from pprint import pprint
>>> @dataclass
... class Configuration(TomlDataClassIO):
...     project_name: str
...     plugin: Plugin

>>> config = Configuration("image-reader", jpg_plugin)
>>> with open("config.toml", "w") as fw:
...     config.write(fw)

>>> with open("config.toml", "r") as fr:
...     config_from_file = Configuration.read(fr)
>>> pprint(config_from_file)
Configuration(project_name='image-reader',
              plugin=Plugin(name='image-jpg',
                            version='1.0',
                            description='Conversion functions to jpg type.'))

>>> pprint(f"Plugin name: {config_from_file.plugin.name}")
'Plugin name: image-jpg'

Notice how it differs from the ouptut of the toml library.

>>> import toml
>>> pprint(toml.load("config.toml"))
{'plugin': {'description': 'Conversion functions to jpg type.',
            'name': 'image-jpg',
            'version': '1.0'},
 'project_name': 'image-reader'}

Preserve in-memory representation with toml tables.

>>> from danoan.toml_dataclass import TomlTableDataClassIO
>>> from typing import List

>>> @dataclass
... class PluginTable(TomlTableDataClassIO):
...     list_of_plugins: List[Plugin]

>>> png_plugin = Plugin("image-png", "1.0", "Conversion functions to png type.")
>>> plugin_table = PluginTable([jpg_plugin, png_plugin])
>>> with open("plugin-table.toml", "w") as fw:
...     plugin_table.write(fw)

>>> with open("plugin-table.toml", "r") as fr:
...     plugin_table_from_file = PluginTable.read(fr)
>>> pprint(plugin_table_from_file)
PluginTable(list_of_plugins=[Plugin(name='image-jpg',
                                    version='1.0',
                                    description='Conversion functions to jpg '
                                                'type.'),
                             Plugin(name='image-png',
                                    version='1.0',
                                    description='Conversion functions to png '
                                                'type.')])

Notice how it differs from the ouptut of the toml library.

>>> pprint(toml.load("plugin-table.toml"))
{'list_of_plugins': [{'description': 'Conversion functions to jpg type.',
                      'name': 'image-jpg',
                      'version': '1.0'},
                     {'description': 'Conversion functions to png type.',
                      'name': 'image-png',
                      'version': '1.0'}]}

Here it is what looks like the written toml.

>>> with open("plugin-table.toml", "r") as f:
...     print(f.read())
[[list_of_plugins]]
name = "image-jpg"
version = "1.0"
description = "Conversion functions to jpg type."

[[list_of_plugins]]
name = "image-png"
version = "1.0"
description = "Conversion functions to png type."