Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Genie

Genie (geniespec on PyPI) generates API code from an api.yaml spec. Install it like any other tool and run it from your build scripts; the generated code is gitignored, not committed.

geniespec build --spec api.yaml --target <python-server | typescript-client> [--output .]
geniespec watch --spec api.yaml --target <python-server | typescript-client> [--output .] [-- <command>]
  • build writes the target's package into the output directory. Only files in that package are touched: changed files are rewritten and files it no longer generates are removed.
    • python-server: ./<service>_api/v<major>/ (api, endpoints, resources, internal, exceptions). Code run from the output directory imports it directly, e.g. from my_service_api.v1 import api. Needs kiba-core (core.api, core.util.typing_util; 0.5.3.dev87 or later for File fields), pydantic and starlette.
    • typescript-client: ./<service>-api/v<major>/ (client, endpoints, resources, index) with a <Service>ApiV<major>Client that extends @kibalabs/core's ServiceClient. Construct it with the url the API version is mounted at, e.g. new MyServiceApiV1Client(requester, 'https://api.example.com/v1'). Methods take path parameters, then a params object for the request fields, and return the response field; stream transitions take a callback for each item; transitions with File fields send a multipart form. Transitions with responseType: redirect or a query-parameters field are left out, as browsers open redirects directly and query-parameters fields receive third-party callbacks. Needs @kibalabs/core.
  • watch builds, then rebuilds whenever the spec changes. If the spec is invalid it logs the error and keeps the previous output. Given a command after --, it runs it once the first build is done, keeps rebuilding while it runs, exits with its exit code and stops it when watch itself is stopped, e.g. geniespec watch --spec api.yaml --target python-server -- uvicorn app:app --reload.
  • The bundled templates are examples of a kibalabs-style target.

Enums and files

Enums are string values limited to a list. Name them at the top level to reuse them, or give a field its own:

enums:
  - name: ViewKind
    values: [member, cycle-start]
resources:
  - singleName: View
    collectionName: Views
    attributes:
      - name: kind
        type: ViewKind
      - name: size
        type: Enum
        enumValues: [small, large]

python-server types them as typing.Literal[...] (named ones as ViewKindV1 in resources) and rejects requests with other values; typescript-client types them as 'member' | 'cycle-start' (named ones as an exported ViewKindV1).

type: File request fields upload a file. They are only allowed on POST transitions, and the transition's other fields must be single primitive or enum values, as the request is sent as a multipart form. Internal methods receive kiba-core's UploadedFile (filename, contentType, content); clients pass a File.

Development

make install
make lint-check type-check test

tests/python_server covers the core and the python-server target (the core tests generate through it) and runs in Dockerfile. tests/typescript_client covers the typescript-client target; it needs node and runs in typescript-client.Dockerfile:

make install-typescript-client
make test-typescript-client

Merges to main publish a dev version to PyPI. To release, bump version in pyproject.toml in a PR, then run the Release workflow on main (Actions → Release → Run workflow). It tags vX.Y.Z and the Publish workflow publishes it. Only the release workflow can push version tags.

Things that need work

Typing of params and fields in general

OneOf not supported yet

I think we need to create an object for Type. what would it look like?

class BaseFieldType:
    isNullable: bool


class RawFieldType(BaseFieldType):
    name: str


class ClassFieldType(BaseFieldType):
    fieldType: RawFieldType


class ListFieldType:(BaseFieldType)
    fieldType: RawFieldType
    isNullable: bool


class MappingFieldType(BaseFieldType):
    keyFieldType: RawFieldType
    valueFieldType: RawFieldType


class OneOfFieldType(BaseFieldType):
    fieldTypes: list[RawFieldType]


class EnumFieldType(BaseFieldType):
    values: list[str]

Metadata

Release files for geniespec 0.1.1.dev7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for geniespec 0.1.1.dev7
File Size Uploaded Provenance
geniespec-0.1.1.dev7.tar.gz 26.2 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for geniespec 0.1.1.dev7
File Interpreter ABI Platform
geniespec-0.1.1.dev7-py3-none-any.whl Python 3 none any Details

Total release size: 59.9 kB

Release files / geniespec-0.1.1.dev7.tar.gz

Download URL geniespec-0.1.1.dev7.tar.gz
Size 26.2 kB
Tags Source
SHA-256 checksum
How to use checksums
55af730e68ebc2dbf2aed2f260b3fb1662afbf1f76f4d73e52b2f749531a5360
BLAKE2b-256 checksum
How to use checksums
6ecb5b6e3e70ed25d5ca0eefbd2139f16ddf21b849faf1377608a95265cf8a41
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / geniespec-0.1.1.dev7-py3-none-any.whl

Download URL geniespec-0.1.1.dev7-py3-none-any.whl
Size 33.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8a5976c01f0c34884c55cf310192fcc424dbb09d34bb4a5433b8f353df3352b5
BLAKE2b-256 checksum
How to use checksums
60a34f50cba0095f3bc30a964c5d44b61d52721fa467c1db7cfe7673d8f51341
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Security for geniespec 0.1.1.dev7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page