From 9d4c21167b3f105880bd110f70ffd0212cbedc65 Mon Sep 17 00:00:00 2001 From: Justin Black Date: Sun, 29 Dec 2019 10:19:26 -0800 Subject: [PATCH] Adds a Player model with a self type rpoperty, adds a test to ensure that it is working right --- .../languages/PythonClientExperimentalCodegen.java | 9 +++++++++ .../petstore/python-experimental/docs/Player.md | 2 +- .../petstore_api/models/player.py | 4 ++-- .../petstore/python-experimental/test/test_player.py | 12 +++++++++--- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java index eb3c65438ea9..1467060a88be 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java @@ -643,6 +643,11 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty p) { // fix ListContainers p.complexType = getPythonClassName(p.mostInnerItems.complexType); } + // if a model has a property that is of type self, remove the module name from the dataType + if (p.complexType != null && p.dataType.contains(model.classname)) { + String classNameNoModule = getPythonClassName(model.classname); + p.dataType = p.dataType.replace(model.classname, classNameNoModule); + } } @Override @@ -753,6 +758,10 @@ public CodegenModel fromModel(String name, Schema schema) { result.imports.add(modelName); } } + // if a class has a property of type self, remove the self import from imports + if (result.imports.contains(result.classname)) { + result.imports.remove(result.classname); + } return result; } diff --git a/samples/client/petstore/python-experimental/docs/Player.md b/samples/client/petstore/python-experimental/docs/Player.md index 87c2c6b27ba4..34adf5302a00 100644 --- a/samples/client/petstore/python-experimental/docs/Player.md +++ b/samples/client/petstore/python-experimental/docs/Player.md @@ -4,7 +4,7 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **name** | **str** | | -**enemy_player** | [**player.Player**](Player.md) | | [optional] +**enemy_player** | [**Player**](Player.md) | | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/samples/client/petstore/python-experimental/petstore_api/models/player.py b/samples/client/petstore/python-experimental/petstore_api/models/player.py index c7266e840283..75b3ca337674 100644 --- a/samples/client/petstore/python-experimental/petstore_api/models/player.py +++ b/samples/client/petstore/python-experimental/petstore_api/models/player.py @@ -74,7 +74,7 @@ def openapi_types(): """ return { 'name': (str,), # noqa: E501 - 'enemy_player': (player.Player,), # noqa: E501 + 'enemy_player': (Player,), # noqa: E501 } @staticmethod @@ -118,7 +118,7 @@ def __init__(self, name, _check_type=True, _from_server=False, _path_to_item=(), deserializing a file_type parameter. If passed, type conversion is attempted If omitted no type conversion is done. - enemy_player (player.Player): [optional] # noqa: E501 + enemy_player (Player): [optional] # noqa: E501 """ self._data_store = {} diff --git a/samples/client/petstore/python-experimental/test/test_player.py b/samples/client/petstore/python-experimental/test/test_player.py index f44b7695ff27..b100dd798943 100644 --- a/samples/client/petstore/python-experimental/test/test_player.py +++ b/samples/client/petstore/python-experimental/test/test_player.py @@ -28,9 +28,15 @@ def tearDown(self): def testPlayer(self): """Test Player""" - # FIXME: construct object with mandatory attributes with example values - # model = petstore_api.Player() # noqa: E501 - pass + # we can make a player without an enemy_player property + jane = petstore_api.Player(name="Jane") + # we can make a player with an enemy_player + sally = petstore_api.Player(name="Sally", enemy_player=jane) + # we can make a player with an inline enemy_player + jim = petstore_api.Player( + name="Jim", + enemy_player=petstore_api.Player(name="Sam") + ) if __name__ == '__main__':