Skip to main content

Tornado OpenAPI 3 request and response validation library

Project description

https://travis-ci.com/correl/tornado-openapi3.svg?branch=master https://codecov.io/gh/correl/tornado-openapi3/branch/master/graph/badge.svg?token=CTYWWDXTL9 https://img.shields.io/badge/code%20style-black-000000.svg

Tornado OpenAPI 3 request and response validation library.

Provides integration between the Tornado web framework and Openapi-core library for validating request and response objects against an OpenAPI 3 specification.

Usage

Adding validation to request handlers

from openapi_core import create_spec  # type: ignore
from openapi_core.exceptions import OpenAPIError  # type: ignore
from openapi_core.deserializing.exceptions import DeserializeError  # type: ignore
from openapi_core.schema.media_types.exceptions import (  # type: ignore
    InvalidContentType,
)
from openapi_core.unmarshalling.schemas.exceptions import ValidateError  # type: ignore
from tornado.web import RequestHandler
from tornado_openapi3 import RequestValidator
import yaml


class OpenAPIRequestHandler(RequestHandler):
    async def prepare(self) -> None:
        maybe_coro = super().prepare()
        if maybe_coro and asyncio.iscoroutine(maybe_coro):  # pragma: no cover
            await maybe_coro

        spec = create_spec(yaml.safe_load(self.render_string("openapi.yaml")))
        validator = RequestValidator(spec)
        result = validator.validate(self.request)
        try:
            result.raise_for_errors()
        except InvalidContentType:
            self.set_status(415)
            self.finish()
        except (DeserializeError, ValidateError) as e:
            self.set_status(400)
            self.finish()
        except OpenAPIError:
            raise

Validating a response

from tornado.testing import AsyncHTTPTestCase
from tornado_openapi3 import ResponseValidator

from myapplication import create_app, spec


class TestResponses(AsyncHTTPTestCase):
    def get_app(self) -> Application:
        return create_app()

    def test_status(self) -> None:
        validator = ResponseValidator(spec)
        response = self.fetch("/status")
        result = validator.validate(response)
        result.raise_for_errors()

Contributing

Getting Started

This project uses Poetry to manage its dependencies. To set up a local development environment, just run:

poetry install

Formatting Code

The Black tool is used by this project to format Python code. It is included as a development dependency, and should be run on all committed code. To format code prior to committing it and submitting a PR, run:

poetry run black .

Running Tests

pytest is the preferred test runner for this project. It is included as a development dependency, and is configured to track code coverage, Flake8 style compliance, and Black code formatting. Tests can be run in your development environment by running:

poetry run pytest

Additionally, tests can be run using tox, which will run the tests using multiple versions of both Python and Tornado to ensure broad compatibility.

Configuring Hypothesis

Many of the tests make use of Hypothesis to specify their expectations and generate a large volume of randomized test input. Because of this, the tests may take a long time to run on slower computers. Two profiles are defined for Hypothesis to use which can be selected by setting the HYPOTHESIS_PROFILE environment variable to one of the following values:

ci

Runs tests using the default Hypothesis settings (100 examples per test) and no completion deadline.

dev

The fastest profile, meant for local development only. Uses only 10 examples per test with no completion deadline.

Project details


Download files

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

Source Distribution

tornado-openapi3-0.2.4.tar.gz (5.5 kB view hashes)

Uploaded Source

Built Distribution

tornado_openapi3-0.2.4-py3-none-any.whl (5.9 kB view hashes)

Uploaded Python 3

Supported by

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