Skip to content

Lilya Converter

Lilya

Convert FastAPI codebases into Lilya using deterministic rules, explicit diagnostics, and reproducible reports.

Test Suite Package version Supported Python versions


Documentation: https://lilya-converter.dymmond.com 📚

Source Code: https://github.com/dymmond/lilya-converter 💻

The official supported version is always the latest released.


Installation

pip install lilya-converter

Start Here

  1. Get Started
  2. First Conversion
  3. Guides
  4. Command Reference

What You Get

  • Deterministic conversion outputs.
  • Rule-level diagnostics and reports.
  • Dry-run and unified diff previews.
  • Verification checks after conversion.

Quick Command Preview

# Analyze
# lilya-converter analyze ./fastapi_project --json

# Convert with preview
# lilya-converter convert ./fastapi_project ./lilya_project --dry-run --diff

# Persist reports
# lilya-converter convert ./fastapi_project ./lilya_project --report ./reports/convert.json
# lilya-converter verify ./lilya_project --report ./reports/verify.json

# Mapping introspection
# lilya-converter map rules
# lilya-converter map applied ./reports/convert.json

Conversion Preview

FastAPI input:

from fastapi import APIRouter, FastAPI
from fastapi.responses import ORJSONResponse, PlainTextResponse

app = FastAPI(openapi_url=None)
router = APIRouter()


@router.api_route(
    "/payload",
    methods=["PATCH"],
    response_class=ORJSONResponse,
    response_model=dict,
    responses={404: {"description": "missing"}},
    status_code=201,
)
async def payload():
    return {"value": 1}


@router.trace("/trace", include_in_schema=False)
async def trace_route():
    return PlainTextResponse("trace")


app.include_router(router)

Lilya output:

from lilya.apps import Lilya as FastAPI
from lilya.responses import PlainText as PlainTextResponse
from lilya.routing import Router as APIRouter

app = FastAPI(enable_openapi=False)
router = APIRouter()


@router.route("/payload", methods=["PATCH"])
async def payload():
    return {"value": 1}


@router.route("/trace", include_in_schema=False, methods=["TRACE"])
async def trace_route():
    return PlainTextResponse("trace")


app.include(path="", app=router)