From 6e29848608121724f9ed4383f95970b0b9e7871e Mon Sep 17 00:00:00 2001 From: Koudai Aono Date: Sun, 31 May 2020 23:23:20 +0900 Subject: [PATCH] Add datamodel-code-generator link in pydantic document site (#1532) * Add datamodel-code-generator link in pydantic document site. * tweak menu * fix blank lines Co-authored-by: Samuel Colvin Co-authored-by: Samuel Colvin --- changes/1500-koxudaxi.md | 1 + docs/datamodel_code_generator.md | 78 +++++++++++++++++++ docs/examples/generate_models_person_model.py | 19 +++++ mkdocs.yml | 1 + 4 files changed, 99 insertions(+) create mode 100644 changes/1500-koxudaxi.md create mode 100644 docs/datamodel_code_generator.md create mode 100644 docs/examples/generate_models_person_model.py diff --git a/changes/1500-koxudaxi.md b/changes/1500-koxudaxi.md new file mode 100644 index 0000000000..a62521162a --- /dev/null +++ b/changes/1500-koxudaxi.md @@ -0,0 +1 @@ +Add datamodel-code-generator link in pydantic document site. \ No newline at end of file diff --git a/docs/datamodel_code_generator.md b/docs/datamodel_code_generator.md new file mode 100644 index 0000000000..b15076aa3b --- /dev/null +++ b/docs/datamodel_code_generator.md @@ -0,0 +1,78 @@ +[datamodel-code-generator](https://github.com/koxudaxi/datamodel-code-generator/) is a command to generate pydantic models from other data types. + + +* Supported source types + * OpenAPI 3 (YAML/JSON) + * JSON Schema + * JSON/YAML Data (It will be converted to JSON Schema) + +## Install +```bash +pip install datamodel-code-generato +``` + +## Example +In this case, The datamodel-code-generator creates pydantic models from JSON Schema. +```bash +datamodel-codegen --input person.json --input-file-type jsonschema --output model.py +``` + +person.json: +```json +{ + "$id": "person.json", + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Person", + "type": "object", + "properties": { + "first_name": { + "type": "string", + "description": "The person's first name." + }, + "last_name": { + "type": "string", + "description": "The person's last name." + }, + "age": { + "description": "Age in years.", + "type": "integer", + "minimum": 0 + }, + "pets": { + "type": "array", + "items": [ + { + "$ref": "#/definitions/Pet" + } + ] + }, + "comment": { + "type": "null" + } + }, + "required": [ + "first_name", + "last_name" + ], + "definitions": { + "Pet": { + "properties": { + "name": { + "type": "string" + }, + "age": { + "type": "integer" + } + } + } + } +} +``` + +model.py: +```py +{!.tmp_examples/generate_models_person_model.py!} +``` + +More information can be found on the +[official documentation](https://koxudaxi.github.io/datamodel-code-generator/) diff --git a/docs/examples/generate_models_person_model.py b/docs/examples/generate_models_person_model.py new file mode 100644 index 0000000000..a846938a82 --- /dev/null +++ b/docs/examples/generate_models_person_model.py @@ -0,0 +1,19 @@ +# generated by datamodel-codegen: +# filename: person.json +# timestamp: 2020-05-19T15:07:31+00:00 +from __future__ import annotations +from typing import Any, List, Optional +from pydantic import BaseModel, Field, conint + + +class Pet(BaseModel): + name: Optional[str] = None + age: Optional[int] = None + + +class Person(BaseModel): + first_name: str = Field(..., description="The person's first name.") + last_name: str = Field(..., description="The person's last name.") + age: Optional[conint(ge=0)] = Field(None, description='Age in years.') + pets: Optional[List[Pet]] = None + comment: Optional[Any] = None diff --git a/mkdocs.yml b/mkdocs.yml index a8119cad06..6db1114da3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -46,6 +46,7 @@ nav: - benchmarks.md - 'Mypy plugin': mypy_plugin.md - 'PyCharm plugin': pycharm_plugin.md +- 'Code Generation': datamodel_code_generator.md - changelog.md markdown_extensions: