Skip to content

0.2 #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Aug 20, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 7 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ This Gradle plugin is able to generate the following classes based on your Graph
### Plugin Setup

plugins {
id "com.kobylynskyi.graphql.codegen" version "0.1"
id "com.kobylynskyi.graphql.codegen" version "0.2"
}

Using [legacy plugin application](https://docs.gradle.org/current/userguide/plugins.html#sec:old_plugin_application):
Expand All @@ -29,7 +29,7 @@ Using [legacy plugin application](https://docs.gradle.org/current/userguide/plug
}
}
dependencies {
classpath "com.kobylynskyi.graphql.codegen:graphql-codegen-gradle-plugin:0.1"
classpath "com.kobylynskyi.graphql.codegen:graphql-codegen-gradle-plugin:0.2"
}
}

Expand All @@ -53,13 +53,7 @@ Using [legacy plugin application](https://docs.gradle.org/current/userguide/plug
```
* Add generated sources to your project source sets:
```
sourceSets {
main {
java {
srcDir "$buildDir/generated/graphql"
}
}
}
sourceSets.main.java.srcDir "$buildDir/generated"
```


Expand All @@ -71,11 +65,10 @@ Using [legacy plugin application](https://docs.gradle.org/current/userguide/plug
| packageName | String | Empty | Java package for generated classes. |
| outputDir | String | None | The output target directory into which code will be generated. |
| customTypesMapping | Map(String,String) | Empty | Map of (GraphQL Schema Type) to (Java Type). Can be used to supply custom mappings for scalars. |
| - | - | - | - |
| **TBD** apiPackage | String | Empty | |
| **TBD** modelPackage | String | Empty | |
| **TBD** modelNamePrefix | String | Empty | |
| **TBD** modelNameSuffix | String | Empty | |
| modelNamePrefix | String | Empty | Sets the prefix for GraphQL model classes (type, input, interface, enum, union). |
| modelNameSuffix | String | Empty | Sets the suffix for GraphQL model classes (type, input, interface, enum, union). |
| apiPackage | String | Empty | Java package for generated api classes (Query, Mutation, Subscription). |
| modelPackage | String | Empty | Java package for generated model classes (type, input, interface, enum, union). |


### Example
Expand Down
11 changes: 5 additions & 6 deletions graphql-codegen-gradle-plugin-example/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ plugins {
id "java"
id "net.ltgt.apt" version "0.21"
id "net.ltgt.apt-idea" version "0.21"
id "com.kobylynskyi.graphql.codegen" version "0.1"
id "com.kobylynskyi.graphql.codegen" version "0.2"
}

ext {
Expand All @@ -21,19 +21,18 @@ ext {
}

group = "com.kobylynskyi"
version = "0.1-SNAPSHOT"
version = "0.2"
description = "graphql-java-codegen-example"
sourceCompatibility = "1.8"

compileJava.dependsOn tasks.graphqlCodegen
compileJava.dependsOn "graphqlCodegen"

sourceSets.main.java.srcDir "build/generated"
sourceSets.main.java.srcDir "$buildDir/generated"

graphqlCodegen {
graphqlSchemaPaths = [
"$projectDir/src/main/resources/schema.graphqls".toString()
]
outputDir = "$buildDir/generated"
outputDir = new File("$buildDir/generated")
packageName = "com.kobylynskyi.graphql.codegen"
}

Expand Down
2 changes: 1 addition & 1 deletion graphql-codegen-gradle-plugin/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ apply plugin: "java"
apply plugin: "idea"
apply plugin: "maven-publish"

version = "0.1"
version = "0.2"
group = "com.kobylynskyi.graphql.codegen"

dependencies {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.kobylynskyi.graphql.codegen;

import com.kobylynskyi.graphql.codegen.model.UnableToLoadFreeMarkerTemplateException;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
Expand Down Expand Up @@ -29,7 +30,7 @@ class FreeMarkerTemplatesRegistry {
interfaceTemplate = configuration.getTemplate("templates/javaClassGraphqlInterface.ftl");
operationsTemplate = configuration.getTemplate("templates/javaClassGraphqlOperations.ftl");
} catch (IOException e) {
throw new RuntimeException("Unable to load FreeMarker templates", e);
throw new UnableToLoadFreeMarkerTemplateException(e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,19 +35,17 @@
public class GraphqlCodegen {

private List<String> schemas;
private String outputDir;
private File outputDir;
private MappingConfig mappingConfig;

private File classesOutputDir;

public GraphqlCodegen(List<String> schemas, String outputDir, MappingConfig mappingConfig) {
public GraphqlCodegen(List<String> schemas, File outputDir, MappingConfig mappingConfig) {
this.schemas = schemas;
this.outputDir = outputDir;
this.mappingConfig = mappingConfig;
}

public void generate() throws IOException, TemplateException {
classesOutputDir = prepareOutputDir(outputDir, mappingConfig);
prepareOutputDir();
for (String schema : schemas) {
long startTime = System.currentTimeMillis();
Document document = GraphqlDocumentParser.getDocument(schema);
Expand Down Expand Up @@ -81,7 +79,7 @@ private void processDocument(Document document) throws IOException, TemplateExce
}
}
System.out.println(String.format("Generated %d definitions in folder '%s'", document.getDefinitions().size(),
classesOutputDir.getAbsolutePath()));
outputDir.getAbsolutePath()));
}

private void generateUnion(UnionTypeDefinition definition) throws IOException, TemplateException {
Expand Down Expand Up @@ -131,27 +129,30 @@ private void addScalarsToCustomMappingConfig(Document document) {
}

private void generateFile(Template template, Map<String, Object> dataModel) throws IOException, TemplateException {
File javaSourceFile = new File(classesOutputDir, dataModel.get(DataModelFields.CLASS_NAME) + ".java");
String fileName = dataModel.get(DataModelFields.CLASS_NAME) + ".java";
File fileOutputDir = getFileTargetDirectory(dataModel);
File javaSourceFile = new File(fileOutputDir, fileName);
boolean fileCreated = javaSourceFile.createNewFile();
if (!fileCreated) {
throw new FileAlreadyExistsException("File already exists: " + javaSourceFile.getPath());
}
template.process(dataModel, new FileWriter(javaSourceFile));
}

private static File prepareOutputDir(String outputDir, MappingConfig mappingConfig) throws IOException {
private void prepareOutputDir() throws IOException {
Utils.deleteDir(outputDir);
Utils.createDirIfAbsent(outputDir);
}

private File getFileTargetDirectory(Map<String, Object> dataModel) throws IOException {
File targetDir;
String packageName = mappingConfig.getPackageName();
if (packageName == null || packageName.trim().isEmpty()) {
targetDir = new File(outputDir);
Object packageName = dataModel.get(DataModelFields.PACKAGE);
if (packageName != null && !Utils.isBlank(packageName.toString())) {
targetDir = new File(outputDir, packageName.toString().replace(".", File.separator));
} else {
targetDir = new File(outputDir, packageName.replace(".", File.separator));
}
Utils.deleteFolder(targetDir);
boolean outputDirCreated = targetDir.mkdirs();
if (!outputDirCreated) {
throw new IOException("Unable to create output directory");
targetDir = outputDir;
}
Utils.createDirIfAbsent(targetDir);
return targetDir;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.TaskAction;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
Expand All @@ -22,15 +23,23 @@
public class GraphqlCodegenGradleTask extends DefaultTask {

private List<String> graphqlSchemaPaths;
private String outputDir;
private File outputDir;
private Map<String, String> customTypesMapping;
private String packageName;
private String apiPackageName;
private String modelPackageName;
private String modelNamePrefix;
private String modelNameSuffix;

@TaskAction
public void generate() throws IOException, TemplateException {
MappingConfig mappingConfig = new MappingConfig();
mappingConfig.setPackageName(packageName);
mappingConfig.setCustomTypesMapping(customTypesMapping != null ? customTypesMapping : new HashMap<>());
mappingConfig.setModelNamePrefix(modelNamePrefix);
mappingConfig.setModelNameSuffix(modelNameSuffix);
mappingConfig.setApiPackageName(apiPackageName);
mappingConfig.setModelPackageName(modelPackageName);
new GraphqlCodegen(graphqlSchemaPaths, outputDir, mappingConfig).generate();
}

Expand All @@ -44,11 +53,11 @@ public void setGraphqlSchemaPaths(List<String> graphqlSchemaPaths) {
}

@OutputDirectory
public String getOutputDir() {
public File getOutputDir() {
return outputDir;
}

public void setOutputDir(String outputDir) {
public void setOutputDir(File outputDir) {
this.outputDir = outputDir;
}

Expand All @@ -72,4 +81,44 @@ public void setPackageName(String packageName) {
this.packageName = packageName;
}

@Input
@Optional
public String getModelNamePrefix() {
return modelNamePrefix;
}

public void setModelNameSuffix(String modelNameSuffix) {
this.modelNameSuffix = modelNameSuffix;
}

@Input
@Optional
public String getModelNameSuffix() {
return modelNameSuffix;
}

public void setModelNamePrefix(String modelNamePrefix) {
this.modelNamePrefix = modelNamePrefix;
}

@Input
@Optional
public String getApiPackageName() {
return apiPackageName;
}

public void setApiPackageName(String apiPackageName) {
this.apiPackageName = apiPackageName;
}

@Input
@Optional
public String getModelPackageName() {
return modelPackageName;
}

public void setModelPackageName(String modelPackageName) {
this.modelPackageName = modelPackageName;
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.kobylynskyi.graphql.codegen.mapper;

import com.kobylynskyi.graphql.codegen.model.MappingConfig;
import com.kobylynskyi.graphql.codegen.utils.Utils;
import graphql.language.EnumTypeDefinition;

import java.util.HashMap;
Expand All @@ -25,11 +24,11 @@ public class EnumDefinitionToDataModelMapper {
*/
public static Map<String, Object> map(MappingConfig mappingConfig, EnumTypeDefinition enumDef) {
Map<String, Object> dataModel = new HashMap<>();

dataModel.put(PACKAGE, mappingConfig.getPackageName());
dataModel.put(CLASS_NAME, Utils.capitalize(enumDef.getName()));
String packageName = MapperUtils.getModelPackageName(mappingConfig);
dataModel.put(PACKAGE, packageName);
dataModel.put(IMPORTS, MapperUtils.getImports(mappingConfig, packageName));
dataModel.put(CLASS_NAME, MapperUtils.getClassNameWithPrefixAndSuffix(mappingConfig, enumDef));
dataModel.put(FIELDS, EnumValueDefinitionToStringMapper.map(enumDef.getEnumValueDefinitions()));

return dataModel;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@ public class FieldDefinitionToDataModelMapper {
public static Map<String, Object> map(MappingConfig mappingConfig, FieldDefinition fieldDefinition,
String objectType) {
Map<String, Object> dataModel = new HashMap<>();
dataModel.put(PACKAGE, mappingConfig.getPackageName());
String packageName = MapperUtils.getApiPackageName(mappingConfig);
dataModel.put(PACKAGE, packageName);
dataModel.put(IMPORTS, MapperUtils.getImports(mappingConfig, packageName));
dataModel.put(CLASS_NAME, getClassName(fieldDefinition.getName(), objectType));
Operation operation = mapFieldDefinition(mappingConfig, fieldDefinition);
dataModel.put(OPERATIONS, Collections.singletonList(operation));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
*
* @author kobylynskyi
*/
public class GraphqlTypeToJavaTypeMapper {
class GraphqlTypeToJavaTypeMapper {

static String mapToJavaType(MappingConfig mappingConfig, Type type) {
if (type instanceof TypeName) {
Expand All @@ -27,7 +27,7 @@ static String mapToJavaType(MappingConfig mappingConfig, Type type) {
}

private static String wrapIntoJavaCollection(String type) {
return String.format("java.util.Collection<%s>", type);
return String.format("Collection<%s>", type);
}

private static String mapToJavaType(MappingConfig mappingConfig, String graphlType) {
Expand All @@ -40,8 +40,13 @@ private static String mapToJavaType(MappingConfig mappingConfig, String graphlTy
return "String";
case "Int":
return "Integer";
default: // String, Float, Boolean
case "String":
case "Float":
case "Boolean":
return graphlType;
default:
// We need to refer other custom types/interfaces/unions with prefix and suffix
return MapperUtils.getClassNameWithPrefixAndSuffix(mappingConfig, graphlType);
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.kobylynskyi.graphql.codegen.mapper;

import com.kobylynskyi.graphql.codegen.model.MappingConfig;
import com.kobylynskyi.graphql.codegen.utils.Utils;
import graphql.language.InputObjectTypeDefinition;

import java.util.HashMap;
Expand All @@ -25,8 +24,10 @@ public class InputDefinitionToDataModelMapper {
*/
public static Map<String, Object> map(MappingConfig mappingConfig, InputObjectTypeDefinition typeDefinition) {
Map<String, Object> dataModel = new HashMap<>();
dataModel.put(PACKAGE, mappingConfig.getPackageName());
dataModel.put(CLASS_NAME, Utils.capitalize(typeDefinition.getName()));
String packageName = MapperUtils.getModelPackageName(mappingConfig);
dataModel.put(PACKAGE, packageName);
dataModel.put(IMPORTS, MapperUtils.getImports(mappingConfig, packageName));
dataModel.put(CLASS_NAME, MapperUtils.getClassNameWithPrefixAndSuffix(mappingConfig, typeDefinition));
dataModel.put(NAME, typeDefinition.getName());
dataModel.put(FIELDS, InputValueDefinitionToParameterMapper.map(mappingConfig, typeDefinition.getInputValueDefinitions()));
return dataModel;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.kobylynskyi.graphql.codegen.mapper;

import com.kobylynskyi.graphql.codegen.model.MappingConfig;
import com.kobylynskyi.graphql.codegen.utils.Utils;
import graphql.language.InterfaceTypeDefinition;

import java.util.HashMap;
Expand All @@ -25,8 +24,10 @@ public class InterfaceDefinitionToDataModelMapper {
*/
public static Map<String, Object> map(MappingConfig mappingConfig, InterfaceTypeDefinition typeDefinition) {
Map<String, Object> dataModel = new HashMap<>();
dataModel.put(PACKAGE, mappingConfig.getPackageName());
dataModel.put(CLASS_NAME, Utils.capitalize(typeDefinition.getName()));
String packageName = MapperUtils.getModelPackageName(mappingConfig);
dataModel.put(PACKAGE, packageName);
dataModel.put(IMPORTS, MapperUtils.getImports(mappingConfig, packageName));
dataModel.put(CLASS_NAME, MapperUtils.getClassNameWithPrefixAndSuffix(mappingConfig, typeDefinition));
dataModel.put(FIELDS, FieldDefinitionToParameterMapper.map(mappingConfig, typeDefinition.getFieldDefinitions()));
return dataModel;
}
Expand Down
Loading