Skip to content

ljnsn/api-client-pydantic

 
 

Repository files navigation

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

About

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

Resources

License

Code of conduct

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 77.1%
  • JavaScript 15.5%
  • Makefile 7.4%