This is an automated email from the ASF dual-hosted git repository. sgoeschl pushed a commit to branch FREEMARKER-139 in repository https://gitbox.apache.org/repos/asf/freemarker-generator.git
commit ac6ed0f6a4ec6787e29bb0a5616a1a415f23bdca Author: Siegfried Goeschl <[email protected]> AuthorDate: Sat Apr 4 12:20:43 2020 +0200 FREEMARKER-139 freemarker-cli: Provide GsonTool to align with Maven plugin --- freemarker-generator-cli/run-samples.sh | 11 +- .../site/sample/yaml/swagger-spec.yaml | 700 +++++++++++++++++++++ .../src/main/config/freemarker-cli.properties | 2 +- .../src/main/scripts/run-samples.sh | 10 +- .../freemarker/generator/cli/ExamplesTest.java | 5 +- .../freemarker/generator/cli/ManualTest.java | 3 +- .../templates/json/yaml/transform.ftl | 18 + .../templates/yaml/json/transform.ftl | 18 + 8 files changed, 759 insertions(+), 8 deletions(-) diff --git a/freemarker-generator-cli/run-samples.sh b/freemarker-generator-cli/run-samples.sh index baaafab..a1a9daf 100755 --- a/freemarker-generator-cli/run-samples.sh +++ b/freemarker-generator-cli/run-samples.sh @@ -137,6 +137,9 @@ $FREEMARKER_CMD -t templates/html/csv/dependencies.ftl site/sample/html/dependen echo "templates/json/csv/swagger-endpoints.ftl" $FREEMARKER_CMD -t templates/json/csv/swagger-endpoints.ftl site/sample/json/swagger-spec.json > target/out/swagger-spec.csv || { echo >&2 "Test failed. Aborting."; exit 1; } +echo "templates/json/yaml/transform.ftl" +$FREEMARKER_CMD -t templates/json/yaml/transform.ftl site/sample/json/swagger-spec.json > target/out/swagger-spec.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } + if hash curl 2>/dev/null; then echo "templates/json/md/github-users.ftl" $FREEMARKER_CMD -t templates/json/md/github-users.ftl site/sample/json/github-users.json > target/out/github-users-curl.md || { echo >&2 "Test failed. Aborting."; exit 1; } @@ -154,7 +157,10 @@ $FREEMARKER_CMD -t templates/properties/csv/locker-test-users.ftl site/sample/pr ############################################################################# echo "templates/yaml/txt/transform.ftl" -$FREEMARKER_CMD -t ./templates/yaml/txt/transform.ftl ./site/sample/yaml/customer.yaml > target/out/customer.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -t templates/yaml/txt/transform.ftl site/sample/yaml/customer.yaml > target/out/customer.txt || { echo >&2 "Test failed. Aborting."; exit 1; } + +echo "templates/yaml/json/transform.ftl" +$FREEMARKER_CMD -t templates/yaml/json/transform.ftl site/sample/yaml/swagger-spec.yaml > target/out/swagger-spec.json || { echo >&2 "Test failed. Aborting."; exit 1; } ############################################################################# # XML @@ -164,5 +170,4 @@ echo "templates/xml/txt/recipients.ftl" $FREEMARKER_CMD -t ./templates/xml/txt/recipients.ftl site/sample/xml/recipients.xml > target/out/recipients.txt || { echo >&2 "Test failed. Aborting."; exit 1; } echo "Created the following sample files in ./target/out" -ls -l ./target/out - +ls -l ./target/out \ No newline at end of file diff --git a/freemarker-generator-cli/site/sample/yaml/swagger-spec.yaml b/freemarker-generator-cli/site/sample/yaml/swagger-spec.yaml new file mode 100644 index 0000000..5ab693a --- /dev/null +++ b/freemarker-generator-cli/site/sample/yaml/swagger-spec.yaml @@ -0,0 +1,700 @@ +swagger: "2.0" +info: + description: "This is a sample server Petstore server. You can find out more about Swagger at <a href=\"http://swagger.io\">http://swagger.io</a> or on irc.freenode.net, #swagger. For this sample, you can use the api key \"special-key\" to test the authorization filters" + version: 1.0.0 + title: Swagger Petstore YAML + termsOfService: "http://swagger.io/terms/" + contact: + email: "[email protected]" + license: + name: Apache 2.0 + url: "http://www.apache.org/licenses/LICENSE-2.0.html" +basePath: /v2 +tags: + - name: pet + description: Everything about your Pets + externalDocs: + description: Find out more + url: "http://swagger.io" + - name: store + description: Operations about user + - name: user + description: Access to Petstore orders + externalDocs: + description: Find out more about our store + url: "http://swagger.io" +schemes: + - http +paths: + /pet: + post: + tags: + - pet + summary: Add a new pet to the store + x-swagger-router-controller: SampleController + description: "" + operationId: addPet + consumes: + - application/json + - application/xml + produces: + - application/xml + - application/json + parameters: + - in: body + name: body + description: Pet object that needs to be added to the store + required: false + schema: + $ref: "#/definitions/Pet" + responses: + "405": + description: Invalid input + security: + - petstore_auth: + - "write:pets" + - "read:pets" + put: + tags: + - pet + summary: Update an existing pet + description: "" + operationId: updatePet + consumes: + - application/json + - application/xml + produces: + - application/xml + - application/json + parameters: + - in: body + name: body + description: Pet object that needs to be added to the store + required: false + schema: + $ref: "#/definitions/Pet" + responses: + "400": + description: Invalid ID supplied + "404": + description: Pet not found + "405": + description: Validation exception + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /pet/findByStatus: + get: + tags: + - pet + summary: Finds Pets by status + description: Multiple status values can be provided with comma separated strings + operationId: findPetsByStatus + consumes: + - application/xml + - application/json + - multipart/form-data + - application/x-www-form-urlencoded + produces: + - application/xml + - application/json + parameters: + - name: status + in: query + description: Status values that need to be considered for filter + required: false + type: array + items: + type: string + collectionFormat: multi + default: available + enum: + - available + - pending + - sold + responses: + "200": + description: successful operation + schema: + type: array + items: + $ref: "#/definitions/Pet" + "400": + description: Invalid status value + security: + - petstore_auth: + - "write:pets" + - "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 + produces: + - application/xml + - application/json + parameters: + - name: tags + in: query + description: Tags to filter by + required: false + type: array + items: + type: string + collectionFormat: multi + responses: + "200": + description: successful operation + schema: + type: array + items: + $ref: "#/definitions/Pet" + "400": + description: Invalid tag value + security: + - petstore_auth: + - "write:pets" + - "read:pets" + "/pet/{petId}": + get: + tags: + - pet + summary: Find pet by ID + description: Returns a single pet + operationId: getPetById + consumes: + - application/x-www-form-urlencoded + produces: + - application/xml + - application/json + parameters: + - name: petId + in: path + description: ID of pet to return + required: true + type: integer + format: int64 + responses: + "200": + description: successful operation + schema: + $ref: "#/definitions/Pet" + "400": + description: Invalid ID supplied + "404": + description: Pet not found + security: + - api_key: [] + - petstore_auth: + - "write:pets" + - "read:pets" + post: + tags: + - pet + summary: Updates a pet in the store with form data + description: "" + operationId: updatePetWithForm + consumes: + - application/x-www-form-urlencoded + produces: + - application/xml + - application/json + parameters: + - name: petId + in: path + description: ID of pet that needs to be updated + required: true + type: string + - name: name + in: formData + description: Updated name of the pet + required: false + type: string + - name: status + in: formData + description: Updated status of the pet + required: false + type: string + responses: + "405": + description: Invalid input + security: + - petstore_auth: + - "write:pets" + - "read:pets" + delete: + tags: + - pet + summary: Deletes a pet + description: "" + operationId: deletePet + consumes: + - multipart/form-data + - application/x-www-form-urlencoded + produces: + - application/xml + - application/json + parameters: + - name: api_key + in: header + description: "" + required: false + type: string + - name: petId + in: path + description: Pet id to delete + required: true + 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 + x-swagger-router-controller: SampleController + description: "" + operationId: uploadFile + consumes: + - multipart/form-data + produces: + - application/json + parameters: + - name: petId + in: path + description: ID of pet to update + required: true + type: integer + format: int64 + - name: additionalMetadata + in: formData + description: Additional data to pass to server + required: false + type: string + - name: file + in: formData + description: file to upload + required: false + type: file + responses: + "200": + description: successful operation + schema: + $ref: "#/definitions/ApiResponse" + security: + - petstore_auth: + - "write:pets" + - "read:pets" + /store/inventory: + get: + tags: + - store + summary: Returns pet inventories by status + description: Returns a map of status codes to quantities + operationId: getInventory + produces: + - application/json + parameters: [] + responses: + "200": + description: successful operation + 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 + produces: + - application/xml + - application/json + parameters: + - in: body + name: body + description: order placed for purchasing the pet + required: false + schema: + $ref: "#/definitions/Order" + responses: + "200": + description: successful operation + schema: + $ref: "#/definitions/Order" + "400": + description: Invalid Order + "/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 generated exceptions" + operationId: getOrderById + produces: + - application/xml + - application/json + parameters: + - name: orderId + in: path + description: ID of pet that needs to be fetched + required: true + type: string + responses: + "200": + description: successful operation + schema: + $ref: "#/definitions/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 + produces: + - application/xml + - application/json + parameters: + - name: orderId + in: path + description: ID of the order that needs to be deleted + required: true + 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 + produces: + - application/xml + - application/json + parameters: + - in: body + name: body + description: Created user object + required: false + schema: + $ref: "#/definitions/User" + responses: + default: + description: successful operation + /user/createWithArray: + post: + tags: + - user + summary: Creates list of users with given input array + description: "" + operationId: createUsersWithArrayInput + produces: + - application/xml + - application/json + parameters: + - in: body + name: body + description: List of user object + required: false + schema: + type: array + items: + $ref: "#/definitions/User" + responses: + default: + description: successful operation + /user/createWithList: + post: + tags: + - user + summary: Creates list of users with given input array + description: "" + operationId: createUsersWithListInput + produces: + - application/xml + - application/json + parameters: + - in: body + name: body + description: List of user object + required: false + schema: + type: array + items: + $ref: "#/definitions/User" + responses: + default: + description: successful operation + /user/login: + get: + tags: + - user + summary: Logs user into the system + description: "" + operationId: loginUser + produces: + - application/xml + - application/json + parameters: + - name: username + in: query + description: The user name for login + required: false + type: string + - name: password + in: query + description: The password for login in clear text + required: false + type: string + responses: + "200": + description: successful operation + schema: + type: string + headers: + X-Rate-Limit: + type: integer + format: int32 + description: calls per hour allowed by the user + X-Expires-After: + type: string + format: date-time + description: date in UTC when toekn expires + "400": + description: Invalid username/password supplied + /user/logout: + get: + tags: + - user + summary: Logs out current logged in user session + description: "" + operationId: logoutUser + produces: + - application/xml + - application/json + parameters: [] + responses: + default: + description: successful operation + "/user/{username}": + get: + tags: + - user + summary: Get user by user name + description: "" + operationId: getUserByName + produces: + - application/xml + - application/json + parameters: + - name: username + in: path + description: "The name that needs to be fetched. Use user1 for testing. " + required: true + type: string + responses: + "200": + description: successful operation + schema: + $ref: "#/definitions/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 + produces: + - application/xml + - application/json + parameters: + - name: username + in: path + description: name that need to be deleted + required: true + type: string + - in: body + name: body + description: Updated user object + required: false + schema: + $ref: "#/definitions/User" + responses: + "400": + description: Invalid user supplied + "404": + description: User not found + delete: + tags: + - user + summary: Delete user + description: This can only be done by the logged in user. + operationId: deleteUser + produces: + - application/xml + - application/json + parameters: + - name: username + in: path + description: The name that needs to be deleted + required: true + type: string + responses: + "400": + description: Invalid username supplied + "404": + description: User not found +securityDefinitions: + petstore_auth: + type: oauth2 + authorizationUrl: "http://petstore.swagger.io/api/oauth/dialog" + flow: implicit + scopes: + "write:pets": modify pets in your account + "read:pets": read your pets + api_key: + type: apiKey + name: api_key + in: header +definitions: + Order: + 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 + xml: + name: Order + Category: + properties: + id: + type: integer + format: int64 + name: + type: string + xml: + name: Category + User: + 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: + properties: + id: + type: integer + format: int64 + name: + type: string + xml: + name: Tag + Pet: + required: + - name + - photoUrls + properties: + id: + type: integer + format: int64 + category: + $ref: "#/definitions/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: "#/definitions/Tag" + status: + type: string + description: pet status in the store + enum: + - available + - pending + - sold + xml: + name: Pet + ApiResponse: + properties: + code: + type: integer + format: int32 + type: + type: string + message: + type: string + xml: + name: "##default" +externalDocs: + description: Find out more about Swagger + url: "http://swagger.io" \ No newline at end of file diff --git a/freemarker-generator-cli/src/main/config/freemarker-cli.properties b/freemarker-generator-cli/src/main/config/freemarker-cli.properties index c8fdcbe..fa08255 100644 --- a/freemarker-generator-cli/src/main/config/freemarker-cli.properties +++ b/freemarker-generator-cli/src/main/config/freemarker-cli.properties @@ -29,7 +29,7 @@ freemarker.tools.ExecTool=org.apache.freemarker.generator.tools.commonsexec.Comm freemarker.tools.ExcelTool=org.apache.freemarker.generator.tools.excel.ExcelTool freemarker.tools.FreeMarkerTool=org.apache.freemarker.generator.tools.freemarker.FreeMarkerTool freemarker.tools.GrokTool=org.apache.freemarker.generator.tools.grok.GrokTool -freemarker.tools.GsonTool=org.apache.freemarker.generator.tools.grok.GsonTool +freemarker.tools.GsonTool=org.apache.freemarker.generator.tools.gson.GsonTool freemarker.tools.JsonPathTool=org.apache.freemarker.generator.tools.jsonpath.JsonPathTool freemarker.tools.JsoupTool=org.apache.freemarker.generator.tools.jsoup.JsoupTool freemarker.tools.PropertiesTool=org.apache.freemarker.generator.tools.properties.PropertiesTool diff --git a/freemarker-generator-cli/src/main/scripts/run-samples.sh b/freemarker-generator-cli/src/main/scripts/run-samples.sh index 0366d5e..36b9699 100755 --- a/freemarker-generator-cli/src/main/scripts/run-samples.sh +++ b/freemarker-generator-cli/src/main/scripts/run-samples.sh @@ -137,6 +137,9 @@ $FREEMARKER_CMD -t templates/html/csv/dependencies.ftl site/sample/html/dependen echo "templates/json/csv/swagger-endpoints.ftl" $FREEMARKER_CMD -t templates/json/csv/swagger-endpoints.ftl site/sample/json/swagger-spec.json > target/out/swagger-spec.csv || { echo >&2 "Test failed. Aborting."; exit 1; } +echo "templates/json/yaml/transform.ftl" +$FREEMARKER_CMD -t templates/json/yaml/transform.ftl site/sample/json/swagger-spec.json > target/out/swagger-spec.yaml || { echo >&2 "Test failed. Aborting."; exit 1; } + if hash curl 2>/dev/null; then echo "templates/json/md/github-users.ftl" $FREEMARKER_CMD -t templates/json/md/github-users.ftl site/sample/json/github-users.json > target/out/github-users-curl.md || { echo >&2 "Test failed. Aborting."; exit 1; } @@ -154,7 +157,10 @@ $FREEMARKER_CMD -t templates/properties/csv/locker-test-users.ftl site/sample/pr ############################################################################# echo "templates/yaml/txt/transform.ftl" -$FREEMARKER_CMD -t ./templates/yaml/txt/transform.ftl ./site/sample/yaml/customer.yaml > target/out/customer.txt || { echo >&2 "Test failed. Aborting."; exit 1; } +$FREEMARKER_CMD -t templates/yaml/txt/transform.ftl site/sample/yaml/customer.yaml > target/out/customer.txt || { echo >&2 "Test failed. Aborting."; exit 1; } + +echo "templates/yaml/json/transform.ftl" +$FREEMARKER_CMD -t templates/yaml/json/transform.ftl site/sample/yaml/swagger-spec.yaml > target/out/swagger-spec.json || { echo >&2 "Test failed. Aborting."; exit 1; } ############################################################################# # XML @@ -164,4 +170,4 @@ echo "templates/xml/txt/recipients.ftl" $FREEMARKER_CMD -t ./templates/xml/txt/recipients.ftl site/sample/xml/recipients.xml > target/out/recipients.txt || { echo >&2 "Test failed. Aborting."; exit 1; } echo "Created the following sample files in ./target/out" -ls -l ./target/out +ls -l ./target/out \ No newline at end of file diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java index 7039efb..85ba50a 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ExamplesTest.java @@ -73,6 +73,7 @@ public class ExamplesTest extends AbstractMainTest { public void shouldRunJsonExamples() throws IOException { assertValid(execute("-t templates/json/csv/swagger-endpoints.ftl site/sample/json/swagger-spec.json")); assertValid(execute("-t templates/json/md/github-users.ftl site/sample/json/github-users.json")); + assertValid(execute("-t templates/json/yaml/transform.ftl site/sample/json/swagger-spec.json")); } @Test @@ -83,6 +84,7 @@ public class ExamplesTest extends AbstractMainTest { @Test public void shouldRunYamlExamples() throws IOException { assertValid(execute("-t templates/yaml/txt/transform.ftl site/sample/yaml/customer.yaml")); + assertValid(execute("-t templates/yaml/json/transform.ftl site/sample/yaml/swagger-spec.yaml")); } @Test @@ -130,6 +132,7 @@ public class ExamplesTest extends AbstractMainTest { private static void assertValid(String output) { assertTrue(output.length() > MIN_OUTPUT_SIZE); assertFalse(output.contains("Exception")); - assertFalse(output.contains("Error")); + assertFalse(output.contains("FreeMarker template error")); + assertFalse(output.contains("FTL stack trace")); } } diff --git a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java index ff83957..0d8ca31 100644 --- a/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java +++ b/freemarker-generator-cli/src/test/java/org/apache/freemarker/generator/cli/ManualTest.java @@ -40,7 +40,8 @@ public class ManualTest { // private static final String CMD = "-b ./src/test -t templates/info.ftl -d :user=site/sample/properties -d contract=site/sample/csv/contract.csv"; // private static final String CMD = "-b ./src/test -t site/sample/ftl/nginx/nginx.conf.ftl -d env=site/sample/ftl/nginx/nginx.env"; // private static final String CMD = "-b ./src/test -t templates/info.ftl -d env=site/sample/ftl/nginx/nginx.env"; - private static final String CMD = "-b ./src/test -t templates/json/csv/swagger-endpoints.ftl site/sample/json/swagger-spec.json"; + private static final String CMD = "-b ./src/test -t templates/json/yaml/transform.ftl site/sample/json/swagger-spec.json"; + // private static final String CMD = "-b ./src/test -t templates/yaml/json/transform.ftl site/sample/yaml/swagger-spec.yaml"; public static void main(String[] args) { Main.execute(toArgs(CMD)); diff --git a/freemarker-generator-cli/templates/json/yaml/transform.ftl b/freemarker-generator-cli/templates/json/yaml/transform.ftl new file mode 100644 index 0000000..ad0e010 --- /dev/null +++ b/freemarker-generator-cli/templates/json/yaml/transform.ftl @@ -0,0 +1,18 @@ +<#ftl output_format="plainText"> +<#-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 + http://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. +--> +${YamlTool.toYaml(GsonTool.parse(DataSources.get(0)))} \ No newline at end of file diff --git a/freemarker-generator-cli/templates/yaml/json/transform.ftl b/freemarker-generator-cli/templates/yaml/json/transform.ftl new file mode 100644 index 0000000..3059fe6 --- /dev/null +++ b/freemarker-generator-cli/templates/yaml/json/transform.ftl @@ -0,0 +1,18 @@ +<#ftl output_format="plainText"> +<#-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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 + http://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. +--> +${GsonTool.toJson(YamlTool.parse(DataSources.get(0)))} \ No newline at end of file
