Metadata-Version: 2.4
Name: openapi3
Version: 1.8.2
Summary: Client and Validator of OpenAPI 3 Specifications
Home-page: https://github.com/dorthu/openapi3
Author: dorthu
License: BSD 3-Clause License
License-File: LICENSE
Requires-Dist: PyYaml
Requires-Dist: requests
Provides-Extra: test
Requires-Dist: pytest; extra == "test"
Requires-Dist: pytest-asyncio==0.16; extra == "test"
Requires-Dist: uvloop==0.17.0; extra == "test"
Requires-Dist: hypercorn==0.14.3; extra == "test"
Requires-Dist: pydantic==1.10.2; extra == "test"
Requires-Dist: fastapi==0.76.0; extra == "test"
Dynamic: author
Dynamic: description
Dynamic: home-page
Dynamic: license
Dynamic: license-file
Dynamic: provides-extra
Dynamic: requires-dist
Dynamic: summary

openapi3
========

A Python `OpenAPI 3 Specification`_ client and validator for Python 3.

.. image:: https://github.com/Dorthu/openapi3/actions/workflows/main.yml/badge.svg
   :alt: GitHub Actions Build Badge

.. image:: https://badge.fury.io/py/openapi3.svg
   :target: https://badge.fury.io/py/openapi3


Validation Mode
---------------

This module can be run against a spec file to validate it like so::

   python3 -m openapi3 /path/to/spec

Usage as a Client
-----------------

This library also functions as an interactive client for arbitrary OpenAPI 3
specs. For example, using `Linode's OpenAPI 3 Specification`_ for reference::

   from openapi3 import OpenAPI
   import yaml

   # load the spec file and read the yaml
   with open('openapi.yaml') as f:
       spec = yaml.safe_load(f.read())

   # parse the spec into python - this will raise if the spec is invalid
   api = OpenAPI(spec)

   # call operations and receive result models
   regions = api.call_getRegions()

   # authenticate using a securityScheme defined in the spec's components.securitySchemes
   api.authenticate('personalAccessToken', my_token)

   # call an operation that requires authentication
   linodes  = api.call_getLinodeInstances()

   # call an operation with parameters
   linode = api.call_getLinodeInstance(parameters={"linodeId": 123})

   # the models returns are all of the same (generated) type
   print(type(linode))                      # openapi.schemas.Linode
   type(linode) == type(linodes.data[0])    # True

   # call an operation with a request body
   new_linode = api.call_createLinodeInstance(data={"region":"us-east","type":"g6-standard-2"})

   # the returned models is still of the correct type
   type(new_linode) == type(linode)     # True

HTTP basic authentication and HTTP digest authentication works like this::

   # authenticate using a securityScheme defined in the spec's components.securitySchemes
   # Tuple with (username, password) as second argument
   api.authenticate('basicAuth', ('username', 'password'))

Running Tests
-------------

This project includes a test suite, run via ``pytest``.  To run the test suite,
ensure that you've installed the dependencies and then run ``pytest`` in the root
of this project.

Roadmap
-------

The following features are planned for the future:

* Request body models, creation, and validation.
* Parameters interface with validation and explicit typing.
* Support for more authentication types.
* Support for non-json request/response content.
* Full support for all objects defined in the specification.

.. _OpenAPI 3 Specification: https://openapis.org
.. _Linode's OpenAPI 3 Specification: https://developers.linode.com/api/v4

