This code generator creates a ApiClient app from an openapi file.
Project description
apiclient-pydantic-generator
This code generator creates a ApiClient app from an openapi file.
This project uses:
- datamodel-code-generator to generate pydantic models
- api-client to create class ApiClient
- api-client-pydantic extension for validate request data and converting json straight to pydantic class.
This project highly inspired fastapi-code-generator
Installation
To install apiclient-pydantic-generator
:
$ pip install apiclient-pydantic-generator
Usage
The apiclient-pydantic-generator
command:
Usage: apiclient-codegen [OPTIONS]
Options:
-i, --input FILENAME [required]
-o, --output PATH [required]
-t, --template-dir PATH
-b, --base_url TEXT [default: ]
-p, --prefix TEXT If "My" then will be MyApiClient [default: My]
-a, --base_api_cls TEXT Base class for client class [default:
apiclient.APIClient]
--install-completion Install completion for the current shell.
--show-completion Show completion for the current shell, to copy it
or customize the installation.
--help Show this message and exit.
Example
OpenAPI
petstore.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
description: list of pet
items:
$ref: '#/components/schemas/Pet'
Error:
required:
- code
- message
properties:
code:
type: integer
format: int32
message:
type: string
$ apiclient-codegen --input petstore.yaml --output app_petstore --prefix PetStore
app_petstore/__init__.py
:
from .client import PetStoreAPIClient
__all__ = ('PetStoreAPIClient', )
app_petstore/client.py
:
from __future__ import annotations
from apiclient import APIClient
from apiclient_pydantic import serialize_all_methods
from .endpoints import Endpoints
from .models import LimitQueryParams, PetIdPathParams, Pets
@serialize_all_methods()
class PetStoreAPIClient(APIClient):
def list_pets(self, query_params: LimitQueryParams) -> Pets:
"""List all pets"""
return self.get(Endpoints.list_pets, query_params)
def create_pets(self) -> None:
"""Create a pet"""
self.post(Endpoints.create_pets)
def show_pet_by_id(self, path_params: PetIdPathParams) -> Pets:
"""Info for a specific pet"""
return self.get(Endpoints.show_pet_by_id.format(**path_params))
app_petstore/endpoints.py
:
from apiclient import endpoint
@endpoint(base_url='http://petstore.swagger.io/v1')
class Endpoints:
list_pets: str = '/pets'
create_pets: str = '/pets'
show_pet_by_id: str = '/pets/{pet_id}'
app_petstore/models.py
:
from __future__ import annotations
from typing import List, Optional
from pydantic import BaseModel, Field
class Pet(BaseModel):
id: int
name: str
tag: Optional[str] = None
class Pets(BaseModel):
__root__: List[Pet] = Field(..., description='list of pet')
class Error(BaseModel):
code: int
message: str
class LimitQueryParams(BaseModel):
limit: Optional[int] = None
class PetIdPathParams(BaseModel):
petId: str
Using a class:
from apiclient.request_formatters import JsonRequestFormatter
from apiclient.response_handlers import JsonResponseHandler
from app_petstore import PetStoreAPIClient
pet_client = PetStoreAPIClient(response_handler=JsonResponseHandler, request_formatter=JsonRequestFormatter)
pets = pet_client.list_pets()
for pet in pets:
print(pet.name)
License
apiclient-pydantic-generator is released under the MIT License. http://www.opensource.org/licenses/mit-license
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file apiclient-pydantic-generator-0.1.0.tar.gz
.
File metadata
- Download URL: apiclient-pydantic-generator-0.1.0.tar.gz
- Upload date:
- Size: 15.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.11 CPython/3.8.12 Linux/5.8.0-1042-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 63100386ea711ae0cfb4ceec9f03e7442492033ab8683ccfae1b360da88f29f2 |
|
MD5 | 8d66a93458aafc4b017d2a4aec964a7d |
|
BLAKE2b-256 | f0bd64576c0d26b386319c339f57730486f5e6b10a3ad037631cce60f0996f81 |
File details
Details for the file apiclient_pydantic_generator-0.1.0-py3-none-any.whl
.
File metadata
- Download URL: apiclient_pydantic_generator-0.1.0-py3-none-any.whl
- Upload date:
- Size: 14.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/1.1.11 CPython/3.8.12 Linux/5.8.0-1042-azure
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4750d5b56e37eff31b50407d159085db77c4bc6307f55d9cdb970713d0afb8ff |
|
MD5 | 974f18b06fbbeb8b7015de0417bf2b3a |
|
BLAKE2b-256 | debe5e24de0dc89625ce721393c7a07a663f19509848abedd66cb4446bd02e83 |