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 Mapping, Set, Tuple, List class DiskPermissions(enum.Flag): READ = enum.auto() WRITE = enum.auto() EXECUTE = enum.auto() class OS(enum.Enum): mac = enum.auto() windows = enum.auto() linux = enum.auto() @dataclasses.dataclass class Job: name: str os: Set[OS] script_path: str framework_version: Tuple[int, int] = (1, 0) disk_permissions: DiskPermissions = DiskPermissions.READ @dataclasses.dataclass class CIConf: stages: List[Job] global_environment: Mapping[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={<OS.linux: 3>, <OS.mac:1>}, # script_path='build.sh', # framework_version=(1, 0), # disk_permissions=<DiskPermissions.EXECUTE|WRITE|READ: 7>, # ), # Job( # name='test', # os={<OS.linux: 3>, <OS.mac: 1>}, # 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