Skip to content

Commit 65c77a5

Browse files
committed
fixed duplicate property names
1 parent 3c664d1 commit 65c77a5

File tree

224 files changed

+16481
-5
lines changed

Some content is hidden

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

224 files changed

+16481
-5
lines changed

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

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -625,10 +625,11 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
625625

626626
CodegenComposedSchemas composedSchemas = model.getComposedSchemas();
627627
if (composedSchemas != null) {
628+
Set<String> composedPropertyNames = new HashSet<String>();
628629
List<CodegenProperty> allOf = composedSchemas.getAllOf();
629630
if (allOf != null) {
630631
for (CodegenProperty property : allOf) {
631-
property.name = patchPropertyName(model, camelize(property.baseType));
632+
property.name = patchPropertyName(model, camelize(property.baseType), composedPropertyNames);
632633
patchPropertyVendorExtensions(property);
633634
}
634635
}
@@ -637,7 +638,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
637638
if (anyOf != null) {
638639
removePropertiesDeclaredInComposedTypes(objs, model, anyOf);
639640
for (CodegenProperty property : anyOf) {
640-
property.name = patchPropertyName(model, camelize(property.baseType));
641+
property.name = patchPropertyName(model, camelize(property.baseType), composedPropertyNames);
641642
property.isNullable = true;
642643
patchPropertyVendorExtensions(property);
643644
property.vendorExtensions.put("x-base-name", model.name.substring(model.name.lastIndexOf('_') + 1));
@@ -648,7 +649,7 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
648649
if (oneOf != null) {
649650
removePropertiesDeclaredInComposedTypes(objs, model, oneOf);
650651
for (CodegenProperty property : oneOf) {
651-
property.name = patchPropertyName(model, camelize(property.baseType));
652+
property.name = patchPropertyName(model, camelize(property.baseType), composedPropertyNames);
652653
property.isNullable = true;
653654
patchPropertyVendorExtensions(property);
654655
property.vendorExtensions.put("x-base-name", model.name.substring(model.name.lastIndexOf('_') + 1));
@@ -715,13 +716,27 @@ private boolean modelIsMutable(CodegenModel model, Set<String> processed) {
715716
protected void removePropertiesDeclaredInComposedTypes(Map<String, ModelsMap> objs, CodegenModel model, List<CodegenProperty> composedProperties) {
716717
}
717718

718-
private String patchPropertyName(CodegenModel model, String value) {
719+
private String patchPropertyName(CodegenModel model, String value, Set<String> composedPropertyNames) {
719720
String name = escapeReservedWord(model, value);
720721

721722
if (name.startsWith(AbstractCSharpCodegen.invalidParameterNamePrefix)) {
722723
name = AbstractCSharpCodegen.invalidPropertyNamePrefix + name.substring(AbstractCSharpCodegen.invalidParameterNamePrefix.length());
723724
}
724725

726+
// ensure the name we use for a composed property does not already exist as a property or composed property
727+
// only do this if the set of composed property names was provided to ensure this method is idempotent
728+
// we would not calling this method multiple times to result in different values
729+
if (composedPropertyNames != null) {
730+
String tmpName = name;
731+
long count = model.allVars.stream().map(v -> v.name).filter(n -> n.equals(tmpName)).count() + composedPropertyNames.stream().filter(n -> n.equals(tmpName)).count();
732+
733+
if (count > 0) {
734+
name = name + count++;
735+
}
736+
737+
composedPropertyNames.add(name);
738+
}
739+
725740
return name;
726741
}
727742

@@ -753,7 +768,7 @@ protected void patchProperty(Map<String, CodegenModel> enumRefs, CodegenModel mo
753768

754769
patchPropertyVendorExtensions(property);
755770

756-
property.name = patchPropertyName(model, property.name);
771+
property.name = patchPropertyName(model, property.name, null);
757772

758773
String[] nestedTypes = {"List", "Collection", "ICollection", "Dictionary"};
759774

modules/openapi-generator/src/test/resources/3_0/csharp/petstore-with-fake-endpoints-models-for-testing-with-http-signature.yaml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,24 @@ tags:
1717
- name: user
1818
description: Operations about user
1919
paths:
20+
/one-of-array:
21+
post:
22+
description: Oneof array test
23+
operationId: oneOfArray
24+
requestBody:
25+
content:
26+
application/json:
27+
schema:
28+
oneOf:
29+
- items:
30+
type: string
31+
type: array
32+
- items:
33+
$ref: '#/components/schemas/TestObject'
34+
type: array
35+
responses:
36+
"204":
37+
description: Successful operation
2038
/roles/report:
2139
get:
2240
responses:
@@ -2929,3 +2947,8 @@ components:
29292947
enum:
29302948
- APPROVED
29312949
- MANUAL_APPROVAL_REQUIRED
2950+
TestObject:
2951+
properties:
2952+
name:
2953+
type: string
2954+
type: object

samples/client/petstore/csharp/generichost/net4.7/FormModels/.openapi-generator/FILES

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ docs/models/NullableGuidClass.md
8181
docs/models/NullableShape.md
8282
docs/models/NumberOnly.md
8383
docs/models/ObjectWithDeprecatedFields.md
84+
docs/models/OneOfArrayRequest.md
8485
docs/models/OneOfString.md
8586
docs/models/Order.md
8687
docs/models/OrderStatus.md
@@ -126,6 +127,7 @@ docs/models/TestEnumParametersEnumQueryIntegerParameter.md
126127
docs/models/TestEnumParametersRequestEnumFormString.md
127128
docs/models/TestEnumParametersRequestEnumFormStringArrayInner.md
128129
docs/models/TestInlineFreeformAdditionalPropertiesRequest.md
130+
docs/models/TestObject.md
129131
docs/models/TestResult.md
130132
docs/models/TestResultCode.md
131133
docs/models/Triangle.md
@@ -246,6 +248,7 @@ src/Org.OpenAPITools/Model/NullableGuidClass.cs
246248
src/Org.OpenAPITools/Model/NullableShape.cs
247249
src/Org.OpenAPITools/Model/NumberOnly.cs
248250
src/Org.OpenAPITools/Model/ObjectWithDeprecatedFields.cs
251+
src/Org.OpenAPITools/Model/OneOfArrayRequest.cs
249252
src/Org.OpenAPITools/Model/OneOfString.cs
250253
src/Org.OpenAPITools/Model/Order.cs
251254
src/Org.OpenAPITools/Model/OrderStatus.cs
@@ -291,6 +294,7 @@ src/Org.OpenAPITools/Model/TestEnumParametersEnumQueryIntegerParameter.cs
291294
src/Org.OpenAPITools/Model/TestEnumParametersRequestEnumFormString.cs
292295
src/Org.OpenAPITools/Model/TestEnumParametersRequestEnumFormStringArrayInner.cs
293296
src/Org.OpenAPITools/Model/TestInlineFreeformAdditionalPropertiesRequest.cs
297+
src/Org.OpenAPITools/Model/TestObject.cs
294298
src/Org.OpenAPITools/Model/TestResult.cs
295299
src/Org.OpenAPITools/Model/TestResultCode.cs
296300
src/Org.OpenAPITools/Model/Triangle.cs

samples/client/petstore/csharp/generichost/net4.7/FormModels/api/openapi.yaml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,18 @@ tags:
4141
- description: Operations about user
4242
name: user
4343
paths:
44+
/one-of-array:
45+
post:
46+
description: Oneof array test
47+
operationId: oneOfArray
48+
requestBody:
49+
content:
50+
application/json:
51+
schema:
52+
$ref: '#/components/schemas/oneOfArray_request'
53+
responses:
54+
"204":
55+
description: Successful operation
4456
/roles/report:
4557
get:
4658
responses:
@@ -2682,6 +2694,19 @@ components:
26822694
- APPROVED
26832695
- MANUAL_APPROVAL_REQUIRED
26842696
type: string
2697+
TestObject:
2698+
properties:
2699+
name:
2700+
type: string
2701+
type: object
2702+
oneOfArray_request:
2703+
oneOf:
2704+
- items:
2705+
type: string
2706+
type: array
2707+
- items:
2708+
$ref: '#/components/schemas/TestObject'
2709+
type: array
26852710
_foo_get_default_response:
26862711
example:
26872712
string:

samples/client/petstore/csharp/generichost/net4.7/FormModels/docs/apis/DefaultApi.md

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ All URIs are relative to *http://petstore.swagger.io:80/v2*
77
| [**FooGet**](DefaultApi.md#fooget) | **GET** /foo | |
88
| [**GetCountry**](DefaultApi.md#getcountry) | **POST** /country | |
99
| [**Hello**](DefaultApi.md#hello) | **GET** /hello | Hello |
10+
| [**OneOfArray**](DefaultApi.md#oneofarray) | **POST** /one-of-array | |
1011
| [**RolesReportGet**](DefaultApi.md#rolesreportget) | **GET** /roles/report | |
1112
| [**Test**](DefaultApi.md#test) | **GET** /test | Retrieve an existing Notificationtest&#39;s Elements |
1213

@@ -261,6 +262,91 @@ No authorization required
261262

262263
[[Back to top]](#) [[Back to API list]](../../README.md#documentation-for-api-endpoints) [[Back to Model list]](../../README.md#documentation-for-models) [[Back to README]](../../README.md)
263264

265+
<a id="oneofarray"></a>
266+
# **OneOfArray**
267+
> void OneOfArray (OneOfArrayRequest oneOfArrayRequest = null)
268+
269+
270+
271+
Oneof array test
272+
273+
### Example
274+
```csharp
275+
using System.Collections.Generic;
276+
using System.Diagnostics;
277+
using Org.OpenAPITools.Api;
278+
using Org.OpenAPITools.Client;
279+
using Org.OpenAPITools.Model;
280+
281+
namespace Example
282+
{
283+
public class OneOfArrayExample
284+
{
285+
public static void Main()
286+
{
287+
Configuration config = new Configuration();
288+
config.BasePath = "http://petstore.swagger.io:80/v2";
289+
var apiInstance = new DefaultApi(config);
290+
var oneOfArrayRequest = new OneOfArrayRequest(); // OneOfArrayRequest | (optional)
291+
292+
try
293+
{
294+
apiInstance.OneOfArray(oneOfArrayRequest);
295+
}
296+
catch (ApiException e)
297+
{
298+
Debug.Print("Exception when calling DefaultApi.OneOfArray: " + e.Message);
299+
Debug.Print("Status Code: " + e.ErrorCode);
300+
Debug.Print(e.StackTrace);
301+
}
302+
}
303+
}
304+
}
305+
```
306+
307+
#### Using the OneOfArrayWithHttpInfo variant
308+
This returns an ApiResponse object which contains the response data, status code and headers.
309+
310+
```csharp
311+
try
312+
{
313+
apiInstance.OneOfArrayWithHttpInfo(oneOfArrayRequest);
314+
}
315+
catch (ApiException e)
316+
{
317+
Debug.Print("Exception when calling DefaultApi.OneOfArrayWithHttpInfo: " + e.Message);
318+
Debug.Print("Status Code: " + e.ErrorCode);
319+
Debug.Print(e.StackTrace);
320+
}
321+
```
322+
323+
### Parameters
324+
325+
| Name | Type | Description | Notes |
326+
|------|------|-------------|-------|
327+
| **oneOfArrayRequest** | [**OneOfArrayRequest**](OneOfArrayRequest.md) | | [optional] |
328+
329+
### Return type
330+
331+
void (empty response body)
332+
333+
### Authorization
334+
335+
No authorization required
336+
337+
### HTTP request headers
338+
339+
- **Content-Type**: application/json
340+
- **Accept**: Not defined
341+
342+
343+
### HTTP response details
344+
| Status code | Description | Response headers |
345+
|-------------|-------------|------------------|
346+
| **204** | Successful operation | - |
347+
348+
[[Back to top]](#) [[Back to API list]](../../README.md#documentation-for-api-endpoints) [[Back to Model list]](../../README.md#documentation-for-models) [[Back to README]](../../README.md)
349+
264350
<a id="rolesreportget"></a>
265351
# **RolesReportGet**
266352
> List&lt;List&lt;RolesReportsHash&gt;&gt; RolesReportGet ()
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Org.OpenAPITools.Model.OneOfArrayRequest
2+
3+
## Properties
4+
5+
Name | Type | Description | Notes
6+
------------ | ------------- | ------------- | -------------
7+
8+
[[Back to Model list]](../../README.md#documentation-for-models) [[Back to API list]](../../README.md#documentation-for-api-endpoints) [[Back to README]](../../README.md)
9+
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# Org.OpenAPITools.Model.TestObject
2+
3+
## Properties
4+
5+
Name | Type | Description | Notes
6+
------------ | ------------- | ------------- | -------------
7+
**Name** | **string** | | [optional]
8+
9+
[[Back to Model list]](../../README.md#documentation-for-models) [[Back to API list]](../../README.md#documentation-for-api-endpoints) [[Back to README]](../../README.md)
10+

samples/client/petstore/csharp/generichost/net4.7/FormModels/src/Org.OpenAPITools.Test/Api/DefaultApiTests.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ public async Task HelloAsyncTest()
8282
Assert.IsType<List<Guid>>(model);
8383
}
8484

85+
/// <summary>
86+
/// Test OneOfArray
87+
/// </summary>
88+
[Fact (Skip = "not implemented")]
89+
public async Task OneOfArrayAsyncTest()
90+
{
91+
Client.Option<OneOfArrayRequest> oneOfArrayRequest = default;
92+
await _instance.OneOfArrayAsync(oneOfArrayRequest);
93+
}
94+
8595
/// <summary>
8696
/// Test RolesReportGet
8797
/// </summary>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* OpenAPI Petstore
3+
*
4+
* This spec is mainly for testing Petstore server and contains fake endpoints, models. Please do not use this for any other purpose. Special characters: \" \\
5+
*
6+
* The version of the OpenAPI document: 1.0.0
7+
* Generated by: https://github.com/openapitools/openapi-generator.git
8+
*/
9+
10+
11+
using Xunit;
12+
13+
using System;
14+
using System.Linq;
15+
using System.IO;
16+
using System.Collections.Generic;
17+
using Org.OpenAPITools.Model;
18+
using Org.OpenAPITools.Client;
19+
using System.Reflection;
20+
21+
namespace Org.OpenAPITools.Test.Model
22+
{
23+
/// <summary>
24+
/// Class for testing OneOfArrayRequest
25+
/// </summary>
26+
/// <remarks>
27+
/// This file is automatically generated by OpenAPI Generator (https://openapi-generator.tech).
28+
/// Please update the test case below to test the model.
29+
/// </remarks>
30+
public class OneOfArrayRequestTests : IDisposable
31+
{
32+
// TODO uncomment below to declare an instance variable for OneOfArrayRequest
33+
//private OneOfArrayRequest instance;
34+
35+
public OneOfArrayRequestTests()
36+
{
37+
// TODO uncomment below to create an instance of OneOfArrayRequest
38+
//instance = new OneOfArrayRequest();
39+
}
40+
41+
public void Dispose()
42+
{
43+
// Cleanup when everything is done.
44+
}
45+
46+
/// <summary>
47+
/// Test an instance of OneOfArrayRequest
48+
/// </summary>
49+
[Fact]
50+
public void OneOfArrayRequestInstanceTest()
51+
{
52+
// TODO uncomment below to test "IsType" OneOfArrayRequest
53+
//Assert.IsType<OneOfArrayRequest>(instance);
54+
}
55+
}
56+
}

0 commit comments

Comments
 (0)