Skip to main content

Datamodel Code Generator

Project description

datamodel-code-generator

This code generator creates pydantic model from an openapi file.

Build Status PyPI version PyPI - Python Version codecov license

This project is an experimental phase.

Supported file formats

  • OpenAPI 3 (yaml/json)
  • JsonSchema

Implemented list

OpenAPI 3 and JsonSchema

DataType

  • string (include patter/minLength/maxLenght)
  • number (include maximum/exclusiveMaximum/minimum/exclusiveMinimum/multipleOf/le/ge)
  • integer (include maximum/exclusiveMaximum/minimum/exclusiveMinimum/multipleOf/le/ge)
  • boolean
  • array
  • object
String Format
  • date
  • datetime
  • password
  • email
  • uuid (uuid1/uuid2/uuid3/uuid4/uuid5)
  • ipv4
  • ipv6

Other schema

  • enum
  • allOf (as Multiple inheritance)
  • anyOf (as Union)
  • $ref (exclude URL Reference)

Installation

To install datamodel-code-generator:

$ pip install datamodel-code-generator

Usage

The datamodel-codegen command:

usage: datamodel-codegen [-h] [--input INPUT] [--output OUTPUT]
                         [--base-class BASE_CLASS]
                         [--custom-template-dir CUSTOM_TEMPLATE_DIR]
                         [--extra-template-data EXTRA_TEMPLATE_DATA]
                         [--target-python-version {3.6,3.7}] [--debug]
                         [--version]

optional arguments:
  -h, --help            show this help message and exit
  --input INPUT         Open API YAML file (default: stdin)
  --input-file-type {auto,openapi,jsonschema}
  --output OUTPUT       Output file (default: stdout)
  --base-class BASE_CLASS
                        Base Class (default: pydantic.BaseModel)
  --custom-template-dir CUSTOM_TEMPLATE_DIR
                        Custom Template Directory
  --extra-template-data EXTRA_TEMPLATE_DATA
                        Extra Template Data
  --target-python-version {3.6,3.7}
                        target python version (default: 3.7)
  --debug               show debug message
  --version             show version

Formatting

Code generated by datamodel-codegen will be passed through isort and black to produce consistent, well-formatted results. Settings for these tools can be specified in pyproject.toml (located in the output directory, or in some parent of the output directory).

Example pyproject.toml:

[tool.black]
string-normalization = true
line-length = 100

[tool.isort]
multi_line_output = 3
include_trailing_comma = true
force_grid_wrap = 0
use_parentheses = true
line_length = 100
known_first_party = "kelvin"

See the Black Project for more information.

Example

$ datamodel-codegen --input api.yaml --output model.py
api.yaml

```yaml
openapi: "3.0.0"
info:
  version: 1.0.0
  title: Swagger Petstore
  license:
    name: MIT
servers:
  - url: http://petstore.swagger.io/v1
paths:
  /pets:
    get:
      summary: List all pets
      operationId: listPets
      tags:
        - pets
      parameters:
        - name: limit
          in: query
          description: How many items to return at one time (max 100)
          required: false
          schema:
            type: integer
            format: int32
      responses:
        '200':
          description: A paged array of pets
          headers:
            x-next:
              description: A link to the next page of responses
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Pets"
        default:
          description: unexpected error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
                x-amazon-apigateway-integration:
                  uri:
                    Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${PythonVersionFunction.Arn}/invocations
                  passthroughBehavior: when_no_templates
                  httpMethod: POST
                  type: aws_proxy
    post:
      summary: Create a pet
      operationId: createPets
      tags:
        - pets
      responses:
        '201':
          description: Null response
        default:
          description: unexpected error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
                x-amazon-apigateway-integration:
                  uri:
                    Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${PythonVersionFunction.Arn}/invocations
                  passthroughBehavior: when_no_templates
                  httpMethod: POST
                  type: aws_proxy
  /pets/{petId}:
    get:
      summary: Info for a specific pet
      operationId: showPetById
      tags:
        - pets
      parameters:
        - name: petId
          in: path
          required: true
          description: The id of the pet to retrieve
          schema:
            type: string
      responses:
        '200':
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Pets"
        default:
          description: unexpected error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
    x-amazon-apigateway-integration:
      uri:
        Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${PythonVersionFunction.Arn}/invocations
      passthroughBehavior: when_no_templates
      httpMethod: POST
      type: aws_proxy
components:
  schemas:
    Pet:
      required:
        - id
        - name
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        tag:
          type: string
    Pets:
      type: array
      items:
        $ref: "#/components/schemas/Pet"
    Error:
      required:
        - code
        - message
      properties:
        code:
          type: integer
          format: int32
        message:
          type: string
    apis:
      type: array
      items:
        type: object
        properties:
          apiKey:
            type: string
            description: To be used as a dataset parameter value
          apiVersionNumber:
            type: string
            description: To be used as a version parameter value
          apiUrl:
            type: string
            format: uri
            description: "The URL describing the dataset's fields"
          apiDocumentationUrl:
            type: string
            format: uri
            description: A URL to the API console for each API
```

model.py:

# generated by datamodel-codegen:
#   filename:  api.yaml
#   timestamp: 2019-09-26T01:04:25+00:00

from __future__ import annotations

from typing import List, Optional

from pydantic import BaseModel, UrlStr


class Pet(BaseModel):
    id: int
    name: str
    tag: Optional[str] = None


class Pets(BaseModel):
    __root__: List[Pet]


class Error(BaseModel):
    code: int
    message: str


class api(BaseModel):
    apiKey: Optional[str] = None
    apiVersionNumber: Optional[str] = None
    apiUrl: Optional[UrlStr] = None
    apiDocumentationUrl: Optional[UrlStr] = None


class apis(BaseModel):
    __root__: List[api]

Development

Install the package in editable mode:

$ git clone git@github.com:koxudaxi/datamodel-code-generator.git
$ pip install -e datamodel-code-generator

Contribute

We are waiting for your contributions to datamodel-code-generator.

How to contribute

## 1. Clone your fork repository
$ git clone git@github.com:<your username>/datamodel-code-generator.git
$ cd datamodel-code-generator

## 2. Create `venv` with python3.7 (also you should do with python3.6)
$ python3.7 -m venv venv37
$ source venv37/bin/activate  

## 3. Install dependencies
$ python3 -m pip install ".[all]" 

## 4. Create new branch and rewrite code.
$ git checkout -b new-branch

## 5. Run unittest (you should pass all test and coverage should be 100%)
$ ./scripts/test.sh

## 6. Format code
$ ./scripts/format.sh

## 7. Check lint (mypy)
$ ./scripts/lint.sh

## 8. Commit and Push...

PyPi

https://pypi.org/project/datamodel-code-generator

Source Code

https://github.com/koxudaxi/datamodel-code-generator

Documentation

https://koxudaxi.github.io/datamodel-code-generator

License

datamodel-code-generator is released under the MIT License. http://www.opensource.org/licenses/mit-license

Project details


Release history Release notifications | RSS feed

This version

0.3.1

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

datamodel-code-generator-0.3.1.tar.gz (37.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

datamodel_code_generator-0.3.1-py3-none-any.whl (54.7 kB view details)

Uploaded Python 3

File details

Details for the file datamodel-code-generator-0.3.1.tar.gz.

File metadata

  • Download URL: datamodel-code-generator-0.3.1.tar.gz
  • Upload date:
  • Size: 37.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.0 CPython/3.7.1

File hashes

Hashes for datamodel-code-generator-0.3.1.tar.gz
Algorithm Hash digest
SHA256 5fa7c538aa0ff87d9e83584ae689679fda95948693648e80efb572e2210efc0e
MD5 7aa6adec2c439f7a942e1897a0629e6c
BLAKE2b-256 dc0a4dc7bddba615549d31bd0ddcb43da6380efbb17613b7e49624cf4053f095

See more details on using hashes here.

File details

Details for the file datamodel_code_generator-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: datamodel_code_generator-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 54.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0 requests-toolbelt/0.9.1 tqdm/4.42.0 CPython/3.7.1

File hashes

Hashes for datamodel_code_generator-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e52b0435a86f1cfc90527742dff716148b2a83f65e211f2c0918412f09b6e71b
MD5 fc9d56bbc697f292f912f5cfc9c56893
BLAKE2b-256 823040bc4595b54082c3a1c10f739d83f453a4271d5ab91578822922e5442e03

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page