Skip to content

Advanced Example

WhenInput, ComputedFrom, and filter_by.

Code

"""
Advanced example - WhenInput, ComputedFrom, filter_by.
"""

from typing import Annotated

from pydantic import BaseModel
from semblance import ComputedFrom, FromInput, SemblanceAPI, WhenInput


class UserWithStatus(BaseModel):
    name: Annotated[str, FromInput("name")]
    status: Annotated[str, WhenInput("include_status", True, FromInput("status"))]


class QueryWithStatus(BaseModel):
    name: str = "alice"
    status: str = "active"
    include_status: bool = False


class UserWithFullName(BaseModel):
    first: Annotated[str, FromInput("first")]
    last: Annotated[str, FromInput("last")]
    full: Annotated[str, ComputedFrom(("first", "last"), lambda a, b: f"{a} {b}")]


class QueryWithNames(BaseModel):
    first: str = "John"
    last: str = "Doe"


api = SemblanceAPI(seed=42)


@api.get(
    "/user/status",
    input=QueryWithStatus,
    output=UserWithStatus,
    summary="Get user with optional status",
)
def user_status():
    """WhenInput: status only applied when include_status=True."""
    pass


@api.get(
    "/user/fullname",
    input=QueryWithNames,
    output=UserWithFullName,
    summary="Get user with computed full name",
)
def user_fullname():
    """ComputedFrom: full = first + ' ' + last."""
    pass


@api.get(
    "/users",
    input=QueryWithStatus,
    output=list[UserWithStatus],
    list_count=3,
    filter_by="status",
    summary="List users filtered by status",
)
def users_filtered():
    """filter_by: all items match input.status."""
    pass


app = api.as_fastapi()

Run

semblance run examples.advanced.app:api --port 8000

Try

# WhenInput - status applied only when include_status=true
curl "http://127.0.0.1:8000/user/status?name=alice&include_status=true&status=active"

# ComputedFrom - full name computed from first + last
curl "http://127.0.0.1:8000/user/fullname?first=Jane&last=Smith"

# filter_by - all list items match status (include_status=true so status comes from input)
curl "http://127.0.0.1:8000/users?name=x&status=active&include_status=true"

Example responses:

// GET /user/status?name=alice&include_status=true&status=active
{"name": "alice", "status": "active"}

// GET /user/fullname?first=Jane&last=Smith
{"first": "Jane", "last": "Smith", "full": "Jane Smith"}

// GET /users?name=x&status=active&include_status=true (filter_by)
[
  {"name": "x", "status": "active"},
  {"name": "x", "status": "active"},
  {"name": "x", "status": "active"}
]

Concepts

  • WhenInput(cond, val, link) – apply link only when cond matches
  • ComputedFrom(fields, fn) – compute field from other output fields
  • filter_by – filter list items to those matching input field value