Effective dictionary and nested object validation
Project description
Valleydeight
Pronounced like: "validate" [val-i-deyt]
Effective dictionary and nested object validation for Python
Lately, I've found myself writing many YAML-based config files. Being able to quickly and easily put together a schema for these files has become helpful, and the existing options out there were proving awkward to me.
The approach here is to work directly on the resulting python objects. This allows the code here to be useful in many other situations, and to validate other types of markup easily (eg JSON, XML (?), pickled primitives, etc).
Installation
pip install --user valleydeight
Usage
To be able to validate an object, you must build up a Validator. Doing this is straight forward for most types. There are currently many types of Validators implemented:
- Primitive types:
Str
,Int
,Float
,Bool
- Lists of items:
List
,FixedList
- Dictionaries of items:
Dict
- Mixed types:
Choice
- Custom objects:
Object
- A validator that accepts everything:
Pass
To make a validator, simply instantiate one of the above classes, composing together the more complicated types where needed. To use the validator call it with the object you wish to validate.
For example, say we wish to check that we have a list of dictionaries where each dictionary has a string called "name" and a boolean called "on":
import valleydeight as vd
# Build the validator
validator = vd.List(vd.Dict(name=vd.Str(), on=vd.Bool()))
# Make a test object that should pass fine
test_object = [dict(name="hello", on=True), dict(name="World", on=False)]
parsed_object = validator(test_object)
# Make a test object that will fail, since one of the elements has the wrong type:
test_object = [dict(name="hello", on=True), dict(name="World", on=2018)]
parsed_object = validator(test_object)
# Raises ValidatorException
The Choice
class allows us to make complicated "custom" types:
import valleydeight as vd
# Something like a pythonic Enum with mixed types:
enum_t = vd.Choice("one", 4, True)
# A mixture of validator types:
mix_t = vd.Choice(vd.Str(), vd.Dict(name=vd.Str(), value=vd.Pass()).opts(need_all_keys=True))
# A mixture of specific values and generic types
mix_t = vd.Choice(10012, False, vd.Str(), vd.List(vd.Float()))
The difference between a List
and a FixedList
is that a List
allows an
arbitrary number of items, which must all be the same type (although this can
be a Choice
type), whereas a FixedList
has both a fixed length and specific types for each element.
Example program
For an example program see the script in the examples/
directory on GitHub.
In addition the unit tests in the tests/
directory might be informative.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for valleydeight-0.0.4-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b3146d07bba7c9d1fbc4fb38886dda6b9999cad75071ed363359af734d3f8a1c |
|
MD5 | da381c96cd056e2ecda666eada4b8266 |
|
BLAKE2b-256 | 1c5b47c173377dc3d521636e86720e00677fa84fc5c1a5230cae4305f92b8682 |