Skip to content

OpenAPI JSON Schema Generator allows auto-generation of API client libraries with a focus on JSON schema given an OpenAPI Spec

License

Notifications You must be signed in to change notification settings

hnjm/openapi-json-schema-generator

 
 

Repository files navigation

OpenAPI JSON Schema Generator

CI Tests Apache 2.0 License

Auto generate a client sdk from your openapi 3.0.0-3.0.3 document using Openapi JSON Schema Generator. This project is a code generator that focuses on supporting all openapi and json schema features.

Overview

OpenAPI JSON Schema Generator allows auto-generation of API client libraries (SDK generation) given an OpenAPI Spec (3.0.0-3.0.3 are supported). This project focuses on making the output 100% compliant with openapi + JSON schema specs. The goal is to fully support everything defined in openapi + the included JSON schema specs so developers can use all of those features.

Currently, the following languages/frameworks are supported:

  • python

Reasons To Use the Python Generator

  • Autogenerated thorough testing of json schema keyword features in models and endpoints which come from the json schema test suite
  • Tests are passing in CI
  • Test endpoints are tagged by the relevant keyword like type/format/allOf 25+ keywords and counting
  • Run time type checking and validation checking when:
    • instantiating models
    • sending to endpoints
    • receiving from endpoints
  • Type hints on
    • all model inputs in __new__
    • accessing properties in object instances so some_val in some_val = some_inst['someKey'] will have the correct type hint
    • accessing array items in array instances so some_val in some_val = array_inst[0] will have the correct type hint
    • endpoint inputs + responses
  • Code re-use built in from the ground up
    • components/schemas/headers etc are generated as separate classes and imported when used via $ref
  • Openapi spec inline schemas supported at any depth in any location
  • Format support for: int32, int64, float, double, binary, date, datetime, uuid
  • Invalid (in python) property names supported like from, 1var, hi-there etc in
    • schema property names
    • endpoint parameter names
  • If needed, validation of some json schema keywords can be deactivated via a configuration class
  • Payload values are not coerced when validated, so a datetime value can pass other validations that describe the payload only as type string
  • String transmission of numbers supported with type: string, format: number, value can be accessed as a Decimal with inst.as_decimal_
  • Multiple content types supported for request and response bodies
  • Endpoint response always also includes the urllib3.HTTPResponse
  • Endpoint response deserialization can be skipped with the skip_deserialization argument
  • Validated payload instances subclass all validated schemas so no need to run validate twice, just use isinstance(some_inst, SomeSchemaClass)

And many more!

Can I build here?

Yes; contributions are welcome! Submit a PR if you want to add a new server scaffold, client sdk, or documentation generator in any language.

Table of contents

The OpenAPI Specification has undergone 3 revisions since initial creation in 2010. The openapi-json-schema-generator project has the following compatibilities with the OpenAPI Specification:

OpenAPI JSON Schema Generator Version OpenAPI Spec compatibility
2.0.0 3.0.0 - 3.0.3
1.0.4 3.0.0 - 3.0.3
1.0.3 3.0.0 - 3.0.3
1.0.2 3.0.0 - 3.0.3
1.0.1 3.0.0 - 3.0.3
1.0.0 3.0.0 - 3.0.3

To build from source, you need the following installed and available in your $PATH:

After cloning the project, you can build it from source with this command:

mvn clean install

If you don't have maven installed, you may directly use the included maven wrapper, and build with the command:

./mvnw clean install

The default build contains minimal static analysis (via CheckStyle). To run your build with PMD and Spotbugs, use the static-analysis profile:

mvn -Pstatic-analysis clean install

Public Pre-built Docker images

OpenAPI JSON Schema Generator CLI Docker Image

The OpenAPI JSON Schema Generator image acts as a standalone executable. It can be used as an alternative to installing via homebrew, or for developers who are unable to install Java or upgrade the installed version.

To generate code with this image, you'll need to mount a local location as a volume.

Example:

docker run --rm -v "${PWD}:/local" openapjsonschematools/openapi-json-schema-generator-cli generate \
    -i https://raw.githubusercontent.com/openapi-json-schema-tools/openapi-json-schema-generator/master/modules/openapi-json-schema-generator/src/test/resources/3_0/petstore.yaml \
    -g python \
    -o /local/out/python

The generated code will be located under ./out/python in the current directory.

Development in docker

You can use run-in-docker.sh to do all development. This script maps your local repository to /gen in the docker container. It also maps ~/.m2/repository to the appropriate container location.

To execute mvn package:

git clone https://github.com/openapi-json-schema-tools/openapi-json-schema-generator
cd openapi-json-schema-generator
./run-in-docker.sh mvn package

Build artifacts are now accessible in your working directory.

Once built, run-in-docker.sh will act as an executable for openapi-json-schema-generator-cli. To generate code, you'll need to output to a directory under /gen (e.g. /gen/out). For example:

./run-in-docker.sh help # Executes 'help' command for openapi-json-schema-generator-cli
./run-in-docker.sh list # Executes 'list' command for openapi-json-schema-generator-cli
./run-in-docker.sh /gen/bin/python-petstore.sh  # Builds the Go client
./run-in-docker.sh generate -i modules/openapi-json-schema-generator/src/test/resources/3_0/petstore.yaml \
    -g go -o /gen/out/python-petstore -p packageName=petstore_api # generates python client, outputs locally to ./out/python-petstore
Troubleshooting

If an error like this occurs, just execute the mvn clean install -U command:

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test (default-test) on project openapi-json-schema-generator: A type incompatibility occurred while executing org.apache.maven.plugins:maven-surefire-plugin:2.19.1:test: java.lang.ExceptionInInitializerError cannot be cast to java.io.IOException

./run-in-docker.sh mvn clean install -U

Failed to execute goal org.fortasoft:gradle-maven-plugin:1.0.8:invoke (default) on project openapi-json-schema-generator-gradle-plugin-mvn-wrapper: org.gradle.tooling.BuildException: Could not execute build using Gradle distribution 'https://services.gradle.org/distributions/gradle-4.7-bin.zip'

Right now: no solution for this one :|

Run Docker in Vagrant

Prerequisite: install Vagrant and VirtualBox.

git clone https://github.com/openapi-json-schema-tools/openapi-json-schema-generator.git
cd openapi-json-schema-generator
vagrant up
vagrant ssh
cd /vagrant
./run-in-docker.sh mvn package

To generate a python client for petstore.yaml, please run the following

git clone https://github.com/openapi-json-schema-tools/openapi-json-schema-generator
cd openapi-json-schema-generator
mvn clean package
java -jar modules/openapi-json-schema-generator-cli/target/openapi-json-schema-generator-cli.jar generate \
   -i https://raw.githubusercontent.com/openapi-json-schema-tools/openapi-json-schema-generator/master/modules/openapi-json-schema-generator/src/test/resources/3_0/petstore.yaml \
   -g python \
   -o /var/tmp/python_api_client

(if you're on Windows, replace the last command with java -jar modules\openapi-json-schema-generator-cli\target\openapi-json-schema-generator-cli.jar generate -i https://raw.githubusercontent.com/openapi-json-schema-tools/openapi-json-schema-generator/master/modules/openapi-json-schema-generator/src/test/resources/3_0/petstore.yaml -g python -o c:\temp\python_api_client)

You can also download the JAR (latest release) directly from maven.org

To get a list of general options available, please run java -jar modules/openapi-json-schema-generator-cli/target/openapi-json-schema-generator-cli.jar help generate

To get a list of PHP specified options (which can be passed to the generator with a config file via the -c option), please run java -jar modules/openapi-json-schema-generator-cli/target/openapi-json-schema-generator-cli.jar config-help -g php

To generate a sample client library

You can build a client against the Petstore API as follows:

./bin/generate-samples.sh ./bin/configs/python.yaml

(On Windows, please install GIT Bash for Windows to run the command above)

This script will run the generator with this command:

java -jar modules/openapi-json-schema-generator-cli/target/openapi-json-schema-generator-cli.jar generate \
  -i https://raw.githubusercontent.com/openapijsonschematools/openapi-json-schema-generator/master/modules/openapi-json-schema-generator/src/test/resources/3_0/petstore.yaml \
  -g python \
  -t modules/openapi-json-schema-generator/src/main/resources/python \
  --additional-properties packageName=petstore_api \
  -o samples/openapi3/client/petstore/python

with a number of options. The python options are documented here.

You can also get the options with the help generate command (below only shows partial results):

NAME
        openapi-json-schema-generator-cli generate - Generate code with the specified
        generator.

SYNOPSIS
        openapi-json-schema-generator-cli generate
                [(-a <authorization> | --auth <authorization>)]
                [--api-name-suffix <api name suffix>] [--api-package <api package>]
                [--artifact-id <artifact id>] [--artifact-version <artifact version>]
                [(-c <configuration file> | --config <configuration file>)] [--dry-run]
                [(-e <templating engine> | --engine <templating engine>)]
                [--enable-post-process-file]
                [(-g <generator name> | --generator-name <generator name>)]
                [--generate-alias-as-model] [--git-host <git host>]
                [--git-repo-id <git repo id>] [--git-user-id <git user id>]
                [--global-property <global properties>...] [--group-id <group id>]
                [--http-user-agent <http user agent>]
                [(-i <spec file> | --input-spec <spec file>)]
                [--ignore-file-override <ignore file override location>]
                [--import-mappings <import mappings>...]
                [--instantiation-types <instantiation types>...]
                [--invoker-package <invoker package>]
                [--language-specific-primitives <language specific primitives>...]
                [--legacy-discriminator-behavior] [--library <library>]
                [--log-to-stderr] [--minimal-update]
                [--model-name-prefix <model name prefix>]
                [--model-name-suffix <model name suffix>]
                [--model-package <model package>]
                [(-o <output directory> | --output <output directory>)] [(-p <additional properties> | --additional-properties <additional properties>)...]
                [--package-name <package name>] [--release-note <release note>]
                [--remove-operation-id-prefix]
                [--reserved-words-mappings <reserved word mappings>...]
                [(-s | --skip-overwrite)] [--server-variables <server variables>...]
                [--skip-validate-spec] [--strict-spec <true/false strict behavior>]
                [(-t <template directory> | --template-dir <template directory>)]
                [--type-mappings <type mappings>...] [(-v | --verbose)]

OPTIONS
        -a <authorization>, --auth <authorization>
            adds authorization headers when fetching the OpenAPI definitions
            remotely. Pass in a URL-encoded string of name:header with a comma
            separating multiple values

...... (results omitted)

        -v, --verbose
            verbose mode

You can then use the auto-generated client. The README.md is a good starting point.

Other generators have samples too.

Please refer to customization.md on how to customize the output (e.g. package name, version)

Please refer to integration.md on how to integrate OpenAPI generator with Maven, Gradle, Github and CI/CD.

The OpenAPI JSON Schema Generator project is intended as a benefit for users of the Open API Specification. The project itself has the License as specified. In addition, please understand the following points:

  • The templates included with this project are subject to the License.
  • Generated code is intentionally not subject to the parent project license

When code is generated from this project, it shall be considered AS IS and owned by the user of the software. There are no warranties--expressed or implied--for generated code. You can do what you wish with it, and once generated, the code is your responsibility and subject to the licensing terms that you deem appropriate.

This repo is based on v6.2.0 of OpenAPI Generator. This project focuses on making the output 100% compliant with JSON schema as part of the OpenAPI 3.1 specification with a focus on complex cases (top-down approach). The goal is to fully support everything defined in JSON schema so that developers can leverage JSON schema as well as OpenAPI specification in their API design. Building here allows for more rapid progress supporting new features in OpenAPI 3.X without having to support many older generators which don't use the new features.

OpenAPI JSON Schema Generator is based on OpenAPI Generator v6.2.0. The project was created here because the openapi-generator core team required the removal of the python generator from their project. The author of the python generator (@spacether) preferred to keep building in the openapi-generator repo, but core team refused to consider keeping python in openapi-generator. Below is a timeline of those events and some of their reasons:

Timeline of python generator development

Removal Reasons

  • Core team and @wing328 felt adoption of the python client was reduced from 5.0.0 and onward due to python-prior + python generators
  • Some python users in the community did not prefer the new python code
  • The fact that other users + companies are using it does not warrant keeping it in the repo
  • The fact that it is more fully passing json schema tests (including the feature keywords oneOf/anyOf/allOf/additionalProperties) does not warrant keeping it in the repo
  • The openapi-generator core team refused to consider the option of keeping the python generator as another generator option in their repo, and building another python generator that looks more conventional and making that generator primary

Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech) Copyright 2018 SmartBear Software

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.


Releases

No releases published

Packages

No packages published

Languages

  • Java 73.6%
  • Handlebars 14.1%
  • TypeScript 7.7%
  • Shell 2.3%
  • JavaScript 1.1%
  • Python 0.9%
  • Other 0.3%