Validobj is library that takes semistructured data (for example JSON and YAML configuration files) and converts it to more structured Python objects. It places the emphasis on:
- Good error messages (rather than avoiding extra work in the error handling code).
- Schema defined in terms of dataclasses and other high level objects such as enums, as well as a subset of the typing module.
- Simplicity of implementation (rather than full generality).
Validobj requires a modern Python version and has no other dependencies. It progressively supports typing features as they are implemented in the standard library and language: A limited subset of the parsing facilities work with Python 3.8, which is the minimum version. The custom validation module requires at least Python 3.9.
https://validobj.readthedocs.io/en/latest/
- Define a schema using dataclasses
import dataclasses import enum from typing import Literal class DiskPermissions(enum.Flag): READ = enum.auto() WRITE = enum.auto() EXECUTE = enum.auto() @dataclasses.dataclass class Job: name: str os: set[Literal['windows', 'mac', 'linux']] script_path: str framework_version: tuple[int, int] = (1, 0) disk_permissions: DiskPermissions = DiskPermissions.READ @dataclasses.dataclass class CIConf: stages: list[Job] global_environment: dict[str, str] = dataclasses.field(default_factory=dict)
- Process a dictionary input into it using Validobj
from validobj import parse_input inp = { 'global_environment': {'CI_ACTIVE': '1'}, 'stages': [ { 'name': 'compile', 'os': ['linux', 'mac'], 'script_path': 'build.sh', 'disk_permissions': ['READ', 'WRITE', 'EXECUTE'], }, { 'name': 'test', 'os': ['linux', 'mac'], 'script_path': 'test.sh', 'framework_version': [4, 0], }, ], } print(parse_input(inp, CIConf)) # This results in a dataclass instance with the correct types: # # CIConf(stages=[ # Job(name='compile', # os={'linux', 'mac'}, # script_path='build.sh', # framework_version=(1, 0), # disk_permissions=<DiskPermissions.READ|WRITE|EXECUTE: 7>), # Job(name='test', # os={'linux', 'mac'}, # script_path='test.sh', # framework_version=(4, 0), # disk_permissions=<DiskPermissions.READ: 1>)], # global_environment={'CI_ACTIVE': '1'} # )
The set of applied transformations as well as the interface to customise processing are described in the documentation
The package can be installed with pip
:
python3 -m pip install validobj
As well as with conda
, from the conda-forge
channel:
conda install validobj -c conda-forge
The code is hosted at