Skip to main content

Caddy JSON configuration manipulation (Pydantic v2 + fluent builder)

Project description

caddyconfig

Caddy JSON configuration manipulation for Python, built on Pydantic v2.

Provides typed models, validation, a fluent builder API, and bidirectional serialization to/from Caddy's native JSON format.

Installation

pip install caddyconfig

Requires Python 3.10+.

Quick Start

Fluent Builder API

from caddyconfig.builder import CaddyConfigBuilder

config = (
    CaddyConfigBuilder()
    .admin(listen="localhost:2019")
    .logging(writer="stderr", level="info")
    .server("main", listen=[":443", ":80"])
        .route()
            .match(host=["acme.com"])
            .handle_static(200, body="Welcome")
        .done()
        .route()
            .match(path=["/api"])
            .handle_reverse_proxy("10.0.0.1:8080")
        .done()
    .done()
    .build()
)

print(config.to_json(indent=2))

Direct Model API

from caddyconfig import (
    CaddyConfig, Admin, Logging, LogSink, LogEntry,
    Apps, HttpApp, Server, Route, MatchCriteria,
    StaticResponseHandler, ReverseProxyHandler,
)

config = CaddyConfig(
    admin=Admin(listen="localhost:2019"),
    logging=Logging(
        sink=LogSink(writer="stderr"),
        logs={"default": LogEntry(name="default", level="info")},
    ),
    apps=Apps(
        http=HttpApp(
            servers={
                "main": Server(
                    name="main",
                    listen=[":443", ":80"],
                    routes=[
                        Route(
                            match=[MatchCriteria(host=["acme.com"])],
                            handle=[StaticResponseHandler(status_code=200, body="Welcome")],
                        ),
                        Route(
                            match=[MatchCriteria(path=["/api"])],
                            handle=[ReverseProxyHandler(upstreams=["10.0.0.1:8080"])],
                        ),
                    ],
                )
            }
        ),
    )
)

JSON Roundtrip

json_str = config.to_json()
config2 = CaddyConfig.from_json(json_str)
assert config2.to_dict() == config.to_dict()

Route Lookup and Mutation

server = config.apps.http.get_server("main")

# Find a route by matcher criteria (partial match supported)
route = server.find_route(MatchCriteria(path=["/api"]))

# Upsert: replace if exists, insert otherwise
server.upsert_route(MatchCriteria(path=["/api"]), new_route)

# Remove a route
server.remove_route(MatchCriteria(path=["/api"]))

# Search recursively through subroutes
route = server.find_route(MatchCriteria(path=["/api"]), recursive=True)

Supported Handlers

Handler Model Builder Method
static_response StaticResponseHandler .handle_static(status, body=...)
reverse_proxy ReverseProxyHandler .handle_reverse_proxy("host:port")
file_server FileServerHandler .handle_file_server(root=...)
authentication AuthenticationHandler .handle_auth_basic(("u", "pw"))
subroute SubrouteHandler .handle_subroute()
unknown types RawHandler .handle(raw_handler)

Development

# Install dependencies
uv sync

# Run tests
uv run pytest

# Run a single test file
uv run pytest tests/test_builder.py

# With coverage
uv run pytest --cov=caddyconfig

License

Apache License 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

caddyconfig-0.1.4.tar.gz (36.6 kB view details)

Uploaded Source

Built Distribution

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

caddyconfig-0.1.4-py3-none-any.whl (29.6 kB view details)

Uploaded Python 3

File details

Details for the file caddyconfig-0.1.4.tar.gz.

File metadata

  • Download URL: caddyconfig-0.1.4.tar.gz
  • Upload date:
  • Size: 36.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for caddyconfig-0.1.4.tar.gz
Algorithm Hash digest
SHA256 1cde7b703bea44fff5c03e71f37ada05bdd3085a5503f08a291815730de981ca
MD5 1ab63616738248524498422c87b792b1
BLAKE2b-256 d540ad75e83c561ce6244e523687079cbd00c80bb0a918e95bc16852beb4d049

See more details on using hashes here.

File details

Details for the file caddyconfig-0.1.4-py3-none-any.whl.

File metadata

  • Download URL: caddyconfig-0.1.4-py3-none-any.whl
  • Upload date:
  • Size: 29.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for caddyconfig-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 8ad66caeab6997a9704293d4e8123a2a28e763743a58cffa7da6e1e52684bbee
MD5 5bf0aafe9ff95bdde545392ce75417c3
BLAKE2b-256 b39b1b033112fbba02c9509ac17cb919d63f5cfab05d70cf35e9c7a684c39f43

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