py-openapi-schema-to-json-schema


Namepy-openapi-schema-to-json-schema JSON
Version 0.0.3 PyPI version JSON
download
home_pagehttps://github.com/pglass/py-openapi-schema-to-json-schema
SummaryConvert OpenAPI Schemas to JSON Schemas
upload_time2020-07-25 05:34:52
maintainer
docs_urlNone
authorPaul Glass
requires_python
licenseMIT
keywords openapi json schema convert translate
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI
coveralls test coverage No coveralls.
            Overview
--------

[![Build Status](https://travis-ci.org/pglass/py-openapi-schema-to-json-schema.svg?branch=master)](https://travis-ci.org/pglass/py-openapi-schema-to-json-schema)
[![PyPI](https://img.shields.io/pypi/v/py-openapi-schema-to-json-schema.svg)](https://pypi.org/project/py-openapi-schema-to-json-schema/)
[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/py-openapi-schema-to-json-schema.svg)](https://pypi.org/project/py-openapi-schema-to-json-schema/)


**This is a straight Python port of the MIT-licensed
[mikunn/openapi-schema-to-json-schema](https://github.com/mikunn/openapi-schema-to-json-schema)
([v2.1.0](https://github.com/mikunn/openapi-schema-to-json-schema/tree/v2.1.0))**.
This port is similarly MIT-licensed.

It converts from [OpenAPI 3.0](
https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md) to
[JSON Schema Draft 4](http://json-schema.org/specification-links.html#draft-4).

## Why?

OpenAPI 3 Schemas and JSON Schemas are mostly similar. However, JSON Schema
validators are unaware of the differences between the two formats. This means
that validating request/response JSON using a standard JSON Schema validator
with OpenAPI 3 Schemas will result in incorrect validations in certain common
cases.

One way to solve this problem is to translate the OpenAPI 3 schema to JSON
Schema, which is the purpose of this library.

See [here](https://github.com/mikunn/openapi-schema-to-json-schema/tree/v2.1.0#why)
for more rationale, as well as [Phil Sturgeon's blog post](
https://philsturgeon.uk/api/2018/03/30/openapi-and-json-schema-divergence/)
about the problem.

## Features

* converts OpenAPI 3.0 Schema Object to JSON Schema Draft 4
* deletes `nullable` and adds `"null"` to `type` array if `nullable` is `true` and `type` is present
* adds `{"type": "null"}` to `oneOf` or `anyOf` array if `nullable` is `true` and `type` is _not_ present
* supports deep structures with nested `allOf`s etc.
* removes [OpenAPI specific
  properties](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#fixed-fields-20)
such as `discriminator`, `deprecated` etc. unless specified otherwise
* optionally supports `patternProperties` with `x-patternProperties` in the
  Schema Object

**NOTE**: `$ref`s are not dereferenced. You will need another library to
read the spec and follow `$ref` fields.


## Installation

```bash
$ pip install py-openapi-schema-to-json-schema
```


## Usage

```python
import json
from openapi_schema_to_json_schema import to_json_schema

openapi_schema = {
    "type": "object",
    "properties": {
        "name": {
            "type": "string",
            "nullable": True,
        }
    },
    "x-patternProperties": {
        "^[a-z]+$": {
            "type": "number",
        }
    }
}

options = {"supportPatternProperties": True}
converted = to_json_schema(openapi_schema, options)

print(json.dumps(converted, indent=2))
```

This outputs the following JSON schema. This shows the conversion of
`nullable: True` to `type: ["string", "null"]`, and the enablement of
unsupported JSON Schema features using OpenAPI extension fields
(`x-patternProperties` -> `patternProperties`).

```json
{
  "patternProperties": {
    "^[a-z]+$": {
      "type": "number"
    }
  },
  "properties": {
    "name": {
      "type": [
        "string",
        "null"
      ]
    }
  },
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "object"
}
```

### Options

The `to_json_schema` function accepts an `options` dictionary as the second
argument.

```python
# Defaults
options = {
    'cloneSchema': True,
    'dateToDateTime': False,
    'supportPatternProperties': False,
    'keepNotSupported': [],
    'patternPropertiesHandler':
        openapi_schema_to_json_schema.patternPropertiesHandler,
    'removeReadOnly': False,
    'removeWriteOnly': True,
}
```

#### `cloneSchema` (bool)

If set to `False`, converts the provided schema in place. If `True`, clones the
schema using `copy.deepcopy`. Defaults to `True`.

#### `dateToDateTime` (bool)

This is `False` by default and leaves `date` format as is. If set to `True`,
sets `format: 'date'` to `format: 'date-time'`.

For example

```python
import json
from openapi_schema_to_json_schema import to_json_schema

schema = {
  'type': 'string',
  'format': 'date',
}

converted = to_json_schema(schema, {'dateToDateTime': True})

print(json.dumps(converted, indent=2))
```

prints

```json
{
  "format": "date-time",
  "$schema": "http://json-schema.org/draft-04/schema#",
  "type": "string"
}
```

#### `keepNotSupported` (list)

By default, the following fields are removed from the result schema:
`nullable`, `discriminator`, `readOnly`, `writeOnly`, `xml`, `externalDocs`,
`example` and `deprecated` as they are not supported by JSON Schema Draft 4.
Provide a list of the ones you want to keep (as strings) and they won't be
removed.

#### `removeReadOnly` (bool)

If set to `True`, will remove properties set as `readOnly`. If the property is
set as `required`, it will be removed from the `required` list as well. The
property will be removed even if `readOnly` is set to be kept with
`keepNotSupported`.

#### `removeWriteOnly` (bool)

Similar to `removeReadOnly`, but for `writeOnly` properties.

#### `supportPatternProperties` (bool)

If set to `True` and `x-patternProperties` property is present, change
`x-patternProperties` to `patternProperties` and call
`patternPropertiesHandler`. If `patternPropertiesHandler` is not defined, call
the default handler. See `patternPropertiesHandler` for more information.

#### `patternPropertiesHandler` (function)

Provide a function to handle pattern properties and set
`supportPatternProperties` to take effect. The function takes the schema where
`x-patternProperties` is defined on the root level. At this point
`x-patternProperties` is changed to `patternProperties`. It must return the
modified schema.

If the handler is not provided, the default handler is used. If
`additionalProperties` is set and is an object, the default handler sets it to
false if the `additionalProperties` object has deep equality with a pattern
object inside `patternProperties`. This is because we might want to define
`additionalProperties` in OpenAPI spec file, but want to validate against a
pattern. The pattern would turn out to be useless if `additionalProperties` of
the same structure were allowed. Create you own handler to override this
functionality.

See `tests/to_jsonschema/test_pattern_properties.py` for examples of this.


Credits
-------

- [mikunn](https://github.com/mikunn) for the [original
openapi-schema-to-json-schema](https://github.com/mikunn/openapi-schema-to-json-schema)
- [Phil Sturgeon](https://github.com/philsturgeon) for his great 
[blog post](https://philsturgeon.uk/api/2018/03/30/openapi-and-json-schema-divergence/)
about the issue (and his [reverse implementation](https://github.com/wework/json-schema-to-openapi-schema))



            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/pglass/py-openapi-schema-to-json-schema",
    "name": "py-openapi-schema-to-json-schema",
    "maintainer": "",
    "docs_url": null,
    "requires_python": "",
    "maintainer_email": "",
    "keywords": "openapi json schema convert translate",
    "author": "Paul Glass",
    "author_email": "pnglass@gmail.com",
    "download_url": "https://files.pythonhosted.org/packages/51/c5/5d6a9b08df175a886b4085eb51e0351854a96e4896a367b2373ad19d881b/py-openapi-schema-to-json-schema-0.0.3.tar.gz",
    "platform": "",
    "description": "Overview\n--------\n\n[![Build Status](https://travis-ci.org/pglass/py-openapi-schema-to-json-schema.svg?branch=master)](https://travis-ci.org/pglass/py-openapi-schema-to-json-schema)\n[![PyPI](https://img.shields.io/pypi/v/py-openapi-schema-to-json-schema.svg)](https://pypi.org/project/py-openapi-schema-to-json-schema/)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/py-openapi-schema-to-json-schema.svg)](https://pypi.org/project/py-openapi-schema-to-json-schema/)\n\n\n**This is a straight Python port of the MIT-licensed\n[mikunn/openapi-schema-to-json-schema](https://github.com/mikunn/openapi-schema-to-json-schema)\n([v2.1.0](https://github.com/mikunn/openapi-schema-to-json-schema/tree/v2.1.0))**.\nThis port is similarly MIT-licensed.\n\nIt converts from [OpenAPI 3.0](\nhttps://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md) to\n[JSON Schema Draft 4](http://json-schema.org/specification-links.html#draft-4).\n\n## Why?\n\nOpenAPI 3 Schemas and JSON Schemas are mostly similar. However, JSON Schema\nvalidators are unaware of the differences between the two formats. This means\nthat validating request/response JSON using a standard JSON Schema validator\nwith OpenAPI 3 Schemas will result in incorrect validations in certain common\ncases.\n\nOne way to solve this problem is to translate the OpenAPI 3 schema to JSON\nSchema, which is the purpose of this library.\n\nSee [here](https://github.com/mikunn/openapi-schema-to-json-schema/tree/v2.1.0#why)\nfor more rationale, as well as [Phil Sturgeon's blog post](\nhttps://philsturgeon.uk/api/2018/03/30/openapi-and-json-schema-divergence/)\nabout the problem.\n\n## Features\n\n* converts OpenAPI 3.0 Schema Object to JSON Schema Draft 4\n* deletes `nullable` and adds `\"null\"` to `type` array if `nullable` is `true` and `type` is present\n* adds `{\"type\": \"null\"}` to `oneOf` or `anyOf` array if `nullable` is `true` and `type` is _not_ present\n* supports deep structures with nested `allOf`s etc.\n* removes [OpenAPI specific\n  properties](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#fixed-fields-20)\nsuch as `discriminator`, `deprecated` etc. unless specified otherwise\n* optionally supports `patternProperties` with `x-patternProperties` in the\n  Schema Object\n\n**NOTE**: `$ref`s are not dereferenced. You will need another library to\nread the spec and follow `$ref` fields.\n\n\n## Installation\n\n```bash\n$ pip install py-openapi-schema-to-json-schema\n```\n\n\n## Usage\n\n```python\nimport json\nfrom openapi_schema_to_json_schema import to_json_schema\n\nopenapi_schema = {\n    \"type\": \"object\",\n    \"properties\": {\n        \"name\": {\n            \"type\": \"string\",\n            \"nullable\": True,\n        }\n    },\n    \"x-patternProperties\": {\n        \"^[a-z]+$\": {\n            \"type\": \"number\",\n        }\n    }\n}\n\noptions = {\"supportPatternProperties\": True}\nconverted = to_json_schema(openapi_schema, options)\n\nprint(json.dumps(converted, indent=2))\n```\n\nThis outputs the following JSON schema. This shows the conversion of\n`nullable: True` to `type: [\"string\", \"null\"]`, and the enablement of\nunsupported JSON Schema features using OpenAPI extension fields\n(`x-patternProperties` -> `patternProperties`).\n\n```json\n{\n  \"patternProperties\": {\n    \"^[a-z]+$\": {\n      \"type\": \"number\"\n    }\n  },\n  \"properties\": {\n    \"name\": {\n      \"type\": [\n        \"string\",\n        \"null\"\n      ]\n    }\n  },\n  \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n  \"type\": \"object\"\n}\n```\n\n### Options\n\nThe `to_json_schema` function accepts an `options` dictionary as the second\nargument.\n\n```python\n# Defaults\noptions = {\n    'cloneSchema': True,\n    'dateToDateTime': False,\n    'supportPatternProperties': False,\n    'keepNotSupported': [],\n    'patternPropertiesHandler':\n        openapi_schema_to_json_schema.patternPropertiesHandler,\n    'removeReadOnly': False,\n    'removeWriteOnly': True,\n}\n```\n\n#### `cloneSchema` (bool)\n\nIf set to `False`, converts the provided schema in place. If `True`, clones the\nschema using `copy.deepcopy`. Defaults to `True`.\n\n#### `dateToDateTime` (bool)\n\nThis is `False` by default and leaves `date` format as is. If set to `True`,\nsets `format: 'date'` to `format: 'date-time'`.\n\nFor example\n\n```python\nimport json\nfrom openapi_schema_to_json_schema import to_json_schema\n\nschema = {\n  'type': 'string',\n  'format': 'date',\n}\n\nconverted = to_json_schema(schema, {'dateToDateTime': True})\n\nprint(json.dumps(converted, indent=2))\n```\n\nprints\n\n```json\n{\n  \"format\": \"date-time\",\n  \"$schema\": \"http://json-schema.org/draft-04/schema#\",\n  \"type\": \"string\"\n}\n```\n\n#### `keepNotSupported` (list)\n\nBy default, the following fields are removed from the result schema:\n`nullable`, `discriminator`, `readOnly`, `writeOnly`, `xml`, `externalDocs`,\n`example` and `deprecated` as they are not supported by JSON Schema Draft 4.\nProvide a list of the ones you want to keep (as strings) and they won't be\nremoved.\n\n#### `removeReadOnly` (bool)\n\nIf set to `True`, will remove properties set as `readOnly`. If the property is\nset as `required`, it will be removed from the `required` list as well. The\nproperty will be removed even if `readOnly` is set to be kept with\n`keepNotSupported`.\n\n#### `removeWriteOnly` (bool)\n\nSimilar to `removeReadOnly`, but for `writeOnly` properties.\n\n#### `supportPatternProperties` (bool)\n\nIf set to `True` and `x-patternProperties` property is present, change\n`x-patternProperties` to `patternProperties` and call\n`patternPropertiesHandler`. If `patternPropertiesHandler` is not defined, call\nthe default handler. See `patternPropertiesHandler` for more information.\n\n#### `patternPropertiesHandler` (function)\n\nProvide a function to handle pattern properties and set\n`supportPatternProperties` to take effect. The function takes the schema where\n`x-patternProperties` is defined on the root level. At this point\n`x-patternProperties` is changed to `patternProperties`. It must return the\nmodified schema.\n\nIf the handler is not provided, the default handler is used. If\n`additionalProperties` is set and is an object, the default handler sets it to\nfalse if the `additionalProperties` object has deep equality with a pattern\nobject inside `patternProperties`. This is because we might want to define\n`additionalProperties` in OpenAPI spec file, but want to validate against a\npattern. The pattern would turn out to be useless if `additionalProperties` of\nthe same structure were allowed. Create you own handler to override this\nfunctionality.\n\nSee `tests/to_jsonschema/test_pattern_properties.py` for examples of this.\n\n\nCredits\n-------\n\n- [mikunn](https://github.com/mikunn) for the [original\nopenapi-schema-to-json-schema](https://github.com/mikunn/openapi-schema-to-json-schema)\n- [Phil Sturgeon](https://github.com/philsturgeon) for his great \n[blog post](https://philsturgeon.uk/api/2018/03/30/openapi-and-json-schema-divergence/)\nabout the issue (and his [reverse implementation](https://github.com/wework/json-schema-to-openapi-schema))\n\n\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Convert OpenAPI Schemas to JSON Schemas",
    "version": "0.0.3",
    "project_urls": {
        "Homepage": "https://github.com/pglass/py-openapi-schema-to-json-schema"
    },
    "split_keywords": [
        "openapi",
        "json",
        "schema",
        "convert",
        "translate"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "1c1aa43f73b8762512ab3358aac96c6c6d1d9ec4dbb3bbb99d82c2e90e5f3d16",
                "md5": "781fdb33e90caf6680c57454ea1be4ce",
                "sha256": "456802186309257a9667fd50eca7c6ff6eaf9930ab09dcc87c54537e01066f09"
            },
            "downloads": -1,
            "filename": "py_openapi_schema_to_json_schema-0.0.3-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "781fdb33e90caf6680c57454ea1be4ce",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 6954,
            "upload_time": "2020-07-25T05:34:50",
            "upload_time_iso_8601": "2020-07-25T05:34:50.932835Z",
            "url": "https://files.pythonhosted.org/packages/1c/1a/a43f73b8762512ab3358aac96c6c6d1d9ec4dbb3bbb99d82c2e90e5f3d16/py_openapi_schema_to_json_schema-0.0.3-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "51c55d6a9b08df175a886b4085eb51e0351854a96e4896a367b2373ad19d881b",
                "md5": "5fbcbf4a38fbee6206cede45cf855157",
                "sha256": "d557afb6bcc45d62a1383ada0ad57515421552efa3b2e07b2264e5b9e1e9634e"
            },
            "downloads": -1,
            "filename": "py-openapi-schema-to-json-schema-0.0.3.tar.gz",
            "has_sig": false,
            "md5_digest": "5fbcbf4a38fbee6206cede45cf855157",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 5964,
            "upload_time": "2020-07-25T05:34:52",
            "upload_time_iso_8601": "2020-07-25T05:34:52.287557Z",
            "url": "https://files.pythonhosted.org/packages/51/c5/5d6a9b08df175a886b4085eb51e0351854a96e4896a367b2373ad19d881b/py-openapi-schema-to-json-schema-0.0.3.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2020-07-25 05:34:52",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "pglass",
    "github_project": "py-openapi-schema-to-json-schema",
    "travis_ci": true,
    "coveralls": false,
    "github_actions": false,
    "tox": true,
    "lcname": "py-openapi-schema-to-json-schema"
}
        
Elapsed time: 0.22465s