Skip to main content

In-process Python bindings for vastlint VAST XML validation

Project description

vastlint (Python)

High-performance, in-process VAST XML validation for Python backends.

Rule reference: vastlint.org/docs/rules · Web validator: vastlint.org/validate

This package wraps the stable vastlint-ffi C API, backed by the same Rust core used by the CLI, Go binding, Ruby gem, Erlang NIF, MCP server, and web validator. The intended use case is a DSP, SSP, ad server, or trafficking backend that needs to validate VAST XML and return structured linting results to a frontend.

Why this shape

  • No subprocess management in your Python app
  • No network hop to an external validation service
  • Stable JSON-compatible result shape for backend-to-frontend responses
  • Same rule coverage and behavior as the rest of the vastlint ecosystem

Install

The package bundles a platform-matched libvastlint shared library inside the wheel, so no compiler or Rust toolchain is needed at install time.

pip install vastlint

You can also point the package at an explicit shared library with VASTLINT_LIB_PATH:

export VASTLINT_LIB_PATH=/absolute/path/to/libvastlint.dylib

For development in this monorepo, it automatically falls back to the sibling vastlint/target/debug and vastlint/target/release outputs.

Usage

import vastlint

result = vastlint.validate(vast_xml)

if result.valid:
    print("clean tag")
else:
    print(result.summary.errors)
    print(result.issues[0].message)

print(result.to_json())

FastAPI / Flask example

from fastapi import FastAPI
from pydantic import BaseModel
import vastlint

app = FastAPI()


class ValidateRequest(BaseModel):
    xml: str
    wrapper_depth: int = 0
    max_wrapper_depth: int = 5
    rule_overrides: dict[str, str] | None = None


@app.post("/validate")
def validate(req: ValidateRequest):
    result = vastlint.validate(
        req.xml,
        wrapper_depth=req.wrapper_depth,
        max_wrapper_depth=req.max_wrapper_depth,
        rule_overrides=req.rule_overrides,
    )
    return result.to_dict()

The response shape is stable and frontend-friendly:

{
  "version": "4.2",
  "issues": [
    {
      "id": "VAST-2.0-inline-impression",
      "severity": "error",
      "message": "<InLine> must contain at least one <Impression>",
      "path": "/VAST/Ad[0]/InLine",
      "spec_ref": "IAB VAST 2.0 §2.2.1",
      "line": 4,
      "col": 3
    }
  ],
  "summary": { "errors": 1, "warnings": 0, "infos": 0, "valid": false }
}

API

vastlint.validate(xml, *, wrapper_depth=0, max_wrapper_depth=5, rule_overrides=None) -> Result
vastlint.version() -> str

xml accepts str or bytes. rule_overrides maps rule IDs to severity levels:

result = vastlint.validate(
    vast_xml,
    rule_overrides={
        "VAST-2.0-mediafile-https": "error",
        "VAST-4.1-mezzanine-recommended": "off",
    },
)

Result exposes .version, .issues (list of Issue), .summary (Summary), .valid, .to_dict(), and .to_json(). All result types are frozen dataclasses.

Native library layout

Vendored release libraries live at:

  • src/vastlint/native/darwin_arm64/libvastlint.dylib
  • src/vastlint/native/darwin_amd64/libvastlint.dylib
  • src/vastlint/native/linux_arm64/libvastlint.so
  • src/vastlint/native/linux_amd64/libvastlint.so

They come from the vastlint-ffi-* tarballs attached to each vastlint GitHub Release. Refresh them with:

./scripts/fetch-libs.sh v0.4.14

License

Apache 2.0.

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

vastlint-0.6.0.tar.gz (1.9 MB view details)

Uploaded Source

Built Distribution

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

vastlint-0.6.0-py3-none-any.whl (1.9 MB view details)

Uploaded Python 3

File details

Details for the file vastlint-0.6.0.tar.gz.

File metadata

  • Download URL: vastlint-0.6.0.tar.gz
  • Upload date:
  • Size: 1.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vastlint-0.6.0.tar.gz
Algorithm Hash digest
SHA256 3381c61829cef20ac9c482aeaa369a3821f8fda3f4b107e385a34c776fac2725
MD5 b2f1fdc580f9715e29d0133df035d48c
BLAKE2b-256 5ad8ad0d8defd2b9da9fe14eeb7088e5410e5119be4f2fbbd9cad73d0f29d451

See more details on using hashes here.

Provenance

The following attestation bundles were made for vastlint-0.6.0.tar.gz:

Publisher: publish-pypi.yml on aleksUIX/vastlint-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file vastlint-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: vastlint-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 1.9 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for vastlint-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d713bc267bfa050fa175bc5b671596534c47a77d5d174e530e387dd3d4ce3b23
MD5 c0f2df1c9fb4b83b23f9528ac5e10625
BLAKE2b-256 f065fd11e1e6b0b453fb4e675d913bc9401315d5b28a43f617eaf5e4318fc62b

See more details on using hashes here.

Provenance

The following attestation bundles were made for vastlint-0.6.0-py3-none-any.whl:

Publisher: publish-pypi.yml on aleksUIX/vastlint-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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