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
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.1.tar.gz.
File metadata
- Download URL: caddyconfig-0.1.1.tar.gz
- Upload date:
- Size: 30.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 |
2e3d227579eeb5eb783212865615b9801fc063d84b4b9e813c5375181ef1ad7d
|
|
| MD5 |
801f1ee7bd69c5e4ec282fee317fb4c3
|
|
| BLAKE2b-256 |
49fee8dca4c2d5f496ec95c61b0f78d0818890fd3bca5da84c20372d04ed841a
|
File details
Details for the file caddyconfig-0.1.1-py3-none-any.whl.
File metadata
- Download URL: caddyconfig-0.1.1-py3-none-any.whl
- Upload date:
- Size: 27.1 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 |
6e7d2ce2e5783a77d6d4c5e6f72d44c1e39707747f0b3b350db39e03af585d9c
|
|
| MD5 |
41e61d1fe35266bee070f1e2bc3d0c34
|
|
| BLAKE2b-256 |
6b23af49ef62cfc42de61d9660de3f0b6ff8d118d31e7c1dc0e415f85a882a6d
|