Skip to content

Commit ee0686e

Browse files
authored
Python-exp clean up model classnames (#7054)
* Adds lazy_import, removes python-exp java class renaming code, partial removal of getPythonClassName call sites Fixes PythonClientExperimentalTest.java Python-exp smaples regeneration Revers makefile Reverst pom.xml Fixes model imports in models.__init__ Updates docstring, omits lazy import in additional properties if we dont need it Improves additional_properties_type assignment if None Removes getPythonClassName Fixes python-exp tests * Removes unused makefiles
1 parent 2743242 commit ee0686e

419 files changed

Lines changed: 2490 additions & 2228 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/PythonClientExperimentalCodegen.java

Lines changed: 72 additions & 196 deletions
Large diffs are not rendered by default.

modules/openapi-generator/src/main/resources/python/python-experimental/README_common.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ Class | Method | HTTP request | Description
4747

4848
## Documentation For Models
4949

50-
{{#models}}{{#model}} - [{{{classname}}}]({{modelDocPath}}{{{unescapedDescription}}}.md)
50+
{{#models}}{{#model}} - [{{{classname}}}]({{modelDocPath}}{{{classname}}}.md)
5151
{{/model}}{{/models}}
5252

5353
## Documentation For Authorization

modules/openapi-generator/src/main/resources/python/python-experimental/__init__models.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@
1313

1414
{{#models}}
1515
{{#model}}
16-
from {{modelPackage}}.{{classFilename}} import {{unescapedDescription}}
16+
from {{modelPackage}}.{{classFilename}} import {{classname}}
1717
{{/model}}
1818
{{/models}}

modules/openapi-generator/src/main/resources/python/python-experimental/model.mustache

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@ from {{packageName}}.model_utils import ( # noqa: F401
2424
{{#models}}
2525
{{#model}}
2626
{{#imports}}
27-
{{{.}}}
27+
{{#-first}}
28+
29+
def lazy_import():
30+
{{/-first}}
31+
{{{.}}}
2832
{{/imports}}
2933

3034

modules/openapi-generator/src/main/resources/python/python-experimental/model_templates/classvars.mustache

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,20 +64,41 @@
6464
{{/optionalVars}}
6565
}
6666

67-
additional_properties_type = {{#additionalPropertiesType}}({{{additionalPropertiesType}}},) # noqa: E501{{/additionalPropertiesType}}{{^additionalPropertiesType}}None{{/additionalPropertiesType}}
67+
{{#additionalPropertiesType}}
68+
@cached_property
69+
def additional_properties_type():
70+
"""
71+
This must be a method because a model may have properties that are
72+
of type self, this must run after the class is loaded
73+
"""
74+
{{#imports}}
75+
{{#-first}}
76+
lazy_import()
77+
{{/-first}}
78+
{{/imports}}
79+
return ({{{additionalPropertiesType}}},) # noqa: E501
80+
{{/additionalPropertiesType}}
81+
{{^additionalPropertiesType}}
82+
additional_properties_type = None
83+
{{/additionalPropertiesType}}
6884

6985
_nullable = {{#isNullable}}True{{/isNullable}}{{^isNullable}}False{{/isNullable}}
7086

7187
@cached_property
7288
def openapi_types():
7389
"""
74-
This must be a class method so a model may have properties that are
75-
of type self, this ensures that we don't create a cyclic import
90+
This must be a method because a model may have properties that are
91+
of type self, this must run after the class is loaded
7692

7793
Returns
7894
openapi_types (dict): The key is attribute name
7995
and the value is attribute type.
8096
"""
97+
{{#imports}}
98+
{{#-first}}
99+
lazy_import()
100+
{{/-first}}
101+
{{/imports}}
81102
return {
82103
{{#isAlias}}
83104
'value': ({{{dataType}}},),
@@ -98,7 +119,20 @@
98119

99120
@cached_property
100121
def discriminator():
101-
{{^discriminator}}return None{{/discriminator}}{{#discriminator}}val = {
122+
{{^discriminator}}
123+
return None
124+
{{/discriminator}}
125+
{{#discriminator}}
126+
{{#mappedModels}}
127+
{{#-first}}
128+
{{#imports}}
129+
{{#-first}}
130+
lazy_import()
131+
{{/-first}}
132+
{{/imports}}
133+
{{/-first}}
134+
{{/mappedModels}}
135+
val = {
102136
{{#mappedModels}}
103137
'{{mappingName}}': {{{modelName}}},
104138
{{/mappedModels}}

modules/openapi-generator/src/main/resources/python/python-experimental/model_templates/model_composed.mustache

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
class {{unescapedDescription}}(ModelComposed):
1+
class {{classname}}(ModelComposed):
22
"""NOTE: This class is auto generated by OpenAPI Generator.
33
Ref: https://openapi-generator.tech
44

@@ -35,6 +35,11 @@ class {{unescapedDescription}}(ModelComposed):
3535
# code would be run when this module is imported, and these composed
3636
# classes don't exist yet because their module has not finished
3737
# loading
38+
{{#imports}}
39+
{{#-first}}
40+
lazy_import()
41+
{{/-first}}
42+
{{/imports}}
3843
return {
3944
'anyOf': [
4045
{{#anyOf}}

modules/openapi-generator/src/main/resources/python/python-experimental/model_templates/model_normal.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
class {{unescapedDescription}}(ModelNormal):
1+
class {{classname}}(ModelNormal):
22
"""NOTE: This class is auto generated by OpenAPI Generator.
33
Ref: https://openapi-generator.tech
44

modules/openapi-generator/src/main/resources/python/python-experimental/model_templates/model_simple.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
class {{unescapedDescription}}(ModelSimple):
1+
class {{classname}}(ModelSimple):
22
"""NOTE: This class is auto generated by OpenAPI Generator.
33
Ref: https://openapi-generator.tech
44

modules/openapi-generator/src/main/resources/python/python-experimental/model_utils.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ class cached_property(object):
3333
self._fn = fn
3434

3535
def __get__(self, instance, cls=None):
36-
try:
36+
if self.result_key in vars(self):
3737
return vars(self)[self.result_key]
38-
except KeyError:
38+
else:
3939
result = self._fn()
4040
setattr(self, self.result_key, result)
4141
return result

modules/openapi-generator/src/test/java/org/openapitools/codegen/python/PythonClientExperimentalTest.java

Lines changed: 63 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -40,19 +40,19 @@ public void modelTest() {
4040
codegen.setOpenAPI(openAPI);
4141
final CodegenModel simpleName = codegen.fromModel("v1beta3.Binding", openAPI.getComponents().getSchemas().get("v1beta3.Binding"));
4242
Assert.assertEquals(simpleName.name, "v1beta3.Binding");
43-
Assert.assertEquals(simpleName.classname, "v1beta3_binding.V1beta3Binding");
43+
Assert.assertEquals(simpleName.classname, "V1beta3Binding");
4444
Assert.assertEquals(simpleName.classVarName, "v1beta3_binding");
4545

4646
codegen.setOpenAPI(openAPI);
4747
final CodegenModel compoundName = codegen.fromModel("v1beta3.ComponentStatus", openAPI.getComponents().getSchemas().get("v1beta3.ComponentStatus"));
4848
Assert.assertEquals(compoundName.name, "v1beta3.ComponentStatus");
49-
Assert.assertEquals(compoundName.classname, "v1beta3_component_status.V1beta3ComponentStatus");
49+
Assert.assertEquals(compoundName.classname, "V1beta3ComponentStatus");
5050
Assert.assertEquals(compoundName.classVarName, "v1beta3_component_status");
5151

5252
final String path = "/api/v1beta3/namespaces/{namespaces}/bindings";
5353
final Operation operation = openAPI.getPaths().get(path).getPost();
5454
final CodegenOperation codegenOperation = codegen.fromOperation(path, "get", operation, null);
55-
Assert.assertEquals(codegenOperation.returnType, "v1beta3_binding.V1beta3Binding");
55+
Assert.assertEquals(codegenOperation.returnType, "V1beta3Binding");
5656
Assert.assertEquals(codegenOperation.returnBaseType, "V1beta3Binding");
5757
}
5858

@@ -71,7 +71,7 @@ public void simpleModelTest() {
7171
final CodegenModel cm = codegen.fromModel("sample", schema);
7272

7373
Assert.assertEquals(cm.name, "sample");
74-
Assert.assertEquals(cm.classname, "sample.Sample");
74+
Assert.assertEquals(cm.classname, "Sample");
7575
Assert.assertEquals(cm.description, "a sample model");
7676
Assert.assertEquals(cm.vars.size(), 3);
7777

@@ -119,7 +119,7 @@ public void listPropertyTest() {
119119
final CodegenModel cm = codegen.fromModel("sample", model);
120120

121121
Assert.assertEquals(cm.name, "sample");
122-
Assert.assertEquals(cm.classname, "sample.Sample");
122+
Assert.assertEquals(cm.classname, "Sample");
123123
Assert.assertEquals(cm.description, "a sample model");
124124
Assert.assertEquals(cm.vars.size(), 2);
125125

@@ -159,7 +159,7 @@ public void mapPropertyTest() {
159159
final CodegenModel cm = codegen.fromModel("sample", model);
160160

161161
Assert.assertEquals(cm.name, "sample");
162-
Assert.assertEquals(cm.classname, "sample.Sample");
162+
Assert.assertEquals(cm.classname, "Sample");
163163
Assert.assertEquals(cm.description, "a sample model");
164164
Assert.assertEquals(cm.vars.size(), 1);
165165

@@ -176,48 +176,60 @@ public void mapPropertyTest() {
176176

177177
@Test(description = "convert a model with complex property")
178178
public void complexPropertyTest() {
179+
final DefaultCodegen codegen = new PythonClientExperimentalCodegen();
180+
OpenAPI openAPI = TestUtils.createOpenAPI();
179181
final Schema model = new Schema()
180182
.description("a sample model")
181-
.addProperties("children", new Schema().$ref("#/definitions/Children"));
182-
final DefaultCodegen codegen = new PythonClientExperimentalCodegen();
183-
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
183+
.addProperties("children", new Schema().$ref("#/components/schemas/Children"));
184+
final Schema children = new Schema()
185+
.type("object")
186+
.addProperties("number", new Schema().type("integer"));
187+
openAPI.getComponents().addSchemas("sample", model);
188+
openAPI.getComponents().addSchemas("Children", children);
184189
codegen.setOpenAPI(openAPI);
190+
185191
final CodegenModel cm = codegen.fromModel("sample", model);
186192

187193
Assert.assertEquals(cm.name, "sample");
188-
Assert.assertEquals(cm.classname, "sample.Sample");
194+
Assert.assertEquals(cm.classname, "Sample");
189195
Assert.assertEquals(cm.description, "a sample model");
190196
Assert.assertEquals(cm.vars.size(), 1);
191197

192198
final CodegenProperty property1 = cm.vars.get(0);
193199
Assert.assertEquals(property1.baseName, "children");
194-
Assert.assertEquals(property1.dataType, "children.Children");
200+
Assert.assertEquals(property1.dataType, "Children");
195201
Assert.assertEquals(property1.name, "children");
196-
Assert.assertEquals(property1.baseType, "children.Children");
202+
Assert.assertEquals(property1.baseType, "Children");
197203
Assert.assertFalse(property1.required);
198204
Assert.assertFalse(property1.isContainer);
199205
}
200206

201207
@Test(description = "convert a model with complex list property")
202208
public void complexListPropertyTest() {
209+
final DefaultCodegen codegen = new PythonClientExperimentalCodegen();
210+
OpenAPI openAPI = TestUtils.createOpenAPI();
203211
final Schema model = new Schema()
204212
.description("a sample model")
205213
.addProperties("children", new ArraySchema()
206-
.items(new Schema().$ref("#/definitions/Children")));
207-
final DefaultCodegen codegen = new PythonClientExperimentalCodegen();
208-
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
214+
.items(new Schema().$ref("#/components/schemas/Children")));
215+
final Schema children = new Schema()
216+
.type("object")
217+
.addProperties("number", new Schema().type("integer"));
218+
openAPI.getComponents().addSchemas("sample", model);
219+
openAPI.getComponents().addSchemas("Children", children);
209220
codegen.setOpenAPI(openAPI);
221+
210222
final CodegenModel cm = codegen.fromModel("sample", model);
211223

212224
Assert.assertEquals(cm.name, "sample");
213-
Assert.assertEquals(cm.classname, "sample.Sample");
225+
Assert.assertEquals(cm.classname, "Sample");
214226
Assert.assertEquals(cm.description, "a sample model");
215227
Assert.assertEquals(cm.vars.size(), 1);
216228

217229
final CodegenProperty property1 = cm.vars.get(0);
218230
Assert.assertEquals(property1.baseName, "children");
219231
Assert.assertEquals(property1.complexType, "Children");
220-
Assert.assertEquals(property1.dataType, "[children.Children]");
232+
Assert.assertEquals(property1.dataType, "[Children]");
221233
Assert.assertEquals(property1.name, "children");
222234
Assert.assertEquals(property1.baseType, "list");
223235
Assert.assertEquals(property1.containerType, "array");
@@ -227,25 +239,31 @@ public void complexListPropertyTest() {
227239

228240
@Test(description = "convert a model with complex map property")
229241
public void complexMapPropertyTest() {
242+
final DefaultCodegen codegen = new PythonClientExperimentalCodegen();
243+
OpenAPI openAPI = TestUtils.createOpenAPI();
230244
final Schema model = new Schema()
231245
.description("a sample model")
232246
.addProperties("children", new MapSchema()
233-
.additionalProperties(new Schema().$ref("#/definitions/Children")));
234-
final DefaultCodegen codegen = new PythonClientExperimentalCodegen();
235-
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
247+
.additionalProperties(new Schema().$ref("#/components/schemas/Children")));
248+
final Schema children = new Schema()
249+
.type("object")
250+
.addProperties("number", new Schema().type("integer"));
251+
openAPI.getComponents().addSchemas("sample", model);
252+
openAPI.getComponents().addSchemas("Children", children);
236253
codegen.setOpenAPI(openAPI);
254+
237255
final CodegenModel cm = codegen.fromModel("sample", model);
238256

239257
Assert.assertEquals(cm.name, "sample");
240-
Assert.assertEquals(cm.classname, "sample.Sample");
258+
Assert.assertEquals(cm.classname, "Sample");
241259
Assert.assertEquals(cm.description, "a sample model");
242260
Assert.assertEquals(cm.vars.size(), 1);
243-
Assert.assertEquals(Sets.intersection(cm.imports, Sets.newHashSet("children.Children")).size(), 1);
261+
Assert.assertEquals(Sets.intersection(cm.imports, Sets.newHashSet("Children")).size(), 1);
244262

245263
final CodegenProperty property1 = cm.vars.get(0);
246264
Assert.assertEquals(property1.baseName, "children");
247265
Assert.assertEquals(property1.complexType, "Children");
248-
Assert.assertEquals(property1.dataType, "{str: (children.Children,)}");
266+
Assert.assertEquals(property1.dataType, "{str: (Children,)}");
249267
Assert.assertEquals(property1.name, "children");
250268
Assert.assertEquals(property1.baseType, "dict");
251269
Assert.assertEquals(property1.containerType, "map");
@@ -257,38 +275,48 @@ public void complexMapPropertyTest() {
257275
// should not start with 'null'. need help from the community to investigate further
258276
@Test(description = "convert an array model")
259277
public void arrayModelTest() {
278+
final DefaultCodegen codegen = new PythonClientExperimentalCodegen();
279+
OpenAPI openAPI = TestUtils.createOpenAPI();
260280
final Schema model = new ArraySchema()
261-
//.description()
262-
.items(new Schema().$ref("#/definitions/Children"))
281+
.items(new Schema().$ref("#/components/schemas/Children"))
263282
.description("an array model");
264-
final DefaultCodegen codegen = new PythonClientExperimentalCodegen();
265-
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
283+
final Schema children = new Schema()
284+
.type("object")
285+
.addProperties("number", new Schema().type("integer"));
286+
openAPI.getComponents().addSchemas("sample", model);
287+
openAPI.getComponents().addSchemas("Children", children);
266288
codegen.setOpenAPI(openAPI);
289+
267290
final CodegenModel cm = codegen.fromModel("sample", model);
268291

269292
Assert.assertEquals(cm.name, "sample");
270-
Assert.assertEquals(cm.classname, "sample.Sample");
293+
Assert.assertEquals(cm.classname, "Sample");
271294
Assert.assertEquals(cm.classVarName, "sample");
272295
Assert.assertEquals(cm.description, "an array model");
273296
Assert.assertEquals(cm.vars.size(), 0); // the array model has no vars
274297
Assert.assertEquals(cm.parent, "list");
275298
Assert.assertEquals(cm.imports.size(), 1);
276-
Assert.assertEquals(Sets.intersection(cm.imports, Sets.newHashSet("children.Children")).size(), 1);
299+
Assert.assertEquals(Sets.intersection(cm.imports, Sets.newHashSet("Children")).size(), 1);
277300
}
278301

279302
// should not start with 'null'. need help from the community to investigate further
280303
@Test(description = "convert a map model")
281304
public void mapModelTest() {
282-
final Schema model = new Schema()
283-
.description("a map model")
284-
.additionalProperties(new Schema().$ref("#/definitions/Children"));
285305
final DefaultCodegen codegen = new PythonClientExperimentalCodegen();
286-
OpenAPI openAPI = TestUtils.createOpenAPIWithOneSchema("sample", model);
306+
OpenAPI openAPI = TestUtils.createOpenAPI();
307+
final Schema sample = new Schema()
308+
.description("a map model")
309+
.additionalProperties(new Schema().$ref("#/components/schemas/Children"));
310+
final Schema children = new Schema()
311+
.type("object")
312+
.addProperties("number", new Schema().type("integer"));
313+
openAPI.getComponents().addSchemas("sample", sample);
314+
openAPI.getComponents().addSchemas("Children", children);
287315
codegen.setOpenAPI(openAPI);
288-
final CodegenModel cm = codegen.fromModel("sample", model);
316+
final CodegenModel cm = codegen.fromModel("sample", sample);
289317

290318
Assert.assertEquals(cm.name, "sample");
291-
Assert.assertEquals(cm.classname, "sample.Sample");
319+
Assert.assertEquals(cm.classname, "Sample");
292320
Assert.assertEquals(cm.description, "a map model");
293321
Assert.assertEquals(cm.vars.size(), 0);
294322
Assert.assertEquals(cm.parent, null);

0 commit comments

Comments
 (0)