Skip to main content

Translate your middle model declarations to OpenAPI, JSONSchema or any other schema you need!

In a nutshell

>>> import enum
>>> import json
>>> import typing as t
>>> import middle
>>> from middle_schema.openapi import parse

>>> @enum.unique
... class PlatformEnum(str, enum.Enum):
...     XBOX1 = "XBOX1"
...     PLAYSTATION4 = "PLAYSTATION4"
...     PC = "PC"

>>> @enum.unique
... class LanguageEnum(enum.IntEnum):
...     ENGLISH = 1
...     JAPANESE = 2
...     SPANISH = 3
...     GERMAN = 4
...     PORTUGUESE = 5

>>> @enum.unique
... class CityRegionEnum(str, enum.Enum):
...     TROPICAL = "TROPICAL"
...     TEMPERATE = "TEMPERATE"
...     BOREAL = "BOREAL"

>>> class City(middle.Model):
...     __description__ = "One awesome city built"
...     name = middle.field(type=str, description="The city name")
...     region = middle.field(
...         default=CityRegionEnum.TEMPERATE,
...         type=CityRegionEnum,
...         description="The region this city is located",
...     )

>>> class Player(middle.Model):
...     nickname = middle.field(
...         type=str, description="The nickname of the player over the internet"
...     )
...     youtube_channel = middle.field(
...         type=str, description="The YouTube channel of the player", default=None
...     )

>>> class Game(middle.Model):
...     __description__ = "An electronic game model"
...     name = middle.field(type=str, description="The name of the game")
...     platform = middle.field(
...         type=PlatformEnum, description="Which platform it runs on"
...     )
...     score = middle.field(
...         type=float,
...         description="The average score of the game",
...         minimum=0,
...         maximum=10,
...         multiple_of=0.1,
...     )
...     resolution_tested = middle.field(
...         type=str,
...         description="The resolution which the game was tested",
...         pattern="^\d+x\d+$",
...     )
...     genre = middle.field(
...         type=t.List[str],
...         description="One or more genres this game is part of",
...         min_items=1,
...         unique_items=True,
...     )
...     rating = middle.field(
...         type=t.Dict[str, float],
...         description="Ratings given on specialized websites",
...         min_properties=3,
...     )
...     players = middle.field(
...         type=t.Set[str],
...         description="Some of the notorious players of this game",
...     )
...     language = middle.field(
...         type=LanguageEnum, description="The main language of the game"
...     )
...     awesome_city = middle.field(type=City)
...     remarkable_resources = middle.field(
...         type=t.Union[Player, City],
...         description="Some remarkable resources of this game over the internet",
...     )

>>> api = parse(Game)

>>> json.dumps(api.specification, indent=4, sort_keys=True)
{
    "description": "An electronic game model",
    "properties": {
        "awesome_city": {
            "description": "One awesome city built",
            "properties": {
                "name": {
                    "description": "The city name",
                    "type": "string"
                },
                "region": {
                    "choices": [
                        "TROPICAL",
                        "TEMPERATE",
                        "BOREAL"
                    ],
                    "description": "The region this city is located",
                    "type": "string"
                }
            },
            "required": [
                "name"
            ],
            "type": "object"
        },
        "genre": {
            "description": "One or more genres this game is part of",
            "items": {
                "type": "string"
            },
            "minItems": 1,
            "type": "array",
            "uniqueItems": true
        },
        "language": {
            "choices": [
                1,
                2,
                3,
                4,
                5
            ],
            "description": "The main language of the game",
            "format": "int64",
            "type": "integer"
        },
        "name": {
            "description": "The name of the game",
            "type": "string"
        },
        "platform": {
            "choices": [
                "XBOX1",
                "PLAYSTATION4",
                "PC"
            ],
            "description": "Which platform it runs on",
            "type": "string"
        },
        "players": {
            "description": "Some of the notorious players of this game",
            "items": {
                "properties": {
                    "nickname": {
                        "description": "The nickname of the player over the internet",
                        "type": "string"
                    },
                    "youtube_channel": {
                        "description": "The YouTube channel of the player",
                        "type": "string"
                    }
                },
                "required": [
                    "nickname"
                ],
                "type": "object"
            },
            "type": "array"
        },
        "rating": {
            "additionalProperties": {
                "format": "double",
                "type": "number"
            },
            "description": "Ratings given on specialized websites",
            "minProperties": 3,
            "type": "object"
        },
        "remarkable_resources": {
            "anyOf": [
                {
                    "properties": {
                        "nickname": {
                            "description": "The nickname of the player over the internet",
                            "type": "string"
                        },
                        "youtube_channel": {
                            "description": "The YouTube channel of the player",
                            "type": "string"
                        }
                    },
                    "required": [
                        "nickname"
                    ],
                    "type": "object"
                },
                {
                    "description": "One awesome city built",
                    "properties": {
                        "name": {
                            "description": "The city name",
                            "type": "string"
                        },
                        "region": {
                            "choices": [
                                "TROPICAL",
                                "TEMPERATE",
                                "BOREAL"
                            ],
                            "description": "The region this city is located",
                            "type": "string"
                        }
                    },
                    "required": [
                        "name"
                    ],
                    "type": "object"
                }
            ],
            "description": "Some remarkable resources of this game over the internet"
        },
        "resolution_tested": {
            "description": "The resolution which the game was tested",
            "pattern": "^\\d+x\\d+$",
            "type": "string"
        },
        "score": {
            "description": "The average score of the game",
            "format": "double",
            "maximum": 10,
            "minimum": 0,
            "multipleOf": 0.1,
            "type": "number"
        }
    },
    "required": [
        "name",
        "platform",
        "score",
        "resolution_tested",
        "genre",
        "rating",
        "players",
        "language",
        "awesome_city",
        "remarkable_resources"
    ],
    "type": "object"
}

Documentation

https://middle-schema.readthedocs.io/en/latest/

License

middle-schema is a free software distributed under the MIT license.

Changelog

v0.2.0 on 2018-08-01

  • Small refactoring on the Skeleton parser;

  • OpenAPI component and schema generation of middle models;

  • 99%+ of code coverage.

v0.1.0 on 2018-07-26

  • First release on PyPI. Not stable.

Download files

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

Source Distribution

middle-schema-0.2.0.tar.gz (45.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

middle_schema-0.2.0-py2.py3-none-any.whl (7.5 kB view details)

Uploaded Python 2Python 3

File details

Details for the file middle-schema-0.2.0.tar.gz.

File metadata

  • Download URL: middle-schema-0.2.0.tar.gz
  • Upload date:
  • Size: 45.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.24.0 CPython/3.6.6

File hashes

Hashes for middle-schema-0.2.0.tar.gz
Algorithm Hash digest
SHA256 64ccdb5fc77f41ab68c2d5011c104e2306816b19b6baa3bc52362f1fec526a3d
MD5 83a5ab7710e6b50d2d7c300485d73023
BLAKE2b-256 d22f8931c8ff6aa0d4bd773a5896973f8b1ac2d6069c996fbbfbd8975b326cf1

See more details on using hashes here.

File details

Details for the file middle_schema-0.2.0-py2.py3-none-any.whl.

File metadata

  • Download URL: middle_schema-0.2.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 7.5 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/39.0.1 requests-toolbelt/0.8.0 tqdm/4.24.0 CPython/3.6.6

File hashes

Hashes for middle_schema-0.2.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 7d085cb27be48e57a1beef7008ad07f40b6be6bfecd11e575137403f15f690a9
MD5 391a78fef047ea4dfdd218780d4f4ad1
BLAKE2b-256 058ef0d4467159d887fd79a6152edd275b88767cd74a1c7995a5e03349fb794d

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page