From 129b033931729d0121a9c1da116c97213adbccf6 Mon Sep 17 00:00:00 2001 From: Marc LE BIHAN Date: Fri, 26 Apr 2024 03:02:48 +0200 Subject: [PATCH] [BUG] [C++][Pistache] cpp-pistache-server generating API include undefined "Object.h" (#2769) Should handle Object.h, AnyType.h correctly. Set.h also tested. - #include Object.h removed and replaced by a typeMapping.put(object, nlohmann::json) like suggested in other issues - object had an invalid syntax: ':' instead of '::' in types with namespace - extra include of #include nlohmann/json.h removed when there's already #include - nlohmann::json is excluded from model namespace Tested with custom petstore played, with suggested openapi specs coming from issues #2769, #10266, #14234 ```bash rm -rf samples/server/petstore/cpp-pistache-everything/ && ./bin/generate-samples.sh ./bin/configs/cpp-pistache-server-cpp-pistache-everything.yaml && cd samples/server/petstore/cpp-pistache-everything/ && mkdir build && cd build && cmake .. && cmake --build . --parallel ``` --- ...stache-server-cpp-pistache-everything.yaml | 7 + .../languages/CppPistacheServerCodegen.java | 93 +- .../cpppistache/AbstractGeneratorsTest.java | 70 ++ .../cpppistache/ObjectAnyTypeSetTest.java | 62 ++ .../codegen/cpppistache/README.md | 2 + ...nytype-object-set-petstore-everything.yaml | 815 ++++++++++++++++++ .../petstore/cpp-pistache/install_pistache.sh | 11 +- 7 files changed, 1028 insertions(+), 32 deletions(-) create mode 100644 bin/configs/cpp-pistache-server-cpp-pistache-everything.yaml create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/AbstractGeneratorsTest.java create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/ObjectAnyTypeSetTest.java create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/README.md create mode 100644 modules/openapi-generator/src/test/resources/3_0/issues-anytype-object-set-petstore-everything.yaml diff --git a/bin/configs/cpp-pistache-server-cpp-pistache-everything.yaml b/bin/configs/cpp-pistache-server-cpp-pistache-everything.yaml new file mode 100644 index 0000000000000..b18ff7270d94f --- /dev/null +++ b/bin/configs/cpp-pistache-server-cpp-pistache-everything.yaml @@ -0,0 +1,7 @@ +generatorName: cpp-pistache-server +outputDir: samples/server/petstore/cpp-pistache-everything +inputSpec: modules/openapi-generator/src/test/resources/3_0/issues-anytype-object-set-petstore-everything.yaml +templateDir: modules/openapi-generator/src/main/resources/cpp-pistache-server +additionalProperties: + useStructModel: "false" + addExternalLibs: "true" diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java index fe823fc600c6e..92638aaec3c88 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/CppPistacheServerCodegen.java @@ -18,7 +18,6 @@ package org.openapitools.codegen.languages; import io.swagger.v3.oas.models.Operation; -import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.servers.Server; @@ -53,6 +52,27 @@ public class CppPistacheServerCodegen extends AbstractCppCodegen { protected final String PREFIX = ""; protected String helpersPackage = ""; + /** OpenApi types that shouldn't have a namespace added with getTypeDeclaration() at generation time (for nlohmann::json) */ + private final Set openAPITypesWithoutModelNamespace = new HashSet<>(); + + /** int32_t (for integer) */ + private static final String INT32_T = "int32_t"; + + /** int64_t (for long) */ + private static final String INT64_T = "int64_t"; + + /** nlohmann::json (for object, AnyType) */ + private static final String NLOHMANN_JSON = "nlohmann::json"; + + /** std:string (for date, DateTime, string, file, binary, UUID, URI, ByteArray) */ + private static final String STD_STRING = "std::string"; + + /** std:map (for map) */ + private static final String STD_MAP = "std::map"; + + /** std:vector (for array, set) */ + private static final String STD_VECTOR = "std::vector"; + @Override public CodegenType getTag() { return CodegenType.SERVER; @@ -117,33 +137,35 @@ public CppPistacheServerCodegen() { setupSupportingFiles(); languageSpecificPrimitives = new HashSet<>( - Arrays.asList("int", "char", "bool", "long", "float", "double", "int32_t", "int64_t")); + Arrays.asList("int", "char", "bool", "long", "float", "double", INT32_T, INT64_T)); typeMapping = new HashMap<>(); - typeMapping.put("date", "std::string"); - typeMapping.put("DateTime", "std::string"); - typeMapping.put("string", "std::string"); - typeMapping.put("integer", "int32_t"); - typeMapping.put("long", "int64_t"); + typeMapping.put("date", STD_STRING); + typeMapping.put("DateTime", STD_STRING); + typeMapping.put("string", STD_STRING); + typeMapping.put("integer", INT32_T); + typeMapping.put("long", INT64_T); typeMapping.put("boolean", "bool"); - typeMapping.put("array", "std::vector"); - typeMapping.put("map", "std::map"); - typeMapping.put("set", "std::vector"); - typeMapping.put("file", "std::string"); - typeMapping.put("object", "Object"); - typeMapping.put("binary", "std::string"); + typeMapping.put("array", STD_VECTOR); + typeMapping.put("map", STD_MAP); + typeMapping.put("set", STD_VECTOR); + typeMapping.put("file", STD_STRING); + typeMapping.put("object", NLOHMANN_JSON); + typeMapping.put("binary", STD_STRING); typeMapping.put("number", "double"); - typeMapping.put("UUID", "std::string"); - typeMapping.put("URI", "std::string"); - typeMapping.put("ByteArray", "std::string"); - typeMapping.put("AnyType", "nlohmann::json"); + typeMapping.put("UUID", STD_STRING); + typeMapping.put("URI", STD_STRING); + typeMapping.put("ByteArray", STD_STRING); + typeMapping.put("AnyType", NLOHMANN_JSON); super.importMapping = new HashMap<>(); - importMapping.put("std::vector", "#include "); - importMapping.put("std::map", "#include "); - importMapping.put("std::string", "#include "); - importMapping.put("Object", "#include \"Object.h\""); - importMapping.put("nlohmann::json", "#include "); + importMapping.put(STD_VECTOR, "#include "); + importMapping.put(STD_MAP, "#include "); + importMapping.put(STD_STRING, "#include "); + importMapping.put(NLOHMANN_JSON, "#include "); + + // nlohmann:json doesn't belong to model package + this.openAPITypesWithoutModelNamespace.add(NLOHMANN_JSON); } private void setupSupportingFiles() { @@ -202,8 +224,16 @@ private void setupModelTemplate() { } } + /** + * {@inheritDoc} + */ @Override public String toModelImport(String name) { + // Do not reattempt to add #include on an already solved #include + if (name.startsWith("#include")) { + return null; + } + if (importMapping.containsKey(name)) { return importMapping.get(name); } else { @@ -214,20 +244,23 @@ public String toModelImport(String name) { @Override public CodegenModel fromModel(String name, Schema model) { + // Exchange import directives from core model with ours CodegenModel codegenModel = super.fromModel(name, model); Set oldImports = codegenModel.imports; codegenModel.imports = new HashSet<>(); + for (String imp : oldImports) { String newImp = toModelImport(imp); - if (!newImp.isEmpty()) { + + if (newImp != null && !newImp.isEmpty()) { codegenModel.imports.add(newImp); } } if(!codegenModel.isEnum && codegenModel.anyOf.size()>1 - && codegenModel.anyOf.contains("std::string") + && codegenModel.anyOf.contains(STD_STRING) && !codegenModel.anyOf.contains("AnyType") && codegenModel.interfaces.size()==1 ){ @@ -388,7 +421,7 @@ public String getTypeDeclaration(Schema p) { Schema inner = ModelUtils.getAdditionalProperties(p); return getSchemaType(p) + ""; } else if (ModelUtils.isByteArraySchema(p)) { - return "std::string"; + return STD_STRING; } if (ModelUtils.isStringSchema(p) || ModelUtils.isDateSchema(p) @@ -397,8 +430,14 @@ public String getTypeDeclaration(Schema p) { return toModelName(openAPIType); } - String namespace = (String)additionalProperties.get("modelNamespace"); - return namespace + "::" + openAPIType; + // Some types might not support namespace + if (this.openAPITypesWithoutModelNamespace.contains(openAPIType)) { + return openAPIType; + } + else { + String namespace = (String) additionalProperties.get("modelNamespace"); + return namespace + "::" + openAPIType; + } } @Override diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/AbstractGeneratorsTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/AbstractGeneratorsTest.java new file mode 100644 index 0000000000000..d8e7da91e1b48 --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/AbstractGeneratorsTest.java @@ -0,0 +1,70 @@ +/* + * Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openapitools.codegen.cpppistache; + +import java.io.*; +import java.nio.file.Files; +import java.util.*; + +import org.openapitools.codegen.*; +import org.openapitools.codegen.config.CodegenConfigurator; + +/** + * Abstract test class to make one or multiple generators generate files for one specific input spec + */ +public abstract class AbstractGeneratorsTest { + /** + * Test each with a given input spec + * @param inputSpec The input spec to use + * @return Map of generator and files + * @throws IOException if the test directory cannot be created + */ + protected Map> eachWith(String inputSpec) throws IOException { + Objects.requireNonNull(inputSpec, "Specify an inputspec to run that test"); + Map> generatedFilesByGenerator = new HashMap<>(); + + for (final CodegenConfig codegenConfig : CodegenConfigLoader.getAll()) { + generatedFilesByGenerator.put(codegenConfig.getName(), oneWith(codegenConfig.getName(), inputSpec)); + } + + return generatedFilesByGenerator; + } + + /** + * Test each with a given input spec + * @param generatorName the generator name to use + * @param inputSpec The input spec to use + * @return List of generated files + * @throws IOException if the test directory cannot be created + */ + protected List oneWith(String generatorName, String inputSpec) throws IOException { + Objects.requireNonNull(generatorName, "Specify a generatorName to run that test"); + Objects.requireNonNull(inputSpec, "Specify an inputspec to run that test"); + + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName(generatorName) + .setInputSpec(inputSpec) + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + DefaultGenerator generator = new DefaultGenerator(); + return generator.opts(clientOptInput).generate(); + } +} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/ObjectAnyTypeSetTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/ObjectAnyTypeSetTest.java new file mode 100644 index 0000000000000..95b2ddddcb592 --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/ObjectAnyTypeSetTest.java @@ -0,0 +1,62 @@ +/* + * Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.openapitools.codegen.cpppistache; + +import java.io.*; +import java.util.*; + +import org.slf4j.*; +import org.testng.annotations.Test; +import org.testng.asserts.SoftAssert; + +/** + * Generate from an input spec containing various abstract objects and sets + */ +public class ObjectAnyTypeSetTest extends AbstractGeneratorsTest { + /** Logger. */ + private static final Logger LOGGER = LoggerFactory.getLogger(ObjectAnyTypeSetTest.class); + + /** A Petstore inputspec with abstract properties added in the Pet */ + private static final String INPUT_SPEC = "src/test/resources/3_0/issues-anytype-object-set-petstore-everything.yaml"; + + /** Soft assert to check all the generators before eventually failing a test */ + private final SoftAssert softAssert = new SoftAssert(); + + /** + * Test some generators with an input spec requiring generation of abstract properties + * @throws IOException if the test folder cannot be created + */ + @Test + public void testSomeWithPetstoreWithAbstract() throws IOException { +// assertGeneratedFiles("c"); +// assertGeneratedFiles("cpp-restsdk"); + generateFiles("cpp-pistache-server"); +// assertGeneratedFiles("typescript"); + this.softAssert.assertAll(); + } + + /** + * Asserts that a generator has produced some files + * @param generatorName The generator name to test + * @return List of files generated + * @throws IOException if the test folder cannot be created + */ + private List generateFiles(String generatorName) throws IOException { + Objects.requireNonNull(generatorName, "A generator name is expected for this assertion"); + return oneWith(generatorName, INPUT_SPEC); + } +} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/README.md b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/README.md new file mode 100644 index 0000000000000..23af1c6b581bc --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/cpppistache/README.md @@ -0,0 +1,2 @@ +These test aren't useful yet +they only run the generator for a single case \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/issues-anytype-object-set-petstore-everything.yaml b/modules/openapi-generator/src/test/resources/3_0/issues-anytype-object-set-petstore-everything.yaml new file mode 100644 index 0000000000000..3fa84d89af694 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issues-anytype-object-set-petstore-everything.yaml @@ -0,0 +1,815 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server. For this sample, you can use the api key + `special-key` to test the authorization filters. + version: 1.0.0 + title: OpenAPI Petstore + license: + name: Apache-2.0 + url: 'https://www.apache.org/licenses/LICENSE-2.0.html' +tags: + - name: pet + description: Everything about your Pets + - name: store + description: Access to Petstore orders + - name: user + description: Operations about user + +paths: + /pet: + post: + tags: + - pet + summary: Add a new pet to the store + description: '' + operationId: addPet + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '405': + description: Invalid input + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + $ref: '#/components/requestBodies/Pet' + + put: + tags: + - pet + summary: Update an existing pet + description: '' + operationId: updatePet + externalDocs: + url: "http://petstore.swagger.io/v2/doc/updatePet" + description: "API documentation for the updatePet operation" + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid ID supplied + '404': + description: Pet not found + '405': + description: Validation exception + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + $ref: '#/components/requestBodies/Pet' + + /pet/findByStatus: + get: + tags: + - pet + summary: Finds Pets by status + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + parameters: + - name: status + in: query + description: Status values that need to be considered for filter + required: true + style: form + explode: false + deprecated: true + schema: + type: array + items: + type: string + enum: + - available + - pending + - sold + default: available + responses: + '200': + description: successful operation + content: + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid status value + security: + - petstore_auth: + - 'read:pets' + + /pet/findByTags: + get: + tags: + - pet + summary: Finds Pets by tags + description: >- + Multiple tags can be provided with comma separated strings. Use tag1, + tag2, tag3 for testing. + operationId: findPetsByTags + parameters: + - name: tags + in: query + description: Tags to filter by + required: true + style: form + explode: false + schema: + type: array + items: + type: string + responses: + '200': + description: successful operation + content: + application/xml: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid tag value + security: + - petstore_auth: + - 'read:pets' + deprecated: true + + '/pet/{petId}': + get: + tags: + - pet + summary: Find pet by ID + description: Returns a single pet + operationId: getPetById + parameters: + - name: petId + in: path + description: ID of pet to return + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Pet' + application/json: + schema: + $ref: '#/components/schemas/Pet' + '400': + description: Invalid ID supplied + '404': + description: Pet not found + security: + - api_key: [] + + post: + tags: + - pet + summary: Updates a pet in the store with form data + description: '' + operationId: updatePetWithForm + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + schema: + type: integer + format: int64 + responses: + '405': + description: Invalid input + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + name: + description: Updated name of the pet + type: string + status: + description: Updated status of the pet + type: string + + delete: + tags: + - pet + summary: Deletes a pet + description: '' + operationId: deletePet + parameters: + - name: api_key + in: header + required: false + schema: + type: string + - name: petId + in: path + description: Pet id to delete + required: true + schema: + type: integer + format: int64 + responses: + '400': + description: Invalid pet value + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + + '/pet/{petId}/uploadImage': + post: + tags: + - pet + summary: uploads an image + description: '' + operationId: uploadFile + parameters: + - name: petId + in: path + description: ID of pet to update + required: true + schema: + type: integer + format: int64 + responses: + '200': + description: successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/ApiResponse' + security: + - petstore_auth: + - 'write:pets' + - 'read:pets' + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + additionalMetadata: + description: Additional data to pass to server + type: string + file: + description: file to upload + type: string + format: binary + + /store/inventory: + get: + tags: + - store + summary: Returns pet inventories by status + description: Returns a map of status codes to quantities + operationId: getInventory + responses: + '200': + description: successful operation + content: + application/json: + schema: + type: object + additionalProperties: + type: integer + format: int32 + security: + - api_key: [] + + /store/order: + post: + tags: + - store + summary: Place an order for a pet + description: '' + operationId: placeOrder + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Order' + application/json: + schema: + $ref: '#/components/schemas/Order' + '400': + description: Invalid Order + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/Order' + description: order placed for purchasing the pet + required: true + + '/store/order/{orderId}': + get: + tags: + - store + summary: Find purchase order by ID + description: >- + For valid response try integer IDs with value <= 5 or > 10. Other values + will generate exceptions + operationId: getOrderById + parameters: + - name: orderId + in: path + description: ID of pet that needs to be fetched + required: true + schema: + type: integer + format: int64 + minimum: 1 + maximum: 5 + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/Order' + application/json: + schema: + $ref: '#/components/schemas/Order' + '400': + description: Invalid ID supplied + '404': + description: Order not found + + delete: + tags: + - store + summary: Delete purchase order by ID + description: >- + For valid response try integer IDs with value < 1000. Anything above + 1000 or nonintegers will generate API errors + operationId: deleteOrder + parameters: + - name: orderId + in: path + description: ID of the order that needs to be deleted + required: true + schema: + type: string + responses: + '400': + description: Invalid ID supplied + '404': + description: Order not found + + /user: + post: + tags: + - user + summary: Create user + description: This can only be done by the logged in user. + operationId: createUser + responses: + default: + description: successful operation + security: + - api_key: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/User' + description: Created user object + required: true + + /user/createWithArray: + post: + tags: + - user + summary: Creates list of users with given input array + description: '' + operationId: createUsersWithArrayInput + responses: + default: + description: successful operation + security: + - api_key: [] + requestBody: + $ref: '#/components/requestBodies/UserArray' + + /user/createWithList: + post: + tags: + - user + summary: Creates list of users with given input array + description: '' + operationId: createUsersWithListInput + responses: + default: + description: successful operation + security: + - api_key: [] + requestBody: + $ref: '#/components/requestBodies/UserArray' + + /user/login: + get: + tags: + - user + summary: Logs user into the system + description: '' + operationId: loginUser + parameters: + - name: username + in: query + description: The user name for login + required: true + schema: + type: string + pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$' + - name: password + in: query + description: The password for login in clear text + required: true + schema: + type: string + + responses: + '200': + description: successful operation + headers: + Set-Cookie: + description: >- + Cookie authentication key for use with the `api_key` + apiKey authentication. + schema: + type: string + example: AUTH_KEY=abcde12345; Path=/; HttpOnly + X-Rate-Limit: + description: calls per hour allowed by the user + schema: + type: integer + format: int32 + X-Expires-After: + description: date in UTC when token expires + schema: + type: string + format: date-time + content: + application/xml: + schema: + type: string + application/json: + schema: + type: string + '400': + description: Invalid username/password supplied + + /user/logout: + get: + tags: + - user + summary: Logs out current logged in user session + description: '' + operationId: logoutUser + responses: + default: + description: successful operation + security: + - api_key: [] + + '/user/{username}': + get: + tags: + - user + summary: Get user by user name + description: '' + operationId: getUserByName + parameters: + - name: username + in: path + description: The name that needs to be fetched. Use user1 for testing. + required: true + schema: + type: string + responses: + '200': + description: successful operation + content: + application/xml: + schema: + $ref: '#/components/schemas/User' + application/json: + schema: + $ref: '#/components/schemas/User' + '400': + description: Invalid username supplied + '404': + description: User not found + + put: + tags: + - user + summary: Updated user + description: This can only be done by the logged in user. + operationId: updateUser + parameters: + - name: username + in: path + description: name that need to be deleted + required: true + schema: + type: string + responses: + '400': + description: Invalid user supplied + '404': + description: User not found + security: + - api_key: [] + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/User' + description: Updated user object + required: true + + delete: + tags: + - user + summary: Delete user + description: This can only be done by the logged in user. + operationId: deleteUser + parameters: + - name: username + in: path + description: The name that needs to be deleted + required: true + schema: + type: string + responses: + '400': + description: Invalid username supplied + '404': + description: User not found + security: + - api_key: [] + +externalDocs: + description: Find out more about Swagger + url: 'http://swagger.io' + +components: + requestBodies: + UserArray: + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/User' + description: List of user object + required: true + + Pet: + content: + application/json: + schema: + $ref: '#/components/schemas/Pet' + application/xml: + schema: + $ref: '#/components/schemas/Pet' + description: Pet object that needs to be added to the store + required: true + + securitySchemes: + petstore_auth: + type: oauth2 + flows: + implicit: + authorizationUrl: 'http://petstore.swagger.io/api/oauth/dialog' + scopes: + 'write:pets': modify pets in your account + 'read:pets': read your pets + api_key: + type: apiKey + name: api_key + in: header + + schemas: + Order: + title: Pet Order + description: An order for a pets from the pet store + type: object + properties: + id: + type: integer + format: int64 + petId: + type: integer + format: int64 + quantity: + type: integer + format: int32 + shipDate: + type: string + format: date-time + status: + type: string + description: Order Status + enum: + - placed + - approved + - delivered + complete: + type: boolean + default: false + xml: + name: Order + + Category: + title: Pet category + description: A category for a pet + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + pattern: '^[a-zA-Z0-9]+[a-zA-Z0-9\.\-_]*[a-zA-Z0-9]+$' + xml: + name: Category + + User: + title: a User + description: A User who is purchasing from the pet store + type: object + properties: + id: + type: integer + format: int64 + username: + type: string + firstName: + type: string + lastName: + type: string + email: + type: string + password: + type: string + phone: + type: string + userStatus: + type: integer + format: int32 + description: User Status + xml: + name: User + + Tag: + title: Pet Tag + description: A tag for a pet + type: object + properties: + id: + type: integer + format: int64 + name: + type: string + xml: + name: Tag + + Pet: + title: a Pet + description: A pet for sale in the pet store + type: object + + required: + - name + - photoUrls + + properties: + id: + type: integer + format: int64 + + category: + $ref: '#/components/schemas/Category' + + name: + type: string + example: doggie + + photoUrls: + type: array + xml: + name: photoUrl + wrapped: true + items: + type: string + + tags: + type: array + xml: + name: tag + wrapped: true + items: + $ref: '#/components/schemas/Tag' + + status: + type: string + description: pet status in the store + deprecated: true + enum: + - available + - pending + - sold + + # --------------------------------------------------------- + # Properties that dedicate this configuration to this issue + # --------------------------------------------------------- + + # https://github.com/OpenAPITools/openapi-generator/issues/2769 + # object property (leading to Object.h) + veterinarianVisit: + type: object + description: last veterinarian visit advice + + # leading to Anytype.h + # https://github.com/OpenAPITools/openapi-generator/issues/10266 + goodies: + type: array + items: {} + nullable: true + description: to help you installing your pet at home + + # Leading to Set.h + # https://github.com/OpenAPITools/openapi-generator/issues/14234 + bestFriends: + description: Pet best friends! + type: object + + required: + - bestFriends + + properties: + bestFriends: + type: array + uniqueItems: true + + items: + type: string + + xml: + name: Pet + + ApiResponse: + title: An uploaded response + description: Describes the result of uploading an image resource + type: object + properties: + code: + type: integer + format: int32 + type: + type: string + message: + type: string diff --git a/samples/server/petstore/cpp-pistache/install_pistache.sh b/samples/server/petstore/cpp-pistache/install_pistache.sh index d10e3f19b37eb..271db23faeef0 100755 --- a/samples/server/petstore/cpp-pistache/install_pistache.sh +++ b/samples/server/petstore/cpp-pistache/install_pistache.sh @@ -1,13 +1,14 @@ -#/bin/bash +#!/bin/bash # ref: http://pistache.io/quickstart#installing-pistache # echo "Installing Pistache ..." git clone https://github.com/oktal/pistache.git || true -cd pistache +cd pistache || (echo "Cannot find git clone pistache directory"; exit 1) + git submodule update --init mkdir -p build -cd build +cd build || (echo "Cannot find build directory"; exit 1) + cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release .. -make -sudo make install +meson