Skip to main content

A simple and hands-on validation library for Python.

Project description

Pydator

CI PyPI version Python Versions License

Pydator is a lightweight, easy-to-use validation library for Python. It provides a clean and intuitive way to validate data using predefined rules.

Installation

# Using pip
pip install pydator

# Using conda
conda install -c conda-forge pydator

Quick Start

from pydator.validator import Validator

# Data to validate
data = {
    "username": "john_doe123",
    "email": "john@example.com",
    "age": 30
}

# Define validation rules
rules = {
    "username": ["required", "string", "min:3", "max:20"],
    "email": ["required", "email"],
    "age": ["required", "integer", "min:18"]
}

# Create validator
validator = Validator(data, rules)

# Validate data
if validator.validate():
    print("All validations passed!")
else:
    print("Validation errors:", validator.errors)

Features

  • Simple and intuitive API
  • Multiple validation rules per field
  • Custom error messages
  • Extensive built-in validation rules
  • Easy to extend with custom rules

Available Validation Rules

Rule Description Example
required Field must be present and not empty "name": ["required"]
string Field must be a string "name": ["string"]
number Field must be a number (integer or float) "price": ["number"]
min:value Minimum value for numbers, minimum length for strings "age": ["min:18"]
max:value Maximum value for numbers, maximum length for strings "bio": ["max:200"]
email Field must be a valid email address "email": ["email"]
boolean Field must be a boolean value "active": ["boolean"]
in:val1,val2,val3 Field value must be in the specified list "status": ["in:pending,active,completed"]
regex:pattern Field must match the regular expression pattern "username": ["regex:^[a-zA-Z0-9_]+$"]
date Field must be a valid date string "birth_date": ["date"]
float Field must be a float number "weight": ["float"]
url Field must be a valid URL "website": ["url"]
integer Field must be an integer "age": ["integer"]
contains:value Field must contain the specified value "description": ["contains:important"]

Advanced Usage

Custom Error Messages

You can customize error messages for specific rules:

data = {
    "username": "",
    "email": "invalid-email"
}

rules = {
    "username": ["required", "string"],
    "email": ["required", "email"]
}

messages = {
    "username.required": "Username is required!",
    "email.email": "Please provide a valid email address."
}

validator = Validator(data, rules, messages)

if not validator.validate():
    print(validator.errors)
    # Output: {'username': ['Username is required!'], 'email': ['Please provide a valid email address.']}

Complete Example

Here's a comprehensive example showing most features:

from pydator.validator import Validator

data = {
    "username": "john_doe123",
    "email": "john@example.com",
    "age": 30,
    "is_active": True,
    "website": "https://example.com",
    "signup_date": "2025-04-24",
    "bio": "Software developer with 10 years of experience.",
    "password": "SecurePass123!",
    "confirm_password": "SecurePass123!",
    "referral_code": "ABC123XYZ",
}

rules = {
    "username": ["required", "string", "min:3", "max:20", "regex:^[a-zA-Z0-9_]+$"],
    "email": ["required", "email"],
    "age": ["required", "integer", "min:18", "max:65"],
    "is_active": ["required", "boolean"],
    "website": ["required", "url"],
    "signup_date": ["required", "date"],
    "bio": ["string", "max:100"],
    "password": ["required", "string", "min:8"],
    "confirm_password": ["required", "string", "min:8"],
    "referral_code": ["string", "regex:^[A-Z0-9]{9}$"],
    "ip_address": ["required", "string"],
}

messages = {
    "username.required": "Username is required!",
    "username.min": "Username must be at least 3 characters long.",
    "username.max": "Username must not exceed 20 characters.",
    "username.regex": "Username can only contain letters, numbers, and underscores.",
    "email.required": "Email address is required!",
    "email.email": "Please provide a valid email address.",
    "age.required": "Age is required!",
    "age.integer": "Age must be a valid number.",
    "age.min": "You must be at least 18 years old.",
    "age.max": "Age must not exceed 65.",
    "is_active.required": "Please specify if the account is active.",
    "is_active.boolean": "Active status must be a boolean value.",
    "website.required": "Website URL is required!",
    "website.url": "Please provide a valid URL.",
    "signup_date.required": "Signup date is required!",
    "signup_date.date": "Please provide a valid date.",
    "bio.max": "Bio must not exceed 100 characters.",
    "password.required": "Password is required!",
    "password.min": "Password must be at least 8 characters long.",
    "confirm_password.required": "Please confirm your password.",
    "confirm_password.min": "Confirmation password must be at least 8 characters long.",
    "referral_code.regex": "Referral code must be exactly 9 characters long and alphanumeric.",
    "ip_address.required": "IP address is required!",
}

validator = Validator(data, rules, messages)

if validator.validate():
    print("All validations passed!")
else:
    print("Validation errors:", validator.errors)

Extending with Custom Rules

You can create custom validation rules by extending the rules.py module:

from pydator.rules import RULES

def phone_number(value):
    import re
    pattern = r'^\+?[1-9]\d{1,14}$'
    if not re.match(pattern, str(value)):
        return False
    return True

# Add your custom rule to the RULES dictionary
RULES["phone"] = phone_number

# Now you can use it in your validation rules
rules = {
    "contact": ["required", "phone"]
}

Why Pydator?

  • Simplicity: Easy to learn and use with a clean, intuitive API
  • Flexibility: Validate any data structure with customizable rules
  • Performance: Lightweight with minimal dependencies
  • Extensible: Easy to add custom validation rules
  • Readable: Straightforward validation definitions that are easy to understand

Comparison with other validation libraries

Feature Pydator Other Validation Libraries
Learning Curve Minimal Often steeper
Configuration Simple dict-based Various (class-based, schema-based)
Custom Rules Easy to add Usually requires more code
Dependencies Minimal Often more dependencies
Performance Lightweight Can be heavier

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the terms of the MIT license. See LICENSE for more 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

pydator-1.2.0.tar.gz (11.4 kB view details)

Uploaded Source

Built Distribution

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

pydator-1.2.0-py3-none-any.whl (12.8 kB view details)

Uploaded Python 3

File details

Details for the file pydator-1.2.0.tar.gz.

File metadata

  • Download URL: pydator-1.2.0.tar.gz
  • Upload date:
  • Size: 11.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.1

File hashes

Hashes for pydator-1.2.0.tar.gz
Algorithm Hash digest
SHA256 e17362672317f683b803b557711b1d6c1d5f76572026d6e887c71916f7455ded
MD5 2b3014791482c031a67ebe9093d98739
BLAKE2b-256 ee8a56b9df28716066dc9fe7e4a4f1ed74f7a7b2371845862abf6e71c2eb83b4

See more details on using hashes here.

File details

Details for the file pydator-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: pydator-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 12.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.1

File hashes

Hashes for pydator-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ba2bc9a1067b27a6473d249b9ab72c38725e19d46d38d45841d229524033c4b0
MD5 7ea60f0a993240f48eac7480bdfa2481
BLAKE2b-256 c35fea1c0b02d6d0a41e6185c3c7d0ce1cde985aab4669554b34984ae312e19c

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