forked from loafle/openapi-generator-original
* Cases previously generated as "case type[Int]([Int])" become "case typeArrayOfInt([Int])"
This commit is contained in:
parent
187af2ec4e
commit
e553180c06
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
package org.openapitools.codegen.languages;
|
package org.openapitools.codegen.languages;
|
||||||
|
|
||||||
|
import com.samskivert.mustache.Mustache;
|
||||||
import io.swagger.v3.oas.models.media.Schema;
|
import io.swagger.v3.oas.models.media.Schema;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
@ -608,6 +609,11 @@ public class Swift6ClientCodegen extends DefaultCodegen implements CodegenConfig
|
|||||||
}
|
}
|
||||||
additionalProperties.put(COMBINE_DEFERRED, combineDeferred);
|
additionalProperties.put(COMBINE_DEFERRED, combineDeferred);
|
||||||
|
|
||||||
|
additionalProperties.put("transformArrayType", (Mustache.Lambda) (frag, out) -> {
|
||||||
|
String type = frag.execute();
|
||||||
|
out.write(transformArrayTypeName(type));
|
||||||
|
});
|
||||||
|
|
||||||
// infrastructure destination folder
|
// infrastructure destination folder
|
||||||
final String infrastructureFolder = sourceFolder + File.separator + "Infrastructure";
|
final String infrastructureFolder = sourceFolder + File.separator + "Infrastructure";
|
||||||
|
|
||||||
@ -1090,6 +1096,17 @@ public class Swift6ClientCodegen extends DefaultCodegen implements CodegenConfig
|
|||||||
LOWERCASE_FIRST_LETTER);
|
LOWERCASE_FIRST_LETTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String transformArrayTypeName(String type) {
|
||||||
|
if (!type.startsWith("[") || !type.endsWith("]")) {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
String innerType = type.substring(1, type.length() - 1);
|
||||||
|
String transformed = transformArrayTypeName(innerType);
|
||||||
|
|
||||||
|
return "ArrayOf" + transformed;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private Boolean isLanguageSpecificType(String name) {
|
private Boolean isLanguageSpecificType(String name) {
|
||||||
return languageSpecificPrimitives.contains(name);
|
return languageSpecificPrimitives.contains(name);
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum {{classname}}: {{^useClasses}}Sendable, {{/useClasses}}{{#useClasses}}{{#readonlyProperties}}Sendable, {{/readonlyProperties}}{{/useClasses}}{{#useVapor}}Content{{/useVapor}}{{^useVapor}}Codable, JSONEncodable{{#vendorExtensions.x-swift-hashable}}, Hashable{{/vendorExtensions.x-swift-hashable}}{{/useVapor}} {
|
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} enum {{classname}}: {{^useClasses}}Sendable, {{/useClasses}}{{#useClasses}}{{#readonlyProperties}}Sendable, {{/readonlyProperties}}{{/useClasses}}{{#useVapor}}Content{{/useVapor}}{{^useVapor}}Codable, JSONEncodable{{#vendorExtensions.x-swift-hashable}}, Hashable{{/vendorExtensions.x-swift-hashable}}{{/useVapor}} {
|
||||||
{{#oneOf}}
|
{{#oneOf}}
|
||||||
case type{{.}}({{.}})
|
case type{{#transformArrayType}}{{.}}{{/transformArrayType}}({{.}})
|
||||||
{{/oneOf}}
|
{{/oneOf}}
|
||||||
{{#oneOfUnknownDefaultCase}}
|
{{#oneOfUnknownDefaultCase}}
|
||||||
case unknownDefaultOpenApi
|
case unknownDefaultOpenApi
|
||||||
@ -10,7 +10,7 @@
|
|||||||
var container = encoder.singleValueContainer()
|
var container = encoder.singleValueContainer()
|
||||||
switch self {
|
switch self {
|
||||||
{{#oneOf}}
|
{{#oneOf}}
|
||||||
case .type{{.}}(let value):
|
case .type{{#transformArrayType}}{{.}}{{/transformArrayType}}(let value):
|
||||||
try container.encode(value)
|
try container.encode(value)
|
||||||
{{/oneOf}}
|
{{/oneOf}}
|
||||||
{{#oneOfUnknownDefaultCase}}
|
{{#oneOfUnknownDefaultCase}}
|
||||||
@ -29,7 +29,7 @@
|
|||||||
{{^-first}}
|
{{^-first}}
|
||||||
} else if let value = try? container.decode({{.}}.self) {
|
} else if let value = try? container.decode({{.}}.self) {
|
||||||
{{/-first}}
|
{{/-first}}
|
||||||
self = .type{{.}}(value)
|
self = .type{{#transformArrayType}}{{.}}{{/transformArrayType}}(value)
|
||||||
{{/oneOf}}
|
{{/oneOf}}
|
||||||
} else {
|
} else {
|
||||||
{{#oneOfUnknownDefaultCase}}
|
{{#oneOfUnknownDefaultCase}}
|
||||||
|
@ -65,6 +65,13 @@ public class Swift6ClientCodegenTest {
|
|||||||
Assert.assertEquals(swiftCodegen.toEnumVarName("value", null), "value");
|
Assert.assertEquals(swiftCodegen.toEnumVarName("value", null), "value");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(enabled = true)
|
||||||
|
public void testArrayTypeTransformations() throws Exception {
|
||||||
|
Assert.assertEquals(swiftCodegen.transformArrayTypeName("[Int]"), "ArrayOfInt");
|
||||||
|
Assert.assertEquals(swiftCodegen.transformArrayTypeName("[[Int]]"), "ArrayOfArrayOfInt");
|
||||||
|
Assert.assertEquals(swiftCodegen.transformArrayTypeName("String"), "String");
|
||||||
|
}
|
||||||
|
|
||||||
@Test(enabled = true)
|
@Test(enabled = true)
|
||||||
public void testCapitalsWithUnderscore() throws Exception {
|
public void testCapitalsWithUnderscore() throws Exception {
|
||||||
Assert.assertEquals(swiftCodegen.toEnumVarName("ENTRY_NAME", null), "entryName");
|
Assert.assertEquals(swiftCodegen.toEnumVarName("ENTRY_NAME", null), "entryName");
|
||||||
@ -319,4 +326,41 @@ public class Swift6ClientCodegenTest {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test(description = "Array type name transformation in oneOf schema", enabled = true)
|
||||||
|
public void oneOfArrayTypeNamesTest() throws IOException {
|
||||||
|
Path target = Files.createTempDirectory("test");
|
||||||
|
File output = target.toFile();
|
||||||
|
try {
|
||||||
|
final CodegenConfigurator configurator = new CodegenConfigurator()
|
||||||
|
.setGeneratorName("swift6")
|
||||||
|
.setValidateSpec(false)
|
||||||
|
.setInputSpec("src/test/resources/bugs/issue_20560.yaml")
|
||||||
|
.setEnablePostProcessFile(true)
|
||||||
|
.setOutputDir(target.toAbsolutePath().toString());
|
||||||
|
|
||||||
|
final ClientOptInput clientOptInput = configurator.toClientOptInput();
|
||||||
|
DefaultGenerator generator = new DefaultGenerator(false);
|
||||||
|
|
||||||
|
generator.setGeneratorPropertyDefault(CodegenConstants.MODELS, "true");
|
||||||
|
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_TESTS, "false");
|
||||||
|
generator.setGeneratorPropertyDefault(CodegenConstants.MODEL_DOCS, "false");
|
||||||
|
generator.setGeneratorPropertyDefault(CodegenConstants.APIS, "false");
|
||||||
|
generator.setGeneratorPropertyDefault(CodegenConstants.SUPPORTING_FILES, "false");
|
||||||
|
|
||||||
|
List<File> files = generator.opts(clientOptInput).generate();
|
||||||
|
|
||||||
|
File modelFile = files.stream()
|
||||||
|
.filter(f -> f.getName().contains("CreateCompletionRequestPrompt"))
|
||||||
|
.findFirst()
|
||||||
|
.get();
|
||||||
|
|
||||||
|
String content = Files.readString(modelFile.toPath());
|
||||||
|
Assert.assertTrue(content.contains("case typeString(String)"));
|
||||||
|
Assert.assertTrue(content.contains("case typeArrayOfInt([Int])"));
|
||||||
|
Assert.assertTrue(content.contains("case typeArrayOfString([String])"));
|
||||||
|
Assert.assertTrue(content.contains("case typeArrayOfArrayOfInt([[Int]])"));
|
||||||
|
} finally {
|
||||||
|
output.deleteOnExit();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,162 @@
|
|||||||
|
openapi: 3.0.0
|
||||||
|
info:
|
||||||
|
title: Completions API
|
||||||
|
version: 1.0.0
|
||||||
|
description: API for generating text completions
|
||||||
|
|
||||||
|
paths:
|
||||||
|
/completions:
|
||||||
|
post:
|
||||||
|
summary: Create a completion
|
||||||
|
operationId: createCompletion
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/CreateCompletionRequest'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: Successful completion response
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
# Note: Full response schema would be defined here
|
||||||
|
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
CreateCompletionRequest:
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- model
|
||||||
|
- prompt
|
||||||
|
properties:
|
||||||
|
model:
|
||||||
|
description: ID of the model to use
|
||||||
|
anyOf:
|
||||||
|
- type: string
|
||||||
|
- type: string
|
||||||
|
enum:
|
||||||
|
- gpt-3.5-turbo-instruct
|
||||||
|
- davinci-002
|
||||||
|
- babbage-002
|
||||||
|
prompt:
|
||||||
|
description: The prompt(s) to generate completions for
|
||||||
|
default: <|endoftext|>
|
||||||
|
oneOf:
|
||||||
|
- type: string
|
||||||
|
default: ""
|
||||||
|
example: This is a test.
|
||||||
|
- type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
default: ""
|
||||||
|
example: This is a test.
|
||||||
|
- type: array
|
||||||
|
minItems: 1
|
||||||
|
items:
|
||||||
|
type: integer
|
||||||
|
example: "[1212, 318, 257, 1332, 13]"
|
||||||
|
- type: array
|
||||||
|
minItems: 1
|
||||||
|
items:
|
||||||
|
type: array
|
||||||
|
minItems: 1
|
||||||
|
items:
|
||||||
|
type: integer
|
||||||
|
example: "[[1212, 318, 257, 1332, 13]]"
|
||||||
|
max_tokens:
|
||||||
|
type: integer
|
||||||
|
minimum: 0
|
||||||
|
default: 16
|
||||||
|
nullable: true
|
||||||
|
description: The maximum number of tokens that can be generated in the completion
|
||||||
|
temperature:
|
||||||
|
type: number
|
||||||
|
minimum: 0
|
||||||
|
maximum: 2
|
||||||
|
default: 1
|
||||||
|
nullable: true
|
||||||
|
description: What sampling temperature to use, between 0 and 2
|
||||||
|
top_p:
|
||||||
|
type: number
|
||||||
|
minimum: 0
|
||||||
|
maximum: 1
|
||||||
|
default: 1
|
||||||
|
nullable: true
|
||||||
|
description: An alternative to sampling with temperature, called nucleus sampling
|
||||||
|
n:
|
||||||
|
type: integer
|
||||||
|
minimum: 1
|
||||||
|
maximum: 128
|
||||||
|
default: 1
|
||||||
|
nullable: true
|
||||||
|
description: How many completions to generate for each prompt
|
||||||
|
stream:
|
||||||
|
type: boolean
|
||||||
|
nullable: true
|
||||||
|
default: false
|
||||||
|
description: Whether to stream back partial progress
|
||||||
|
logprobs:
|
||||||
|
type: integer
|
||||||
|
minimum: 0
|
||||||
|
maximum: 5
|
||||||
|
nullable: true
|
||||||
|
description: Include the log probabilities on the most likely output tokens
|
||||||
|
echo:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
nullable: true
|
||||||
|
description: Echo back the prompt in addition to the completion
|
||||||
|
stop:
|
||||||
|
description: Up to 4 sequences where the API will stop generating further tokens
|
||||||
|
nullable: true
|
||||||
|
oneOf:
|
||||||
|
- type: string
|
||||||
|
example: "\n"
|
||||||
|
- type: array
|
||||||
|
minItems: 1
|
||||||
|
maxItems: 4
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
presence_penalty:
|
||||||
|
type: number
|
||||||
|
default: 0
|
||||||
|
minimum: -2
|
||||||
|
maximum: 2
|
||||||
|
nullable: true
|
||||||
|
description: Number between -2.0 and 2.0 for presence-based penalty
|
||||||
|
frequency_penalty:
|
||||||
|
type: number
|
||||||
|
default: 0
|
||||||
|
minimum: -2
|
||||||
|
maximum: 2
|
||||||
|
nullable: true
|
||||||
|
description: Number between -2.0 and 2.0 for frequency-based penalty
|
||||||
|
best_of:
|
||||||
|
type: integer
|
||||||
|
default: 1
|
||||||
|
minimum: 0
|
||||||
|
maximum: 20
|
||||||
|
nullable: true
|
||||||
|
description: Number of completions to generate server-side
|
||||||
|
logit_bias:
|
||||||
|
type: object
|
||||||
|
nullable: true
|
||||||
|
additionalProperties:
|
||||||
|
type: integer
|
||||||
|
description: Modify the likelihood of specified tokens appearing
|
||||||
|
user:
|
||||||
|
type: string
|
||||||
|
example: user-1234
|
||||||
|
description: A unique identifier representing your end-user
|
||||||
|
seed:
|
||||||
|
type: integer
|
||||||
|
format: int64
|
||||||
|
nullable: true
|
||||||
|
description: Seed for deterministic sampling
|
||||||
|
suffix:
|
||||||
|
type: string
|
||||||
|
nullable: true
|
||||||
|
description: The suffix that comes after a completion of inserted text
|
Loading…
x
Reference in New Issue
Block a user