Skip to main content

A simple and easy to use TOML validator for Python.

Project description

TOML Validator

top language code size last commit issues contributors PyPI License

A simple and easy to use TOML validator for Python.

Installation

You can install the package from PyPI:

pip install tomlval

The package is available for Python 3.11 and newer.

Concepts

Before using the package, there are some concepts you may need to understand for the most optimal use of the package.

Key

A key is the name of a field in a TOML file, such as name, person.name, etc. Keys must conform to the TOML specification, which means keys are either snake_case or SCREAMING_SNAKE_CASE. For the validator, keys may also include wildcards, such as *name, person.*, etc.

Handler

A handler is a function that is called for a certain key. Handlers can be of the following types:

  • Types, such as int, str, float.
  • Tuples/Lists of types, such as (int, str), [int, str].
  • Anonymous functions (lambda)
  • Named functions (Callable objects, such as def my_handler(key, value): ...)

The following argument configurations are supported:

  • fn()
  • fn(key)
  • fn(value)
  • fn(key, value)

If the handler has any other parameters than key or value, the validator will raise a TOMLHandlerError.

Handlers may return any type, but is is recommended to use the return type as an error message if the value is invalid. The validator considers a None return value a successful validation.

Schema

The schema is used to bring give the validator default values. The schema is defined in the TOMLSchema class, and is passed to the TOMLValidator class. To create a schema, you pass a dictionary with the keys and their respective allowed types.

Here is an example of a schema:

{
    "single_type": str,
    "list_of_strings": [str],
    "mixed_list:" [str, int],
    "multiple_types": (int, float),
    "optional?": str,
    "nested": {
        "key": str
    }
}

When a schema is defined, the validator will also check if values are missing and if their types are correct. If a handler is defined for a key, the validator will use the handler instead of the type defined in the schema.

Validator

The validator is the core of the package. It is used to validate a TOML file. A schema is optionally passed to the validator, and handlers are added using the add_handler method. Once you feel ready, you can call the validate method to get a dictionary of errors.

Currently, there are two type of error structures, for type errors and all other errors.

Type errors are structured as follows:

"key": (message, (value, expected_type, actual_type))

expected_type and actual_type can be either type or tuple[type]

All other errors have a slightly simpler structure:

"key": (message, value)

The point of the validator is to parse the data and get the errors in a clean and easy way. What you do with the errors is up to you.

Example

Here is a full example of how to use the validator.

import pathlib
import tomllib
import datetime
from tomlval import TOMLValidator, TOMLSchema

# Load data
path = pathlib.Path("data.toml")

with path.open("rb") as file:
    data = tomllib.load(file)

# Define schema (optional)
structure = {
    "first_name": str,
    "last_name": str,
    "age": int,
    "email": str,
    "phone": str,
    "birthday": datetime.datetime,
    "address": {
        "street": str,
        "city": str,
        "zip": int
    }
}

schema = TOMLSchema(structure) # If the struture is invalid, a TOMLSchemaError is raised

# Define validator
validator = TOMLValidator(data, schema)

# Add handlers
validator.add_handler("*_name", lambda key: None if key in ["first_name", "last_name"] else "invalid-key")
validator.add_handler("age", lambda value: None if 18 < value < 100 else "invalid-age")
validator.add_handler("*", lambda: "invalid-key")

# Validate the data
errors = validator.validate()

Future Plans

Future plans are found in the TODO file.

License

This project is licensed under the MIT License - see the LICENSE file for details.

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

tomlval-1.0.0.tar.gz (12.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tomlval-1.0.0-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file tomlval-1.0.0.tar.gz.

File metadata

  • Download URL: tomlval-1.0.0.tar.gz
  • Upload date:
  • Size: 12.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for tomlval-1.0.0.tar.gz
Algorithm Hash digest
SHA256 5820b71fb95342f7287b1007ce5f0289283e6b72928cf2726fd248bf9580b5a8
MD5 329697f522361e275ede66af5c71f6fe
BLAKE2b-256 0bc16ecaceb803b7fb2f3257f09109531d9796f2301d89a876c42290eccc3912

See more details on using hashes here.

File details

Details for the file tomlval-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: tomlval-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 9.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.8

File hashes

Hashes for tomlval-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 74d498d564938ce8645a31354d62098c893a49f81247d516cba5025c2c8a64f8
MD5 b7b73f701734d252e5e419dba26ac73a
BLAKE2b-256 ffba62087b9d11b4647068618121cec3ef58d29ba03bed62b97501d34ad01e3f

See more details on using hashes here.

Supported by

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