From 117229530d236a6e418f374af61f8d3a3056807f Mon Sep 17 00:00:00 2001 From: Daniel Grossmann-Kavanagh Date: Wed, 2 Sep 2020 23:33:09 -0700 Subject: [PATCH] fix: import Optional when properties are nullable or not required --- CHANGELOG.md | 1 + end_to_end_tests/fastapi_app/__init__.py | 4 ++-- end_to_end_tests/fastapi_app/openapi.json | 3 ++- .../golden-master/my_test_api_client/models/a_model.py | 2 +- openapi_python_client/parser/properties.py | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c062ce2e..b5677a00b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## 0.5.5 - Unreleased ### Fixes - Improved trailing comma handling in endpoint generation (#178 & #179). Thanks @dtkav! +- `Optional` is now properly imported for `nullable` fields (#177 & #180). Thanks @dtkav! ## 0.5.4 - 2020-08-29 diff --git a/end_to_end_tests/fastapi_app/__init__.py b/end_to_end_tests/fastapi_app/__init__.py index 0b58cb56d..f1d124260 100644 --- a/end_to_end_tests/fastapi_app/__init__.py +++ b/end_to_end_tests/fastapi_app/__init__.py @@ -6,7 +6,7 @@ from typing import Dict, List, Union from fastapi import APIRouter, Body, FastAPI, File, Header, Query, UploadFile -from pydantic import BaseModel +from pydantic import BaseModel, Field from starlette.responses import FileResponse app = FastAPI(title="My Test API", description="An API for testing openapi-python-client",) @@ -44,7 +44,7 @@ class AModel(BaseModel): an_enum_value: AnEnum nested_list_of_enums: List[List[DifferentEnum]] = [] - some_dict: Dict[str, str] + some_dict: Dict[str, str] = Field(..., nullable=True) aCamelDateTime: Union[datetime, date] a_date: date diff --git a/end_to_end_tests/fastapi_app/openapi.json b/end_to_end_tests/fastapi_app/openapi.json index 7c36f444f..7bf670a40 100644 --- a/end_to_end_tests/fastapi_app/openapi.json +++ b/end_to_end_tests/fastapi_app/openapi.json @@ -493,7 +493,8 @@ "type": "object", "additionalProperties": { "type": "string" - } + }, + "nullable": true }, "aCamelDateTime": { "title": "Acameldatetime", diff --git a/end_to_end_tests/golden-master/my_test_api_client/models/a_model.py b/end_to_end_tests/golden-master/my_test_api_client/models/a_model.py index 85e595de1..cf4f2e22f 100644 --- a/end_to_end_tests/golden-master/my_test_api_client/models/a_model.py +++ b/end_to_end_tests/golden-master/my_test_api_client/models/a_model.py @@ -13,7 +13,7 @@ class AModel: """ A Model for testing all the ways custom objects can be used """ an_enum_value: AnEnum - some_dict: Dict[Any, Any] + some_dict: Optional[Dict[Any, Any]] a_camel_date_time: Union[datetime.datetime, datetime.date] a_date: datetime.date nested_list_of_enums: Optional[List[List[DifferentEnum]]] = field( diff --git a/openapi_python_client/parser/properties.py b/openapi_python_client/parser/properties.py index 63c9cffb4..4e6951bce 100644 --- a/openapi_python_client/parser/properties.py +++ b/openapi_python_client/parser/properties.py @@ -63,7 +63,7 @@ def get_imports(self, *, prefix: str) -> Set[str]: Args: prefix: A prefix to put before any relative (local) module names. """ - if not self.required: + if self.nullable or not self.required: return {"from typing import Optional"} return set()