From 652358b26c5911e2a60d3c5e4ad3fdd83ed3fd78 Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Fri, 17 Aug 2018 11:51:45 +0200 Subject: [PATCH 01/23] openapi-generator-api --- modules/openapi-generator-api/pom.xml | 14 +++++++++++ .../codegen/api/TemplatingEngineAdapter.java | 24 +++++++++++++++++++ .../codegen/api/TemplatingGenerator.java | 11 +++++++++ modules/openapi-generator/pom.xml | 5 ++++ .../typescript-axios/git_push.sh.mustache | 0 pom.xml | 1 + 6 files changed, 55 insertions(+) create mode 100644 modules/openapi-generator-api/pom.xml create mode 100644 modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java create mode 100644 modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java mode change 100644 => 100755 modules/openapi-generator/src/main/resources/typescript-axios/git_push.sh.mustache diff --git a/modules/openapi-generator-api/pom.xml b/modules/openapi-generator-api/pom.xml new file mode 100644 index 000000000000..839ad72868cf --- /dev/null +++ b/modules/openapi-generator-api/pom.xml @@ -0,0 +1,14 @@ + + + + openapi-generator-project + org.openapitools + 4.0.0-SNAPSHOT + ../.. + + 4.0.0 + + openapi-generator-api + \ No newline at end of file diff --git a/modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java b/modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java new file mode 100644 index 000000000000..ad39fa425524 --- /dev/null +++ b/modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java @@ -0,0 +1,24 @@ +package org.openapitools.codegen.api; + +import java.io.IOException; +import java.util.Map; + + +public interface TemplatingEngineAdapter{ + + /** + * Processes a template into a string + * @param generator From where we can fetch the templates content (e.g. an instance of DefaultGenerator) + * @param bundle The map of values to pass to the template + * @param templateFile The name of the template (e.g. model.mustache ) + * @return the processed template result + * @throws IOException an error ocurred in the template processing + */ + String doProcessTemplateToFile(TemplatingGenerator generator, Map bundle, + String templateFile) throws IOException; + + /* + Used to determine whether a given supporting file is a template + */ + String getFileExtension(); +} diff --git a/modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java b/modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java new file mode 100644 index 000000000000..8d1e8467c509 --- /dev/null +++ b/modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java @@ -0,0 +1,11 @@ +package org.openapitools.codegen.api; + +/* +interface for getting the templates + */ +public interface TemplatingGenerator { + + // returns the template content by name + String getFullTemplate(String name); + +} diff --git a/modules/openapi-generator/pom.xml b/modules/openapi-generator/pom.xml index 49d287cea7e4..b79f66c41b2b 100644 --- a/modules/openapi-generator/pom.xml +++ b/modules/openapi-generator/pom.xml @@ -300,6 +300,11 @@ jackson-datatype-threetenbp ${jackson-threetenbp-version} + + org.openapitools + openapi-generator-api + 4.0.0-SNAPSHOT + diff --git a/modules/openapi-generator/src/main/resources/typescript-axios/git_push.sh.mustache b/modules/openapi-generator/src/main/resources/typescript-axios/git_push.sh.mustache old mode 100644 new mode 100755 diff --git a/pom.xml b/pom.xml index a0ba2f2f8b0d..3e6425a1f3c4 100644 --- a/pom.xml +++ b/pom.xml @@ -1298,6 +1298,7 @@ modules/openapi-generator-maven-plugin modules/openapi-generator-gradle-plugin modules/openapi-generator-online + modules/openapi-generator-api target/site From 119b662dec5559c39dffd000171459217bb373e1 Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Fri, 17 Aug 2018 12:22:09 +0200 Subject: [PATCH 02/23] templating engine adapters --- modules/openapi-generator/pom.xml | 5 +++ .../templating/HandlebarsEngineAdapter.java | 38 +++++++++++++++++++ .../templating/MustacheEngineAdapter.java | 32 ++++++++++++++++ pom.xml | 1 + 4 files changed, 76 insertions(+) create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java diff --git a/modules/openapi-generator/pom.xml b/modules/openapi-generator/pom.xml index b79f66c41b2b..eed24a4e2a80 100644 --- a/modules/openapi-generator/pom.xml +++ b/modules/openapi-generator/pom.xml @@ -215,6 +215,11 @@ jmustache ${jmustache-version} + + com.github.jknack + handlebars + ${handlebars.java-version} + commons-io commons-io diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java new file mode 100644 index 000000000000..e1c73d7f156b --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java @@ -0,0 +1,38 @@ +package org.openapitools.codegen.templating; + +import com.github.jknack.handlebars.Handlebars; +import com.github.jknack.handlebars.Template; +import com.github.jknack.handlebars.io.AbstractTemplateLoader; +import com.github.jknack.handlebars.io.StringTemplateSource; +import com.github.jknack.handlebars.io.TemplateLoader; +import com.github.jknack.handlebars.io.TemplateSource; +import java.io.IOException; +import java.util.Map; +import org.openapitools.codegen.api.TemplatingEngineAdapter; +import org.openapitools.codegen.api.TemplatingGenerator; + + +public class HandlebarsEngineAdapter implements TemplatingEngineAdapter { + + public String doProcessTemplateToFile(TemplatingGenerator generator, + Map bundle, String templateFile) throws IOException { + TemplateLoader loader = new AbstractTemplateLoader() { + @Override + public TemplateSource sourceAt(String location) { + String templateContent = generator.getFullTemplate(location); + return new StringTemplateSource(location, templateContent); + } + }; + + Handlebars handlebars = new Handlebars(loader); + handlebars.registerHelperMissing((context, options) -> ""); + Template tmpl = handlebars.compile(templateFile); + return tmpl.apply(bundle); + } + + @Override + public String getFileExtension() { + return "handlebars"; + } +} + diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java new file mode 100644 index 000000000000..23f695fb4acf --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java @@ -0,0 +1,32 @@ +package org.openapitools.codegen.templating; + +import com.samskivert.mustache.Mustache; +import com.samskivert.mustache.Template; +import java.io.IOException; +import java.io.StringReader; +import java.util.Map; +import org.openapitools.codegen.api.TemplatingEngineAdapter; +import org.openapitools.codegen.api.TemplatingGenerator; + + +public class MustacheEngineAdapter implements TemplatingEngineAdapter { + + Mustache.Compiler compiler = Mustache.compiler(); + + @Override + public String doProcessTemplateToFile(TemplatingGenerator generator, Map bundle, + String templateFile) throws IOException { + + Template tmpl = compiler + .withLoader(name -> new StringReader(generator.getFullTemplate(name + "." + getFileExtension()))) + .defaultValue("") + .compile(generator.getFullTemplate(templateFile)); + + return tmpl.execute(bundle); + } + + @Override + public String getFileExtension() { + return "mustache"; + } +} diff --git a/pom.xml b/pom.xml index 3e6425a1f3c4..fdc72feaba86 100644 --- a/pom.xml +++ b/pom.xml @@ -1378,6 +1378,7 @@ 1.7.12 3.2.1 1.14 + 4.1.0 6.9.6 2.22.0 1.43 From f2e9184edbca47e69c523e99198f1e54cbb7f4a4 Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Fri, 17 Aug 2018 12:23:56 +0200 Subject: [PATCH 03/23] -e templating engine CLI option --- .../org/openapitools/codegen/cmd/Generate.java | 8 ++++++++ .../org/openapitools/codegen/CodegenConfig.java | 4 ++++ .../openapitools/codegen/CodegenConstants.java | 3 +++ .../org/openapitools/codegen/DefaultCodegen.java | 12 ++++++++++++ .../codegen/config/CodegenConfigurator.java | 16 ++++++++++++++++ 5 files changed, 43 insertions(+) diff --git a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java index 8f1082039453..8da7aeaf9304 100644 --- a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java +++ b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java @@ -65,6 +65,10 @@ public class Generate implements Runnable { description = "folder containing the template files") private String templateDir; + @Option(name = {"-e", "--engine"}, title = "templating engine", + description = "uses a given plugin for loading the templating engine") + private String templatingEngine; + @Option( name = {"-a", "--auth"}, title = "authorization", @@ -273,6 +277,10 @@ public void run() { configurator.setTemplateDir(templateDir); } + if (isNotEmpty(templatingEngine)) { + configurator.setTemplatingEngineName(templatingEngine); + } + if (isNotEmpty(apiPackage)) { configurator.setApiPackage(apiPackage); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java index 5d554cf97137..ac097cc9c808 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.openapitools.codegen.api.TemplatingEngineAdapter; public interface CodegenConfig { CodegenType getTag(); @@ -260,4 +261,7 @@ public interface CodegenConfig { */ void setOpenAPI(OpenAPI openAPI); + void setTemplatingEngine(TemplatingEngineAdapter s); + + TemplatingEngineAdapter getTemplatingEngine(); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java index c07e4c00728e..808d52355f46 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java @@ -181,6 +181,9 @@ public class CodegenConstants { public static final String DOTNET_FRAMEWORK = "targetFramework"; public static final String DOTNET_FRAMEWORK_DESC = "The target .NET framework version."; + public static final String TEMPLATING_ENGINE = "templatingEngine"; + public static final String TEMPLATING_ENGINE_DESC = "The templating engine plugin to use"; + public static enum MODEL_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case, original} public static enum ENUM_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case, original, UPPERCASE} diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index e973ce6329e0..7d208ced9101 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -41,6 +41,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.openapitools.codegen.CodegenDiscriminator.MappedModel; +import org.openapitools.codegen.api.TemplatingEngineAdapter; import org.openapitools.codegen.config.GeneratorProperties; import org.openapitools.codegen.examples.ExampleGenerator; import org.openapitools.codegen.serializer.SerializerUtils; @@ -111,6 +112,7 @@ public class DefaultCodegen implements CodegenConfig { protected String ignoreFilePathOverride; // flag to indicate whether to use environment variable to post process file protected boolean enablePostProcessFile = false; + private TemplatingEngineAdapter templatingEngine; // make openapi available to all methods protected OpenAPI openAPI; @@ -3804,6 +3806,16 @@ public String sanitizeName(String name) { return sanitizeName(name, "\\W"); } + @Override + public void setTemplatingEngine(TemplatingEngineAdapter templatingEngine) { + this.templatingEngine = templatingEngine; + } + + @Override + public TemplatingEngineAdapter getTemplatingEngine() { + return this.templatingEngine; + } + /** * Sanitize name (parameter, property, method, etc) * diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java index a1bdb827ea50..3265b5de0968 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; +import org.openapitools.codegen.api.TemplatingEngineAdapter; import io.swagger.parser.OpenAPIParser; import io.swagger.v3.core.util.Json; import io.swagger.v3.oas.models.OpenAPI; @@ -29,6 +30,8 @@ import org.openapitools.codegen.*; import org.openapitools.codegen.auth.AuthParser; import org.openapitools.codegen.languages.*; +import org.openapitools.codegen.templating.HandlebarsEngineAdapter; +import org.openapitools.codegen.templating.MustacheEngineAdapter; import org.openapitools.codegen.utils.ModelUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -39,6 +42,7 @@ import java.nio.file.Paths; import java.util.*; +import static org.apache.commons.lang3.StringUtils.isEmpty; import static org.apache.commons.lang3.StringUtils.isNotEmpty; /** @@ -77,6 +81,7 @@ public class CodegenConfigurator implements Serializable { private boolean validateSpec; private boolean enablePostProcessFile; private String templateDir; + private String templatingEngineName; private String auth; private String apiPackage; private String modelPackage; @@ -525,6 +530,7 @@ public ClientOptInput toClientOptInput() { checkAndSetAdditionalProperty(artifactId, CodegenConstants.ARTIFACT_ID); checkAndSetAdditionalProperty(artifactVersion, CodegenConstants.ARTIFACT_VERSION); checkAndSetAdditionalProperty(templateDir, toAbsolutePathStr(templateDir), CodegenConstants.TEMPLATE_DIR); + checkAndSetAdditionalProperty(templatingEngineName, CodegenConstants.TEMPLATING_ENGINE); checkAndSetAdditionalProperty(modelNamePrefix, CodegenConstants.MODEL_NAME_PREFIX); checkAndSetAdditionalProperty(modelNameSuffix, CodegenConstants.MODEL_NAME_SUFFIX); checkAndSetAdditionalProperty(gitUserId, CodegenConstants.GIT_USER_ID); @@ -538,6 +544,12 @@ public ClientOptInput toClientOptInput() { config.setLibrary(library); } + if (isEmpty(templatingEngineName) || templatingEngineName.equals("mustache")) { + config.setTemplatingEngine(new MustacheEngineAdapter()); + } else if (templatingEngineName.equals("handlebars")) { + config.setTemplatingEngine(new HandlebarsEngineAdapter()); + } + config.additionalProperties().putAll(additionalProperties); ClientOptInput input = new ClientOptInput() @@ -669,4 +681,8 @@ public static CodegenConfigurator fromFile(String configFile) { return null; } + public CodegenConfigurator setTemplatingEngineName(String templatingEngineName) { + this.templatingEngineName = templatingEngineName; + return this; + } } From 4699c6469d18abe5e3547e3d02f7ed16e43739fa Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Fri, 17 Aug 2018 11:52:05 +0200 Subject: [PATCH 04/23] adapt Generator to process Template with the passed TemplatingEngineAdpater --- .../codegen/AbstractGenerator.java | 3 +- .../codegen/DefaultGenerator.java | 44 ++++++------------- 2 files changed, 16 insertions(+), 31 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/AbstractGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/AbstractGenerator.java index 1a0109b9f4d6..2f2f47138918 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/AbstractGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/AbstractGenerator.java @@ -18,6 +18,7 @@ package org.openapitools.codegen; import org.apache.commons.lang3.StringUtils; +import org.openapitools.codegen.api.TemplatingGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -26,7 +27,7 @@ import java.util.Scanner; import java.util.regex.Pattern; -public abstract class AbstractGenerator { +public abstract class AbstractGenerator implements TemplatingGenerator { private static final Logger LOGGER = LoggerFactory.getLogger(AbstractGenerator.class); @SuppressWarnings("static-method") diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 41d8c6daa5b1..40557d8b39f1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -36,6 +36,7 @@ import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.config.GeneratorProperties; +import org.openapitools.codegen.api.TemplatingEngineAdapter; import org.openapitools.codegen.ignore.CodegenIgnoreProcessor; import org.openapitools.codegen.utils.ImplementationVersion; import org.openapitools.codegen.utils.ModelUtils; @@ -54,6 +55,7 @@ public class DefaultGenerator extends AbstractGenerator implements Generator { protected ClientOptInput opts; protected OpenAPI openAPI; protected CodegenIgnoreProcessor ignoreProcessor; + protected TemplatingEngineAdapter templatingEngine; private Boolean generateApis = null; private Boolean generateModels = null; private Boolean generateSupportingFiles = null; @@ -73,6 +75,7 @@ public Generator opts(ClientOptInput opts) { this.openAPI = opts.getOpenAPI(); this.config = opts.getConfig(); this.config.additionalProperties().putAll(opts.getOpts().getProperties()); + this.templatingEngine = this.config.getTemplatingEngine(); String ignoreFileLocation = this.config.getIgnoreFilePathOverride(); if (ignoreFileLocation != null) { @@ -698,21 +701,10 @@ private void generateSupportingFiles(List files, Map bundl } if (ignoreProcessor.allowsFile(new File(outputFilename))) { - if (templateFile.endsWith("mustache")) { - String template = readTemplate(templateFile); - Mustache.Compiler compiler = Mustache.compiler(); - compiler = config.processCompiler(compiler); - Template tmpl = compiler - .withLoader(new Mustache.TemplateLoader() { - @Override - public Reader getTemplate(String name) { - return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); - } - }) - .defaultValue("") - .compile(template); - - writeToFile(outputFilename, tmpl.execute(bundle)); + if (templateFile.endsWith(templatingEngine.getFileExtension())) { + String templateContent = templatingEngine + .doProcessTemplateToFile(this, bundle, support.templateFile); + writeToFile(outputFilename, templateContent); File written = new File(outputFilename); files.add(written); if (config.isEnablePostProcessFile()) { @@ -910,24 +902,16 @@ public List generate() { return files; } + @Override + public String getFullTemplate(String templateName) { + return readTemplate(getFullTemplateFile(config, templateName)); + } + protected File processTemplateToFile(Map templateData, String templateName, String outputFilename) throws IOException { String adjustedOutputFilename = outputFilename.replaceAll("//", "/").replace('/', File.separatorChar); if (ignoreProcessor.allowsFile(new File(adjustedOutputFilename))) { - String templateFile = getFullTemplateFile(config, templateName); - String template = readTemplate(templateFile); - Mustache.Compiler compiler = Mustache.compiler(); - compiler = config.processCompiler(compiler); - Template tmpl = compiler - .withLoader(new Mustache.TemplateLoader() { - @Override - public Reader getTemplate(String name) { - return getTemplateReader(getFullTemplateFile(config, name + ".mustache")); - } - }) - .defaultValue("") - .compile(template); - - writeToFile(adjustedOutputFilename, tmpl.execute(templateData)); + String templateContent = templatingEngine.doProcessTemplateToFile(this, templateData, templateName); + writeToFile(adjustedOutputFilename, templateContent); return new File(adjustedOutputFilename); } From 30cb6c4306e5431bff8304133cdd2efe361f3031 Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Sun, 19 Aug 2018 22:21:44 +0200 Subject: [PATCH 05/23] add a MustacheEngineAdapter to the codegen in the unit tests --- .../codegen/java/jaxrs/JavaJerseyServerCodegenTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJerseyServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJerseyServerCodegenTest.java index 6844b943d691..2e9268e2430f 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJerseyServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJerseyServerCodegenTest.java @@ -5,6 +5,7 @@ import org.openapitools.codegen.*; import org.openapitools.codegen.MockDefaultGenerator.WrittenTemplateBasedFile; import org.openapitools.codegen.languages.JavaJerseyServerCodegen; +import org.openapitools.codegen.templating.MustacheEngineAdapter; import org.testng.Assert; import org.testng.annotations.Test; @@ -88,6 +89,7 @@ public void testAddOperationToGroupUseTagsFalse() throws Exception { JavaJerseyServerCodegen codegen = new JavaJerseyServerCodegen(); codegen.setUseTags(false); codegen.setOutputDir(output.getAbsolutePath()); + codegen.setTemplatingEngine(new MustacheEngineAdapter()); ClientOpts opts = new ClientOpts(); ClientOptInput input = new ClientOptInput(); From 1d0a1afee841e9dd71db3b117a6db43d884b14b3 Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Sun, 19 Aug 2018 22:40:50 +0200 Subject: [PATCH 06/23] force default MustacheEngineAdapter --- .../src/main/java/org/openapitools/codegen/DefaultCodegen.java | 3 ++- .../codegen/java/jaxrs/JavaJerseyServerCodegenTest.java | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 7d208ced9101..491da3e6bb41 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -45,6 +45,7 @@ import org.openapitools.codegen.config.GeneratorProperties; import org.openapitools.codegen.examples.ExampleGenerator; import org.openapitools.codegen.serializer.SerializerUtils; +import org.openapitools.codegen.templating.MustacheEngineAdapter; import org.openapitools.codegen.utils.ModelUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -112,7 +113,7 @@ public class DefaultCodegen implements CodegenConfig { protected String ignoreFilePathOverride; // flag to indicate whether to use environment variable to post process file protected boolean enablePostProcessFile = false; - private TemplatingEngineAdapter templatingEngine; + private TemplatingEngineAdapter templatingEngine = new MustacheEngineAdapter(); // make openapi available to all methods protected OpenAPI openAPI; diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJerseyServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJerseyServerCodegenTest.java index 2e9268e2430f..b0d459103c09 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJerseyServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJerseyServerCodegenTest.java @@ -89,7 +89,6 @@ public void testAddOperationToGroupUseTagsFalse() throws Exception { JavaJerseyServerCodegen codegen = new JavaJerseyServerCodegen(); codegen.setUseTags(false); codegen.setOutputDir(output.getAbsolutePath()); - codegen.setTemplatingEngine(new MustacheEngineAdapter()); ClientOpts opts = new ClientOpts(); ClientOptInput input = new ClientOptInput(); From 30fbd73817fd4d8cc601641d3128452bc9cd2f05 Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Sun, 19 Aug 2018 23:05:16 +0200 Subject: [PATCH 07/23] copy api module in the root Dockerfile --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index e53ca77d84a8..24e0b1814ebd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,6 +18,7 @@ COPY ./modules/openapi-generator-gradle-plugin ${GEN_DIR}/modules/openapi-genera COPY ./modules/openapi-generator-maven-plugin ${GEN_DIR}/modules/openapi-generator-maven-plugin COPY ./modules/openapi-generator-online ${GEN_DIR}/modules/openapi-generator-online COPY ./modules/openapi-generator-cli ${GEN_DIR}/modules/openapi-generator-cli +COPY ./modules/openapi-generator-api ${GEN_DIR}/modules/openapi-generator-api COPY ./modules/openapi-generator ${GEN_DIR}/modules/openapi-generator COPY ./pom.xml ${GEN_DIR} From 585ec3b01f9f97d4f9ce8d0a055b7947f4f4cb55 Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Mon, 20 Aug 2018 10:04:58 +0200 Subject: [PATCH 08/23] rename the interfaces module to openapi-generator-core --- Dockerfile | 2 +- .../{openapi-generator-api => openapi-generator-core}/pom.xml | 2 +- .../org/openapitools/codegen/api/TemplatingEngineAdapter.java | 0 .../java/org/openapitools/codegen/api/TemplatingGenerator.java | 0 modules/openapi-generator/pom.xml | 2 +- pom.xml | 2 +- 6 files changed, 4 insertions(+), 4 deletions(-) rename modules/{openapi-generator-api => openapi-generator-core}/pom.xml (90%) rename modules/{openapi-generator-api => openapi-generator-core}/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java (100%) rename modules/{openapi-generator-api => openapi-generator-core}/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java (100%) diff --git a/Dockerfile b/Dockerfile index 24e0b1814ebd..6264997fd610 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,7 +18,7 @@ COPY ./modules/openapi-generator-gradle-plugin ${GEN_DIR}/modules/openapi-genera COPY ./modules/openapi-generator-maven-plugin ${GEN_DIR}/modules/openapi-generator-maven-plugin COPY ./modules/openapi-generator-online ${GEN_DIR}/modules/openapi-generator-online COPY ./modules/openapi-generator-cli ${GEN_DIR}/modules/openapi-generator-cli -COPY ./modules/openapi-generator-api ${GEN_DIR}/modules/openapi-generator-api +COPY ./modules/openapi-generator-core ${GEN_DIR}/modules/openapi-generator-core COPY ./modules/openapi-generator ${GEN_DIR}/modules/openapi-generator COPY ./pom.xml ${GEN_DIR} diff --git a/modules/openapi-generator-api/pom.xml b/modules/openapi-generator-core/pom.xml similarity index 90% rename from modules/openapi-generator-api/pom.xml rename to modules/openapi-generator-core/pom.xml index 839ad72868cf..74f49ca94d18 100644 --- a/modules/openapi-generator-api/pom.xml +++ b/modules/openapi-generator-core/pom.xml @@ -10,5 +10,5 @@ 4.0.0 - openapi-generator-api + openapi-generator-core \ No newline at end of file diff --git a/modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java similarity index 100% rename from modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java rename to modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java diff --git a/modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java similarity index 100% rename from modules/openapi-generator-api/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java rename to modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java diff --git a/modules/openapi-generator/pom.xml b/modules/openapi-generator/pom.xml index eed24a4e2a80..7da9422289c1 100644 --- a/modules/openapi-generator/pom.xml +++ b/modules/openapi-generator/pom.xml @@ -307,7 +307,7 @@ org.openapitools - openapi-generator-api + openapi-generator-core 4.0.0-SNAPSHOT diff --git a/pom.xml b/pom.xml index fdc72feaba86..f503ad60952b 100644 --- a/pom.xml +++ b/pom.xml @@ -1298,7 +1298,7 @@ modules/openapi-generator-maven-plugin modules/openapi-generator-gradle-plugin modules/openapi-generator-online - modules/openapi-generator-api + modules/openapi-generator-core target/site From 148f04302dbe1129e7df5b3c84812f26f0d92b15 Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Mon, 20 Aug 2018 10:05:12 +0200 Subject: [PATCH 09/23] rename getFullTemplate to getFullTemplateContents --- .../org/openapitools/codegen/api/TemplatingGenerator.java | 2 +- .../main/java/org/openapitools/codegen/DefaultGenerator.java | 2 +- .../codegen/templating/HandlebarsEngineAdapter.java | 2 +- .../codegen/templating/MustacheEngineAdapter.java | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java index 8d1e8467c509..cfc85daa6103 100644 --- a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java +++ b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java @@ -6,6 +6,6 @@ interface for getting the templates public interface TemplatingGenerator { // returns the template content by name - String getFullTemplate(String name); + String getFullTemplateContents(String name); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 40557d8b39f1..b2c2a95731ce 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -903,7 +903,7 @@ public List generate() { } @Override - public String getFullTemplate(String templateName) { + public String getFullTemplateContents(String templateName) { return readTemplate(getFullTemplateFile(config, templateName)); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java index e1c73d7f156b..c90810df47fe 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java @@ -19,7 +19,7 @@ public String doProcessTemplateToFile(TemplatingGenerator generator, TemplateLoader loader = new AbstractTemplateLoader() { @Override public TemplateSource sourceAt(String location) { - String templateContent = generator.getFullTemplate(location); + String templateContent = generator.getFullTemplateContents(location); return new StringTemplateSource(location, templateContent); } }; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java index 23f695fb4acf..fa4c672c1866 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java @@ -18,9 +18,9 @@ public String doProcessTemplateToFile(TemplatingGenerator generator, Map new StringReader(generator.getFullTemplate(name + "." + getFileExtension()))) + .withLoader(name -> new StringReader(generator.getFullTemplateContents(name + "." + getFileExtension()))) .defaultValue("") - .compile(generator.getFullTemplate(templateFile)); + .compile(generator.getFullTemplateContents(templateFile)); return tmpl.execute(bundle); } From 7da8cc849995a63161dd45635b591d1f76d8ef4a Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Mon, 20 Aug 2018 10:26:49 +0200 Subject: [PATCH 10/23] reinstate the processCompiler step in case of a MustacheEngineAdapter --- .../org/openapitools/codegen/DefaultGenerator.java | 10 ++++++++++ .../codegen/templating/MustacheEngineAdapter.java | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index b2c2a95731ce..e244733f296c 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -38,6 +38,7 @@ import org.openapitools.codegen.config.GeneratorProperties; import org.openapitools.codegen.api.TemplatingEngineAdapter; import org.openapitools.codegen.ignore.CodegenIgnoreProcessor; +import org.openapitools.codegen.templating.MustacheEngineAdapter; import org.openapitools.codegen.utils.ImplementationVersion; import org.openapitools.codegen.utils.ModelUtils; import org.openapitools.codegen.utils.URLPathUtils; @@ -94,6 +95,13 @@ public Generator opts(ClientOptInput opts) { return this; } + private void configPostProcessMustacheCompiler() { + if (this.templatingEngine instanceof MustacheEngineAdapter) { + MustacheEngineAdapter mustacheEngineAdapter = (MustacheEngineAdapter) this.templatingEngine; + mustacheEngineAdapter.setCompiler(this.config.processCompiler(mustacheEngineAdapter.getCompiler())); + } + } + /** * Programmatically disable the output of .openapi-generator/VERSION, .openapi-generator-ignore, * or other metadata files used by OpenAPI Generator. @@ -702,6 +710,7 @@ private void generateSupportingFiles(List files, Map bundl if (ignoreProcessor.allowsFile(new File(outputFilename))) { if (templateFile.endsWith(templatingEngine.getFileExtension())) { + configPostProcessMustacheCompiler(); String templateContent = templatingEngine .doProcessTemplateToFile(this, bundle, support.templateFile); writeToFile(outputFilename, templateContent); @@ -910,6 +919,7 @@ public String getFullTemplateContents(String templateName) { protected File processTemplateToFile(Map templateData, String templateName, String outputFilename) throws IOException { String adjustedOutputFilename = outputFilename.replaceAll("//", "/").replace('/', File.separatorChar); if (ignoreProcessor.allowsFile(new File(adjustedOutputFilename))) { + configPostProcessMustacheCompiler(); String templateContent = templatingEngine.doProcessTemplateToFile(this, templateData, templateName); writeToFile(adjustedOutputFilename, templateContent); return new File(adjustedOutputFilename); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java index fa4c672c1866..8d56cf554f03 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java @@ -29,4 +29,12 @@ public String doProcessTemplateToFile(TemplatingGenerator generator, Map Date: Mon, 20 Aug 2018 10:31:31 +0200 Subject: [PATCH 11/23] add processTemplatingEngine to CodegenConfig, to be overriden by Codegen classes if needed --- .../main/java/org/openapitools/codegen/CodegenConfig.java | 2 ++ .../main/java/org/openapitools/codegen/DefaultCodegen.java | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java index ac097cc9c808..21e58a0ef67f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConfig.java @@ -150,6 +150,8 @@ public interface CodegenConfig { Compiler processCompiler(Compiler compiler); + TemplatingEngineAdapter processTemplatingEngine(TemplatingEngineAdapter templatingEngine); + String sanitizeTag(String tag); String toApiFilename(String name); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 491da3e6bb41..f8e57d5449ac 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -463,6 +463,12 @@ public Compiler processCompiler(Compiler compiler) { return compiler; } + // override with any special handling for the templating engine + @SuppressWarnings("unused") + public TemplatingEngineAdapter processTemplatingEngine(TemplatingEngineAdapter templatingEngine) { + return templatingEngine; + } + // override with any special text escaping logic @SuppressWarnings("static-method") public String escapeText(String input) { From 387ba9de7a712f446704bbf0193207aa8eaa241d Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Mon, 20 Aug 2018 17:41:09 +0200 Subject: [PATCH 12/23] multiple file extensions per templating engine adapter --- .../codegen/api/TemplatingEngineAdapter.java | 2 +- .../codegen/DefaultGenerator.java | 3 ++- .../templating/HandlebarsEngineAdapter.java | 24 +++++++++++++++---- .../templating/MustacheEngineAdapter.java | 19 ++++++++++++--- 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java index ad39fa425524..8c2621b75cf5 100644 --- a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java +++ b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java @@ -20,5 +20,5 @@ String doProcessTemplateToFile(TemplatingGenerator generator, Map files, Map bundl } if (ignoreProcessor.allowsFile(new File(outputFilename))) { - if (templateFile.endsWith(templatingEngine.getFileExtension())) { + if (Arrays.stream(templatingEngine.getFileExtensions()) + .anyMatch(templateFile::endsWith)) { configPostProcessMustacheCompiler(); String templateContent = templatingEngine .doProcessTemplateToFile(this, bundle, support.templateFile); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java index c90810df47fe..efce7914ba76 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java @@ -7,6 +7,8 @@ import com.github.jknack.handlebars.io.TemplateLoader; import com.github.jknack.handlebars.io.TemplateSource; import java.io.IOException; +import java.io.Reader; +import java.io.StringReader; import java.util.Map; import org.openapitools.codegen.api.TemplatingEngineAdapter; import org.openapitools.codegen.api.TemplatingGenerator; @@ -14,13 +16,23 @@ public class HandlebarsEngineAdapter implements TemplatingEngineAdapter { + public TemplateSource findTemplate(TemplatingGenerator generator, String name){ + for (String extension: extensions){ + try{ + String location = name + "." + extension; + return new StringTemplateSource(location, generator.getFullTemplateContents(location)); + } catch(Exception ignored) { + } + } + throw new RuntimeException("couldnt find a subtemplate " + name); + } + public String doProcessTemplateToFile(TemplatingGenerator generator, Map bundle, String templateFile) throws IOException { - TemplateLoader loader = new AbstractTemplateLoader() { + TemplateLoader loader = new AbstractTemplateLoader() { @Override public TemplateSource sourceAt(String location) { - String templateContent = generator.getFullTemplateContents(location); - return new StringTemplateSource(location, templateContent); + return findTemplate(generator, location); } }; @@ -30,9 +42,11 @@ public TemplateSource sourceAt(String location) { return tmpl.apply(bundle); } + String[] extensions = new String[]{"handlebars", "hbs"}; + @Override - public String getFileExtension() { - return "handlebars"; + public String[] getFileExtensions() { + return extensions; } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java index 8d56cf554f03..8b7915102d34 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java @@ -3,6 +3,7 @@ import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; import java.io.IOException; +import java.io.Reader; import java.io.StringReader; import java.util.Map; import org.openapitools.codegen.api.TemplatingEngineAdapter; @@ -13,21 +14,33 @@ public class MustacheEngineAdapter implements TemplatingEngineAdapter { Mustache.Compiler compiler = Mustache.compiler(); + public Reader findTemplate(TemplatingGenerator generator, String name){ + for (String extension: extensions){ + try{ + return new StringReader(generator.getFullTemplateContents(name + "." + extension)); + } catch(Exception ignored) { + } + } + throw new RuntimeException("couldnt find a subtemplate " + name); + } + @Override public String doProcessTemplateToFile(TemplatingGenerator generator, Map bundle, String templateFile) throws IOException { Template tmpl = compiler - .withLoader(name -> new StringReader(generator.getFullTemplateContents(name + "." + getFileExtension()))) + .withLoader(name -> findTemplate(generator, name)) .defaultValue("") .compile(generator.getFullTemplateContents(templateFile)); return tmpl.execute(bundle); } + String[] extensions = new String[]{"mustache"}; + @Override - public String getFileExtension() { - return "mustache"; + public String[] getFileExtensions() { + return extensions; } public Mustache.Compiler getCompiler() { From 809382218b27c843f51fa3998dda6c73acaf6856 Mon Sep 17 00:00:00 2001 From: rienafairefr Date: Wed, 22 Aug 2018 14:13:40 +0200 Subject: [PATCH 13/23] docs touchup --- .../java/org/openapitools/codegen/cmd/Generate.java | 2 +- modules/openapi-generator-core/pom.xml | 2 ++ .../codegen/api/TemplatingEngineAdapter.java | 11 ++++++++--- .../codegen/api/TemplatingGenerator.java | 12 +++++++++--- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java index 8da7aeaf9304..00f79f285e26 100644 --- a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java +++ b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java @@ -66,7 +66,7 @@ public class Generate implements Runnable { private String templateDir; @Option(name = {"-e", "--engine"}, title = "templating engine", - description = "uses a given plugin for loading the templating engine") + description = "templating engine, for now \"mustache\" and \"handlebars\" are supported") private String templatingEngine; @Option( diff --git a/modules/openapi-generator-core/pom.xml b/modules/openapi-generator-core/pom.xml index 74f49ca94d18..5e2b77ab81c6 100644 --- a/modules/openapi-generator-core/pom.xml +++ b/modules/openapi-generator-core/pom.xml @@ -11,4 +11,6 @@ 4.0.0 openapi-generator-core + openapi-generator-core + https://github.com/openapitools/openapi-generator \ No newline at end of file diff --git a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java index 8c2621b75cf5..ac2825a70254 100644 --- a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java +++ b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java @@ -3,7 +3,9 @@ import java.io.IOException; import java.util.Map; - +/** + * Each templating engine is called by an Adapter, selected at runtime + */ public interface TemplatingEngineAdapter{ /** @@ -17,8 +19,11 @@ public interface TemplatingEngineAdapter{ String doProcessTemplateToFile(TemplatingGenerator generator, Map bundle, String templateFile) throws IOException; - /* - Used to determine whether a given supporting file is a template + /** + * During generation, if a supporting file has a file extension that is + * inside that array, then it is considered a templated supporting file + * and we use the templating engine adapter to generate it + * @return string array of the valid file extensions for this templating engine */ String[] getFileExtensions(); } diff --git a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java index cfc85daa6103..498067e51354 100644 --- a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java +++ b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingGenerator.java @@ -1,11 +1,17 @@ package org.openapitools.codegen.api; -/* -interface for getting the templates +/** + * interface to the full template content + * implementers might take into account the -t cli option, + * look in the resources for a language specific template, etc */ public interface TemplatingGenerator { - // returns the template content by name + /** + * returns the template content by name + * @param name the template name (e.g. model.mustache) + * @return the contents of that template + */ String getFullTemplateContents(String name); } From 1732281ff2194222af0e14ff5b2144c4cc816637 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Fri, 8 Mar 2019 22:44:20 -0500 Subject: [PATCH 14/23] Rename template engine method to compileTemplate --- .../codegen/api/TemplatingEngineAdapter.java | 7 +- .../codegen/DefaultGenerator.java | 8 +-- .../templating/HandlebarsEngineAdapter.java | 69 +++++++++---------- .../templating/MustacheEngineAdapter.java | 39 +++++------ 4 files changed, 60 insertions(+), 63 deletions(-) diff --git a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java index ac2825a70254..6340bd2b282c 100644 --- a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java +++ b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/TemplatingEngineAdapter.java @@ -9,15 +9,16 @@ public interface TemplatingEngineAdapter{ /** - * Processes a template into a string + * Compiles a template into a string + * * @param generator From where we can fetch the templates content (e.g. an instance of DefaultGenerator) * @param bundle The map of values to pass to the template * @param templateFile The name of the template (e.g. model.mustache ) * @return the processed template result * @throws IOException an error ocurred in the template processing */ - String doProcessTemplateToFile(TemplatingGenerator generator, Map bundle, - String templateFile) throws IOException; + String compileTemplate(TemplatingGenerator generator, Map bundle, + String templateFile) throws IOException; /** * During generation, if a supporting file has a file extension that is diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index f9bfa910fbe3..8d0c72cb8cda 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -17,8 +17,6 @@ package org.openapitools.codegen; -import com.samskivert.mustache.Mustache; -import com.samskivert.mustache.Template; import io.swagger.v3.core.util.Json; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.Operation; @@ -39,6 +37,7 @@ import org.openapitools.codegen.api.TemplatingEngineAdapter; import org.openapitools.codegen.ignore.CodegenIgnoreProcessor; import org.openapitools.codegen.templating.MustacheEngineAdapter; +import org.openapitools.codegen.config.GeneratorProperties; import org.openapitools.codegen.utils.ImplementationVersion; import org.openapitools.codegen.utils.ModelUtils; import org.openapitools.codegen.utils.URLPathUtils; @@ -712,8 +711,7 @@ private void generateSupportingFiles(List files, Map bundl if (Arrays.stream(templatingEngine.getFileExtensions()) .anyMatch(templateFile::endsWith)) { configPostProcessMustacheCompiler(); - String templateContent = templatingEngine - .doProcessTemplateToFile(this, bundle, support.templateFile); + String templateContent = templatingEngine.compileTemplate(this, bundle, support.templateFile); writeToFile(outputFilename, templateContent); File written = new File(outputFilename); files.add(written); @@ -921,7 +919,7 @@ protected File processTemplateToFile(Map templateData, String te String adjustedOutputFilename = outputFilename.replaceAll("//", "/").replace('/', File.separatorChar); if (ignoreProcessor.allowsFile(new File(adjustedOutputFilename))) { configPostProcessMustacheCompiler(); - String templateContent = templatingEngine.doProcessTemplateToFile(this, templateData, templateName); + String templateContent = templatingEngine.compileTemplate(this, templateData, templateName); writeToFile(adjustedOutputFilename, templateContent); return new File(adjustedOutputFilename); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java index efce7914ba76..38c1bcd26dc1 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java @@ -6,47 +6,46 @@ import com.github.jknack.handlebars.io.StringTemplateSource; import com.github.jknack.handlebars.io.TemplateLoader; import com.github.jknack.handlebars.io.TemplateSource; -import java.io.IOException; -import java.io.Reader; -import java.io.StringReader; -import java.util.Map; import org.openapitools.codegen.api.TemplatingEngineAdapter; import org.openapitools.codegen.api.TemplatingGenerator; +import java.io.IOException; +import java.util.Map; + public class HandlebarsEngineAdapter implements TemplatingEngineAdapter { - public TemplateSource findTemplate(TemplatingGenerator generator, String name){ - for (String extension: extensions){ - try{ - String location = name + "." + extension; - return new StringTemplateSource(location, generator.getFullTemplateContents(location)); - } catch(Exception ignored) { - } + public String[] extensions = new String[]{"handlebars", "hbs"}; + + public String compileTemplate(TemplatingGenerator generator, + Map bundle, String templateFile) throws IOException { + TemplateLoader loader = new AbstractTemplateLoader() { + @Override + public TemplateSource sourceAt(String location) { + return findTemplate(generator, location); + } + }; + + Handlebars handlebars = new Handlebars(loader); + handlebars.registerHelperMissing((context, options) -> ""); + Template tmpl = handlebars.compile(templateFile); + return tmpl.apply(bundle); + } + + public TemplateSource findTemplate(TemplatingGenerator generator, String name) { + for (String extension : extensions) { + try { + String location = name + "." + extension; + return new StringTemplateSource(location, generator.getFullTemplateContents(location)); + } catch (Exception ignored) { + } + } + throw new RuntimeException("couldnt find a subtemplate " + name); + } + + @Override + public String[] getFileExtensions() { + return extensions; } - throw new RuntimeException("couldnt find a subtemplate " + name); - } - - public String doProcessTemplateToFile(TemplatingGenerator generator, - Map bundle, String templateFile) throws IOException { - TemplateLoader loader = new AbstractTemplateLoader() { - @Override - public TemplateSource sourceAt(String location) { - return findTemplate(generator, location); - } - }; - - Handlebars handlebars = new Handlebars(loader); - handlebars.registerHelperMissing((context, options) -> ""); - Template tmpl = handlebars.compile(templateFile); - return tmpl.apply(bundle); - } - - String[] extensions = new String[]{"handlebars", "hbs"}; - - @Override - public String[] getFileExtensions() { - return extensions; - } } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java index 8b7915102d34..37e85d1ecdeb 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/MustacheEngineAdapter.java @@ -2,32 +2,23 @@ import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; +import org.openapitools.codegen.api.TemplatingEngineAdapter; +import org.openapitools.codegen.api.TemplatingGenerator; + import java.io.IOException; import java.io.Reader; import java.io.StringReader; import java.util.Map; -import org.openapitools.codegen.api.TemplatingEngineAdapter; -import org.openapitools.codegen.api.TemplatingGenerator; public class MustacheEngineAdapter implements TemplatingEngineAdapter { + public String[] extensions = new String[]{"mustache"}; Mustache.Compiler compiler = Mustache.compiler(); - public Reader findTemplate(TemplatingGenerator generator, String name){ - for (String extension: extensions){ - try{ - return new StringReader(generator.getFullTemplateContents(name + "." + extension)); - } catch(Exception ignored) { - } - } - throw new RuntimeException("couldnt find a subtemplate " + name); - } - @Override - public String doProcessTemplateToFile(TemplatingGenerator generator, Map bundle, - String templateFile) throws IOException { - + public String compileTemplate(TemplatingGenerator generator, Map bundle, + String templateFile) throws IOException { Template tmpl = compiler .withLoader(name -> findTemplate(generator, name)) .defaultValue("") @@ -36,11 +27,14 @@ public String doProcessTemplateToFile(TemplatingGenerator generator, Map Date: Fri, 8 Mar 2019 22:57:40 -0500 Subject: [PATCH 15/23] Initialize config-customized mustache compiler only once --- .../java/org/openapitools/codegen/DefaultGenerator.java | 8 ++++---- .../openapitools/codegen/config/CodegenConfigurator.java | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java index 8d0c72cb8cda..47bde2a5ef2b 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultGenerator.java @@ -708,9 +708,7 @@ private void generateSupportingFiles(List files, Map bundl } if (ignoreProcessor.allowsFile(new File(outputFilename))) { - if (Arrays.stream(templatingEngine.getFileExtensions()) - .anyMatch(templateFile::endsWith)) { - configPostProcessMustacheCompiler(); + if (Arrays.stream(templatingEngine.getFileExtensions()).anyMatch(templateFile::endsWith)) { String templateContent = templatingEngine.compileTemplate(this, bundle, support.templateFile); writeToFile(outputFilename, templateContent); File written = new File(outputFilename); @@ -890,6 +888,9 @@ public List generate() { configureGeneratorProperties(); configureOpenAPIInfo(); + // If the template adapter is mustache, we'll set the config-modified Compiler. + configPostProcessMustacheCompiler(); + List files = new ArrayList(); // models List filteredSchemas = ModelUtils.getSchemasUsedOnlyInFormParam(openAPI); @@ -918,7 +919,6 @@ public String getFullTemplateContents(String templateName) { protected File processTemplateToFile(Map templateData, String templateName, String outputFilename) throws IOException { String adjustedOutputFilename = outputFilename.replaceAll("//", "/").replace('/', File.separatorChar); if (ignoreProcessor.allowsFile(new File(adjustedOutputFilename))) { - configPostProcessMustacheCompiler(); String templateContent = templatingEngine.compileTemplate(this, templateData, templateName); writeToFile(adjustedOutputFilename, templateContent); return new File(adjustedOutputFilename); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java index 3265b5de0968..94055fa94ab2 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/config/CodegenConfigurator.java @@ -544,6 +544,7 @@ public ClientOptInput toClientOptInput() { config.setLibrary(library); } + // Built-in templates are mustache, but allow users to use a simplified handlebars engine for their custom templates. if (isEmpty(templatingEngineName) || templatingEngineName.equals("mustache")) { config.setTemplatingEngine(new MustacheEngineAdapter()); } else if (templatingEngineName.equals("handlebars")) { From 765a539780ddb3bad7542a98006680d842295698 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Sat, 16 Mar 2019 23:09:38 -0400 Subject: [PATCH 16/23] Extend handlebars experimental adapter with more explicit contextual resolvers --- README.md | 10 ++++- .../api/AbstractTemplatingEngineAdapter.java | 38 +++++++++++++++++++ modules/openapi-generator/pom.xml | 5 +++ .../templating/HandlebarsEngineAdapter.java | 33 +++++++++++----- 4 files changed, 74 insertions(+), 12 deletions(-) create mode 100644 modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/AbstractTemplatingEngineAdapter.java diff --git a/README.md b/README.md index 6a97d14dc89b..d15a7121c7b1 100644 --- a/README.md +++ b/README.md @@ -417,9 +417,12 @@ SYNOPSIS [--artifact-version ] [(-c | --config )] [-D ...] + [(-e | --engine )] + [--enable-post-process-file] [(-g | --generator-name )] - [--git-repo-id ] [--git-user-id ] - [--group-id ] [--http-user-agent ] + [--generate-alias-as-model] [--git-repo-id ] + [--git-user-id ] [--group-id ] + [--http-user-agent ] (-i | --input-spec ) [--ignore-file-override ] [--import-mappings ...] @@ -567,6 +570,9 @@ OpenAPI Generator core team members are contributors who have been making signif :heart: = Link to support the contributor directly #### Template Creator + +**NOTE**: Embedded templates are only supported in _Mustache_ format. Support for all other formats is experimental and subject to change at any time. + Here is a list of template creators: * API Clients: * Ada: @stcarrez diff --git a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/AbstractTemplatingEngineAdapter.java b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/AbstractTemplatingEngineAdapter.java new file mode 100644 index 000000000000..19965f2e6d1d --- /dev/null +++ b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/AbstractTemplatingEngineAdapter.java @@ -0,0 +1,38 @@ +package org.openapitools.codegen.api; + +/** + * Provides abstractions around the template engine adapter interface, for reuse by implementers. + */ +public abstract class AbstractTemplatingEngineAdapter implements TemplatingEngineAdapter { + + /** + * Gets all possible template paths for a given location. + * + * @param location The full location of the template. + * + * @return A new array of locations, modified according to the extensions or other adapter rules. + */ + protected String[] getModifiedFileLocation(String location) { + String[] extensions = getFileExtensions(); + String[] result = new String[extensions.length]; + for (int i = 0; i < extensions.length; i++) { + String extension = extensions[i]; + result[i] = String.format("%s.%s", getPathWithoutExtension(location), extension); + } + return result; + } + + /** + * Returns the path without an extension for an input location. + * + * @param location The location of the file, with original file extension intact. + * + * @return The full path, without extension (e.g. /path/to/file.txt => /path/to/file) + */ + private String getPathWithoutExtension(String location) { + if (location == null) return null; + int idx = location.lastIndexOf('.'); + if (idx == -1) return location; + return location.substring(0, idx); + } +} diff --git a/modules/openapi-generator/pom.xml b/modules/openapi-generator/pom.xml index 7da9422289c1..4c003f2f3210 100644 --- a/modules/openapi-generator/pom.xml +++ b/modules/openapi-generator/pom.xml @@ -220,6 +220,11 @@ handlebars ${handlebars.java-version} + + com.github.jknack + handlebars-jackson2 + ${handlebars.java-version} + commons-io commons-io diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java index 38c1bcd26dc1..5b850d9dc662 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java @@ -1,21 +1,26 @@ package org.openapitools.codegen.templating; +import com.github.jknack.handlebars.Context; import com.github.jknack.handlebars.Handlebars; +import com.github.jknack.handlebars.Jackson2Helper; import com.github.jknack.handlebars.Template; +import com.github.jknack.handlebars.context.FieldValueResolver; +import com.github.jknack.handlebars.context.JavaBeanValueResolver; +import com.github.jknack.handlebars.context.MapValueResolver; import com.github.jknack.handlebars.io.AbstractTemplateLoader; import com.github.jknack.handlebars.io.StringTemplateSource; import com.github.jknack.handlebars.io.TemplateLoader; import com.github.jknack.handlebars.io.TemplateSource; -import org.openapitools.codegen.api.TemplatingEngineAdapter; +import org.openapitools.codegen.api.AbstractTemplatingEngineAdapter; import org.openapitools.codegen.api.TemplatingGenerator; import java.io.IOException; import java.util.Map; -public class HandlebarsEngineAdapter implements TemplatingEngineAdapter { +public class HandlebarsEngineAdapter extends AbstractTemplatingEngineAdapter { - public String[] extensions = new String[]{"handlebars", "hbs"}; + private final String[] extensions = new String[]{"handlebars", "hbs"}; public String compileTemplate(TemplatingGenerator generator, Map bundle, String templateFile) throws IOException { @@ -26,21 +31,29 @@ public TemplateSource sourceAt(String location) { } }; + Context context = Context + .newBuilder(bundle) + .resolver( + MapValueResolver.INSTANCE, + JavaBeanValueResolver.INSTANCE, + FieldValueResolver.INSTANCE) + .build(); + Handlebars handlebars = new Handlebars(loader); - handlebars.registerHelperMissing((context, options) -> ""); + handlebars.registerHelperMissing((obj, options) -> ""); + handlebars.registerHelper("json", Jackson2Helper.INSTANCE); Template tmpl = handlebars.compile(templateFile); - return tmpl.apply(bundle); + return tmpl.apply(context); } - public TemplateSource findTemplate(TemplatingGenerator generator, String name) { - for (String extension : extensions) { + public TemplateSource findTemplate(TemplatingGenerator generator, String templateFile) { + for (String file : getModifiedFileLocation(templateFile)) { try { - String location = name + "." + extension; - return new StringTemplateSource(location, generator.getFullTemplateContents(location)); + return new StringTemplateSource(file, generator.getFullTemplateContents(file)); } catch (Exception ignored) { } } - throw new RuntimeException("couldnt find a subtemplate " + name); + throw new RuntimeException("couldnt find a subtemplate " + templateFile); } @Override From f95715f24bd2a82a8de6706abc90a186e278ae30 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Mon, 1 Apr 2019 21:36:41 -0400 Subject: [PATCH 17/23] Use Locale.ROOT in String.format --- .../codegen/api/AbstractTemplatingEngineAdapter.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/AbstractTemplatingEngineAdapter.java b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/AbstractTemplatingEngineAdapter.java index 19965f2e6d1d..3255b9c85846 100644 --- a/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/AbstractTemplatingEngineAdapter.java +++ b/modules/openapi-generator-core/src/main/java/org/openapitools/codegen/api/AbstractTemplatingEngineAdapter.java @@ -1,5 +1,7 @@ package org.openapitools.codegen.api; +import java.util.Locale; + /** * Provides abstractions around the template engine adapter interface, for reuse by implementers. */ @@ -17,7 +19,7 @@ protected String[] getModifiedFileLocation(String location) { String[] result = new String[extensions.length]; for (int i = 0; i < extensions.length; i++) { String extension = extensions[i]; - result[i] = String.format("%s.%s", getPathWithoutExtension(location), extension); + result[i] = String.format(Locale.ROOT, "%s.%s", getPathWithoutExtension(location), extension); } return result; } From 9f6be28fe3d53d090f31172ff8cf081858fa8f11 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Sat, 13 Apr 2019 16:27:37 -0400 Subject: [PATCH 18/23] Add new openapi-generator-core/pom.xml to release_version_update.sh --- bin/utils/release_version_update.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/bin/utils/release_version_update.sh b/bin/utils/release_version_update.sh index c7a41c0d12ca..d79b6b04de2e 100755 --- a/bin/utils/release_version_update.sh +++ b/bin/utils/release_version_update.sh @@ -36,6 +36,7 @@ echo "Release preparation: replacing $FROM with $TO in different files" declare -a files=("modules/openapi-generator-cli/pom.xml" "modules/openapi-generator-gradle-plugin/gradle.properties" "modules/openapi-generator-gradle-plugin/pom.xml" + "modules/openapi-generator-core/pom.xml" "modules/openapi-generator-maven-plugin/pom.xml" "modules/openapi-generator-online/pom.xml" "modules/openapi-generator/pom.xml" From d32f6834337b25baea45c4177d608148ea71a77d Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Tue, 16 Apr 2019 22:04:26 -0400 Subject: [PATCH 19/23] Log a message on missing handlebars helper --- .../codegen/templating/HandlebarsEngineAdapter.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java index 5b850d9dc662..8d8f27492dbb 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java @@ -13,13 +13,16 @@ import com.github.jknack.handlebars.io.TemplateSource; import org.openapitools.codegen.api.AbstractTemplatingEngineAdapter; import org.openapitools.codegen.api.TemplatingGenerator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.IOException; +import java.util.Locale; import java.util.Map; public class HandlebarsEngineAdapter extends AbstractTemplatingEngineAdapter { - + static Logger LOGGER = LoggerFactory.getLogger(HandlebarsEngineAdapter.class); private final String[] extensions = new String[]{"handlebars", "hbs"}; public String compileTemplate(TemplatingGenerator generator, @@ -40,7 +43,10 @@ public TemplateSource sourceAt(String location) { .build(); Handlebars handlebars = new Handlebars(loader); - handlebars.registerHelperMissing((obj, options) -> ""); + handlebars.registerHelperMissing((obj, options) -> { + LOGGER.warn(String.format(Locale.ROOT, "Unregistered helper name '%s', processing template:\n%s", options.helperName, options.fn.text())); + return ""; + }); handlebars.registerHelper("json", Jackson2Helper.INSTANCE); Template tmpl = handlebars.compile(templateFile); return tmpl.apply(context); From 2b901ad7bb6eebeba3141e479f3f85b7520befe9 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Tue, 16 Apr 2019 22:07:54 -0400 Subject: [PATCH 20/23] Add clarification around template default and beta options --- .../src/main/java/org/openapitools/codegen/cmd/Generate.java | 2 +- .../main/java/org/openapitools/codegen/CodegenConstants.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java index c829aad3b878..28dc4dcdb261 100644 --- a/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java +++ b/modules/openapi-generator-cli/src/main/java/org/openapitools/codegen/cmd/Generate.java @@ -71,7 +71,7 @@ public class Generate implements Runnable { private String templateDir; @Option(name = {"-e", "--engine"}, title = "templating engine", - description = "templating engine, for now \"mustache\" and \"handlebars\" are supported") + description = "templating engine: \"mustache\" (default) or \"handlebars\" (beta)") private String templatingEngine; @Option( diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java index 3c2ed28f75ba..f9c21a4968b0 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/CodegenConstants.java @@ -185,7 +185,7 @@ public class CodegenConstants { public static final String DOTNET_FRAMEWORK_DESC = "The target .NET framework version."; public static final String TEMPLATING_ENGINE = "templatingEngine"; - public static final String TEMPLATING_ENGINE_DESC = "The templating engine plugin to use"; + public static final String TEMPLATING_ENGINE_DESC = "The templating engine plugin to use: \"mustache\" (default) or \"handlebars\" (beta)"; public static enum MODEL_PROPERTY_NAMING_TYPE {camelCase, PascalCase, snake_case, original} From b5f2c2ae5793a4a8a3a0cd7bd445695d027eeb82 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Tue, 16 Apr 2019 22:18:40 -0400 Subject: [PATCH 21/23] Move mustache package under new templating package --- .../openapitools/codegen/languages/AbstractCSharpCodegen.java | 2 +- .../org/openapitools/codegen/languages/AbstractCppCodegen.java | 2 +- .../org/openapitools/codegen/languages/ErlangClientCodegen.java | 2 +- .../org/openapitools/codegen/languages/JavaClientCodegen.java | 2 +- .../org/openapitools/codegen/languages/KotlinServerCodegen.java | 2 +- .../codegen/languages/ScalaPlayFrameworkServerCodegen.java | 2 +- .../codegen/{ => templating}/mustache/CamelCaseLambda.java | 2 +- .../codegen/{ => templating}/mustache/CaseFormatLambda.java | 2 +- .../codegen/{ => templating}/mustache/IndentedLambda.java | 2 +- .../codegen/{ => templating}/mustache/JoinWithCommaLambda.java | 2 +- .../codegen/{ => templating}/mustache/LowercaseLambda.java | 2 +- .../codegen/{ => templating}/mustache/TitlecaseLambda.java | 2 +- .../codegen/{ => templating}/mustache/UppercaseLambda.java | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) rename modules/openapi-generator/src/main/java/org/openapitools/codegen/{ => templating}/mustache/CamelCaseLambda.java (97%) rename modules/openapi-generator/src/main/java/org/openapitools/codegen/{ => templating}/mustache/CaseFormatLambda.java (96%) rename modules/openapi-generator/src/main/java/org/openapitools/codegen/{ => templating}/mustache/IndentedLambda.java (98%) rename modules/openapi-generator/src/main/java/org/openapitools/codegen/{ => templating}/mustache/JoinWithCommaLambda.java (96%) rename modules/openapi-generator/src/main/java/org/openapitools/codegen/{ => templating}/mustache/LowercaseLambda.java (97%) rename modules/openapi-generator/src/main/java/org/openapitools/codegen/{ => templating}/mustache/TitlecaseLambda.java (98%) rename modules/openapi-generator/src/main/java/org/openapitools/codegen/{ => templating}/mustache/UppercaseLambda.java (96%) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java index ff5cdc474ea4..63a99ff9384d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCSharpCodegen.java @@ -25,7 +25,7 @@ import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.openapitools.codegen.*; -import org.openapitools.codegen.mustache.*; +import org.openapitools.codegen.templating.mustache.*; import org.openapitools.codegen.utils.ModelUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java index 62b5331f1e0d..dffc475fb76d 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractCppCodegen.java @@ -25,7 +25,7 @@ import org.openapitools.codegen.CodegenConfig; import org.openapitools.codegen.CodegenProperty; import org.openapitools.codegen.DefaultCodegen; -import org.openapitools.codegen.mustache.IndentedLambda; +import org.openapitools.codegen.templating.mustache.IndentedLambda; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangClientCodegen.java index 61fcfd7057b9..b9d46f66a9ea 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ErlangClientCodegen.java @@ -21,7 +21,7 @@ import com.samskivert.mustache.Template; import io.swagger.v3.oas.models.media.Schema; import org.openapitools.codegen.*; -import org.openapitools.codegen.mustache.JoinWithCommaLambda; +import org.openapitools.codegen.templating.mustache.JoinWithCommaLambda; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java index c42f839ceca9..24681b371e6a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java @@ -23,7 +23,7 @@ import org.openapitools.codegen.languages.features.BeanValidationFeatures; import org.openapitools.codegen.languages.features.GzipFeatures; import org.openapitools.codegen.languages.features.PerformBeanValidationFeatures; -import org.openapitools.codegen.mustache.CaseFormatLambda; +import org.openapitools.codegen.templating.mustache.CaseFormatLambda; import org.openapitools.codegen.utils.ProcessUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinServerCodegen.java index 5c8defdf871b..8c31c1a8a5e6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinServerCodegen.java @@ -24,7 +24,7 @@ import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.CodegenType; import org.openapitools.codegen.SupportingFile; -import org.openapitools.codegen.mustache.*; +import org.openapitools.codegen.templating.mustache.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaPlayFrameworkServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaPlayFrameworkServerCodegen.java index e8c8346db3ee..0285e31ccf72 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaPlayFrameworkServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/ScalaPlayFrameworkServerCodegen.java @@ -21,7 +21,7 @@ import io.swagger.v3.oas.models.media.ArraySchema; import io.swagger.v3.oas.models.media.Schema; import org.openapitools.codegen.*; -import org.openapitools.codegen.mustache.*; +import org.openapitools.codegen.templating.mustache.IndentedLambda; import org.openapitools.codegen.utils.ModelUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/CamelCaseLambda.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/CamelCaseLambda.java similarity index 97% rename from modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/CamelCaseLambda.java rename to modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/CamelCaseLambda.java index 110302b1bb8d..2c5fbd9e5520 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/CamelCaseLambda.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/CamelCaseLambda.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.openapitools.codegen.mustache; +package org.openapitools.codegen.templating.mustache; import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/CaseFormatLambda.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/CaseFormatLambda.java similarity index 96% rename from modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/CaseFormatLambda.java rename to modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/CaseFormatLambda.java index 6f449c42ce53..a925525380b6 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/CaseFormatLambda.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/CaseFormatLambda.java @@ -1,4 +1,4 @@ -package org.openapitools.codegen.mustache; +package org.openapitools.codegen.templating.mustache; import com.google.common.base.CaseFormat; import com.samskivert.mustache.Mustache; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/IndentedLambda.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/IndentedLambda.java similarity index 98% rename from modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/IndentedLambda.java rename to modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/IndentedLambda.java index 66873c311c1b..c3656ed64aff 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/IndentedLambda.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/IndentedLambda.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.openapitools.codegen.mustache; +package org.openapitools.codegen.templating.mustache; import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/JoinWithCommaLambda.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/JoinWithCommaLambda.java similarity index 96% rename from modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/JoinWithCommaLambda.java rename to modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/JoinWithCommaLambda.java index 70e3afa6a859..ec99428222b7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/JoinWithCommaLambda.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/JoinWithCommaLambda.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.openapitools.codegen.mustache; +package org.openapitools.codegen.templating.mustache; import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/LowercaseLambda.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/LowercaseLambda.java similarity index 97% rename from modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/LowercaseLambda.java rename to modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/LowercaseLambda.java index ba466fd0073a..42f292f2400a 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/LowercaseLambda.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/LowercaseLambda.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.openapitools.codegen.mustache; +package org.openapitools.codegen.templating.mustache; import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/TitlecaseLambda.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/TitlecaseLambda.java similarity index 98% rename from modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/TitlecaseLambda.java rename to modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/TitlecaseLambda.java index e9ec42991b6e..a51218f0eeab 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/TitlecaseLambda.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/TitlecaseLambda.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.openapitools.codegen.mustache; +package org.openapitools.codegen.templating.mustache; import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/UppercaseLambda.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/UppercaseLambda.java similarity index 96% rename from modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/UppercaseLambda.java rename to modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/UppercaseLambda.java index 98b835b55bc4..b225eafd3c66 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/mustache/UppercaseLambda.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/mustache/UppercaseLambda.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.openapitools.codegen.mustache; +package org.openapitools.codegen.templating.mustache; import com.samskivert.mustache.Mustache; import com.samskivert.mustache.Template; From 93515295e673d175cb3f800461a8f5aad319d4f8 Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Tue, 16 Apr 2019 23:58:18 -0400 Subject: [PATCH 22/23] Include built-in handlebars helpers which require explicit registration, and custom startsWith helper. --- .../templating/HandlebarsEngineAdapter.java | 5 ++ .../templating/handlebars/StringHelpers.java | 64 ++++++++++++++ .../handlebars/StringHelpersTest.java | 86 +++++++++++++++++++ pom.xml | 2 +- 4 files changed, 156 insertions(+), 1 deletion(-) create mode 100644 modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/handlebars/StringHelpers.java create mode 100644 modules/openapi-generator/src/test/java/org/openapitools/codegen/templating/handlebars/StringHelpersTest.java diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java index 8d8f27492dbb..fb4dcfcdcd7e 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/HandlebarsEngineAdapter.java @@ -7,6 +7,8 @@ import com.github.jknack.handlebars.context.FieldValueResolver; import com.github.jknack.handlebars.context.JavaBeanValueResolver; import com.github.jknack.handlebars.context.MapValueResolver; +import com.github.jknack.handlebars.helper.ConditionalHelpers; +import com.github.jknack.handlebars.helper.StringHelpers; import com.github.jknack.handlebars.io.AbstractTemplateLoader; import com.github.jknack.handlebars.io.StringTemplateSource; import com.github.jknack.handlebars.io.TemplateLoader; @@ -48,6 +50,9 @@ public TemplateSource sourceAt(String location) { return ""; }); handlebars.registerHelper("json", Jackson2Helper.INSTANCE); + StringHelpers.register(handlebars); + handlebars.registerHelpers(ConditionalHelpers.class); + handlebars.registerHelpers(org.openapitools.codegen.templating.handlebars.StringHelpers.class); Template tmpl = handlebars.compile(templateFile); return tmpl.apply(context); } diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/handlebars/StringHelpers.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/handlebars/StringHelpers.java new file mode 100644 index 000000000000..e67d526c4777 --- /dev/null +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/handlebars/StringHelpers.java @@ -0,0 +1,64 @@ +package org.openapitools.codegen.templating.handlebars; + +import com.github.jknack.handlebars.Helper; +import com.github.jknack.handlebars.Options; +import com.github.jknack.handlebars.TagType; + +import java.io.IOException; + +public enum StringHelpers implements Helper { + + /** + * Indicates the string starts with the defined value. + * For example: + * + *
+     * {{startsWith a b ["insensitive"]}}
+     * 
+ * + *
+     * {{startsWith a text='b' [insensitive=true]}}
+     * 
+ * + * Render 'yes' or 'no': + *
+     *   {{#startsWith a b}}
+     *     yes
+     *   {{else}}
+     *     no
+     *   {{/startsWith}}
+     * 
+ * + * Render 'true' or 'false': + *
+     *   {{startsWith a b}}
+     * 
+ * + * Render 'y' or 'n': + *
+     *   {{startsWith a b yes='y' no='n'}}
+     * 
+ * + * If value is "handlebars.java", the output will be "Handlebars.java". + */ + startsWith { + @Override + public Object apply(Object value, Options options) throws IOException { + String match = options.param(0, options.hash("text", "")); + if (match.length() < 1) { + return false; + } + + boolean caseInsensitive = options.hash("insensitive", false); + boolean result = caseInsensitive ? value.toString().toLowerCase().startsWith(match.toLowerCase()) : value.toString().startsWith(match); + + if (options.tagType == TagType.SECTION) { + return result ? options.fn() : options.inverse(); + } + + return result + ? options.hash("yes", true) + : options.hash("no", false); + } + } +} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/templating/handlebars/StringHelpersTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/templating/handlebars/StringHelpersTest.java new file mode 100644 index 000000000000..5bea5678bbba --- /dev/null +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/templating/handlebars/StringHelpersTest.java @@ -0,0 +1,86 @@ +package org.openapitools.codegen.templating.handlebars; + +import com.github.jknack.handlebars.Context; +import com.github.jknack.handlebars.Handlebars; +import com.github.jknack.handlebars.Template; +import com.github.jknack.handlebars.context.FieldValueResolver; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.util.HashMap; + +import static org.testng.Assert.assertEquals; + +public class StringHelpersTest { + + private Handlebars handlebars = null; + + private void evaluate(HashMap data, String template, String expect) throws IOException { + + Context context = Context + .newBuilder(data) + .resolver( + FieldValueResolver.INSTANCE) + .build(); + + Template tmpl = handlebars.compileInline(template); + String actual = tmpl.apply(context); + assertEquals(actual, expect); + } + + @BeforeMethod + public void setup() { + handlebars = new Handlebars(); + handlebars.registerHelpers(StringHelpers.class); + } + + @Test(description = "Handlebars StringHelpers.startsWith, section") + public void startsWithSectionalTest() throws IOException { + HashMap data = new HashMap() {{ + put("asdf", "asdf"); + put("a", "a"); + put("b", "b"); + }}; + + String template = "{{~#startsWith asdf a ~}}yes{{~else~}}no{{~/startsWith~}}"; + evaluate(data, template, "yes"); + + template = "{{~#startsWith asdf b ~}}yes{{~else~}}no{{~/startsWith~}}"; + evaluate(data, template, "no"); + } + + @Test(description = "Handlebars StringHelpers.startsWith") + public void startsWithTest() throws IOException { + HashMap data = new HashMap() {{ + put("asdf", "asdf"); + put("ASDF", "ASDF"); + put("a", "a"); + put("b", "b"); + }}; + evaluate(data, "{{startsWith asdf a}}", "true"); + evaluate(data, "{{startsWith asdf b}}", "false"); + evaluate(data, "{{startsWith ASDF a insensitive=true }}", "true"); + evaluate(data, "{{startsWith ASDF a insensitive=false }}", "false"); + evaluate(data, "{{startsWith ASDF 'a' insensitive=true }}", "true"); + evaluate(data, "{{startsWith ASDF b insensitive=true }}", "false"); + evaluate(data, "{{startsWith ASDF 'b' insensitive=true }}", "false"); + evaluate(data, "{{startsWith ASDF insensitive=true text='a'}}", "true"); + evaluate(data, "{{startsWith ASDF insensitive=true text='a' yes='✓' no='✘'}}", "✓"); + evaluate(data, "{{startsWith ASDF insensitive=false text='a' yes='✓' no='✘'}}", "✘"); + } + + @Test(description = "Handlebars StringHelpers.startsWith, yes/no override") + public void startsWithYesOverrideTest() throws IOException { + HashMap data = new HashMap() {{ + put("asdf", "asdf"); + put("a", "a"); + put("b", "b"); + }}; + String template = "{{startsWith asdf a yes='y' no='n'}}"; + evaluate(data, template, "y"); + + template = "{{startsWith asdf b yes='y' no='n'}}"; + evaluate(data, template, "n"); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index 200025ac5542..191797195f00 100644 --- a/pom.xml +++ b/pom.xml @@ -1372,7 +1372,7 @@ 1.7.12 3.2.1 1.14 - 4.1.0 + 4.1.2 6.14.3 2.22.1 1.43 From edb4dcef79278b9a8c7326625da58bc74e1f994e Mon Sep 17 00:00:00 2001 From: Jim Schubert Date: Wed, 17 Apr 2019 00:07:13 -0400 Subject: [PATCH 23/23] Locale.ROOT in toLowerCase --- .../codegen/templating/handlebars/StringHelpers.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/handlebars/StringHelpers.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/handlebars/StringHelpers.java index e67d526c4777..c8a8170ca96f 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/handlebars/StringHelpers.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/templating/handlebars/StringHelpers.java @@ -5,6 +5,7 @@ import com.github.jknack.handlebars.TagType; import java.io.IOException; +import java.util.Locale; public enum StringHelpers implements Helper { @@ -50,7 +51,7 @@ public Object apply(Object value, Options options) throws IOException { } boolean caseInsensitive = options.hash("insensitive", false); - boolean result = caseInsensitive ? value.toString().toLowerCase().startsWith(match.toLowerCase()) : value.toString().startsWith(match); + boolean result = caseInsensitive ? value.toString().toLowerCase(Locale.ROOT).startsWith(match.toLowerCase(Locale.ROOT)) : value.toString().startsWith(match); if (options.tagType == TagType.SECTION) { return result ? options.fn() : options.inverse();