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
importdataclassesimportenumfromtypingimportLiteralclassDiskPermissions(enum.Flag): READ=enum.auto() WRITE=enum.auto() EXECUTE=enum.auto() @dataclasses.dataclassclassJob: name: stros: set[Literal['windows', 'mac', 'linux']] script_path: strframework_version: tuple[int, int] = (1, 0) disk_permissions: DiskPermissions=DiskPermissions.READ@dataclasses.dataclassclassCIConf: stages: list[Job] global_environment: dict[str, str] =dataclasses.field(default_factory=dict)
- Process a dictionary input into it using Validobj
fromvalidobjimportparse_inputinp= { '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