A project generator that bootstraps a FastAPI setup following Helicon's standards and best practices.
Project description
Helicon kit
A project generator that bootstraps a FastAPI setup following Helicon's standards and best practices.
Included tools
These are the major tools that are configured and included in the project:
- structlog
- sqlmodel
- alembic
- fastapi
- pydantic-settings
- pytest
Start a new project
Run the following commands to initialize a new project:
mkdir helicon-app
cd helicon-app
uvx he-kit init
After answering the prompts you should have a fully runnable FastAPI setup:
├── alembic.ini
├── Dockerfile
├── main.py
├── pyproject.toml
├── README.md
├── migrations
│ ├── env.py
│ ├── script.py.mako
│ └── versions
│ └── placeholder.txt
├── src
│ └── helicon_app
│ ├── app.py
│ ├── conf.py
│ ├── __init__.py
│ ├── models
│ │ └── __init__.py
│ ├── routers
│ │ └── __init__.py
│ └── schemas
│ └── __init__.py
└── tests
└── conftest.py
You can verify that it works by running the test suite and starting the development server:
uv run pytest
uv run he-kit dev
It is recommended that you synchronize the new environment and install the supplied pre-commit hooks (mypy and ruff):
uv sync
uv run pre-commit install
Create a model and migrations
Helicon-kit uses SQLModel and Alembic. To start working with models, first
create a new module in the models/ directory. We'll call it
models/users.py:
from sqlmodel import Field, SQLModel
class User(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
name: str
email: str
We have to make sure the models are importable via your_module_name.models
in order for Alembic to discover them. We do this by importing the new module
in models/__init__.py:
from .users import *
Create the migrations and apply them:
uv run he-kit makemigrations "add user model"
uv run he-kit migrate
Create and register a new router
Firstly we need to define some API schemas. We'll add them in the module
schemas/users.py:
from sqlmodel import SQLModel
class UserCreate(SQLModel):
name: str
email: str
class UserRead(SQLModel):
id: int
name: str
email: str
Note: as both schemas and models are derrived from SQLModel you can of
course create base classes and extend them to avoid repeating attributes.
We'll continue and a new module in the routers/ directory. We'll stay on the
theme and call it routers/users.py:
from he_kit.core.db import db_session
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from sqlmodel import select
from ..models.users import User
from ..schemas.users import UserCreate, UserRead
router = APIRouter()
@router.get("/", response_model=list[UserRead])
async def list_users(session: AsyncSession = Depends(db_session)):
result = await session.execute(select(User))
users = result.scalars().all()
return users
@router.post("/", response_model=UserRead)
async def create_user(user: UserCreate, session: AsyncSession = Depends(db_session)):
user = User.model_validate(user)
session.add(user)
await session.commit()
await session.refresh(user)
return user
And finally we register the router in app.py:
from he_kit.core.app import App
from .conf import settings
from .routers.users import router as user_router
def create_app():
app = App(settings=settings)
app.include_router(user_router, prefix="/users")
return app
app = create_app()
Writing tests
To verify that everything works we'll create a testmodule in
tests/test_user_endpoints.py:
def test_create_user(client):
payload = {"name": "Alice", "email": "alice@example.com"}
r = client.post("/users/", json=payload)
assert r.status_code == 200
data = r.json()
assert data["name"] == "Alice"
assert data["email"] == "alice@example.com"
assert "id" in data
def test_list_users(client):
payload = {"name": "Bob", "email": "bob@example.com"}
r = client.post("/users/", json=payload)
assert r.status_code == 200
r = client.get("/users/")
assert r.status_code == 200
users = r.json()
assert any(u["name"] == "Bob" for u in users)
Save the file and run the tests suite:
uv run pytest
Local development setup
To install he-kit from local disk to try it out during development, you can
install it with pip:
mkdir test-dir
cd test-dir
uv venv
pip install -e ../path/to/he-kit
uv run he-kit ...
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 he_kit-0.0.9.tar.gz.
File metadata
- Download URL: he_kit-0.0.9.tar.gz
- Upload date:
- Size: 60.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1037534e23e475cdadc7ac3142c7ab14dd9afbe7e809bb733ea433ed90829884
|
|
| MD5 |
d01175332a673b475217a33f68bce951
|
|
| BLAKE2b-256 |
8e122ca2f592d286738e32b6ba02c7b4e4f514bbc66bc5c98c81a69d58e87c3b
|
File details
Details for the file he_kit-0.0.9-py3-none-any.whl.
File metadata
- Download URL: he_kit-0.0.9-py3-none-any.whl
- Upload date:
- Size: 18.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6da8fd0dee4ed85387e3252d22db7753e8d0e8622ecf4d442da1070ca7c56bc
|
|
| MD5 |
bc37abc96ff2d9b53eef2a016cf82796
|
|
| BLAKE2b-256 |
1411c4a93b112f79a4515e81561cbd66ea22815ea18207f56230f0baa869ebda
|