Fix Petstore example for Elm (#96)

* Add support for `additionalProperties` in operations;
* Add reserved module names.
This commit is contained in:
Erik Timmers 2018-05-18 13:14:55 +02:00 committed by William Cheng
parent 8c541a247b
commit a5cf27b60e
9 changed files with 48 additions and 37 deletions

View File

@ -87,7 +87,14 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig {
defaultIncludes = new HashSet<>( defaultIncludes = new HashSet<>(
Arrays.asList( Arrays.asList(
"List") "Order",
"Never",
"List",
"Maybe",
"Result",
"Program",
"Cmd",
"Sub")
); );
languageSpecificPrimitives = new HashSet<>( languageSpecificPrimitives = new HashSet<>(
@ -158,7 +165,8 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig {
@Override @Override
public String toModelName(String name) { public String toModelName(String name) {
return camelize(name); final String modelName = camelize(name);
return defaultIncludes.contains(modelName) ? modelName + "_" : modelName;
} }
@Override @Override
@ -262,10 +270,10 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig {
for (Map<String, Object> mo : models) { for (Map<String, Object> mo : models) {
CodegenModel cm = (CodegenModel) mo.get("model"); CodegenModel cm = (CodegenModel) mo.get("model");
if (cm.isEnum) { if (cm.isEnum) {
this.addEncoderAndDecoder(cm.vendorExtensions, cm.classname, false); this.addEncoderAndDecoder(cm.vendorExtensions, cm.classname, false, false);
cm.vendorExtensions.put(X_UNION_TYPE, cm.classname); cm.vendorExtensions.put(X_UNION_TYPE, cm.classname);
} else if (cm.isAlias) { } else if (cm.isAlias) {
this.addEncoderAndDecoder(cm.vendorExtensions, cm.dataType, true); this.addEncoderAndDecoder(cm.vendorExtensions, cm.dataType, false, true);
} }
List<ElmImport> elmImports = new ArrayList<>(); List<ElmImport> elmImports = new ArrayList<>();
@ -380,7 +388,7 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig {
} }
op.path = ("\"" + path + "\"").replaceAll(" \\+\\+ \"\"", ""); op.path = ("\"" + path + "\"").replaceAll(" \\+\\+ \"\"", "");
if (op.bodyParam != null) { if (op.bodyParam != null && !op.bodyParam.isPrimitiveType && !op.bodyParam.isMapContainer) {
final String encoder = (String) op.bodyParam.vendorExtensions.get(X_ENCODER); final String encoder = (String) op.bodyParam.vendorExtensions.get(X_ENCODER);
if (encoder != null) { if (encoder != null) {
if (!dependencies.containsKey(op.bodyParam.dataType)) { if (!dependencies.containsKey(op.bodyParam.dataType)) {
@ -390,6 +398,9 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig {
} }
} }
for (CodegenResponse resp : op.responses) { for (CodegenResponse resp : op.responses) {
if (resp.primitiveType || resp.isMapContainer) {
continue;
}
final String decoder = (String) resp.vendorExtensions.get(X_DECODER); final String decoder = (String) resp.vendorExtensions.get(X_DECODER);
if (decoder != null) { if (decoder != null) {
if (!dependencies.containsKey(resp.dataType)) { if (!dependencies.containsKey(resp.dataType)) {
@ -486,7 +497,7 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig {
final CodegenProperty property = super.fromProperty(name, p); final CodegenProperty property = super.fromProperty(name, p);
final String dataType = property.isEnum ? property.baseName : property.datatype; final String dataType = property.isEnum ? property.baseName : property.datatype;
addEncoderAndDecoder(property.vendorExtensions, dataType, property.isPrimitiveType && !property.isEnum); addEncoderAndDecoder(property.vendorExtensions, dataType, property.isMapContainer, property.isPrimitiveType && !property.isEnum);
if (property.isEnum) { if (property.isEnum) {
property.vendorExtensions.put(X_UNION_TYPE, property.datatypeWithEnum); property.vendorExtensions.put(X_UNION_TYPE, property.datatypeWithEnum);
} }
@ -498,17 +509,24 @@ public class ElmClientCodegen extends DefaultCodegen implements CodegenConfig {
public CodegenResponse fromResponse(String responseCode, ApiResponse resp) { public CodegenResponse fromResponse(String responseCode, ApiResponse resp) {
final CodegenResponse response = super.fromResponse(responseCode, resp); final CodegenResponse response = super.fromResponse(responseCode, resp);
if (response.dataType != null) { if (response.dataType != null) {
addEncoderAndDecoder(response.vendorExtensions, response.dataType, response.primitiveType); addEncoderAndDecoder(response.vendorExtensions, response.dataType, response.isMapContainer, response.primitiveType);
} }
return response; return response;
} }
@Override @Override
public void postProcessParameter(CodegenParameter parameter) { public void postProcessParameter(CodegenParameter parameter) {
addEncoderAndDecoder(parameter.vendorExtensions, parameter.dataType, parameter.isPrimitiveType); addEncoderAndDecoder(parameter.vendorExtensions, parameter.dataType, parameter.isMapContainer, parameter.isPrimitiveType);
} }
private void addEncoderAndDecoder(Map<String, Object> vendorExtensions, String dataType, Boolean isPrimitiveType) { private boolean isPrimitiveDataType(String dataType) {
return languageSpecificPrimitives.contains(dataType);
}
private void addEncoderAndDecoder(Map<String, Object> vendorExtensions, String dataType, Boolean isMapContainer, Boolean isPrimitiveType) {
if (isMapContainer) {
isPrimitiveType = isPrimitiveDataType(dataType);
}
final String baseName = camelize(dataType, true); final String baseName = camelize(dataType, true);
String encoderName; String encoderName;
String decoderName; String decoderName;

View File

@ -4,7 +4,8 @@ import Json.Decode as Decode exposing (Decoder)
import Json.Encode as Encode import Json.Encode as Encode
type alias Byte = String type alias Byte =
String
byteDecoder : Decoder Byte byteDecoder : Decoder Byte

View File

@ -2,7 +2,8 @@
module Request.{{classname}} exposing ({{#operations}}{{#operation}}{{^-first}}, {{/-first}}{{operationId}}{{/operation}}{{/operations}}) module Request.{{classname}} exposing ({{#operations}}{{#operation}}{{^-first}}, {{/-first}}{{operationId}}{{/operation}}{{/operations}})
{{>imports}}import Http {{>imports}}import Dict
import Http
import Json.Decode as Decode import Json.Decode as Decode
@ -16,13 +17,13 @@ basePath =
{- {-
{{notes}} {{notes}}
-} -}
{{operationId}} : {{#pathParams}}{{dataType}} -> {{/pathParams}}{{#bodyParam}}{{dataType}} -> {{/bodyParam}}Http.Request {{#responses}}{{#-first}}{{^dataType}}(){{/dataType}}{{#isListContainer}}(List {{/isListContainer}}{{dataType}}{{#isListContainer}}){{/isListContainer}}{{/-first}}{{/responses}} {{operationId}} : {{#pathParams}}{{dataType}} -> {{/pathParams}}{{#bodyParam}}{{dataType}} -> {{/bodyParam}}Http.Request {{#responses}}{{#-first}}{{^dataType}}(){{/dataType}}{{#isMapContainer}}(Dict.Dict String {{/isMapContainer}}{{#isListContainer}}(List {{/isListContainer}}{{dataType}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/-first}}{{/responses}}
{{operationId}} {{#pathParams}}{{paramName}} {{/pathParams}}{{#bodyParam}}model {{/bodyParam}}= {{operationId}} {{#pathParams}}{{paramName}} {{/pathParams}}{{#bodyParam}}model {{/bodyParam}}=
{ method = "{{httpMethod}}" { method = "{{httpMethod}}"
, url = basePath ++ {{{path}}} , url = basePath ++ {{{path}}}
, headers = [] , headers = []
, body = {{#bodyParam}}Http.jsonBody <| {{vendorExtensions.x-encoder}} model{{/bodyParam}}{{^bodyParam}}Http.emptyBody{{/bodyParam}} , body = {{#bodyParam}}Http.jsonBody <| {{vendorExtensions.x-encoder}} model{{/bodyParam}}{{^bodyParam}}Http.emptyBody{{/bodyParam}}
, expect = {{#responses}}{{#-first}}{{^dataType}}Http.expectStringResponse (\_ -> Ok ()){{/dataType}}{{#dataType}}Http.expectJson {{#isListContainer}}(Decode.list {{/isListContainer}}{{#vendorExtensions}}{{x-decoder}}{{/vendorExtensions}}{{#isListContainer}}){{/isListContainer}}{{/dataType}}{{/-first}}{{/responses}} , expect = {{#responses}}{{#-first}}{{^dataType}}Http.expectStringResponse (\_ -> Ok ()){{/dataType}}{{#dataType}}Http.expectJson {{#isMapContainer}}(Decode.dict {{/isMapContainer}}{{#isListContainer}}(Decode.list {{/isListContainer}}{{#vendorExtensions}}{{x-decoder}}{{/vendorExtensions}}{{#isListContainer}}){{/isListContainer}}{{#isMapContainer}}){{/isMapContainer}}{{/dataType}}{{/-first}}{{/responses}}
, timeout = Just 30000 , timeout = Just 30000
, withCredentials = False , withCredentials = False
} }

View File

@ -1,11 +0,0 @@
{-
* {{{appName}}}
* {{{appDescription}}}
*
* {{#version}}OpenAPI spec version: {{{version}}}{{/version}}
* {{#infoEmail}}Contact: {{{infoEmail}}}{{/infoEmail}}
*
* NOTE: This file is auto generated by the swagger code generator program.
* https://github.com/swagger-api/swagger-codegen.git
* Do not edit manually.
-}

View File

@ -4,7 +4,8 @@ import Json.Decode as Decode exposing (Decoder)
import Json.Encode as Encode import Json.Encode as Encode
type alias Byte = String type alias Byte =
String
byteDecoder : Decoder Byte byteDecoder : Decoder Byte

View File

@ -11,7 +11,7 @@
-} -}
module Data.Order exposing (Order, Status(..), orderDecoder, orderEncoder) module Data.Order_ exposing (Order_, Status(..), orderDecoder, orderEncoder)
import DateTime exposing (DateTime, dateTimeDecoder, dateTimeEncoder) import DateTime exposing (DateTime, dateTimeDecoder, dateTimeEncoder)
import Json.Decode as Decode exposing (Decoder) import Json.Decode as Decode exposing (Decoder)
@ -25,7 +25,7 @@ import Maybe exposing (map, withDefault)
-} -}
type alias Order = type alias Order_ =
{ id : Maybe Int { id : Maybe Int
, petId : Maybe Int , petId : Maybe Int
, quantity : Maybe Int , quantity : Maybe Int
@ -42,9 +42,9 @@ type Status
orderDecoder : Decoder Order orderDecoder : Decoder Order_
orderDecoder = orderDecoder =
decode Order decode Order_
|> optional "id" (Decode.nullable Decode.int) Nothing |> optional "id" (Decode.nullable Decode.int) Nothing
|> optional "petId" (Decode.nullable Decode.int) Nothing |> optional "petId" (Decode.nullable Decode.int) Nothing
|> optional "quantity" (Decode.nullable Decode.int) Nothing |> optional "quantity" (Decode.nullable Decode.int) Nothing
@ -54,7 +54,7 @@ orderDecoder =
orderEncoder : Order -> Encode.Value orderEncoder : Order_ -> Encode.Value
orderEncoder model = orderEncoder model =
Encode.object Encode.object
[ ( "id", withDefault Encode.null (map Encode.int model.id) ) [ ( "id", withDefault Encode.null (map Encode.int model.id) )

View File

@ -15,6 +15,7 @@ module Request.Pet exposing (addPet, deletePet, findPetsByStatus, findPetsByTags
import Data.Pet exposing (Pet, petDecoder, petEncoder) import Data.Pet exposing (Pet, petDecoder, petEncoder)
import Data.ApiResponse exposing (ApiResponse, apiResponseDecoder) import Data.ApiResponse exposing (ApiResponse, apiResponseDecoder)
import Dict
import Http import Http
import Json.Decode as Decode import Json.Decode as Decode

View File

@ -13,8 +13,8 @@
module Request.Store exposing (deleteOrder, getInventory, getOrderById, placeOrder) module Request.Store exposing (deleteOrder, getInventory, getOrderById, placeOrder)
import Data.Order exposing (Order, orderDecoder, orderEncoder) import Data.Order_ exposing (Order_, orderDecoder, orderEncoder)
import Data.Int exposing (Int, intDecoder) import Dict
import Http import Http
import Json.Decode as Decode import Json.Decode as Decode
@ -43,13 +43,13 @@ deleteOrder orderId =
{- {-
Returns a map of status codes to quantities Returns a map of status codes to quantities
-} -}
getInventory : Http.Request Int getInventory : Http.Request (Dict.Dict String Int)
getInventory = getInventory =
{ method = "GET" { method = "GET"
, url = basePath ++ "/store/inventory" , url = basePath ++ "/store/inventory"
, headers = [] , headers = []
, body = Http.emptyBody , body = Http.emptyBody
, expect = Http.expectJson intDecoder , expect = Http.expectJson (Decode.dict Decode.int)
, timeout = Just 30000 , timeout = Just 30000
, withCredentials = False , withCredentials = False
} }
@ -59,7 +59,7 @@ getInventory =
{- {-
For valid response try integer IDs with value &lt;&#x3D; 5 or &gt; 10. Other values will generated exceptions For valid response try integer IDs with value &lt;&#x3D; 5 or &gt; 10. Other values will generated exceptions
-} -}
getOrderById : Int -> Http.Request Order getOrderById : Int -> Http.Request Order_
getOrderById orderId = getOrderById orderId =
{ method = "GET" { method = "GET"
, url = basePath ++ "/store/order/" ++ toString orderId , url = basePath ++ "/store/order/" ++ toString orderId
@ -75,7 +75,7 @@ getOrderById orderId =
{- {-
-} -}
placeOrder : Order -> Http.Request Order placeOrder : Order_ -> Http.Request Order_
placeOrder model = placeOrder model =
{ method = "POST" { method = "POST"
, url = basePath ++ "/store/order" , url = basePath ++ "/store/order"

View File

@ -14,7 +14,7 @@
module Request.User exposing (createUser, createUsersWithArrayInput, createUsersWithListInput, deleteUser, getUserByName, loginUser, logoutUser, updateUser) module Request.User exposing (createUser, createUsersWithArrayInput, createUsersWithListInput, deleteUser, getUserByName, loginUser, logoutUser, updateUser)
import Data.User exposing (User, userDecoder, userEncoder) import Data.User exposing (User, userDecoder, userEncoder)
import Data.String exposing (Decode.string, String) import Dict
import Http import Http
import Json.Decode as Decode import Json.Decode as Decode