{"id":18427742,"url":"https://github.com/pglass/py-openapi-schema-to-json-schema","last_synced_at":"2025-04-07T16:33:49.072Z","repository":{"id":62582242,"uuid":"138369054","full_name":"pglass/py-openapi-schema-to-json-schema","owner":"pglass","description":"Python port of https://github.com/mikunn/openapi-schema-to-json-schema","archived":false,"fork":false,"pushed_at":"2020-07-25T05:42:59.000Z","size":40,"stargazers_count":13,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-17T10:45:19.584Z","etag":null,"topics":["api-specs","json-schema","openapi-schema","openapi3","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pglass.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-06-23T03:46:02.000Z","updated_at":"2024-03-18T07:38:58.000Z","dependencies_parsed_at":"2022-11-03T21:56:18.757Z","dependency_job_id":null,"html_url":"https://github.com/pglass/py-openapi-schema-to-json-schema","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pglass%2Fpy-openapi-schema-to-json-schema","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pglass%2Fpy-openapi-schema-to-json-schema/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pglass%2Fpy-openapi-schema-to-json-schema/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pglass%2Fpy-openapi-schema-to-json-schema/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pglass","download_url":"https://codeload.github.com/pglass/py-openapi-schema-to-json-schema/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247688434,"owners_count":20979665,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-specs","json-schema","openapi-schema","openapi3","python"],"created_at":"2024-11-06T05:11:41.715Z","updated_at":"2025-04-07T16:33:48.749Z","avatar_url":"https://github.com/pglass.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"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` -\u003e `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","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpglass%2Fpy-openapi-schema-to-json-schema","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpglass%2Fpy-openapi-schema-to-json-schema","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpglass%2Fpy-openapi-schema-to-json-schema/lists"}