Skip to content

Generate API clients, pretty data classes and validators from OpenApi spec with ease.

License

Notifications You must be signed in to change notification settings

atten/ez-code-generator

Repository files navigation

Easy Code Generator

pipeline coverage

Console tool for generating API clients, data classes and validators. Written in Kotlin, produces Kotlin and Python code. For the input it takes OpenApi document (JSON/YAML, v2.0 ‒ v3.1.0) or custom codegen schema (JSON).

The main goal of this project is to reduce integration costs between teams in multi-service environments.

Example

OpenAPI source YAML
definitions:
  BasicDto:
    type: object
    properties:
      a:
        title: Some integer
        description: Field description
        type: integer
        maximum: 255
        minimum: 0
      b:
        title: Timestamp
        type: string
        format: date-time
      c:
        title: Some enum
        type: string
        enum:
          - variant1
          - variant2
          - variant3
        default: variant1
    required:
      - a
Python generated dataclass
@dataclass
class BasicDto:
    # Field description
    a: int = field()
    b: t.Optional[datetime] = None
    c: t.Optional[str] = "variant1"    
Kotlin generated classes
@Serializable
enum class SomeEnum(val value: String) {
    @SerialName("variant1")
    VARIANT_1("variant1"),
    @SerialName("variant2")
    VARIANT_2("variant2"),
    @SerialName("variant3")
    VARIANT_3("variant3"),
}

@Serializable
data class BasicDto(
    // Field description
    val a: Int,
    @Contextual
    val b: Instant? = null,
    val c: SomeEnum? = SomeEnum.VARIANT_1,
)

More examples: section Available generators below

Features

  • Several python frameworks support (asyncio, django, pure dataclass etc);
  • Schema validation, logging, error handling, retries and sessions within generated client out-of-the-box;
  • Streamed dump/load (ijson);
  • Kotlin experimental support.

Key differences

ez-code-generator is similar to openapi-generator except a major aspect: a single output file instead of a package. It is meant to be straightforward and concise. No extra configuration options, no tricky preparations before use. Just install dependencies, import generated client class and instantiate it. Then call API methods which take and return generated DTOs:

from client_generated import AllConstantsCollection as consts
from client_generated import AllDataclassesCollection as dto
from client_generated import RestApi

client = RestApi('https://example.com/v1/')
item = client.get_item(a=10)

# item = BasicDto(a=10, b=None, c="variant1")

Common use cases

  • Write integration code in agile, fast-moving projects;
  • Use code generation in CI;
  • Track API changes and check them for backward compatibility on both sides (client/server);
  • Build ETL pipelines with transparent interfaces;
  • Unify type declarations across languages.

Install

Docker image

docker image pull registry.gitlab.com/atten0/ez-code-generator:master

Other image versions:

https://gitlab.com/atten0/ez-code-generator/container_registry

Binary format (linux/x86)

Download and extract archive into current dir:

wget -qO- https://github.com/atten/ez-code-generator/releases/download/v3.0.0/ez-codegen-3.0.0.zip | busybox unzip -
cd ez-codegen-3.0.0/bin/
chmod +x ez-codegen

Other versions lists:

Usage

ez-codegen [options] <files/directories/urls...>

Options:

* -t, --target
  Target implementation
  Possible Values: [KT_DATACLASS, KT_SERIALIZABLE_DATACLASS, KT_INTERFACE, PY_DJANGO_MODEL, PY_API_CLIENT, PY_API_ASYNC_CLIENT, PY_AMQP_BLOCKING_CLIENT, PY_AMQP_GEVENT_CLIENT, PY_MARSHMALLOW_DATACLASS, PY_DATACLASS]

  -n, --name
  Generated class name (inferred from input files if not specified)
  Default: <empty string>

  --include-url-path
  Include only paths containing given strings
  Default: []

  --exclude-url-path
  Do not include paths containing given strings
  Default: []

  -p, --prefixed
  If enabled, add prefix to all fields
  Default: false

  --help
  Show help usage and exit

  --version, -v
  Display version and exit

Example

Script for python API client generation from OpenApi

Runs generator in docker container, reads OpenApi spec from URL and saves output to file.

docker run --rm registry.gitlab.com/atten0/ez-code-generator:master \
    https://gitlab.com/atten0/ez-code-generator/-/raw/master/src/test/resources/input/openApi.json \
    -t PY_API_CLIENT \
    > client_generated.py

Result: client_generated.py

Available generators

Target Language/Framework Serialization Dependencies Example output Coverage
KT_DATACLASS Kotlin kotlinx.serialization entitiesOutput.kt coverage
KT_SERIALIZABLE_DATACLASS Kotlin Jackson entitiesOutputJacksonEnabled.kt coverage
PY_API_CLIENT Python (3.9 - 3.12) Marshmallow requirements.txt endpointsOutput.py coverage
PY_API_ASYNC_CLIENT Python asyncio (3.9 - 3.12) Marshmallow requirements.txt endpointsOutput.py coverage
PY_DATACLASS Python (3.9 - 3.12) Dataclass - entitiesOutput.py coverage
PY_MARSHMALLOW_DATACLASS Python (3.9 - 3.12) Marshmallow requirements.txt entitiesOutput.py coverage
PY_DJANGO_MODEL Python (3.9 - 3.12) + Django - requirements.txt entitiesOutput.py coverage
PY_AMQP_BLOCKING_CLIENT Python3 Marshmallow endpointsOutput.py coverage
PY_AMQP_GEVENT_CLIENT Python3 + Gevent Marshmallow endpointsOutput.py coverage

Support and feedback

For usage questions, feature proposals and bug reports: github issues page.

For other matters: author's profile with contacts.

About

Generate API clients, pretty data classes and validators from OpenApi spec with ease.

Resources

License

Stars

Watchers

Forks