Skip to main content

Executable tutorial testing - make documentation tutorials runnable as tests

Project description

validoc

Documentation Execution and Testing Tool

validoc is an executable documentation testing tool that makes markdown documentation tutorials runnable as tests. It parses markdown files with annotated code blocks and executes them, verifying outputs. The tutorial is the test - single source of truth.

Problem

Documentation tutorials suffer from documentation rot: they become outdated as software evolves, but there's no automated way to detect this. Users follow broken tutorials and blame themselves.

Solution

Annotate markdown code blocks to make them executable:

```bash exec
echo "Hello, World!"
```

```output contains
Hello
```

Run the tutorial as a test:

validoc run docs/tutorials/getting-started.md

Installation

# Install with uv
uv add validoc

# Or install with pip
pip install validoc

For development:

git clone https://github.com/abilian/validoc.git
cd validoc
uv sync --all-extras

Quick Start

# Run a tutorial
validoc run examples/01-hello-world.md

# Run with verbose output
validoc run examples/01-hello-world.md -v

# Keep files for debugging
validoc run tutorial.md --workdir /tmp/test --no-teardown

# Validate without executing
validoc check tutorial.md

# List executable blocks
validoc list tutorial.md

Features

  • Readable first - Documentation remain beautiful, human-readable markdown
  • Standard markdown - Works with GitHub, MkDocs, VS Code without modification
  • Multiple block types - Execute commands, create files, verify output, assert conditions
  • Sandbox execution - Runs in temporary directory, cleans up after
  • Debug-friendly - --no-teardown preserves files for inspection

Block Types

Type Syntax Purpose
Execute ```bash exec Run shell commands
File ```file path=config.yml Create files
Output ```output contains Verify command output
Assert ```assert file-exists path=app.py Check conditions

Execute Block Attributes

Attribute Description
id=name Unique identifier
dir=path Working directory
timeout=60 Timeout in seconds
expect=1 Expected exit code
skip Skip this block
continue-on-error Don't stop on failure

Output Matching Modes

Mode Description
output contains Text appears in output (default)
output exact Exact match
output regex Regular expression

Tutorial Configuration

Use YAML frontmatter for configuration:

---
tutorial:
  name: my-tutorial
  env:
    DEBUG: "true"
  setup:
    - echo "Setting up..."
  teardown:
    - rm -rf myapp || true
---

Examples

The examples/ directory contains tutorials demonstrating all features:

  • 01-hello-world.md - Minimal example
  • 02-file-creation.md - Creating files
  • 03-output-matching.md - Output verification modes
  • 04-assertions.md - Assertion types
  • 05-frontmatter.md - YAML configuration

Run all examples:

uv run pytest tests/c_examples -v

Documentation

Document Description
docs/tutorial.md Comprehensive user guide
notes/specs.md Complete specification
notes/design.md Architecture and design
notes/plans.md Future plans

Development

# Install with dev dependencies
uv sync --all-extras

# Run all tests (98 tests)
uv run pytest

# Run specific test categories
uv run pytest tests/a_unit           # Unit tests
uv run pytest tests/b_integration    # Integration tests
uv run pytest tests/c_examples       # Example tests

# Linting
uv run ruff check src tests

Package Structure

src/validoc/
├── cli.py         # Command-line interface
├── parser.py      # Markdown parser
├── executor.py    # Block execution
├── runner.py      # Orchestration
├── reporter.py    # Console output
├── models.py      # Data structures
└── constants.py   # Enums

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

validoc-0.1.2.tar.gz (11.2 kB view details)

Uploaded Source

Built Distribution

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

validoc-0.1.2-py3-none-any.whl (15.7 kB view details)

Uploaded Python 3

File details

Details for the file validoc-0.1.2.tar.gz.

File metadata

  • Download URL: validoc-0.1.2.tar.gz
  • Upload date:
  • Size: 11.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for validoc-0.1.2.tar.gz
Algorithm Hash digest
SHA256 fa6cb426916475931683956b0460d2fdfb4577e3db47891f180709e471603eda
MD5 d88b984f92e65ed66f13688b929562ae
BLAKE2b-256 73eaa9fb5c9798b8e76cc03d40ba115985f78590c40296501bb5ff500fb9966c

See more details on using hashes here.

File details

Details for the file validoc-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: validoc-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 15.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for validoc-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e859a60184f3f29f410165ab56c62b4367804e1e1f97ad81572716868ad82ed4
MD5 413b5de196a69c72306d3af30626022f
BLAKE2b-256 9e54de584adbf9f73257e395f1b76f18857e09b7e05745a5ae26d4571c5aada8

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