Your docstrings say what your code should do. Quell proves it.
Project description
quelltest
Your docstrings say what your code should do. Quell proves it.
Quell reads specifications that already exist in your codebase — docstrings, Pydantic models, bug reports — extracts every testable requirement, checks which ones have no test, generates a test for each gap, proves the test actually catches violations, then writes it to disk. Every test is verified before it touches your files.
Why Quell is different
| Tool | Spec source | Verified? |
|---|---|---|
| Qodo Gen | reads implementation | ❌ |
| GitHub Copilot | chat prompt | ❌ |
| Hypothesis | you write it manually | ❌ |
| Quell | reads existing specs | ✅ |
The critical insight: Qodo reads your implementation and generates tests for what your code does. If your code has a bug, Qodo generates tests that bless it. Quell reads your specification (docstring says "must raise ValueError") and generates a test that proves the requirement — catching the bug.
How it works
docstrings + Pydantic models + bug reports
↓
list[Requirement]
↓
Coverage checker (AST scan — no execution)
↓
Rule engine → verified test
↓
Verification: PASS on correct code + FAIL on violated code
↓
libcst injection into test file
Installation
pip install quelltest
Requires Python 3.11+. The CLI command is quell.
Quick start
# Scan your specs, find gaps
quell check src/
# Generate + verify + write tests for all gaps
quell check src/ --fix
# Reproduce a bug from a description
quell reproduce "payment accepts zero amount"
# Show confidence score for a file
quell prove src/payments.py
# Project-wide Quell Score
quell score --badge
Example
Given this existing code:
def process_payment(request: PaymentRequest) -> dict:
"""
Process a payment transaction.
Args:
request: Amount must be greater than 0. Currency must be one of: USD, EUR, GBP.
Returns:
dict with transaction_id, status, amount.
Raises:
ValueError: If amount is zero or negative.
"""
And this Pydantic model:
class PaymentRequest(BaseModel):
amount: float = Field(gt=0)
currency: Literal["USD", "EUR", "GBP"]
Running quell check src/payments.py finds 5 requirements with no tests and generates a verified test for each one — before touching your files.
Configuration
quell init # adds [tool.quell] to pyproject.toml
[tool.quell]
llm_provider = "anthropic" # "anthropic" | "openai" | "ollama"
llm_model = "claude-sonnet-4-5"
enable_docstring = true
enable_types = true
enable_mutations = false # mutmut optional
auto_write = false
Set your LLM API key (only needed for complex/unstructured specs):
export ANTHROPIC_API_KEY=sk-ant-...
# or
export OPENAI_API_KEY=sk-...
For fully local/offline setup, use Ollama:
# In pyproject.toml: llm_provider = "ollama"
# ollama pull codellama
Python SDK
from quell import Quell
q = Quell()
# Find requirement gaps
result = q.check("src/")
print(f"Score: {result.score:.0%} | Gaps: {len(result.uncovered)}")
# Reproduce a bug
q.reproduce("payment accepts zero amount silently")
# Project score
score = q.score()
print(f"Project: {score.percentage}%")
Project structure
quell/
├── cli.py # Typer CLI: check, reproduce, prove, score, ci, init
├── sdk.py # Python API: Quell class
├── spec/ # Spec readers (docstring, type, bug, mutation)
├── core/
│ ├── models.py # Requirement, ConstraintKind, VerificationResult
│ ├── verifier.py # THE MOAT — proves every test catches violations
│ └── writer.py # libcst injection, backup/restore
├── coverage/ # AST-based coverage checker
├── synthesis/ # rule_engine.py + llm_engine.py
├── score/ # Quell Score calculator + SVG badge
└── llm/ # Anthropic / OpenAI / Ollama providers
Development
git clone https://github.com/shashank7109/quelltest_lib.git
cd quelltest_lib
uv sync --dev
uv run pytest tests/ -v
uv run ruff check . --fix
uv run mypy quell/
Related
- Docs
- quell_frontend — Next.js website
License
MIT — see LICENSE
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 quelltest-0.4.1.tar.gz.
File metadata
- Download URL: quelltest-0.4.1.tar.gz
- Upload date:
- Size: 208.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":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 |
2ef5cd6c14726318cf0ccfb3a6233a2cefa4d67252ce7deb8019e86cab4d98a7
|
|
| MD5 |
e29194ff78f17c8a754946672e3f93ab
|
|
| BLAKE2b-256 |
c99141c476cf3f2900eac5ddd0adf199e47d4f7c490cf8646f0380ca11afdb07
|
File details
Details for the file quelltest-0.4.1-py3-none-any.whl.
File metadata
- Download URL: quelltest-0.4.1-py3-none-any.whl
- Upload date:
- Size: 67.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.11 {"installer":{"name":"uv","version":"0.11.11","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":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 |
681fd91e5bef37fb364bb86baa19594a7847ffb4b5f001019b9d78f5ce1c9c2e
|
|
| MD5 |
7449c6eb3a2e7de77fadff5478cb9eeb
|
|
| BLAKE2b-256 |
e55331c45bf60a95a23ee8cbfd852a0d49302b0b1af757d3fd3acc445e21c958
|