Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
f4fcd7c
add test
IgorDomagala Aug 21, 2023
4c933e7
add test
IgorDomagala Aug 28, 2023
2b6586a
Add configuration cache compatibility and config cache test
IgorDomagala Aug 31, 2023
89a17f6
Revert "Add configuration cache compatibility and config cache test"
IgorDomagala Aug 31, 2023
18d0b7f
Add configuration cache compatibility and config cache test
IgorDomagala Aug 31, 2023
16cad3d
Merge remote-tracking branch 'origin/main'
IgorDomagala Aug 31, 2023
9c05942
Add configuration cache compatibility and config cache test
IgorDomagala Aug 31, 2023
4c7118a
minor fixes
IgorDomagala Sep 4, 2023
7409a9b
add configuration cache - minor fixes
IgorDomagala Sep 4, 2023
d9d16ee
add configuration cache - minor fixes and windows support
IgorDomagala Sep 4, 2023
13b783f
add configuration cache - minor fixes and windows support
IgorDomagala Sep 5, 2023
60b8cb5
add configuration cache - minor fixes and windows support
IgorDomagala Sep 5, 2023
232695a
add windows support
IgorDomagala Sep 7, 2023
8ca5a58
add configuration cache - minor fixes and windows support
IgorDomagala Sep 7, 2023
c47a5e3
match with checkstyle requirements, change dependencies
IgorDomagala Sep 12, 2023
68f5adf
change dependencies, add compatibility with older gradle versions
IgorDomagala Sep 12, 2023
8420c86
change dependencies, add compatibility with older gradle versions
IgorDomagala Sep 12, 2023
ed0ba6e
change jackson-databind version
IgorDomagala Sep 12, 2023
114173d
add BuildLogicFunctionalTest compatibility with windows
IgorDomagala Sep 14, 2023
4cd38ac
minor fixes
IgorDomagala Sep 14, 2023
577df0f
minor fixes
IgorDomagala Sep 14, 2023
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
42 changes: 42 additions & 0 deletions typescript-generator-gradle-plugin/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,17 @@
</properties>

<dependencies>
<dependency>
<groupId>dev.gradleplugins</groupId>
<artifactId>gradle-test-kit</artifactId>
<version>8.2.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.2</version>
</dependency>
<dependency>
<groupId>org.gradle</groupId>
<artifactId>gradle-core</artifactId>
Expand Down Expand Up @@ -58,11 +69,42 @@
<artifactId>groovy-all</artifactId>
<version>2.4.21</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-scala_2.13</artifactId>
<version>2.14.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cz.habarta.typescript-generator</groupId>
<artifactId>typescript-generator-core</artifactId>
<version>3.2-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
<version>2.14.2</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.gradle/gradle-test-kit -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.sonatype.sisu</groupId>
<artifactId>sisu-inject-bean</artifactId>
<version>2.3.0</version>
<scope>compile</scope>
</dependency>

</dependencies>

<repositories>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,21 +25,24 @@
import cz.habarta.typescript.generator.TypeScriptOutputKind;
import cz.habarta.typescript.generator.util.Utils;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import org.gradle.api.DefaultTask;
import org.gradle.api.Task;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.file.ProjectLayout;
import org.gradle.api.tasks.Classpath;
import org.gradle.api.tasks.TaskAction;
import org.jetbrains.annotations.NotNull;


public class GenerateTask extends DefaultTask {

public String outputFile;
public abstract class GenerateTask extends DefaultTask {

public TypeScriptFileType outputFileType;
public TypeScriptOutputKind outputKind;
public String module;
Expand Down Expand Up @@ -130,6 +133,20 @@ public class GenerateTask extends DefaultTask {
public List<String> jackson2Modules;
public Logger.Level loggingLevel;

public String projectName;

private final ProjectLayout projectLayout;

@Classpath
abstract ConfigurableFileCollection getClasspath();

public String outputFile;

@Inject
public GenerateTask(ProjectLayout projectLayout) {
this.projectLayout = projectLayout;
}

private Settings createSettings(URLClassLoader classLoader) {
final Settings settings = new Settings();
if (outputFileType != null) {
Expand Down Expand Up @@ -200,7 +217,7 @@ private Settings createSettings(URLClassLoader classLoader) {
settings.primitivePropertiesRequired = primitivePropertiesRequired;
settings.generateInfoJson = generateInfoJson;
settings.generateNpmPackageJson = generateNpmPackageJson;
settings.npmName = npmName == null && generateNpmPackageJson ? getProject().getName() : npmName;
settings.npmName = npmName == null && generateNpmPackageJson ? projectName : npmName;
settings.npmVersion = npmVersion == null && generateNpmPackageJson ? settings.getDefaultNpmVersion() : npmVersion;
settings.npmTypescriptVersion = npmTypescriptVersion;
settings.npmBuildScript = npmBuildScript;
Expand All @@ -215,6 +232,7 @@ private Settings createSettings(URLClassLoader classLoader) {
return settings;
}


@TaskAction
public void generate() throws Exception {
if (outputKind == null) {
Expand All @@ -226,55 +244,54 @@ public void generate() throws Exception {

TypeScriptGenerator.setLogger(new Logger(loggingLevel));
TypeScriptGenerator.printVersion();
try (URLClassLoader classLoader = createClassloader()) {
final Settings settings = createSettings(classLoader);
final Input.Parameters parameters = parameters(classLoader, settings);
File finalOutputFile = calculateOutputFile(settings);
settings.validateFileName(finalOutputFile);
new TypeScriptGenerator(settings).generateTypeScript(Input.from(parameters), Output.to(finalOutputFile));
}
}

@NotNull
private URLClassLoader createClassloader() throws MalformedURLException {
// class loader
final Set<URL> urls = new LinkedHashSet<>();
for (Task task : getProject().getTasks()) {
if (task.getName().startsWith("compile") && !task.getName().startsWith("compileTest")) {
for (File file : task.getOutputs().getFiles()) {
urls.add(file.toURI().toURL());
}
}
for (File file : getClasspath()) {
urls.add(file.toURI().toURL());
}
urls.addAll(getFilesFromConfiguration("compileClasspath"));

try (URLClassLoader classLoader = Settings.createClassLoader(getProject().getName(), urls.toArray(new URL[0]), Thread.currentThread().getContextClassLoader())) {

final Settings settings = createSettings(classLoader);

final Input.Parameters parameters = new Input.Parameters();
parameters.classNames = classes;
parameters.classNamePatterns = classPatterns;
parameters.classesWithAnnotations = classesWithAnnotations;
parameters.classesImplementingInterfaces = classesImplementingInterfaces;
parameters.classesExtendingClasses = classesExtendingClasses;
parameters.jaxrsApplicationClassName = classesFromJaxrsApplication;
parameters.automaticJaxrsApplication = classesFromAutomaticJaxrsApplication;
parameters.isClassNameExcluded = settings.getExcludeFilter();
parameters.classLoader = classLoader;
parameters.scanningAcceptedPackages = scanningAcceptedPackages;
parameters.debug = loggingLevel == Logger.Level.Debug;
return Settings.createClassLoader(projectName, urls.toArray(new URL[0]), Thread.currentThread().getContextClassLoader());
}

final File output = outputFile != null
? getProject().file(outputFile)
: new File(new File(getProject().getBuildDir(), "typescript-generator"), getProject().getName() + settings.getExtension());
settings.validateFileName(output);
@NotNull
private File calculateOutputFile(Settings settings) {
return new File(outputFile != null ? outputFile : defaultOutputFile(settings));
}

new TypeScriptGenerator(settings).generateTypeScript(Input.from(parameters), Output.to(output));
}
@NotNull
private String defaultOutputFile(Settings settings) {
return projectLayout.getBuildDirectory().dir("typescript-generator").get().file(projectName + ext(settings.outputFileType)).getAsFile().getAbsolutePath();
}

private List<URL> getFilesFromConfiguration(String configuration) {
try {
final List<URL> urls = new ArrayList<>();
for (File file : getProject().getConfigurations().getAt(configuration).getFiles()) {
urls.add(file.toURI().toURL());
}
return urls;
} catch (Exception e) {
TypeScriptGenerator.getLogger().warning(String.format("Cannot get file names from configuration '%s': %s", configuration, e.getMessage()));
return Collections.emptyList();
}
@NotNull
private Input.Parameters parameters(URLClassLoader classLoader, Settings settings) {
final Input.Parameters parameters = new Input.Parameters();
parameters.classNames = classes;
parameters.classNamePatterns = classPatterns;
parameters.classesWithAnnotations = classesWithAnnotations;
parameters.classesImplementingInterfaces = classesImplementingInterfaces;
parameters.classesExtendingClasses = classesExtendingClasses;
parameters.jaxrsApplicationClassName = classesFromJaxrsApplication;
parameters.automaticJaxrsApplication = classesFromAutomaticJaxrsApplication;
parameters.isClassNameExcluded = settings.getExcludeFilter();
parameters.classLoader = classLoader;
parameters.scanningAcceptedPackages = scanningAcceptedPackages;
parameters.debug = loggingLevel == Logger.Level.Debug;
return parameters;
}

private String ext(TypeScriptFileType outputFileType) {
return outputFileType.equals(TypeScriptFileType.implementationFile) ? ".ts" : ".d.ts";
}
}

Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@

package cz.habarta.typescript.generator.gradle;

import java.util.Collections;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
Expand All @@ -11,14 +10,13 @@ public class TypeScriptGeneratorPlugin implements Plugin<Project> {

@Override
public void apply(Project project) {
final Task generateTsTask = project.task(Collections.singletonMap(Task.TASK_TYPE, GenerateTask.class), "generateTypeScript");

GenerateTask generateTsTask = project.getTasks().create("generateTypeScript", GenerateTask.class);
generateTsTask.projectName = project.getName();
for (Task task : project.getTasks()) {
if (task.getName().startsWith("compile") && !task.getName().startsWith("compileTest")) {
generateTsTask.dependsOn(task.getName());
generateTsTask.getInputs().files(task);
}
}
}

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package cz.habarta.typescript.generator.gradle;

import com.google.common.io.Files;
import static cz.habarta.typescript.generator.gradle.GradlePluginClasspathProvider.getClasspath;
import java.io.BufferedWriter;
import java.io.File;
import static java.io.File.pathSeparator;
import static java.io.File.separator;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import org.apache.commons.io.FileUtils;
import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.GradleRunner;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

public class BuildLogicFunctionalTest {

String sampleGradle = "../../typescript-generator/sample-gradle";
File sourceDir = new File(sampleGradle + "/src");
private File testKitDir = Files.createTempDir();

@TempDir
File testProjectDir;
private File buildFile;
private File classpathFile;

@BeforeEach
public void setup() {
buildFile = new File(testProjectDir, "build.gradle");
classpathFile = new File(buildGradleTemplate().getParent(), "plugin-under-test-metadata.properties");
}

@Test
public void shouldWorkWithConfigurationCache() throws IOException, NoSuchFieldException, IllegalAccessException {
try {
String classpath = "implementation-classpath=" + String.join(pathSeparator, getClasspath(testProjectDir));
System.out.println("Classpath: " + classpath);
writeFile(classpathFile, classpath);
FileUtils.copyToFile(buildGradleTemplateUrl().openStream(), buildFile);
FileUtils.copyDirectory(sourceDir, new File(testProjectDir, "src"));

assertTrue(runGradle("assemble").getOutput().contains("BUILD SUCCESSFUL"));
BuildResult generateTypeScript = runGradle("generateTypeScript");
assertTrue(generateTypeScript.getOutput().contains("BUILD SUCCESSFUL"));

String testFileName = testProjectDir.getName() + ".d.ts";
String testFilePath = testProjectDir + separator + "build" + separator + "typescript-generator" + separator + testFileName;
String schema = FileUtils.readFileToString(new File(testFilePath), StandardCharsets.UTF_8);
assertThat(schema, containsString("export interface Person {"));
assertThat(schema, containsString("export interface PersonGroovy {"));
assertThat(schema, containsString("export interface PersonKt {"));
assertThat(schema, containsString("export interface PersonScala {"));
} finally {
deleteGradleDir(testKitDir);
}
}

private static void deleteGradleDir(File testKitDir) {
try {
FileUtils.deleteDirectory(testKitDir);
}catch (IOException e)
{
//might happen on Windows but should be ignored
}
}

private BuildResult runGradle(String task) {
System.setProperty("org.gradle.testkit.dir", testKitDir.getAbsolutePath());
return GradleRunner.create()
.withProjectDir(testProjectDir)
.withGradleVersion("8.2.1")
.withPluginClasspath()
.withArguments(
"--stacktrace",
"--info",
"--configuration-cache",
task
)
.build();
}

@NotNull
private static File buildGradleTemplate() {
return new File(buildGradleTemplateUrl().getPath());
}

@Nullable
private static URL buildGradleTemplateUrl() {
return BuildLogicFunctionalTest.class.getResource("/build.gradle.template");
}

private void writeFile(File destination, String content) throws IOException {
try (BufferedWriter output = new BufferedWriter(new FileWriter(destination))) {
output.write(content);
}
}
}

Loading