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>]
buildwrites 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. Needskiba-core(core.api,core.util.typing_util; 0.5.3.dev87 or later forFilefields),pydanticandstarlette.typescript-client:./<service>-api/v<major>/(client,endpoints,resources,index) with a<Service>ApiV<major>Clientthat extends@kibalabs/core'sServiceClient. 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 withFilefields send a multipart form. Transitions withresponseType: redirector aquery-parametersfield are left out, as browsers open redirects directly and query-parameters fields receive third-party callbacks. Needs@kibalabs/core.
watchbuilds, 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, oneOfs 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.
A oneOf is a value that is one of several resources, told apart by a discriminator attribute. Each member resource needs that attribute as a non-nullable enum with a single value:
oneOfs:
- name: ViewContent
discriminator: kind
types: [ChartContent, TableContent]
resources:
- singleName: ChartContent
collectionName: ChartContents
attributes:
- name: kind
type: Enum
enumValues: [chart]
Fields use it like any other type (type: ViewContent, also inside List and Mapping). python-server generates a ViewContentV1 pydantic discriminated union in resources; typescript-client generates a ViewContentV1 union type and a viewContentV1FromObject function that builds the member class named by the discriminator (and throws for unknown values).
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
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.2.dev9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| geniespec-0.1.2.dev9.tar.gz | 27.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| geniespec-0.1.2.dev9-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 62.5 kB
Release files / geniespec-0.1.2.dev9.tar.gz
| Download URL | geniespec-0.1.2.dev9.tar.gz |
|---|---|
| Size | 27.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cbaf666b35508cdb7818d5d7c74d2a781ead3aa1e1abd2c6e31dfc91b8253086
|
|
BLAKE2b-256 checksum How to use checksums |
f96688fe6fb6bd521b008257aa7aef67be73c9c758e8ef4761beb97c95efa112
|
| 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.2.dev9-py3-none-any.whl
| Download URL | geniespec-0.1.2.dev9-py3-none-any.whl |
|---|---|
| Size | 34.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fe99557e953a8589c6cc05c04089aa8c3f30c199e666913a7919e3739d758df8
|
|
BLAKE2b-256 checksum How to use checksums |
8e3783f05966f1d4bcd0611c3bf4339db7fa141fe49fae5bff2d60a8ed7ac1fe
|
| 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.2.dev9
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.