The click running on steroids
Project description
Sayer
Fast. Scalable. Elegant. Command the CLI like a boss. 🧙♂️
Documentation: https://sayer.dymmond.com 📚
Source Code: https://github.com/dymmond/sayer
The official supported version is always the latest released.
🤔 What is Sayer?
Sayer is a modern, async-native Python CLI framework built for developers who want more:
- More structure.
- More power.
- More expressiveness.
Less boilerplate. Less headache. Less "why doesn't this just work?".
Designed to scale from weekend scripts to enterprise-grade CLI suites — with a touch of magic.
📦 Installation
Using pip:
pip install sayer
Or with uv (blazing fast):
uv pip install sayer
🧩 Features
- ✅ Fully async support out-of-the-box
- ✅ Param metadata via
Option(...),Argument(...),Env(...)— inspired by the best - ✅ Declarative CLI building with decorators
- ✅ Built-in middleware system (yes, for CLI!)
- ✅ Shared app state and lifecycle management
- ✅ Terminal-rich output via
rich - ✅ Easy testing with
SayerTestClient - ✅ Flexible help and docs rendering
- ✅ Clean project scaffolding, sensible defaults
- ✅ 100% type annotated.
🔥 Why Sayer?
| Feature | Sayer | Notes |
|---|---|---|
| Async Support | ✅ Yes | Truly async from top to bottom |
| Param Metadata | ✅ Yes | With rich options, env vars, etc. |
| Middleware Support | ✅ Yes | Per-command, app-wide, scoped |
| Lifecycle Hooks | ✅ Yes | on_startup, on_shutdown |
| State Management | ✅ Yes | Like a Flask g but better |
| Testability | ✅ Yes | CLI client for unit tests |
| Output Styling | ✅ Yes | Built-in rich integration |
| Based on Modern Tools | ✅ Hatch + UV | Modern dev setup from day 1 |
| Full Typing | ✅ Yes | Mypy + Ruff compliant |
| Fun to Use? | 🕺 Extremely | Let the code dance with you |
🚀 Getting Started
Create your first CLI app:
from sayer import Sayer, Option
app = Sayer()
@app.command()
def hello(name: str = Option(..., help="Your name")):
"""Say hello to someone"""
print(f"Hello, {name}!")
if __name__ == "__main__":
app()
Run it:
$ python app.py hello --name Ada
Hello, Ada!
🧪 Testing
hatch run test:test
Or with pytest:
pytest -v
📚 Documentation
Full docs available at: https://sayer.dymmond.com
You'll find:
- Full API reference
- Command examples
- Parameter deep dives
- Middleware patterns
- Configuration strategies
- ... and some fun easter eggs 🐣
Project details
Release history Release notifications | RSS feed
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 sayer-0.7.4.tar.gz.
File metadata
- Download URL: sayer-0.7.4.tar.gz
- Upload date:
- Size: 64.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df1b3c34441d3b6d12b860ea7880d3acea324b3506dc89c73f22b498c936c84f
|
|
| MD5 |
c9d2ad3ed1b66eef4bba082b98e932a7
|
|
| BLAKE2b-256 |
303b2e338b8a92672ad14430de01bd8f5fcf7144bc5092887d1935c530fc60d2
|
File details
Details for the file sayer-0.7.4-py3-none-any.whl.
File metadata
- Download URL: sayer-0.7.4-py3-none-any.whl
- Upload date:
- Size: 79.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
386e62dbf6ab5b3343fe0145d045122d839b9669b8abc2035c1a54b50b84c989
|
|
| MD5 |
d395fab17ae883cdcd57836ef9a8f85c
|
|
| BLAKE2b-256 |
4d351083436bd35dc4bffceb4c8062be391a0f46e6b13d382032c2f60e9e75d6
|