Sybaritic is an async-first, fully type-hinted Python client library for the Spartan Protocol.
- Async First: Built on top of Python's standard
asyncionetworking loop. - Spartan Protocol Spec Compliant: Supports text/binary downloads and uploads (
content-lengthspecification), default port300, and all status codes (2Success,3Redirect,4Client Error,5Server Error). - Type Safe: Fully typed API with PEP 561 compliance (
py.typed). - SpartanURI Representation: Rich URI class to parse, inspect, validate, and manipulate Spartan URIs (including punycode support for IDNs).
- Auto Redirect Handling: Automatically handles redirects (
status 3) with loop detection and max redirect threshold limits. - Zero Heavy Dependencies: Built on top of Python's standard library.
- CLI Utility: Includes a
sybariticcommand-line utility out of the box.
sybaritic requires Python 3.12 or later and can be installed with uv or pip:
With uv:
uv add sybariticWith pip:
pip install sybariticUse Client with standard async context managers to query a Spartan server:
import asyncio
from sybaritic import Client, SybariticError
async def main():
async with Client() as client:
try:
# Query a Spartan document (defaults to port 300)
response = await client.request("spartan://spartan.mozz.us/specification.gmi")
print(f"Status: {response.status} ({response.meta})")
print(f"Content Type: {response.mime_type}")
print(response.text)
except SybariticError as exc:
print(f"Error querying Spartan server: {exc}")
asyncio.run(main())Post data to a Spartan resource:
import asyncio
from sybaritic import Client
async def main():
async with Client() as client:
# Send data payload
response = await client.post("spartan://example.com/guestbook", data="Hello Spartan!")
print(response.text)
asyncio.run(main())sybaritic provides a command-line interface:
# Request a resource
sybaritic spartan://spartan.mozz.us/specification.gmi
# Output headers with body
sybaritic -i spartan://spartan.mozz.us/specification.gmi
# Upload data payload
sybaritic spartan://example.com/submit "My comment text"
# Post payload from a file
sybaritic spartan://example.com/upload -f payload.txtRun the test suite using uv:
uv run pytestMIT License