From 3a29bda4725da58f6693d9a8f60e7bbba768561b Mon Sep 17 00:00:00 2001 From: Qluxzz Date: Sun, 24 Nov 2024 12:52:37 +0100 Subject: [PATCH 1/4] Add failing example --- .../src/test/resources/3_0/elm.yaml | 13 +++++++++++++ .../openapi3/client/elm/src/Api/Request/Default.elm | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/modules/openapi-generator/src/test/resources/3_0/elm.yaml b/modules/openapi-generator/src/test/resources/3_0/elm.yaml index 162d9b976127..33c0d8e6f3fb 100644 --- a/modules/openapi-generator/src/test/resources/3_0/elm.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/elm.yaml @@ -126,6 +126,19 @@ paths: schema: type: string format: uuid + /param-sanitize-test: + post: + responses: + '405': + description: Invalid input + requestBody: + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + "name with spaces": + type: string components: schemas: Absent: diff --git a/samples/openapi3/client/elm/src/Api/Request/Default.elm b/samples/openapi3/client/elm/src/Api/Request/Default.elm index 241a142aad31..2f8663912026 100644 --- a/samples/openapi3/client/elm/src/Api/Request/Default.elm +++ b/samples/openapi3/client/elm/src/Api/Request/Default.elm @@ -16,6 +16,7 @@ module Api.Request.Default exposing ( headerPost, HeaderType(..), headerTypeVariants , maybeGet + , paramSanitizeTestPost , pathStringIntegerEnumerationGet, Enumeration(..), enumerationVariants , queryGet, Enum(..), enumVariants , securedPost @@ -134,6 +135,18 @@ maybeGet = Api.Data.maybeDecoder +paramSanitizeTestPost : Maybe String -> Api.Request () +paramSanitizeTestPost name with spaces = + Api.request + "POST" + "/param-sanitize-test" + [] + [] + [] + (Just <| Http.multipartBody <| List.filterMap identity [ Maybe.map (Http.stringPart "name with spaces") name with spaces ]) + (Json.Decode.succeed ()) + + pathStringIntegerEnumerationGet : String -> Int -> Enumeration -> Api.Request () pathStringIntegerEnumerationGet string_path integer_path enumeration_path = Api.request From d330eb314991e96c5cbd4d1ebc9e133faee23419 Mon Sep 17 00:00:00 2001 From: Qluxzz Date: Sun, 24 Nov 2024 12:53:21 +0100 Subject: [PATCH 2/4] Sanitize param name --- .../src/main/resources/elm/formParamEncoder.mustache | 2 +- .../openapi-generator/src/main/resources/elm/paramName.mustache | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/elm/formParamEncoder.mustache b/modules/openapi-generator/src/main/resources/elm/formParamEncoder.mustache index 7198a2e7ae4b..2e0cbc0e9529 100644 --- a/modules/openapi-generator/src/main/resources/elm/formParamEncoder.mustache +++ b/modules/openapi-generator/src/main/resources/elm/formParamEncoder.mustache @@ -1 +1 @@ -{{^required}}Maybe.map ({{/required}}{{#required}}Just <| {{/required}}{{^isFile}}Http.stringPart {{/isFile}}{{#isFile}}Http.filePart {{/isFile}}"{{paramName}}"{{#isBoolean}}(\val -> if val then "true" else "false"){{/isBoolean}}{{#isDateTime}}Api.Time.dateTimeToString{{/isDateTime}}{{#isDate}}Api.Time.dateToString{{/isDate}}{{#isInteger}}String.fromInt{{/isInteger}}{{#isLong}}String.fromInt{{/isLong}}{{#isNumber}}String.fromFloat{{/isNumber}}{{#isFloat}}String.fromFloat{{/isFloat}}{{#isDouble}}String.fromFloat{{/isDouble}}{{#allowableValues}}Api.Data.stringFrom{{#datatypeWithEnum}}{{datatypeWithEnum}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{dataType}}{{/datatypeWithEnum}}{{/allowableValues}}{{#isUuid}}Uuid.toString{{/isUuid}}{{^required}}){{/required}} {{paramName}} \ No newline at end of file +{{^required}}Maybe.map ({{/required}}{{#required}}Just <| {{/required}}{{^isFile}}Http.stringPart {{/isFile}}{{#isFile}}Http.filePart {{/isFile}}"{{paramName}}"{{#isBoolean}}(\val -> if val then "true" else "false"){{/isBoolean}}{{#isDateTime}}Api.Time.dateTimeToString{{/isDateTime}}{{#isDate}}Api.Time.dateToString{{/isDate}}{{#isInteger}}String.fromInt{{/isInteger}}{{#isLong}}String.fromInt{{/isLong}}{{#isNumber}}String.fromFloat{{/isNumber}}{{#isFloat}}String.fromFloat{{/isFloat}}{{#isDouble}}String.fromFloat{{/isDouble}}{{#allowableValues}}Api.Data.stringFrom{{#datatypeWithEnum}}{{datatypeWithEnum}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{dataType}}{{/datatypeWithEnum}}{{/allowableValues}}{{#isUuid}}Uuid.toString{{/isUuid}}{{^required}}){{/required}} {{>paramName}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/elm/paramName.mustache b/modules/openapi-generator/src/main/resources/elm/paramName.mustache index 52c3426a5867..92dffdda8246 100644 --- a/modules/openapi-generator/src/main/resources/elm/paramName.mustache +++ b/modules/openapi-generator/src/main/resources/elm/paramName.mustache @@ -1 +1 @@ -{{paramName}}{{#isPathParam}}_path{{/isPathParam}}{{#isQueryParam}}_query{{/isQueryParam}}{{#isHeaderParam}}_header{{/isHeaderParam}}{{#isBodyParam}}_body{{/isBodyParam}} \ No newline at end of file +{{#lambda.camelcase}}{{paramName}}{{/lambda.camelcase}}{{#isPathParam}}_path{{/isPathParam}}{{#isQueryParam}}_query{{/isQueryParam}}{{#isHeaderParam}}_header{{/isHeaderParam}}{{#isBodyParam}}_body{{/isBodyParam}} \ No newline at end of file From b9eb08338d932a2c668304ae9d683a54bf41a09d Mon Sep 17 00:00:00 2001 From: Qluxzz Date: Sun, 24 Nov 2024 12:53:38 +0100 Subject: [PATCH 3/4] Regenerate fixed sample --- samples/openapi3/client/elm/src/Api/Request/Default.elm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/openapi3/client/elm/src/Api/Request/Default.elm b/samples/openapi3/client/elm/src/Api/Request/Default.elm index 2f8663912026..68ec69ad9d92 100644 --- a/samples/openapi3/client/elm/src/Api/Request/Default.elm +++ b/samples/openapi3/client/elm/src/Api/Request/Default.elm @@ -136,14 +136,14 @@ maybeGet = paramSanitizeTestPost : Maybe String -> Api.Request () -paramSanitizeTestPost name with spaces = +paramSanitizeTestPost nameWithSpaces = Api.request "POST" "/param-sanitize-test" [] [] [] - (Just <| Http.multipartBody <| List.filterMap identity [ Maybe.map (Http.stringPart "name with spaces") name with spaces ]) + (Just <| Http.multipartBody <| List.filterMap identity [ Maybe.map (Http.stringPart "name with spaces") nameWithSpaces ]) (Json.Decode.succeed ()) From 4f8220cc09586ae6f78f9945946ed3046f97b8f6 Mon Sep 17 00:00:00 2001 From: Qluxzz Date: Mon, 25 Nov 2024 12:57:27 +0100 Subject: [PATCH 4/4] Override toParamName instead --- .../codegen/languages/ElmClientCodegen.java | 15 ++++++++++++++- .../main/resources/elm/formParamEncoder.mustache | 2 +- .../src/main/resources/elm/operation.mustache | 2 +- .../src/main/resources/elm/paramName.mustache | 2 +- .../src/test/resources/3_0/elm.yaml | 12 +++++++++++- .../client/elm/src/Api/Request/Default.elm | 12 ++++++------ 6 files changed, 34 insertions(+), 11 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java index 3bc81accdc3a..6e9dc7d632ea 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ElmClientCodegen.java @@ -228,10 +228,23 @@ public String toEnumName(CodegenProperty property) { @Override public String toVarName(String name) { - final String varName = camelize(name.replaceAll("[^a-zA-Z0-9_]", ""), LOWERCASE_FIRST_LETTER); + // Replace space with _ (underscore) so camelize works as expected + final String varName = camelize(name.replaceAll(" ", "_").replaceAll("[^a-zA-Z0-9_]", ""), + LOWERCASE_FIRST_LETTER); return isReservedWord(varName) ? escapeReservedWord(name) : varName; } + @Override + public String toParamName(String name) { + // obtain the name from parameterNameMapping directly if provided + if (parameterNameMapping.containsKey(name)) { + return parameterNameMapping.get(name); + } + + // params should be lowerCamelCase + return toVarName(name); + } + @Override public String toEnumVarName(String value, String datatype) { String camelized = camelize(value.replace(" ", "_").replace("(", "_").replace(")", "")); // TODO FIXME escape properly diff --git a/modules/openapi-generator/src/main/resources/elm/formParamEncoder.mustache b/modules/openapi-generator/src/main/resources/elm/formParamEncoder.mustache index 2e0cbc0e9529..e3ad4ee82463 100644 --- a/modules/openapi-generator/src/main/resources/elm/formParamEncoder.mustache +++ b/modules/openapi-generator/src/main/resources/elm/formParamEncoder.mustache @@ -1 +1 @@ -{{^required}}Maybe.map ({{/required}}{{#required}}Just <| {{/required}}{{^isFile}}Http.stringPart {{/isFile}}{{#isFile}}Http.filePart {{/isFile}}"{{paramName}}"{{#isBoolean}}(\val -> if val then "true" else "false"){{/isBoolean}}{{#isDateTime}}Api.Time.dateTimeToString{{/isDateTime}}{{#isDate}}Api.Time.dateToString{{/isDate}}{{#isInteger}}String.fromInt{{/isInteger}}{{#isLong}}String.fromInt{{/isLong}}{{#isNumber}}String.fromFloat{{/isNumber}}{{#isFloat}}String.fromFloat{{/isFloat}}{{#isDouble}}String.fromFloat{{/isDouble}}{{#allowableValues}}Api.Data.stringFrom{{#datatypeWithEnum}}{{datatypeWithEnum}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{dataType}}{{/datatypeWithEnum}}{{/allowableValues}}{{#isUuid}}Uuid.toString{{/isUuid}}{{^required}}){{/required}} {{>paramName}} \ No newline at end of file +{{^required}}Maybe.map ({{/required}}{{#required}}Just <| {{/required}}{{^isFile}}Http.stringPart {{/isFile}}{{#isFile}}Http.filePart {{/isFile}}"{{baseName}}"{{#isBoolean}}(\val -> if val then "true" else "false"){{/isBoolean}}{{#isDateTime}}Api.Time.dateTimeToString{{/isDateTime}}{{#isDate}}Api.Time.dateToString{{/isDate}}{{#isInteger}}String.fromInt{{/isInteger}}{{#isLong}}String.fromInt{{/isLong}}{{#isNumber}}String.fromFloat{{/isNumber}}{{#isFloat}}String.fromFloat{{/isFloat}}{{#isDouble}}String.fromFloat{{/isDouble}}{{#allowableValues}}Api.Data.stringFrom{{#datatypeWithEnum}}{{datatypeWithEnum}}{{/datatypeWithEnum}}{{^datatypeWithEnum}}{{dataType}}{{/datatypeWithEnum}}{{/allowableValues}}{{#isUuid}}Uuid.toString{{/isUuid}}{{^required}}){{/required}} {{paramName}} \ No newline at end of file diff --git a/modules/openapi-generator/src/main/resources/elm/operation.mustache b/modules/openapi-generator/src/main/resources/elm/operation.mustache index 6e9f4282deca..d7c5db32413a 100644 --- a/modules/openapi-generator/src/main/resources/elm/operation.mustache +++ b/modules/openapi-generator/src/main/resources/elm/operation.mustache @@ -56,7 +56,7 @@ import File exposing (File){{/includeFile}} Api.request "{{httpMethod}}" "{{path}}" - [{{#pathParams}} ( "{{paramName}}", {{>paramToString}} {{>paramName}} ){{#-last}} {{/-last}}{{^-last}},{{/-last}}{{/pathParams}}] + [{{#pathParams}} ( "{{baseName}}", {{>paramToString}} {{>paramName}} ){{#-last}} {{/-last}}{{^-last}},{{/-last}}{{/pathParams}}] [{{#queryParams}} ( "{{baseName}}", {{#required}}Just <| {{/required}}{{^required}}Maybe.map {{/required}}{{>paramToString}} {{>paramName}} ){{#-last}} {{/-last}}{{^-last}},{{/-last}}{{/queryParams}}] [{{#headerParams}} ( "{{baseName}}", {{#required}}Just <| {{/required}}{{^required}}Maybe.map {{/required}}{{>paramToString}} {{>paramName}} ){{#-last}} {{/-last}}{{^-last}},{{/-last}}{{/headerParams}}] {{#bodyParam}} diff --git a/modules/openapi-generator/src/main/resources/elm/paramName.mustache b/modules/openapi-generator/src/main/resources/elm/paramName.mustache index 92dffdda8246..52c3426a5867 100644 --- a/modules/openapi-generator/src/main/resources/elm/paramName.mustache +++ b/modules/openapi-generator/src/main/resources/elm/paramName.mustache @@ -1 +1 @@ -{{#lambda.camelcase}}{{paramName}}{{/lambda.camelcase}}{{#isPathParam}}_path{{/isPathParam}}{{#isQueryParam}}_query{{/isQueryParam}}{{#isHeaderParam}}_header{{/isHeaderParam}}{{#isBodyParam}}_body{{/isBodyParam}} \ No newline at end of file +{{paramName}}{{#isPathParam}}_path{{/isPathParam}}{{#isQueryParam}}_query{{/isQueryParam}}{{#isHeaderParam}}_header{{/isHeaderParam}}{{#isBodyParam}}_body{{/isBodyParam}} \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/3_0/elm.yaml b/modules/openapi-generator/src/test/resources/3_0/elm.yaml index 33c0d8e6f3fb..03ac359d2483 100644 --- a/modules/openapi-generator/src/test/resources/3_0/elm.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/elm.yaml @@ -126,11 +126,21 @@ paths: schema: type: string format: uuid - /param-sanitize-test: + /param-sanitize/{test id}: post: responses: '405': description: Invalid input + parameters: + - name: "query with spaces" + in: query + schema: + type: string + - name: "test id" + in: path + required: true + schema: + type: string requestBody: content: application/x-www-form-urlencoded: diff --git a/samples/openapi3/client/elm/src/Api/Request/Default.elm b/samples/openapi3/client/elm/src/Api/Request/Default.elm index 68ec69ad9d92..64fa28f4f1bf 100644 --- a/samples/openapi3/client/elm/src/Api/Request/Default.elm +++ b/samples/openapi3/client/elm/src/Api/Request/Default.elm @@ -16,7 +16,7 @@ module Api.Request.Default exposing ( headerPost, HeaderType(..), headerTypeVariants , maybeGet - , paramSanitizeTestPost + , paramSanitizeTestIdPost , pathStringIntegerEnumerationGet, Enumeration(..), enumerationVariants , queryGet, Enum(..), enumVariants , securedPost @@ -135,13 +135,13 @@ maybeGet = Api.Data.maybeDecoder -paramSanitizeTestPost : Maybe String -> Api.Request () -paramSanitizeTestPost nameWithSpaces = +paramSanitizeTestIdPost : String -> Maybe String -> Maybe String -> Api.Request () +paramSanitizeTestIdPost testId_path queryWithSpaces_query nameWithSpaces = Api.request "POST" - "/param-sanitize-test" - [] - [] + "/param-sanitize/{test id}" + [ ( "test id", identity testId_path ) ] + [ ( "query with spaces", Maybe.map identity queryWithSpaces_query ) ] [] (Just <| Http.multipartBody <| List.filterMap identity [ Maybe.map (Http.stringPart "name with spaces") nameWithSpaces ]) (Json.Decode.succeed ())