/api-client-pydantic

Gives ability https://github.com/MikeWooster/api-client to validate request data and converting json straight to pydantic class.

Primary LanguagePythonMIT LicenseMIT

GitHub issues GitHub stars GitHub Release Date GitHub commits since latest release GitHub last commit GitHub license

PyPI PyPI PyPI - Downloads

Gitmoji Code style: black

Python API Client Pydantic Extension

Installation

pip install api-client-pydantic

Usage

The following decorators have been provided to validate request data and converting json straight to pydantic class.

from apiclient_pydantic import params_serializer, response_serializer, serialize, serialize_all_methods

# serialize incoming kwargs
@params_serializer(by_alias: bool = True, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = True)

# serialize response in pydantic class
@response_serializer(response: Optional[Type[BaseModel]] = None)

# serialize request and response data
@serialize(response: Optional[Type[BaseModel]] = None, by_alias: bool = True, exclude_unset: bool = False, exclude_defaults: bool = False, exclude_none: bool = True)

# wraps all local methods of a class with a specified decorator. default 'serialize'
@serialize_all_methods(decorator=serialize)

Usage:

  1. Define the schema for your api in pydantic classes.

    from pydantic import BaseModel, Field
    
    
    class Account(BaseModel):
        account_number: int = Field(alias='accountNumber')
        sort_code: int = Field(alias='sortCode')
        date_opened: datetime = Field(alias='dateOpened')
  2. Add the @response_serializer decorator to the api client method to transform the response directly into your defined schema.

     @response_serializer(List[Account])
     def get_accounts():
         ...
     # or
     @response_serializer()
     def get_accounts() -> List[Account]:
         ...
  3. Add the @params_serializer decorator to the api client method to translate the incoming kwargs into the required dict for the endpoint:

     @params_serializer(AccountHolder)
     def create_account(data: dict):
         ...
     # or
     @params_serializer()
     def create_account(data: AccountHolder):
         # data will be exactly a dict
         ...
     create_account(last_name='Smith', first_name='John')
     # data will be a dict {"last_name": "Smith", "first_name": "John"}
  4. @serialize - It is a combination of the two decorators @response_serializer and@params_serializer.

  5. For more convenient use, you can wrap all APIClient methods with @serialize_all_methods.

     from apiclient import APIClient
     from apiclient_pydantic import serialize_all_methods
     from typing import List
    
     from .models import Account, AccountHolder
    
    
     @serialize_all_methods()
     class MyApiClient(APIClient):
         def decorated_func(self, data: Account) -> Account:
             ...
    
         def decorated_func_holder(self, data: AccountHolder) -> List[Account]:
             ...

Related projects

apiclient-pydantic-generator

This code generator creates a ApiClient app from an openapi file.

apiclient-pydantic-generator

Mentions

Many thanks to JetBrains for supplying me with a license to use their product in the development of this tool.

JetBrains Logo (Main) logo