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
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.9.tar.gz
(39.2 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file caddyconfig-0.1.9.tar.gz.
File metadata
- Download URL: caddyconfig-0.1.9.tar.gz
- Upload date:
- Size: 39.2 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7440a99d40104f5fef569f097145883f9fe1523ccc3fb259136a74a0e0fe032a
|
|
| MD5 |
902e8b381126397b09ad08f2d59231c8
|
|
| BLAKE2b-256 |
6abe1b85a6742336b8514496b9820edb3bc6e2a591f18f128dac8088bcc84c98
|
File details
Details for the file caddyconfig-0.1.9-py3-none-any.whl.
File metadata
- Download URL: caddyconfig-0.1.9-py3-none-any.whl
- Upload date:
- Size: 30.9 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
22dbb28eae2706eb53946a3199dbdc96d2329181384fcf62505d20c361753181
|
|
| MD5 |
06bd2ba687f8d2d3779e0ce359f1ee0f
|
|
| BLAKE2b-256 |
fa67493560fa08c9bd0513ff01d2708f3ef86d194b99ad31580598bc062aeb93
|