Skip to main content

AutoMD

AutoMD is a documentation library for Flask APIs build with FlaskRESTful and Webargs. Endpoint parameters and basic responses are automatically parsed into the OpenAPI specification, using Type Hints and introspection, and a endpoints registered to serve the specification.

Motivation

Documentation libraries tend to rely heavily on elaborate docstrings and static generation from source code. This library requires minimal changes to existing code, and most information (especially parameter specs) doesn't rely on keeping docstrings up to date.

Installation

AutoMD is available through PyPi. AutoMD requires Python >= 3.6 (f-strings are too convenient to ignore) Install using pip:

pip install automd

AutoMD also install the following dependencies:

  • flask
  • flask-restful
  • webargs
  • apispec
  • pyyaml
  • marshmallow
  • werkzeug

Usage

AutoMD registration/initialization

The first step is to initialize the AutoMD app from a FlaskRESTful Api.

from flask import Flask
from flask_restful import Api
from automd.registration import AutoMDApp


app: Flask = Flask(__name__)
api: Api = Api(app)

spec: AutoMDApp = AutoMDApp(api, title="AutoMD Test App", app_version="1.0.0", openapi_version="3.0.0")

After that, all that is required is adding the @automd decorator to an existing Resource endpoint.

from flask_restful import Resource
from marshmallow import fields
from webargs.flaskparser import use_kwargs
from automd.decorators import automd


class MinimalStatus(Resource):
    get_query_arguments = {
        "text": fields.String(required=False)
    }

    @automd()
    @use_kwargs(get_query_arguments)
    def get(self, text):
        return text

which will mark the endpoint for inclusion in the OpenAPI spec. In this example, the spec information will be pretty limited, but will still have the API url, argument, and a default value.

With more complete python annotations, more information can be gleaned:

from flask_restful import Resource
from marshmallow import fields
from webargs.flaskparser import use_kwargs
from automd.decorators import automd


class IntrospectionStatus(Resource):
    post_query_arguments = {
        "text": fields.String(required=False)
    }

    @automd()
    @use_kwargs(post_query_arguments, location="json")
    def post(self, text: str = "Hello AutoMD") -> str:
        ret_text: str = "status check OK"

        if text is not None:
            ret_text = f"{ret_text}: {text}"

        return ret_text

From this the APISpec also get the parameter type, default value, and API response type. It does not get the parameter location yet though, that takes more aguements to automd.

Filling in more information in the webargs fields, automd decorator, use_kwargs decorator, and using one of the AutoMD response classes for type annotation and gives even better information:

from flask_restful import Resource
from marshmallow import fields
from webargs.flaskparser import use_kwargs
from automd.decorators import automd
from automd.responses import ValueResponse

class Status(Resource):
    get_query_arguments = {
        "text": fields.String(required=False, description='Text to return', doc_default="Hello AutoMD")
    }

    @automd(parameter_schema=get_query_arguments,
             summary="Status Endpoint",
             description="Status Endpoint, responds with a message made from the input string")
    @use_kwargs(get_query_arguments, location="query")
    def get(self, text: str = None) -> ValueResponse:
        log_text: str = "status check OK"

        log_text = f"{log_text}: {text or 'Hello AutoMD'}"

        return ValueResponse(log_text)

With this information, argument types, return types, summaries, descriptions, detailed default information, and parameter location info (body, query, etc) is included. Summary and description are the only "magic strings" needed, and those will generally not change much or be onerous to keep up to date compared to the automatically grabbed information.

An example Flask API app is provided to showcase some functionality. Start it using run.py. A sample of the OpenAPI spec generated is here.

Metadata

Release files for AutoMD 1.8.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for AutoMD 1.8.0
File Size Uploaded
AutoMD-1.8.0.tar.gz 12.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for AutoMD 1.8.0
File Interpreter ABI Platform
AutoMD-1.8.0-py3-none-any.whl Python 3 none any Details

Total release size: 27.5 kB

Release files / AutoMD-1.8.0.tar.gz

Download URL AutoMD-1.8.0.tar.gz
Size 12.1 kB
Tags Source
SHA-256 checksum
How to use checksums
1c0dfbf546337496375f50a244f6fb1bb4d022e8faa3ebbeb04c5dfe4abdd572
BLAKE2b-256 checksum
How to use checksums
5630d9a7bcc64dd3001e40b00ee8d87bf95909491fb5e2de20f6fd694269806b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.8.2

Release files / AutoMD-1.8.0-py3-none-any.whl

Download URL AutoMD-1.8.0-py3-none-any.whl
Size 15.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1a54e18f554fcc29dde308ca03ccc96a8eed0f98e7c994741503445b4b30f362
BLAKE2b-256 checksum
How to use checksums
c133e16be0dca75f7f86dbbb1c88f9cf09d3962975e61c71b45be251a672ae22
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.1.1 pkginfo/1.5.0.1 requests/2.23.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.46.0 CPython/3.8.2

Release history Release notifications | RSS feed

1.10.0

2 release files

1.9.0

2 release files

This release

1.8.0 This release

2 release files

1.7.0

2 release files

1.6.0

2 release files

1.5.0

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page