Skip to content

Commit 2419bb0

Browse files
authored
Merge pull request #507 from tokuhirom/pebble
Use pebble as a template language for generating code
2 parents 8c9455a + ec8f828 commit 2419bb0

File tree

215 files changed

+845
-537
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

215 files changed

+845
-537
lines changed

generate-code.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ def generate_clients():
4444
-cp ./tools/openapi-generator-cli.jar:./generator/target/line-bot-sdk-nodejs-generator-openapi-generator-1.0.0.jar \\
4545
org.openapitools.codegen.OpenAPIGenerator \\
4646
generate \\
47+
-e pebble \\
4748
-g line-bot-sdk-nodejs-generator \\
4849
--enable-post-process-file \\
4950
-o {output_path} \\
@@ -63,8 +64,10 @@ def generate_webhook():
6364
org.openapitools.codegen.OpenAPIGenerator \\
6465
generate \\
6566
--global-property apiTest=false,modelDocs=false,apiDocs=false \\
67+
-e pebble \\
6668
--enable-post-process-file \\
6769
-g line-bot-sdk-nodejs-generator \\
70+
--template-dir ./generator/src/main/resources/line-bot-sdk-nodejs-generator \\
6871
-o {output_path} \\
6972
-i line-openapi/{source_yaml} \\
7073
'''

generator/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
target/
22
.vscode/
33
/out/
4+
/dependency-reduced-pom.xml

generator/pom.xml

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,19 @@
105105
<target>1.8</target>
106106
</configuration>
107107
</plugin>
108+
<plugin>
109+
<groupId>org.apache.maven.plugins</groupId>
110+
<artifactId>maven-shade-plugin</artifactId>
111+
<version>3.2.4</version>
112+
<executions>
113+
<execution>
114+
<phase>package</phase>
115+
<goals>
116+
<goal>shade</goal>
117+
</goals>
118+
</execution>
119+
</executions>
120+
</plugin>
108121
</plugins>
109122
</build>
110123
<dependencies>
@@ -114,16 +127,21 @@
114127
<version>${openapi-generator-version}</version>
115128
<scope>provided</scope>
116129
</dependency>
130+
<dependency>
131+
<groupId>io.pebbletemplates</groupId>
132+
<artifactId>pebble</artifactId>
133+
<version>3.2.1</version>
134+
</dependency>
117135
<dependency>
118136
<groupId>org.junit.jupiter</groupId>
119137
<artifactId>junit-jupiter-api</artifactId>
120-
<version>5.10.0</version> <!-- JUnit 5 のバージョン -->
138+
<version>5.10.0</version>
121139
<scope>test</scope>
122140
</dependency>
123141
<dependency>
124142
<groupId>org.junit.jupiter</groupId>
125143
<artifactId>junit-jupiter-engine</artifactId>
126-
<version>5.10.0</version> <!-- JUnit 5 のバージョン -->
144+
<version>5.10.0</version>
127145
<scope>test</scope>
128146
</dependency>
129147
</dependencies>

generator/src/main/java/line/bot/generator/LineBotSdkNodejsGeneratorGenerator.java

Lines changed: 18 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package line.bot.generator;
22

3-
import com.google.common.collect.ImmutableMap;
4-
import com.samskivert.mustache.Mustache;
53
import io.swagger.v3.oas.models.Operation;
64
import io.swagger.v3.oas.models.media.Schema;
75
import io.swagger.v3.oas.models.responses.ApiResponse;
@@ -10,21 +8,17 @@
108
import org.openapitools.codegen.CodegenDiscriminator;
119
import org.openapitools.codegen.CodegenModel;
1210
import org.openapitools.codegen.CodegenOperation;
13-
import org.openapitools.codegen.CodegenParameter;
1411
import org.openapitools.codegen.CodegenType;
12+
import org.openapitools.codegen.SupportingFile;
1513
import org.openapitools.codegen.languages.TypeScriptNodeClientCodegen;
1614
import org.openapitools.codegen.model.ModelMap;
1715
import org.openapitools.codegen.model.ModelsMap;
18-
import org.openapitools.codegen.model.OperationsMap;
1916
import org.openapitools.codegen.utils.ModelUtils;
2017

2118
import java.io.File;
2219
import java.util.HashMap;
23-
import java.util.List;
2420
import java.util.Map;
2521
import java.util.Optional;
26-
import java.util.regex.Matcher;
27-
import java.util.regex.Pattern;
2822

2923
// https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractTypeScriptClientCodegen.java
3024
// https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/TypeScriptNodeClientCodegen.java
@@ -54,26 +48,6 @@ public String getName() {
5448
return "line-bot-sdk-nodejs-generator";
5549
}
5650

57-
/**
58-
* Provides an opportunity to inspect and modify operation data before the code is generated.
59-
*/
60-
@Override
61-
public OperationsMap postProcessOperationsWithModels(OperationsMap operations, List<ModelMap> allModels) {
62-
OperationsMap objs = super.postProcessOperationsWithModels(operations, allModels);
63-
64-
for (CodegenOperation op : objs.getOperations().getOperation()) {
65-
if (op.getHasBodyParam() && op.bodyParam.isFile) {
66-
op.vendorExtensions.put("isBinary", true);
67-
}
68-
if (op.isResponseFile) {
69-
op.vendorExtensions.put("isStream", true);
70-
}
71-
}
72-
73-
return operations;
74-
}
75-
76-
7751
public String getHelp() {
7852
return "Generates a line-bot-sdk-nodejs-generator client library.";
7953
}
@@ -84,18 +58,29 @@ public LineBotSdkNodejsGeneratorGenerator() {
8458
embeddedTemplateDir = templateDir = "line-bot-sdk-nodejs-generator";
8559
typeMapping.put("file", "Blob");
8660
languageSpecificPrimitives.add("Blob");
87-
apiTestTemplateFiles.put("api_test.mustache", ".spec.ts");
61+
apiTestTemplateFiles.put("line-bot-sdk-nodejs-generator/api_test.pebble", ".spec.ts");
8862
cliOptions.add(CliOption.newString(TEST_OUTPUT, "Set output folder for models and APIs tests").defaultValue(DEFAULT_TEST_FOLDER));
63+
modelTemplateFiles.remove("model.mustache");
64+
modelTemplateFiles.put("line-bot-sdk-nodejs-generator/model.pebble", ".ts");
65+
apiTemplateFiles.remove("api-single.mustache");
66+
apiTemplateFiles.put("line-bot-sdk-nodejs-generator/api-single.pebble", ".ts");
8967
}
9068

9169
@Override
9270
public void processOpts() {
9371
super.processOpts();
72+
supportingFiles.clear();
73+
9474
if (additionalProperties.containsKey(TEST_OUTPUT)) {
9575
setOutputTestFolder(additionalProperties.get(TEST_OUTPUT).toString());
9676
}
77+
78+
supportingFiles.add(new SupportingFile("line-bot-sdk-nodejs-generator/models.pebble", modelPackage().replace('.', File.separatorChar), "models.ts"));
79+
supportingFiles.add(new SupportingFile("line-bot-sdk-nodejs-generator/api-all.pebble", apiPackage().replace('.', File.separatorChar), "apis.ts"));
80+
supportingFiles.add(new SupportingFile("line-bot-sdk-nodejs-generator/api.pebble", getIndexDirectory(), "api.ts"));
9781
}
9882

83+
9984
@Override
10085
public String apiTestFileFolder() {
10186
return (outputTestFolder + File.separator + testFolder + File.separator + apiPackage().replace('.', File.separatorChar)).replace('/', File.separatorChar);
@@ -152,48 +137,6 @@ protected void handleMethodResponse(Operation operation,
152137
}
153138
}
154139

155-
@Override
156-
protected ImmutableMap.Builder<String, Mustache.Lambda> addMustacheLambdas() {
157-
return super.addMustacheLambdas()
158-
.put("endpoint", (fragment, writer) -> {
159-
String text = fragment.execute();
160-
writer.write(this.getEndpointFromClassName(text));
161-
})
162-
.put("lower", (fragment, writer) -> {
163-
String text = fragment.execute();
164-
writer.write(text.toLowerCase());
165-
})
166-
.put("pathReplace", ((fragment, writer) -> {
167-
String text = fragment.execute();
168-
writer.write(pathReplacer(text));
169-
}));
170-
}
171-
172-
private String getEndpointFromClassName(String className) {
173-
if (className.equals("LineModuleAttachClient")) {
174-
return "https://manager.line.biz";
175-
} else if (className.contains("Blob")) {
176-
return "https://api-data.line.me";
177-
} else {
178-
return "https://api.line.me";
179-
}
180-
}
181-
182-
public static String pathReplacer(String template) {
183-
Pattern pattern = Pattern.compile("\\{(\\w+)\\}");
184-
Matcher matcher = pattern.matcher(template);
185-
186-
StringBuilder codeBuilder = new StringBuilder();
187-
while (matcher.find()) {
188-
String key = matcher.group(1);
189-
codeBuilder.append(".replace(\"{").append(key).append("}\", String(");
190-
codeBuilder.append(key);
191-
codeBuilder.append("))");
192-
}
193-
194-
return codeBuilder.toString();
195-
}
196-
197140
@Override
198141
public String getTypeDeclaration(Schema p) {
199142
if (ModelUtils.isFileSchema(p)) {
@@ -205,4 +148,9 @@ public String getTypeDeclaration(Schema p) {
205148
}
206149
return super.getTypeDeclaration(p);
207150
}
151+
152+
private String getIndexDirectory() {
153+
String indexPackage = modelPackage.substring(0, Math.max(0, modelPackage.lastIndexOf('.')));
154+
return indexPackage.replace('.', File.separatorChar);
155+
}
208156
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package line.bot.generator.pebble;
2+
3+
import io.pebbletemplates.pebble.extension.Function;
4+
import io.pebbletemplates.pebble.template.EvaluationContext;
5+
import io.pebbletemplates.pebble.template.PebbleTemplate;
6+
7+
import java.util.Collections;
8+
import java.util.List;
9+
import java.util.Map;
10+
11+
public class EndpointFunction implements Function {
12+
@Override
13+
public List<String> getArgumentNames() {
14+
return Collections.singletonList("className");
15+
}
16+
17+
@Override
18+
public Object execute(Map<String, Object> args, PebbleTemplate self, EvaluationContext context, int lineNumber) {
19+
String className = (String) args.get("className");
20+
if (className.equals("LineModuleAttachClient")) {
21+
return "https://manager.line.biz";
22+
} else if (className.contains("Blob")) {
23+
return "https://api-data.line.me";
24+
} else {
25+
return "https://api.line.me";
26+
}
27+
}
28+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package line.bot.generator.pebble;
2+
3+
import io.pebbletemplates.pebble.extension.AbstractExtension;
4+
import io.pebbletemplates.pebble.extension.Function;
5+
import line.bot.generator.pebble.EndpointFunction;
6+
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
public class MyPebbleExtension extends AbstractExtension {
11+
@Override
12+
public Map<String, Function> getFunctions() {
13+
HashMap<String, Function> map = new HashMap<>();
14+
map.put("endpoint", new EndpointFunction());
15+
return map;
16+
}
17+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package line.bot.generator.pebble;
2+
3+
import io.pebbletemplates.pebble.PebbleEngine;
4+
import io.pebbletemplates.pebble.loader.ClasspathLoader;
5+
import io.pebbletemplates.pebble.loader.DelegatingLoader;
6+
import io.pebbletemplates.pebble.loader.FileLoader;
7+
import org.openapitools.codegen.api.AbstractTemplatingEngineAdapter;
8+
import org.openapitools.codegen.api.TemplatingExecutor;
9+
10+
import java.io.IOException;
11+
import java.io.StringWriter;
12+
import java.util.Arrays;
13+
import java.util.Map;
14+
15+
public class PebbleTemplateAdapter extends AbstractTemplatingEngineAdapter {
16+
private static final String[] EXTENSIONS = new String[]{"pebble"};
17+
private final PebbleEngine engine = new PebbleEngine.Builder()
18+
.cacheActive(false)
19+
.newLineTrimming(false)
20+
.loader(new DelegatingLoader(Arrays.asList(
21+
new FileLoader(),
22+
new ClasspathLoader()
23+
)))
24+
.autoEscaping(false)
25+
.extension(new MyPebbleExtension())
26+
.build();
27+
28+
public PebbleTemplateAdapter() {
29+
super();
30+
}
31+
32+
@Override
33+
public String getIdentifier() {
34+
return "pebble";
35+
}
36+
37+
@Override
38+
public String[] getFileExtensions() {
39+
return EXTENSIONS;
40+
}
41+
42+
@Override
43+
public String compileTemplate(TemplatingExecutor generator, Map<String, Object> bundle, String templateFile) throws IOException {
44+
String modifiedTemplate = this.getModifiedFileLocation(templateFile)[0];
45+
46+
StringWriter writer = new StringWriter();
47+
engine.getTemplate(modifiedTemplate).evaluate(writer, bundle);
48+
return writer.toString();
49+
}
50+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
line.bot.generator.pebble.PebbleTemplateAdapter

generator/src/main/resources/line-bot-sdk-nodejs-generator/api-all.mustache

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{# @pebvariable name="apiInfo" type="org.openapitools.codegen.model.ApiInfoMap" #}
2+
{% for api in apiInfo.apis -%}
3+
export { {{ api.operations.classname }} } from './{{ api.get("classFilename") }}';
4+
{% endfor %}

0 commit comments

Comments
 (0)