Skip to content

Commit 4bda965

Browse files
Support Scala code generation #401 (#402)
* init support scala * init support scala * update * add support for gradle、maven * add unit test for var field in case class * fxi maven * Minor refactoring Co-authored-by: Bogdan Kobylynskyi <92bogdan@gmail.com>
1 parent db7be06 commit 4bda965

File tree

77 files changed

+5422
-177
lines changed

Some content is hidden

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

77 files changed

+5422
-177
lines changed

plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
package io.github.kobylynskyi.graphql.codegen.gradle;
22

33
import com.kobylynskyi.graphql.codegen.GraphQLCodegen;
4-
import com.kobylynskyi.graphql.codegen.model.ApiInterfaceStrategy;
5-
import com.kobylynskyi.graphql.codegen.model.ApiNamePrefixStrategy;
6-
import com.kobylynskyi.graphql.codegen.model.ApiRootInterfaceStrategy;
7-
import com.kobylynskyi.graphql.codegen.model.GraphQLCodegenConfiguration;
8-
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
9-
import com.kobylynskyi.graphql.codegen.model.MappingConfigConstants;
4+
import com.kobylynskyi.graphql.codegen.model.*;
105
import com.kobylynskyi.graphql.codegen.supplier.JsonMappingConfigSupplier;
116
import com.kobylynskyi.graphql.codegen.supplier.MappingConfigSupplier;
127
import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder;
@@ -90,6 +85,7 @@ public class GraphQLCodegenGradleTask extends DefaultTask implements GraphQLCode
9085

9186
private final ParentInterfacesConfig parentInterfaces = new ParentInterfacesConfig();
9287
private String jsonConfigurationFile;
88+
private GeneratedLanguage generatedLanguage = MappingConfigConstants.DEFAULT_GENERATED_LANGUAGE;
9389

9490
public GraphQLCodegenGradleTask() {
9591
setGroup("codegen");
@@ -146,6 +142,8 @@ public void generate() throws Exception {
146142
mappingConfig.setMutationResolverParentInterface(getMutationResolverParentInterface());
147143
mappingConfig.setSubscriptionResolverParentInterface(getSubscriptionResolverParentInterface());
148144

145+
mappingConfig.setGeneratedLanguage(generatedLanguage);
146+
149147
new GraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier()).generate();
150148
}
151149

@@ -717,4 +715,11 @@ public void setJsonConfigurationFile(String jsonConfigurationFile) {
717715
this.jsonConfigurationFile = jsonConfigurationFile;
718716
}
719717

718+
@Input
719+
@Optional
720+
@Override
721+
public GeneratedLanguage getGeneratedLanguage() {
722+
return generatedLanguage;
723+
}
724+
720725
}

plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
package io.github.kobylynskyi.graphql.codegen;
22

33
import com.kobylynskyi.graphql.codegen.GraphQLCodegen;
4-
import com.kobylynskyi.graphql.codegen.model.ApiInterfaceStrategy;
5-
import com.kobylynskyi.graphql.codegen.model.ApiNamePrefixStrategy;
6-
import com.kobylynskyi.graphql.codegen.model.ApiRootInterfaceStrategy;
7-
import com.kobylynskyi.graphql.codegen.model.GraphQLCodegenConfiguration;
8-
import com.kobylynskyi.graphql.codegen.model.MappingConfig;
9-
import com.kobylynskyi.graphql.codegen.model.MappingConfigConstants;
10-
import com.kobylynskyi.graphql.codegen.model.RelayConfig;
4+
import com.kobylynskyi.graphql.codegen.model.*;
115
import com.kobylynskyi.graphql.codegen.supplier.JsonMappingConfigSupplier;
126
import com.kobylynskyi.graphql.codegen.supplier.MappingConfigSupplier;
137
import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder;
@@ -173,6 +167,9 @@ public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenCo
173167
@Parameter
174168
private ParentInterfacesConfig parentInterfaces = new ParentInterfacesConfig();
175169

170+
@Parameter(defaultValue = MappingConfigConstants.DEFAULT_GENERATED_LANGUAGE_STRING)
171+
private GeneratedLanguage generatedLanguage;
172+
176173
@Parameter
177174
private String jsonConfigurationFile;
178175

@@ -234,6 +231,8 @@ public void execute() throws MojoExecutionException {
234231
mappingConfig.setMutationResolverParentInterface(getMutationResolverParentInterface());
235232
mappingConfig.setSubscriptionResolverParentInterface(getSubscriptionResolverParentInterface());
236233

234+
mappingConfig.setGeneratedLanguage(getGeneratedLanguage());
235+
237236
MappingConfigSupplier mappingConfigSupplier = buildJsonSupplier(jsonConfigurationFile);
238237

239238
try {
@@ -518,6 +517,11 @@ public String getResolverParentInterface() {
518517
return parentInterfaces.getResolver();
519518
}
520519

520+
@Override
521+
public GeneratedLanguage getGeneratedLanguage() {
522+
return generatedLanguage;
523+
}
524+
521525
public ParentInterfacesConfig getParentInterfaces() {
522526
return parentInterfaces;
523527
}
@@ -562,4 +566,4 @@ private static Map<String, String> convertToMap(Properties properties) {
562566
return result;
563567
}
564568

565-
}
569+
}

plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenKeys.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import java.util
44

55
import com.kobylynskyi.graphql.codegen.model.{ ApiInterfaceStrategy, ApiNamePrefixStrategy, ApiRootInterfaceStrategy, RelayConfig }
66
import sbt._
7+
import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage
78

89
/**
910
*
@@ -113,6 +114,8 @@ trait GraphQLCodegenKeys {
113114

114115
val relayConfig = settingKey[RelayConfig]("Can be used to supply a custom configuration for Relay support.")
115116

117+
val generatedLanguage = settingKey[GeneratedLanguage]("Generate code with language, like java/scala.")
118+
116119
//for version
117120
val javaxValidationApiVersion = settingKey[Option[String]]("javax-validation-api version")
118121
val graphqlJavaCodegenVersion = settingKey[Option[String]]("graphql java codegen version")

plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co
5959
//With the implementation of some other plugins, initialization is not necessary,
6060
//but maybe should be related to the dependency of key. For convenience, this is a conservative operation
6161
override lazy val globalSettings: Seq[Def.Setting[_]] = Seq(
62+
generatedLanguage := MappingConfigConstants.DEFAULT_GENERATED_LANGUAGE,
6263
graphqlQueryIntrospectionResultPath := None,
6364
graphqlSchemas := schemaFinderConfig,
6465
jsonConfigurationFile := None,
@@ -162,8 +163,9 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co
162163
mappingConfig.setGenerateApisWithThrowsException((generateApisWithThrowsException in GraphQLCodegenConfig).value)
163164
mappingConfig.setResponseProjectionMaxDepth((responseProjectionMaxDepth in GraphQLCodegenConfig).value)
164165
mappingConfig.setRelayConfig((relayConfig in GraphQLCodegenConfig).value)
166+
mappingConfig.setGeneratedLanguage((generatedLanguage in GraphQLCodegenConfig).value)
165167

166-
sLog.value.debug(s"Current mapping config is <$mappingConfig>")
168+
// sLog.value.debug(s"Current mapping config is <$mappingConfig>") // NO toString
167169
mappingConfig
168170
}
169171

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.kobylynskyi.graphql.codegen;
22

3+
import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage;
34
import com.kobylynskyi.graphql.codegen.model.exception.UnableToLoadFreeMarkerTemplateException;
45
import freemarker.ext.beans.BeansWrapper;
56
import freemarker.template.Configuration;
@@ -8,20 +9,13 @@
89
import freemarker.template.Version;
910

1011
import java.io.IOException;
12+
import java.util.HashMap;
13+
import java.util.Map;
1114

1215
class FreeMarkerTemplatesRegistry {
1316

1417
private static final Version FREEMARKER_TEMPLATE_VERSION = Configuration.VERSION_2_3_30;
15-
16-
static final Template typeTemplate;
17-
static final Template enumTemplate;
18-
static final Template unionTemplate;
19-
static final Template requestTemplate;
20-
static final Template responseTemplate;
21-
static final Template interfaceTemplate;
22-
static final Template operationsTemplate;
23-
static final Template parametrizedInputTemplate;
24-
static final Template responseProjectionTemplate;
18+
private static final Map<String, Map<String, Template>> templateMap = new HashMap<>();
2519

2620
static {
2721
BeansWrapper beansWrapper = new BeansWrapper(FREEMARKER_TEMPLATE_VERSION);
@@ -34,15 +28,31 @@ class FreeMarkerTemplatesRegistry {
3428
configuration.setSharedVariable("statics", beansWrapper.getStaticModels());
3529

3630
try {
37-
typeTemplate = configuration.getTemplate("templates/javaClassGraphqlType.ftl");
38-
enumTemplate = configuration.getTemplate("templates/javaClassGraphqlEnum.ftl");
39-
unionTemplate = configuration.getTemplate("templates/javaClassGraphqlUnion.ftl");
40-
requestTemplate = configuration.getTemplate("templates/javaClassGraphqlRequest.ftl");
41-
responseTemplate = configuration.getTemplate("templates/javaClassGraphqlResponse.ftl");
42-
interfaceTemplate = configuration.getTemplate("templates/javaClassGraphqlInterface.ftl");
43-
operationsTemplate = configuration.getTemplate("templates/javaClassGraphqlOperations.ftl");
44-
parametrizedInputTemplate = configuration.getTemplate("templates/javaClassGraphqlParametrizedInput.ftl");
45-
responseProjectionTemplate = configuration.getTemplate("templates/javaClassGraphqlResponseProjection.ftl");
31+
Map<String, Template> javaTemplates = new HashMap<>();
32+
javaTemplates.put("typeTemplate", configuration.getTemplate("templates/javaClassGraphqlType.ftl"));
33+
javaTemplates.put("enumTemplate", configuration.getTemplate("templates/javaClassGraphqlEnum.ftl"));
34+
javaTemplates.put("unionTemplate", configuration.getTemplate("templates/javaClassGraphqlUnion.ftl"));
35+
javaTemplates.put("requestTemplate", configuration.getTemplate("templates/javaClassGraphqlRequest.ftl"));
36+
javaTemplates.put("responseTemplate", configuration.getTemplate("templates/javaClassGraphqlResponse.ftl"));
37+
javaTemplates.put("interfaceTemplate", configuration.getTemplate("templates/javaClassGraphqlInterface.ftl"));
38+
javaTemplates.put("operationsTemplate", configuration.getTemplate("templates/javaClassGraphqlOperations.ftl"));
39+
javaTemplates.put("parametrizedInputTemplate", configuration.getTemplate("templates/javaClassGraphqlParametrizedInput.ftl"));
40+
javaTemplates.put("responseProjectionTemplate", configuration.getTemplate("templates/javaClassGraphqlResponseProjection.ftl"));
41+
templateMap.put(GeneratedLanguage.JAVA.name(), javaTemplates);
42+
43+
Map<String, Template> scalaTemplates = new HashMap<>();
44+
scalaTemplates.put("typeTemplate", configuration.getTemplate("templates/scala-lang/scalaClassGraphqlType.ftl"));
45+
scalaTemplates.put("enumTemplate", configuration.getTemplate("templates/scala-lang/scalaClassGraphqlEnum.ftl"));
46+
scalaTemplates.put("unionTemplate", configuration.getTemplate("templates/scala-lang/scalaClassGraphqlUnion.ftl"));
47+
scalaTemplates.put("requestTemplate", configuration.getTemplate("templates/scala-lang/scalaClassGraphqlRequest.ftl"));
48+
scalaTemplates.put("responseTemplate", configuration.getTemplate("templates/scala-lang/scalaClassGraphqlResponse.ftl"));
49+
scalaTemplates.put("interfaceTemplate", configuration.getTemplate("templates/scala-lang/scalaClassGraphqlInterface.ftl"));
50+
scalaTemplates.put("operationsTemplate", configuration.getTemplate("templates/scala-lang/scalaClassGraphqlOperations.ftl"));
51+
scalaTemplates.put("parametrizedInputTemplate", configuration.getTemplate("templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl"));
52+
scalaTemplates.put("responseProjectionTemplate", configuration.getTemplate("templates/scala-lang/scalaClassGraphqlResponseProjection.ftl"));
53+
templateMap.put(GeneratedLanguage.SCALA.name(), scalaTemplates);
54+
55+
4656
} catch (IOException e) {
4757
throw new UnableToLoadFreeMarkerTemplateException(e);
4858
}
@@ -51,4 +61,8 @@ class FreeMarkerTemplatesRegistry {
5161
private FreeMarkerTemplatesRegistry() {
5262
}
5363

64+
public static Template getTemplateWithLang(GeneratedLanguage generatedLanguage, String templateName) {
65+
return templateMap.get(generatedLanguage.name()).get(templateName);
66+
}
67+
5468
}

0 commit comments

Comments
 (0)