diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java index 80528f08ff3..aa5c0dc6858 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractScalaCodegen.java @@ -21,6 +21,7 @@ import com.samskivert.mustache.Escapers; import com.samskivert.mustache.Mustache; import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.CliOption; import org.openapitools.codegen.CodegenConstants; @@ -113,6 +114,10 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { public void processOpts() { super.processOpts(); + if (StringUtils.isEmpty(System.getenv("SCALAFMT_PATH"))) { + LOGGER.info("Environment variable SCALAFMT_PATH not defined so the Scala code may not be properly formatted. To define it, try 'export SCALAFMT_PATH=/usr/local/bin/scalafmt' (Linux/Mac)"); + } + if (additionalProperties.containsKey(CodegenConstants.SOURCE_FOLDER)) { this.setSourceFolder((String) additionalProperties.get(CodegenConstants.SOURCE_FOLDER)); } @@ -298,4 +303,31 @@ public abstract class AbstractScalaCodegen extends DefaultCodegen { return input.replace("\"", ""); } + @Override + public void postProcessFile(File file, String fileType) { + if (file == null) { + return; + } + + String scalafmtPath = System.getenv("SCALAFMT_PATH"); + if (StringUtils.isEmpty(scalafmtPath)) { + return; // skip if SCALAFMT_PATH env variable is not defined + } + + // only process files with scala extension + if ("scala".equals(FilenameUtils.getExtension(file.toString()))) { + String command = scalafmtPath + " " + file.toString(); + try { + Process p = Runtime.getRuntime().exec(command); + p.waitFor(); + if (p.exitValue() != 0) { + LOGGER.error("Error running the command ({}). Exit value: {}", command, p.exitValue()); + } + LOGGER.info("Successfully executed: " + command); + } catch (Exception e) { + LOGGER.error("Error running the command ({}). Exception: {}", command, e.getMessage()); + } + } + } + } diff --git a/samples/client/petstore/scala-akka/.openapi-generator/VERSION b/samples/client/petstore/scala-akka/.openapi-generator/VERSION index 096bf47efe3..6d94c9c2e12 100644 --- a/samples/client/petstore/scala-akka/.openapi-generator/VERSION +++ b/samples/client/petstore/scala-akka/.openapi-generator/VERSION @@ -1 +1 @@ -3.0.0-SNAPSHOT \ No newline at end of file +3.3.0-SNAPSHOT \ No newline at end of file diff --git a/samples/client/petstore/scala-akka/pom.xml b/samples/client/petstore/scala-akka/pom.xml index 20bf1d9209f..264dad8d1a5 100644 --- a/samples/client/petstore/scala-akka/pom.xml +++ b/samples/client/petstore/scala-akka/pom.xml @@ -240,4 +240,4 @@ - + \ No newline at end of file diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/EnumsSerializers.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/EnumsSerializers.scala index 85cc57e381b..4d7435be038 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/EnumsSerializers.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/EnumsSerializers.scala @@ -1,14 +1,14 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.api import org.openapitools.client.model._ @@ -17,30 +17,32 @@ import scala.reflect.ClassTag object EnumsSerializers { - def all: Seq[Serializer[_]] = Seq[Serializer[_]]() :+ - new EnumNameSerializer(OrderEnums.Status) :+ - new EnumNameSerializer(PetEnums.Status) + def all: Seq[Serializer[_]] = + Seq[Serializer[_]]() :+ + new EnumNameSerializer(OrderEnums.Status) :+ + new EnumNameSerializer(PetEnums.Status) private class EnumNameSerializer[E <: Enumeration: ClassTag](enum: E) - extends Serializer[E#Value] { + extends Serializer[E#Value] { import JsonDSL._ val EnumerationClass: Class[E#Value] = classOf[E#Value] - def deserialize(implicit format: Formats): - PartialFunction[(TypeInfo, JValue), E#Value] = { + def deserialize(implicit format: Formats) + : PartialFunction[(TypeInfo, JValue), E#Value] = { case (t @ TypeInfo(EnumerationClass, _), json) if isValid(json) => json match { case JString(value) => enum.withName(value) case value => - throw new MappingException(s"Can't convert $value to $EnumerationClass") + throw new MappingException( + s"Can't convert $value to $EnumerationClass") } } private[this] def isValid(json: JValue) = json match { case JString(value) if enum.values.exists(_.toString == value) => true - case _ => false + case _ => false } def serialize(implicit format: Formats): PartialFunction[Any, JValue] = { diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/PetApi.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/PetApi.scala index 48ceadfe528..aa441ae47cf 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/PetApi.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/PetApi.scala @@ -1,14 +1,14 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.api import org.openapitools.client.model.ApiResponse @@ -21,118 +21,151 @@ import org.openapitools.client.core.ApiKeyLocations._ object PetApi { /** - * Expected answers: - * code 405 : (Invalid input) - * - * @param pet Pet object that needs to be added to the store - */ + * Expected answers: + * code 405 : (Invalid input) + * + * @param pet Pet object that needs to be added to the store + */ def addPet(pet: Pet): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.POST, "http://petstore.swagger.io/v2", "/pet", "application/json") + ApiRequest[Unit](ApiMethods.POST, + "http://petstore.swagger.io/v2", + "/pet", + "application/json") .withBody(pet) .withErrorResponse[Unit](405) - /** - * Expected answers: - * code 400 : (Invalid pet value) - * - * @param petId Pet id to delete - * @param apiKey - */ + + /** + * Expected answers: + * code 400 : (Invalid pet value) + * + * @param petId Pet id to delete + * @param apiKey + */ def deletePet(petId: Long, apiKey: Option[String] = None): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.DELETE, "http://petstore.swagger.io/v2", "/pet/{petId}", "application/json") + ApiRequest[Unit](ApiMethods.DELETE, + "http://petstore.swagger.io/v2", + "/pet/{petId}", + "application/json") .withPathParam("petId", petId) .withHeaderParam("api_key", apiKey) .withErrorResponse[Unit](400) - /** - * Multiple status values can be provided with comma separated strings - * - * Expected answers: - * code 200 : Seq[Pet] (successful operation) - * code 400 : (Invalid status value) - * - * @param status Status values that need to be considered for filter - */ + + /** + * Multiple status values can be provided with comma separated strings + * + * Expected answers: + * code 200 : Seq[Pet] (successful operation) + * code 400 : (Invalid status value) + * + * @param status Status values that need to be considered for filter + */ def findPetsByStatus(status: Seq[String]): ApiRequest[Seq[Pet]] = - ApiRequest[Seq[Pet]](ApiMethods.GET, "http://petstore.swagger.io/v2", "/pet/findByStatus", "application/json") + ApiRequest[Seq[Pet]](ApiMethods.GET, + "http://petstore.swagger.io/v2", + "/pet/findByStatus", + "application/json") .withQueryParam("status", ArrayValues(status, CSV)) .withSuccessResponse[Seq[Pet]](200) .withErrorResponse[Unit](400) - /** - * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. - * - * Expected answers: - * code 200 : Seq[Pet] (successful operation) - * code 400 : (Invalid tag value) - * - * @param tags Tags to filter by - */ + + /** + * Multiple tags can be provided with comma separated strings. Use tag1, tag2, tag3 for testing. + * + * Expected answers: + * code 200 : Seq[Pet] (successful operation) + * code 400 : (Invalid tag value) + * + * @param tags Tags to filter by + */ def findPetsByTags(tags: Seq[String]): ApiRequest[Seq[Pet]] = - ApiRequest[Seq[Pet]](ApiMethods.GET, "http://petstore.swagger.io/v2", "/pet/findByTags", "application/json") + ApiRequest[Seq[Pet]](ApiMethods.GET, + "http://petstore.swagger.io/v2", + "/pet/findByTags", + "application/json") .withQueryParam("tags", ArrayValues(tags, CSV)) .withSuccessResponse[Seq[Pet]](200) .withErrorResponse[Unit](400) - /** - * Returns a single pet - * - * Expected answers: - * code 200 : Pet (successful operation) - * code 400 : (Invalid ID supplied) - * code 404 : (Pet not found) - * - * Available security schemes: - * api_key (apiKey) - * - * @param petId ID of pet to return - */ + + /** + * Returns a single pet + * + * Expected answers: + * code 200 : Pet (successful operation) + * code 400 : (Invalid ID supplied) + * code 404 : (Pet not found) + * + * Available security schemes: + * api_key (apiKey) + * + * @param petId ID of pet to return + */ def getPetById(petId: Long)(implicit apiKey: ApiKeyValue): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.GET, "http://petstore.swagger.io/v2", "/pet/{petId}", "application/json") + ApiRequest[Unit](ApiMethods.GET, + "http://petstore.swagger.io/v2", + "/pet/{petId}", + "application/json") .withApiKey(apiKey, "api_key", HEADER) .withPathParam("petId", petId) .withSuccessResponse[Pet](200) .withErrorResponse[Unit](400) .withErrorResponse[Unit](404) - /** - * Expected answers: - * code 400 : (Invalid ID supplied) - * code 404 : (Pet not found) - * code 405 : (Validation exception) - * - * @param pet Pet object that needs to be added to the store - */ + + /** + * Expected answers: + * code 400 : (Invalid ID supplied) + * code 404 : (Pet not found) + * code 405 : (Validation exception) + * + * @param pet Pet object that needs to be added to the store + */ def updatePet(pet: Pet): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.PUT, "http://petstore.swagger.io/v2", "/pet", "application/json") + ApiRequest[Unit](ApiMethods.PUT, + "http://petstore.swagger.io/v2", + "/pet", + "application/json") .withBody(pet) .withErrorResponse[Unit](400) .withErrorResponse[Unit](404) .withErrorResponse[Unit](405) - /** - * Expected answers: - * code 405 : (Invalid input) - * - * @param petId ID of pet that needs to be updated - * @param name Updated name of the pet - * @param status Updated status of the pet - */ - def updatePetWithForm(petId: Long, name: Option[String] = None, status: Option[String] = None): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.POST, "http://petstore.swagger.io/v2", "/pet/{petId}", "application/x-www-form-urlencoded") + + /** + * Expected answers: + * code 405 : (Invalid input) + * + * @param petId ID of pet that needs to be updated + * @param name Updated name of the pet + * @param status Updated status of the pet + */ + def updatePetWithForm(petId: Long, + name: Option[String] = None, + status: Option[String] = None): ApiRequest[Unit] = + ApiRequest[Unit](ApiMethods.POST, + "http://petstore.swagger.io/v2", + "/pet/{petId}", + "application/x-www-form-urlencoded") .withFormParam("name", name) .withFormParam("status", status) .withPathParam("petId", petId) .withErrorResponse[Unit](405) - /** - * Expected answers: - * code 200 : ApiResponse (successful operation) - * - * @param petId ID of pet to update - * @param additionalMetadata Additional data to pass to server - * @param file file to upload - */ - def uploadFile(petId: Long, additionalMetadata: Option[String] = None, file: Option[File] = None): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.POST, "http://petstore.swagger.io/v2", "/pet/{petId}/uploadImage", "multipart/form-data") + + /** + * Expected answers: + * code 200 : ApiResponse (successful operation) + * + * @param petId ID of pet to update + * @param additionalMetadata Additional data to pass to server + * @param file file to upload + */ + def uploadFile(petId: Long, + additionalMetadata: Option[String] = None, + file: Option[File] = None): ApiRequest[Unit] = + ApiRequest[Unit](ApiMethods.POST, + "http://petstore.swagger.io/v2", + "/pet/{petId}/uploadImage", + "multipart/form-data") .withFormParam("additionalMetadata", additionalMetadata) .withFormParam("file", file) .withPathParam("petId", petId) .withSuccessResponse[ApiResponse](200) - } - diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/StoreApi.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/StoreApi.scala index 25751afbb21..e1606d401f6 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/StoreApi.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/StoreApi.scala @@ -1,14 +1,14 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.api import org.openapitools.client.model.Order @@ -19,61 +19,75 @@ import org.openapitools.client.core.ApiKeyLocations._ object StoreApi { /** - * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors - * - * Expected answers: - * code 400 : (Invalid ID supplied) - * code 404 : (Order not found) - * - * @param orderId ID of the order that needs to be deleted - */ + * For valid response try integer IDs with value < 1000. Anything above 1000 or nonintegers will generate API errors + * + * Expected answers: + * code 400 : (Invalid ID supplied) + * code 404 : (Order not found) + * + * @param orderId ID of the order that needs to be deleted + */ def deleteOrder(orderId: String): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.DELETE, "http://petstore.swagger.io/v2", "/store/order/{orderId}", "application/json") + ApiRequest[Unit](ApiMethods.DELETE, + "http://petstore.swagger.io/v2", + "/store/order/{orderId}", + "application/json") .withPathParam("orderId", orderId) .withErrorResponse[Unit](400) .withErrorResponse[Unit](404) - /** - * Returns a map of status codes to quantities - * - * Expected answers: - * code 200 : Map[String, Int] (successful operation) - * - * Available security schemes: - * api_key (apiKey) - */ - def getInventory()(implicit apiKey: ApiKeyValue): ApiRequest[Map[String, Int]] = - ApiRequest[Map[String, Int]](ApiMethods.GET, "http://petstore.swagger.io/v2", "/store/inventory", "application/json") + + /** + * Returns a map of status codes to quantities + * + * Expected answers: + * code 200 : Map[String, Int] (successful operation) + * + * Available security schemes: + * api_key (apiKey) + */ + def getInventory()( + implicit apiKey: ApiKeyValue): ApiRequest[Map[String, Int]] = + ApiRequest[Map[String, Int]](ApiMethods.GET, + "http://petstore.swagger.io/v2", + "/store/inventory", + "application/json") .withApiKey(apiKey, "api_key", HEADER) .withSuccessResponse[Map[String, Int]](200) - /** - * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions - * - * Expected answers: - * code 200 : Order (successful operation) - * code 400 : (Invalid ID supplied) - * code 404 : (Order not found) - * - * @param orderId ID of pet that needs to be fetched - */ + + /** + * For valid response try integer IDs with value <= 5 or > 10. Other values will generated exceptions + * + * Expected answers: + * code 200 : Order (successful operation) + * code 400 : (Invalid ID supplied) + * code 404 : (Order not found) + * + * @param orderId ID of pet that needs to be fetched + */ def getOrderById(orderId: Long): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.GET, "http://petstore.swagger.io/v2", "/store/order/{orderId}", "application/json") + ApiRequest[Unit](ApiMethods.GET, + "http://petstore.swagger.io/v2", + "/store/order/{orderId}", + "application/json") .withPathParam("orderId", orderId) .withSuccessResponse[Order](200) .withErrorResponse[Unit](400) .withErrorResponse[Unit](404) - /** - * Expected answers: - * code 200 : Order (successful operation) - * code 400 : (Invalid Order) - * - * @param order order placed for purchasing the pet - */ + + /** + * Expected answers: + * code 200 : Order (successful operation) + * code 400 : (Invalid Order) + * + * @param order order placed for purchasing the pet + */ def placeOrder(order: Order): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.POST, "http://petstore.swagger.io/v2", "/store/order", "application/json") + ApiRequest[Unit](ApiMethods.POST, + "http://petstore.swagger.io/v2", + "/store/order", + "application/json") .withBody(order) .withSuccessResponse[Order](200) .withErrorResponse[Unit](400) - } - diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/UserApi.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/UserApi.scala index c439b7b188b..b0c34dc732d 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/UserApi.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/api/UserApi.scala @@ -1,14 +1,14 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.api import org.openapitools.client.model.User @@ -19,111 +19,141 @@ import org.openapitools.client.core.ApiKeyLocations._ object UserApi { /** - * This can only be done by the logged in user. - * - * Expected answers: - * code 0 : (successful operation) - * - * @param user Created user object - */ + * This can only be done by the logged in user. + * + * Expected answers: + * code 0 : (successful operation) + * + * @param user Created user object + */ def createUser(user: User): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.POST, "http://petstore.swagger.io/v2", "/user", "application/json") + ApiRequest[Unit](ApiMethods.POST, + "http://petstore.swagger.io/v2", + "/user", + "application/json") .withBody(user) .withDefaultSuccessResponse[Unit] - /** - * Expected answers: - * code 0 : (successful operation) - * - * @param user List of user object - */ + + /** + * Expected answers: + * code 0 : (successful operation) + * + * @param user List of user object + */ def createUsersWithArrayInput(user: Seq[User]): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.POST, "http://petstore.swagger.io/v2", "/user/createWithArray", "application/json") + ApiRequest[Unit](ApiMethods.POST, + "http://petstore.swagger.io/v2", + "/user/createWithArray", + "application/json") .withBody(user) .withDefaultSuccessResponse[Unit] - /** - * Expected answers: - * code 0 : (successful operation) - * - * @param user List of user object - */ + + /** + * Expected answers: + * code 0 : (successful operation) + * + * @param user List of user object + */ def createUsersWithListInput(user: Seq[User]): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.POST, "http://petstore.swagger.io/v2", "/user/createWithList", "application/json") + ApiRequest[Unit](ApiMethods.POST, + "http://petstore.swagger.io/v2", + "/user/createWithList", + "application/json") .withBody(user) .withDefaultSuccessResponse[Unit] - /** - * This can only be done by the logged in user. - * - * Expected answers: - * code 400 : (Invalid username supplied) - * code 404 : (User not found) - * - * @param username The name that needs to be deleted - */ + + /** + * This can only be done by the logged in user. + * + * Expected answers: + * code 400 : (Invalid username supplied) + * code 404 : (User not found) + * + * @param username The name that needs to be deleted + */ def deleteUser(username: String): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.DELETE, "http://petstore.swagger.io/v2", "/user/{username}", "application/json") + ApiRequest[Unit](ApiMethods.DELETE, + "http://petstore.swagger.io/v2", + "/user/{username}", + "application/json") .withPathParam("username", username) .withErrorResponse[Unit](400) .withErrorResponse[Unit](404) - /** - * Expected answers: - * code 200 : User (successful operation) - * code 400 : (Invalid username supplied) - * code 404 : (User not found) - * - * @param username The name that needs to be fetched. Use user1 for testing. - */ + + /** + * Expected answers: + * code 200 : User (successful operation) + * code 400 : (Invalid username supplied) + * code 404 : (User not found) + * + * @param username The name that needs to be fetched. Use user1 for testing. + */ def getUserByName(username: String): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.GET, "http://petstore.swagger.io/v2", "/user/{username}", "application/json") + ApiRequest[Unit](ApiMethods.GET, + "http://petstore.swagger.io/v2", + "/user/{username}", + "application/json") .withPathParam("username", username) .withSuccessResponse[User](200) .withErrorResponse[Unit](400) .withErrorResponse[Unit](404) - /** - * Expected answers: - * code 200 : String (successful operation) - * Headers : - * X-Rate-Limit - calls per hour allowed by the user - * X-Expires-After - date in UTC when toekn expires - * code 400 : (Invalid username/password supplied) - * - * @param username The user name for login - * @param password The password for login in clear text - */ + + /** + * Expected answers: + * code 200 : String (successful operation) + * Headers : + * X-Rate-Limit - calls per hour allowed by the user + * X-Expires-After - date in UTC when toekn expires + * code 400 : (Invalid username/password supplied) + * + * @param username The user name for login + * @param password The password for login in clear text + */ def loginUser(username: String, password: String): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.GET, "http://petstore.swagger.io/v2", "/user/login", "application/json") + ApiRequest[Unit](ApiMethods.GET, + "http://petstore.swagger.io/v2", + "/user/login", + "application/json") .withQueryParam("username", username) .withQueryParam("password", password) .withSuccessResponse[String](200) .withErrorResponse[Unit](400) - - object LoginUserHeaders { + + object LoginUserHeaders { def xRateLimit(r: ApiReturnWithHeaders) = r.getIntHeader("X-Rate-Limit") - def xExpiresAfter(r: ApiReturnWithHeaders) = r.getDateTimeHeader("X-Expires-After") + def xExpiresAfter(r: ApiReturnWithHeaders) = + r.getDateTimeHeader("X-Expires-After") } + /** - * Expected answers: - * code 0 : (successful operation) - */ + * Expected answers: + * code 0 : (successful operation) + */ def logoutUser(): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.GET, "http://petstore.swagger.io/v2", "/user/logout", "application/json") + ApiRequest[Unit](ApiMethods.GET, + "http://petstore.swagger.io/v2", + "/user/logout", + "application/json") .withDefaultSuccessResponse[Unit] - /** - * This can only be done by the logged in user. - * - * Expected answers: - * code 400 : (Invalid user supplied) - * code 404 : (User not found) - * - * @param username name that need to be deleted - * @param user Updated user object - */ + + /** + * This can only be done by the logged in user. + * + * Expected answers: + * code 400 : (Invalid user supplied) + * code 404 : (User not found) + * + * @param username name that need to be deleted + * @param user Updated user object + */ def updateUser(username: String, user: User): ApiRequest[Unit] = - ApiRequest[Unit](ApiMethods.PUT, "http://petstore.swagger.io/v2", "/user/{username}", "application/json") + ApiRequest[Unit](ApiMethods.PUT, + "http://petstore.swagger.io/v2", + "/user/{username}", + "application/json") .withBody(user) .withPathParam("username", username) .withErrorResponse[Unit](400) .withErrorResponse[Unit](404) - } - diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiInvoker.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiInvoker.scala index 55b7877b63a..773a6dd54d7 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiInvoker.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiInvoker.scala @@ -1,14 +1,14 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.core import java.io.File @@ -46,58 +46,82 @@ object ApiInvoker { def apply()(implicit system: ActorSystem): ApiInvoker = apply(DefaultFormats + DateTimeSerializer) - def apply(serializers: Traversable[Serializer[_]])(implicit system: ActorSystem): ApiInvoker = + def apply(serializers: Traversable[Serializer[_]])( + implicit system: ActorSystem): ApiInvoker = apply(DefaultFormats + DateTimeSerializer ++ serializers) - def apply(formats: Formats)(implicit system: ActorSystem): ApiInvoker = new ApiInvoker(formats) + def apply(formats: Formats)(implicit system: ActorSystem): ApiInvoker = + new ApiInvoker(formats) - case class CustomStatusCode(value: Int, reason: String = "Application-defined status code", isSuccess: Boolean = true) + case class CustomStatusCode( + value: Int, + reason: String = "Application-defined status code", + isSuccess: Boolean = true) - def addCustomStatusCode(code: CustomStatusCode): Unit = addCustomStatusCode(code.value, code.reason, code.isSuccess) + def addCustomStatusCode(code: CustomStatusCode): Unit = + addCustomStatusCode(code.value, code.reason, code.isSuccess) - def addCustomStatusCode(code: Int, reason: String = "Application defined code", isSuccess: Boolean = true): Unit = { + def addCustomStatusCode(code: Int, + reason: String = "Application defined code", + isSuccess: Boolean = true): Unit = { StatusCodes.getForKey(code) foreach { _ => - StatusCodes.registerCustom(code, reason, reason, isSuccess, allowsEntity = true) + StatusCodes.registerCustom(code, + reason, + reason, + isSuccess, + allowsEntity = true) } } /** - * Allows request execution without calling apiInvoker.execute(request) - * request.response can be used to get a future of the ApiResponse generated. - * request.result can be used to get a future of the expected ApiResponse content. If content doesn't match, a - * Future will failed with a ClassCastException - * @param request the apiRequest to be executed - */ + * Allows request execution without calling apiInvoker.execute(request) + * request.response can be used to get a future of the ApiResponse generated. + * request.result can be used to get a future of the expected ApiResponse content. If content doesn't match, a + * Future will failed with a ClassCastException + * @param request the apiRequest to be executed + */ implicit class ApiRequestImprovements[T](request: ApiRequest[T]) { - def response(invoker: ApiInvoker)(implicit ec: ExecutionContext, system: ActorSystem): Future[ApiResponse[T]] = + def response(invoker: ApiInvoker)( + implicit ec: ExecutionContext, + system: ActorSystem): Future[ApiResponse[T]] = response(ec, system, invoker) - def response(implicit ec: ExecutionContext, system: ActorSystem, invoker: ApiInvoker): Future[ApiResponse[T]] = + def response(implicit ec: ExecutionContext, + system: ActorSystem, + invoker: ApiInvoker): Future[ApiResponse[T]] = invoker.execute(request) - def result[U <: T](implicit c: ClassTag[U], ec: ExecutionContext, system: ActorSystem, invoker: ApiInvoker): Future[U] = + def result[U <: T](implicit c: ClassTag[U], + ec: ExecutionContext, + system: ActorSystem, + invoker: ApiInvoker): Future[U] = invoker.execute(request).map(_.content).mapTo[U] } /** - * Allows transformation from ApiMethod to spray HttpMethods - * @param method the ApiMethod to be converted - */ + * Allows transformation from ApiMethod to spray HttpMethods + * @param method the ApiMethod to be converted + */ implicit class ApiMethodExtensions(val method: ApiMethod) { - def toSprayMethod: HttpMethod = HttpMethods.getForKey(method.value).getOrElse(HttpMethods.GET) + def toSprayMethod: HttpMethod = + HttpMethods.getForKey(method.value).getOrElse(HttpMethods.GET) } - case object DateTimeSerializer extends CustomSerializer[DateTime](format => ( { - case JString(s) => - ISODateTimeFormat.dateOptionalTimeParser().parseDateTime(s) - }, { - case d: DateTime => - JString(ISODateTimeFormat.dateTime().print(d)) - })) + case object DateTimeSerializer + extends CustomSerializer[DateTime](format => + ({ + case JString(s) => + ISODateTimeFormat.dateOptionalTimeParser().parseDateTime(s) + }, { + case d: DateTime => + JString(ISODateTimeFormat.dateTime().print(d)) + })) } -class ApiInvoker(formats: Formats)(implicit system: ActorSystem) extends UntrustedSslContext with CustomContentTypes { +class ApiInvoker(formats: Formats)(implicit system: ActorSystem) + extends UntrustedSslContext + with CustomContentTypes { import org.openapitools.client.core.ApiInvoker._ import org.openapitools.client.core.ParametersMap._ @@ -109,23 +133,27 @@ class ApiInvoker(formats: Formats)(implicit system: ActorSystem) extends Untrust import spray.http.MessagePredicate._ - val CompressionFilter: MessagePredicate= MessagePredicate({ _ => settings.compressionEnabled}) && + val CompressionFilter: MessagePredicate = MessagePredicate({ _ => + settings.compressionEnabled + }) && Encoder.DefaultFilter && minEntitySize(settings.compressionSizeThreshold) settings.customCodes.foreach(addCustomStatusCode) - private def addAuthentication(credentialsSeq: Seq[Credentials]): pipelining.RequestTransformer = + private def addAuthentication( + credentialsSeq: Seq[Credentials]): pipelining.RequestTransformer = request => credentialsSeq.foldLeft(request) { case (req, BasicCredentials(login, password)) => req ~> addCredentials(BasicHttpCredentials(login, password)) - case (req, ApiKeyCredentials(keyValue, keyName, ApiKeyLocations.HEADER)) => + case (req, + ApiKeyCredentials(keyValue, keyName, ApiKeyLocations.HEADER)) => req ~> addHeader(RawHeader(keyName, keyValue.value)) case (req, _) => req - } - - private def addHeaders(headers: Map[String, Any]): pipelining.RequestTransformer = { request => + } + private def addHeaders( + headers: Map[String, Any]): pipelining.RequestTransformer = { request => val rawHeaders = for { (name, value) <- headers.asFormattedParams header = RawHeader(name, String.valueOf(value)) @@ -155,7 +183,9 @@ class ApiInvoker(formats: Formats)(implicit system: ActorSystem) extends Untrust Some( normalizedContentType(request.contentType).mediaType match { case MediaTypes.`multipart/form-data` => - MultipartFormData(params.map { case (name, value) => (name, bodyPart(name, value))}) + MultipartFormData(params.map { + case (name, value) => (name, bodyPart(name, value)) + }) case MediaTypes.`application/x-www-form-urlencoded` => FormData(params.mapValues(String.valueOf)) case m: MediaType => // Default : application/x-www-form-urlencoded. @@ -180,9 +210,13 @@ class ApiInvoker(formats: Formats)(implicit system: ActorSystem) extends Untrust case Some(c: MultipartFormData) => builder.apply(uri, c) case Some(c: String) => - builder.apply(uri, HttpEntity(normalizedContentType(request.contentType), c)) + builder.apply( + uri, + HttpEntity(normalizedContentType(request.contentType), c)) case _ => - builder.apply(uri, HttpEntity(normalizedContentType(request.contentType), " ")) + builder.apply( + uri, + HttpEntity(normalizedContentType(request.contentType), " ")) } case _ => builder.apply(uri) } @@ -194,15 +228,17 @@ class ApiInvoker(formats: Formats)(implicit system: ActorSystem) extends Untrust } def makeQuery(r: ApiRequest[_]): Query = { - r.credentials.foldLeft(r.queryParams) { - case (params, ApiKeyCredentials(key, keyName, ApiKeyLocations.QUERY)) => - params + (keyName -> key.value) - case (params, _) => params - }.asFormattedParams + r.credentials + .foldLeft(r.queryParams) { + case (params, ApiKeyCredentials(key, keyName, ApiKeyLocations.QUERY)) => + params + (keyName -> key.value) + case (params, _) => params + } + .asFormattedParams .mapValues(String.valueOf) .foldRight[Query](Uri.Query.Empty) { - case ((name, value), acc) => acc.+:(name, value) - } + case ((name, value), acc) => acc.+:(name, value) + } } def makeUri(r: ApiRequest[_]): Uri = { @@ -210,8 +246,8 @@ class ApiInvoker(formats: Formats)(implicit system: ActorSystem) extends Untrust val opPathWithParams = r.pathParams.asFormattedParams .mapValues(String.valueOf) .foldLeft(opPath) { - case (path, (name, value)) => path.replaceAll(s"\\{$name\\}", value) - } + case (path, (name, value)) => path.replaceAll(s"\\{$name\\}", value) + } val query = makeQuery(r) Uri(r.basePath + opPathWithParams).withQuery(query) @@ -227,7 +263,9 @@ class ApiInvoker(formats: Formats)(implicit system: ActorSystem) extends Untrust uri.authority.host.toString, uri.effectivePort, sslEncryption = "https".equals(uri.scheme), - defaultHeaders = settings.defaultHeaders ++ List(`Accept-Encoding`(gzip, deflate))) + defaultHeaders = settings.defaultHeaders ++ List( + `Accept-Encoding`(gzip, deflate)) + ) val request = createRequest(uri, r) @@ -237,46 +275,62 @@ class ApiInvoker(formats: Formats)(implicit system: ActorSystem) extends Untrust } yield { response ~> decode(Deflate) ~> decode(Gzip) ~> unmarshallApiResponse(r) } - } - catch { + } catch { case NonFatal(x) => Future.failed(x) } } - def unmarshallApiResponse[T](request: ApiRequest[T])(response: HttpResponse): ApiResponse[T] = { + def unmarshallApiResponse[T](request: ApiRequest[T])( + response: HttpResponse): ApiResponse[T] = { request.responseForCode(response.status.intValue) match { - case Some( (manifest: Manifest[T], state: ResponseState) ) => + case Some((manifest: Manifest[T], state: ResponseState)) => entityUnmarshaller(manifest)(response.entity) match { case Right(value) ⇒ state match { case ResponseState.Success => - ApiResponse(response.status.intValue, value, response.headers.map(header => (header.name, header.value)).toMap) + ApiResponse(response.status.intValue, + value, + response.headers + .map(header => (header.name, header.value)) + .toMap) case ResponseState.Error => - throw ApiError(response.status.intValue, "Error response received", - Some(value), - headers = response.headers.map(header => (header.name, header.value)).toMap) + throw ApiError(response.status.intValue, + "Error response received", + Some(value), + headers = response.headers + .map(header => (header.name, header.value)) + .toMap) } case Left(MalformedContent(error, Some(cause))) ⇒ - throw ApiError(response.status.intValue, s"Unable to unmarshall content to [$manifest]", Some(response.entity.toString), cause) + throw ApiError(response.status.intValue, + s"Unable to unmarshall content to [$manifest]", + Some(response.entity.toString), + cause) case Left(MalformedContent(error, None)) ⇒ - throw ApiError(response.status.intValue, s"Unable to unmarshall content to [$manifest]", Some(response.entity.toString)) + throw ApiError(response.status.intValue, + s"Unable to unmarshall content to [$manifest]", + Some(response.entity.toString)) case Left(ContentExpected) ⇒ - throw ApiError(response.status.intValue, s"Unable to unmarshall empty response to [$manifest]", Some(response.entity.toString)) + throw ApiError( + response.status.intValue, + s"Unable to unmarshall empty response to [$manifest]", + Some(response.entity.toString)) } - case _ => throw ApiError(response.status.intValue, "Unexpected response code", Some(response.entity.toString)) + case _ => + throw ApiError(response.status.intValue, + "Unexpected response code", + Some(response.entity.toString)) } } def entityUnmarshaller[T](implicit mf: Manifest[T]): Unmarshaller[T] = Unmarshaller[T](MediaTypes.`application/json`) { case x: HttpEntity.NonEmpty ⇒ - parse(x.asString(defaultCharset = HttpCharsets.`UTF-8`)) - .noNulls - .camelizeKeys + parse(x.asString(defaultCharset = HttpCharsets.`UTF-8`)).noNulls.camelizeKeys .extract[T] } @@ -285,10 +339,12 @@ class ApiInvoker(formats: Formats)(implicit system: ActorSystem) extends Untrust sealed trait CustomContentTypes { def normalizedContentType(original: String): ContentType = - MediaTypes.forExtension(original) map (ContentType(_)) getOrElse parseContentType(original) + MediaTypes.forExtension(original) map (ContentType(_)) getOrElse parseContentType( + original) def parseContentType(contentType: String): ContentType = { - val contentTypeAsRawHeader = HttpHeaders.RawHeader("Content-Type", contentType) + val contentTypeAsRawHeader = + HttpHeaders.RawHeader("Content-Type", contentType) val parsedContentTypeHeader = HttpParser.parseHeader(contentTypeAsRawHeader) (parsedContentTypeHeader: @unchecked) match { case Right(ct: HttpHeaders.`Content-Type`) => @@ -310,9 +366,11 @@ sealed trait UntrustedSslContext { case true => class IgnoreX509TrustManager extends X509TrustManager { - def checkClientTrusted(chain: Array[X509Certificate], authType: String): Unit = {} + def checkClientTrusted(chain: Array[X509Certificate], + authType: String): Unit = {} - def checkServerTrusted(chain: Array[X509Certificate], authType: String): Unit = {} + def checkServerTrusted(chain: Array[X509Certificate], + authType: String): Unit = {} def getAcceptedIssuers = null } @@ -324,10 +382,9 @@ sealed trait UntrustedSslContext { } implicit val clientSSLEngineProvider = - ClientSSLEngineProvider { - _ => - val engine = trustfulSslContext.createSSLEngine() - engine.setUseClientMode(true) - engine + ClientSSLEngineProvider { _ => + val engine = trustfulSslContext.createSSLEngine() + engine.setUseClientMode(true) + engine } } diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiRequest.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiRequest.scala index 2378d8c5fe0..73b24e948de 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiRequest.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiRequest.scala @@ -1,14 +1,14 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.core sealed trait ResponseState @@ -22,44 +22,58 @@ object ResponseState { } case class ApiRequest[U]( - // required fields - method: ApiMethod, - basePath: String, - operationPath: String, - contentType: String, + // required fields + method: ApiMethod, + basePath: String, + operationPath: String, + contentType: String, + // optional fields + responses: Map[Int, (Manifest[_], ResponseState)] = + Map.empty, + bodyParam: Option[Any] = None, + formParams: Map[String, Any] = Map.empty, + pathParams: Map[String, Any] = Map.empty, + queryParams: Map[String, Any] = Map.empty, + headerParams: Map[String, Any] = Map.empty, + credentials: Seq[Credentials] = List.empty) { - // optional fields - responses: Map[Int, (Manifest[_], ResponseState)] = Map.empty, - bodyParam: Option[Any] = None, - formParams: Map[String, Any] = Map.empty, - pathParams: Map[String, Any] = Map.empty, - queryParams: Map[String, Any] = Map.empty, - headerParams: Map[String, Any] = Map.empty, - credentials: Seq[Credentials] = List.empty) { + def withCredentials(cred: Credentials): ApiRequest[U] = + copy[U](credentials = credentials :+ cred) - def withCredentials(cred: Credentials): ApiRequest[U] = copy[U](credentials = credentials :+ cred) + def withApiKey(key: ApiKeyValue, + keyName: String, + location: ApiKeyLocation): ApiRequest[U] = + withCredentials(ApiKeyCredentials(key, keyName, location)) - def withApiKey(key: ApiKeyValue, keyName: String, location: ApiKeyLocation): ApiRequest[U] = withCredentials(ApiKeyCredentials(key, keyName, location)) + def withSuccessResponse[T](code: Int)( + implicit m: Manifest[T]): ApiRequest[U] = + copy[U](responses = responses + (code -> (m, ResponseState.Success))) - def withSuccessResponse[T](code: Int)(implicit m: Manifest[T]): ApiRequest[U] = copy[U](responses = responses + (code -> (m, ResponseState.Success))) + def withErrorResponse[T](code: Int)(implicit m: Manifest[T]): ApiRequest[U] = + copy[U](responses = responses + (code -> (m, ResponseState.Error))) - def withErrorResponse[T](code: Int)(implicit m: Manifest[T]): ApiRequest[U] = copy[U](responses = responses + (code -> (m, ResponseState.Error))) + def withDefaultSuccessResponse[T](implicit m: Manifest[T]): ApiRequest[U] = + withSuccessResponse[T](0) - def withDefaultSuccessResponse[T](implicit m: Manifest[T]): ApiRequest[U] = withSuccessResponse[T](0) + def withDefaultErrorResponse[T](implicit m: Manifest[T]): ApiRequest[U] = + withErrorResponse[T](0) - def withDefaultErrorResponse[T](implicit m: Manifest[T]): ApiRequest[U] = withErrorResponse[T](0) - - def responseForCode(statusCode: Int): Option[(Manifest[_], ResponseState)] = responses.get(statusCode) orElse responses.get(0) + def responseForCode(statusCode: Int): Option[(Manifest[_], ResponseState)] = + responses.get(statusCode) orElse responses.get(0) def withoutBody(): ApiRequest[U] = copy[U](bodyParam = None) def withBody(body: Any): ApiRequest[U] = copy[U](bodyParam = Some(body)) - def withFormParam(name: String, value: Any): ApiRequest[U] = copy[U](formParams = formParams + (name -> value)) + def withFormParam(name: String, value: Any): ApiRequest[U] = + copy[U](formParams = formParams + (name -> value)) - def withPathParam(name: String, value: Any): ApiRequest[U] = copy[U](pathParams = pathParams + (name -> value)) + def withPathParam(name: String, value: Any): ApiRequest[U] = + copy[U](pathParams = pathParams + (name -> value)) - def withQueryParam(name: String, value: Any): ApiRequest[U] = copy[U](queryParams = queryParams + (name -> value)) + def withQueryParam(name: String, value: Any): ApiRequest[U] = + copy[U](queryParams = queryParams + (name -> value)) - def withHeaderParam(name: String, value: Any): ApiRequest[U] = copy[U](headerParams = headerParams + (name -> value)) + def withHeaderParam(name: String, value: Any): ApiRequest[U] = + copy[U](headerParams = headerParams + (name -> value)) } diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiSettings.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiSettings.scala index a8aadcd7432..ec59863c99b 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiSettings.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/ApiSettings.scala @@ -1,14 +1,14 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.core import java.util.concurrent.TimeUnit @@ -27,16 +27,23 @@ class ApiSettings(config: Config) extends Extension { private def cfg = config.getConfig("org.openapitools.client.apiRequest") val alwaysTrustCertificates: Boolean = cfg.getBoolean("trust-certificates") - val defaultHeaders: List[RawHeader] = cfg.getConfig("default-headers").entrySet.toList.map(c => RawHeader(c.getKey, c.getValue.render)) - val connectionTimeout = FiniteDuration(cfg.getDuration("connection-timeout", TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS) + val defaultHeaders: List[RawHeader] = cfg + .getConfig("default-headers") + .entrySet + .toList + .map(c => RawHeader(c.getKey, c.getValue.render)) + val connectionTimeout = FiniteDuration( + cfg.getDuration("connection-timeout", TimeUnit.MILLISECONDS), + TimeUnit.MILLISECONDS) val compressionEnabled: Boolean = cfg.getBoolean("compression.enabled") - val compressionSizeThreshold: Int = cfg.getBytes("compression.size-threshold").toInt - val customCodes: List[CustomStatusCode] = cfg.getConfigList("custom-codes").toList.map { c => - CustomStatusCode( - c.getInt("code"), - c.getString("reason"), - c.getBoolean("success")) - } + val compressionSizeThreshold: Int = + cfg.getBytes("compression.size-threshold").toInt + val customCodes: List[CustomStatusCode] = + cfg.getConfigList("custom-codes").toList.map { c => + CustomStatusCode(c.getInt("code"), + c.getString("reason"), + c.getBoolean("success")) + } } object ApiSettings extends ExtensionKey[ApiSettings] diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/requests.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/requests.scala index ff715e3eb29..9a417279b20 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/requests.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/core/requests.scala @@ -1,14 +1,14 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.core import java.io.File @@ -26,28 +26,42 @@ sealed trait ApiReturnWithHeaders { // workaround: return date time header in string instead of datetime object def getDateTimeHeader(name: String): Option[String] = header(name) - def getIntHeader(name: String): Option[Int] = castedHeader(name, java.lang.Integer.parseInt) + def getIntHeader(name: String): Option[Int] = + castedHeader(name, java.lang.Integer.parseInt) - def getLongHeader(name: String): Option[Long] = castedHeader(name, java.lang.Long.parseLong) + def getLongHeader(name: String): Option[Long] = + castedHeader(name, java.lang.Long.parseLong) - def getFloatHeader(name: String): Option[Float] = castedHeader(name, java.lang.Float.parseFloat) + def getFloatHeader(name: String): Option[Float] = + castedHeader(name, java.lang.Float.parseFloat) - def getDoubleHeader(name: String): Option[Double] = castedHeader(name, java.lang.Double.parseDouble) + def getDoubleHeader(name: String): Option[Double] = + castedHeader(name, java.lang.Double.parseDouble) - def getBooleanHeader(name: String): Option[Boolean] = castedHeader(name, java.lang.Boolean.parseBoolean) + def getBooleanHeader(name: String): Option[Boolean] = + castedHeader(name, java.lang.Boolean.parseBoolean) - private def castedHeader[U](name: String, conversion: String => U): Option[U] = { + private def castedHeader[U](name: String, + conversion: String => U): Option[U] = { Try { header(name).map(conversion) }.get } } -sealed case class ApiResponse[T](code: Int, content: T, headers: Map[String, String] = Map.empty) - extends ApiReturnWithHeaders +sealed case class ApiResponse[T](code: Int, + content: T, + headers: Map[String, String] = Map.empty) + extends ApiReturnWithHeaders -sealed case class ApiError[T](code: Int, message: String, responseContent: Option[T], cause: Throwable = null, headers: Map[String, String] = Map.empty) - extends Throwable(s"($code) $message.${responseContent.map(s => s" Content : $s").getOrElse("")}", cause) +sealed case class ApiError[T](code: Int, + message: String, + responseContent: Option[T], + cause: Throwable = null, + headers: Map[String, String] = Map.empty) + extends Throwable( + s"($code) $message.${responseContent.map(s => s" Content : $s").getOrElse("")}", + cause) with ApiReturnWithHeaders sealed case class ApiMethod(value: String) @@ -65,23 +79,27 @@ object ApiMethods { } /** - * This trait needs to be added to any model defined by the api. - */ + * This trait needs to be added to any model defined by the api. + */ trait ApiModel /** - * Single trait defining a credential that can be transformed to a paramName / paramValue tupple - */ + * Single trait defining a credential that can be transformed to a paramName / paramValue tupple + */ sealed trait Credentials { def asQueryParam: Option[(String, String)] = None } -sealed case class BasicCredentials(user: String, password: String) extends Credentials +sealed case class BasicCredentials(user: String, password: String) + extends Credentials -sealed case class ApiKeyCredentials(key: ApiKeyValue, keyName: String, location: ApiKeyLocation) extends Credentials { +sealed case class ApiKeyCredentials(key: ApiKeyValue, + keyName: String, + location: ApiKeyLocation) + extends Credentials { override def asQueryParam: Option[(String, String)] = location match { case ApiKeyLocations.QUERY => Some((keyName, key.value)) - case _ => None + case _ => None } } @@ -97,39 +115,40 @@ object ApiKeyLocations { } - /** - * Case class used to unapply numeric values only in pattern matching - * - * @param value the string representation of the numeric value - */ + * Case class used to unapply numeric values only in pattern matching + * + * @param value the string representation of the numeric value + */ sealed case class NumericValue(value: String) { override def toString: String = value } object NumericValue { def unapply(n: Any): Option[NumericValue] = n match { - case (_: Int | _: Long | _: Float | _: Double | _: Boolean | _: Byte) => Some(NumericValue(String.valueOf(n))) + case (_: Int | _: Long | _: Float | _: Double | _: Boolean | _: Byte) => + Some(NumericValue(String.valueOf(n))) case _ => None } } /** - * Used for params being arrays - */ -sealed case class ArrayValues(values: Seq[Any], format: CollectionFormat = CollectionFormats.CSV) + * Used for params being arrays + */ +sealed case class ArrayValues(values: Seq[Any], + format: CollectionFormat = CollectionFormats.CSV) object ArrayValues { def apply(values: Option[Seq[Any]], format: CollectionFormat): ArrayValues = ArrayValues(values.getOrElse(Seq.empty), format) - def apply(values: Option[Seq[Any]]): ArrayValues = ArrayValues(values, CollectionFormats.CSV) + def apply(values: Option[Seq[Any]]): ArrayValues = + ArrayValues(values, CollectionFormats.CSV) } - /** - * Defines how arrays should be rendered in query strings. - */ + * Defines how arrays should be rendered in query strings. + */ sealed trait CollectionFormat trait MergedArrayFormat extends CollectionFormat { @@ -161,33 +180,39 @@ object CollectionFormats { object ParametersMap { /** - * Pimp parameters maps (Map[String, Any]) in order to transform them in a sequence of String -> Any tupples, - * with valid url-encoding, arrays handling, files preservation, ... - */ + * Pimp parameters maps (Map[String, Any]) in order to transform them in a sequence of String -> Any tupples, + * with valid url-encoding, arrays handling, files preservation, ... + */ implicit class ParametersMapImprovements(val m: Map[String, Any]) { - def asFormattedParamsList: List[(String, Any)] = m.toList.flatMap(formattedParams) + def asFormattedParamsList: List[(String, Any)] = + m.toList.flatMap(formattedParams) def asFormattedParams: Map[String, Any] = m.flatMap(formattedParams) - private def urlEncode(v: Any) = URLEncoder.encode(String.valueOf(v), "utf-8").replaceAll("\\+", "%20") + private def urlEncode(v: Any) = + URLEncoder.encode(String.valueOf(v), "utf-8").replaceAll("\\+", "%20") - private def formattedParams(tuple: (String, Any)): Seq[(String, Any)] = formattedParams(tuple._1, tuple._2) + private def formattedParams(tuple: (String, Any)): Seq[(String, Any)] = + formattedParams(tuple._1, tuple._2) - private def formattedParams(name: String, value: Any): Seq[(String, Any)] = value match { - case arr: ArrayValues => - arr.format match { - case CollectionFormats.MULTI => arr.values.flatMap(formattedParams(name, _)) - case format: MergedArrayFormat => Seq((name, arr.values.mkString(format.separator))) - } - case None => Seq.empty - case Some(opt) => formattedParams(name, opt) - case s: Seq[Any] => formattedParams(name, ArrayValues(s)) - case v: String => Seq((name, urlEncode(v))) - case NumericValue(v) => Seq((name, urlEncode(v))) - case f: File => Seq((name, f)) - case m: ApiModel => Seq((name, m)) - } + private def formattedParams(name: String, value: Any): Seq[(String, Any)] = + value match { + case arr: ArrayValues => + arr.format match { + case CollectionFormats.MULTI => + arr.values.flatMap(formattedParams(name, _)) + case format: MergedArrayFormat => + Seq((name, arr.values.mkString(format.separator))) + } + case None => Seq.empty + case Some(opt) => formattedParams(name, opt) + case s: Seq[Any] => formattedParams(name, ArrayValues(s)) + case v: String => Seq((name, urlEncode(v))) + case NumericValue(v) => Seq((name, urlEncode(v))) + case f: File => Seq((name, f)) + case m: ApiModel => Seq((name, m)) + } } } diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/ApiResponse.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/ApiResponse.scala index ce8e3b4942b..9cf9701a0b7 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/ApiResponse.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/ApiResponse.scala @@ -1,24 +1,22 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.model import org.openapitools.client.core.ApiModel import org.joda.time.DateTime import java.util.UUID -case class ApiResponse ( - code: Option[Int], - `type`: Option[String], - message: Option[String] +case class ApiResponse( + code: Option[Int], + `type`: Option[String], + message: Option[String] ) extends ApiModel - - diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Category.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Category.scala index 84a70a3cf6b..53b1eb8fa8c 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Category.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Category.scala @@ -1,23 +1,21 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.model import org.openapitools.client.core.ApiModel import org.joda.time.DateTime import java.util.UUID -case class Category ( - id: Option[Long], - name: Option[String] +case class Category( + id: Option[Long], + name: Option[String] ) extends ApiModel - - diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Order.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Order.scala index 6094089b493..d3634336128 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Order.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Order.scala @@ -1,28 +1,28 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.model import org.openapitools.client.core.ApiModel import org.joda.time.DateTime import java.util.UUID -case class Order ( - id: Option[Long], - petId: Option[Long], - quantity: Option[Int], - shipDate: Option[DateTime], - /* Order Status */ - status: Option[OrderEnums.Status], - complete: Option[Boolean] +case class Order( + id: Option[Long], + petId: Option[Long], + quantity: Option[Int], + shipDate: Option[DateTime], + /* Order Status */ + status: Option[OrderEnums.Status], + complete: Option[Boolean] ) extends ApiModel object OrderEnums { @@ -35,4 +35,3 @@ object OrderEnums { } } - diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Pet.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Pet.scala index 6d4918a776a..3adfab853f3 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Pet.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Pet.scala @@ -1,28 +1,28 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.model import org.openapitools.client.core.ApiModel import org.joda.time.DateTime import java.util.UUID -case class Pet ( - id: Option[Long], - category: Option[Category], - name: String, - photoUrls: Seq[String], - tags: Option[Seq[Tag]], - /* pet status in the store */ - status: Option[PetEnums.Status] +case class Pet( + id: Option[Long], + category: Option[Category], + name: String, + photoUrls: Seq[String], + tags: Option[Seq[Tag]], + /* pet status in the store */ + status: Option[PetEnums.Status] ) extends ApiModel object PetEnums { @@ -35,4 +35,3 @@ object PetEnums { } } - diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Tag.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Tag.scala index 5ed6d6ab614..ab1546b7dc6 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Tag.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/Tag.scala @@ -1,23 +1,21 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.model import org.openapitools.client.core.ApiModel import org.joda.time.DateTime import java.util.UUID -case class Tag ( - id: Option[Long], - name: Option[String] +case class Tag( + id: Option[Long], + name: Option[String] ) extends ApiModel - - diff --git a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/User.scala b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/User.scala index facd053fa45..ebfd3a90491 100644 --- a/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/User.scala +++ b/samples/client/petstore/scala-akka/src/main/scala/org/openapitools/client/model/User.scala @@ -1,30 +1,28 @@ /** - * OpenAPI Petstore - * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. - * - * OpenAPI spec version: 1.0.0 - * - * - * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). - * https://openapi-generator.tech - * Do not edit the class manually. - */ + * OpenAPI Petstore + * This is a sample server Petstore server. For this sample, you can use the api key `special-key` to test the authorization filters. + * + * OpenAPI spec version: 1.0.0 + * + * + * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). + * https://openapi-generator.tech + * Do not edit the class manually. + */ package org.openapitools.client.model import org.openapitools.client.core.ApiModel import org.joda.time.DateTime import java.util.UUID -case class User ( - id: Option[Long], - username: Option[String], - firstName: Option[String], - lastName: Option[String], - email: Option[String], - password: Option[String], - phone: Option[String], - /* User Status */ - userStatus: Option[Int] +case class User( + id: Option[Long], + username: Option[String], + firstName: Option[String], + lastName: Option[String], + email: Option[String], + password: Option[String], + phone: Option[String], + /* User Status */ + userStatus: Option[Int] ) extends ApiModel - -