Skip to main content

Effective dictionary and nested object validation

Project description

PyPI version Build Status codecov

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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

valleydeight-0.0.2.tar.gz (4.4 kB view details)

Uploaded Source

Built Distribution

valleydeight-0.0.2-py3-none-any.whl (6.2 kB view details)

Uploaded Python 3

File details

Details for the file valleydeight-0.0.2.tar.gz.

File metadata

File hashes

Hashes for valleydeight-0.0.2.tar.gz
Algorithm Hash digest
SHA256 db535668612bfaae2381d3500870fa0573388379c745fdf5d8c0c7a83858f04e
MD5 f2a4696eb2f0d7be82d714a1d17954db
BLAKE2b-256 5e9994063fc96cea0f7d162656131a9e07d611082744e5354b1ef066445a72c9

See more details on using hashes here.

File details

Details for the file valleydeight-0.0.2-py3-none-any.whl.

File metadata

File hashes

Hashes for valleydeight-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 047091a11f8fc5572046722cd5e84c1bddd7602e176619ca94135226932ab21c
MD5 cd7deca2cdcee44cad3e97b85a03c96c
BLAKE2b-256 39ca231bfc40098950052431273f7951ba39ac72930a1fdea7029c981a86eb21

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page