From 420ecbdfde5ef96186fc0a805fa4d1d449d8d889 Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Wed, 8 Dec 2021 19:19:06 +0100 Subject: feat: replFrege task v2 returns classpath with all dependencies --- .../ch/fhnw/thga/gradleplugins/FregePlugin.java | 3 +-- .../ch/fhnw/thga/gradleplugins/ReplFregeTask.java | 27 ++++------------------ 2 files changed, 5 insertions(+), 25 deletions(-) (limited to 'src/main') diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java index 5fc89b2..b4948e6 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -42,9 +42,8 @@ public class FregePlugin implements Plugin { task.getFregeDependencies().set(implementation.getAsPath()); }); project.getTasks().register(REPL_FREGE_TASK_NAME, ReplFregeTask.class, task -> { - task.dependsOn(compileFregeTask); + task.dependsOn(setupFregeCompilerTask); task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath()); - task.getFregeOutputDir().set(extension.getOutputDir()); task.getFregeDependencies().set(implementation.getAsPath()); }); } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java index 9541861..5a915c0 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java @@ -1,55 +1,36 @@ package ch.fhnw.thga.gradleplugins; -import javax.inject.Inject; - import org.gradle.api.DefaultTask; -import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.FileCollection; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logging; -import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.Property; import org.gradle.api.provider.Provider; import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.Internal; -import org.gradle.api.tasks.JavaExec; import org.gradle.api.tasks.TaskAction; public abstract class ReplFregeTask extends DefaultTask { public static final Logger LOGGER = Logging.getLogger(SetupFregeTask.class); - public static final String REPL_MAIN_CLASS = "frege.repl.FregeRepl"; - - private final JavaExec javaExec; @InputFile public abstract RegularFileProperty getFregeCompilerJar(); - @InputDirectory - public abstract DirectoryProperty getFregeOutputDir(); - @Input public abstract Property getFregeDependencies(); @Internal public final Provider getClasspath() { return getFregeDependencies().map(depsClasspath -> { - return depsClasspath.isEmpty() ? getProject().files(getFregeCompilerJar(), getFregeOutputDir()) - : getProject().files(getFregeCompilerJar(), getFregeOutputDir(), depsClasspath); + return depsClasspath.isEmpty() ? getProject().files(getFregeCompilerJar()) + : getProject().files(getFregeCompilerJar(), depsClasspath); }); } - @Inject - public ReplFregeTask(ObjectFactory objectFactory) { - javaExec = objectFactory.newInstance(JavaExec.class); - } - @TaskAction - public void startFregeRepl() { - javaExec.setStandardInput(System.in); - javaExec.getMainClass().set(REPL_MAIN_CLASS); - javaExec.setClasspath(getClasspath().get()).exec(); + public void fregeReplDependencies() { + System.out.println(getClasspath().get().getAsPath()); } } -- cgit From 815cc93c870a2a857de8c5dd1dcc8c9aa5b4f2a8 Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Fri, 10 Dec 2021 09:31:44 +0100 Subject: refactor: adds an internal `depsFrege` task and simplifes `replFrege` - `depsFregeTask`: only internal use for the vscode plugin to automate the repl code lens. - `replFregeTask`: simplified to only print the command to start the repl because starting and interacting through a console is not gradle's core strength. See https://github.com/tricktron/frege-gradle-plugin/issues/11. --- build.gradle | 2 +- .../gradleplugins/FregePluginFunctionalTest.java | 33 ++++++++++++++++++---- .../ch/fhnw/thga/gradleplugins/FregePlugin.java | 25 ++++++++++++++-- .../ch/fhnw/thga/gradleplugins/ReplFregeTask.java | 33 ++++++---------------- .../internal/DependencyFregeTask.java | 16 +++++++++++ 5 files changed, 75 insertions(+), 34 deletions(-) create mode 100644 src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java (limited to 'src/main') diff --git a/build.gradle b/build.gradle index 2fb7819..d460e2a 100644 --- a/build.gradle +++ b/build.gradle @@ -41,7 +41,7 @@ check.dependsOn functionalTest tasks.withType(Test).configureEach { useJUnitPlatform() - maxParallelForks 4 + maxParallelForks 6 } dependencies { diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index cf6dc70..f94469c 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -4,9 +4,10 @@ import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_DOWNLOAD_DIRECTO import static ch.fhnw.thga.gradleplugins.FregePlugin.COMPILE_FREGE_TASK_NAME; import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_EXTENSION_NAME; import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_PLUGIN_ID; -import static ch.fhnw.thga.gradleplugins.FregePlugin.REPL_FREGE_TASK_NAME; +import static ch.fhnw.thga.gradleplugins.FregePlugin.DEPS_FREGE_TASK_NAME; import static ch.fhnw.thga.gradleplugins.FregePlugin.RUN_FREGE_TASK_NAME; import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_TASK_NAME; +import static ch.fhnw.thga.gradleplugins.FregePlugin.REPL_FREGE_TASK_NAME; import static ch.fhnw.thga.gradleplugins.GradleBuildFileConversionTest.createPluginsSection; import static org.gradle.testkit.runner.TaskOutcome.FAILED; import static org.gradle.testkit.runner.TaskOutcome.FROM_CACHE; @@ -39,6 +40,8 @@ import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import org.junit.jupiter.api.io.TempDir; +import ch.fhnw.thga.gradleplugins.internal.DependencyFregeTask; + @TestInstance(Lifecycle.PER_CLASS) public class FregePluginFunctionalTest { private static final String NEW_LINE = System.lineSeparator(); @@ -394,16 +397,16 @@ public class FregePluginFunctionalTest { @Nested @TestInstance(Lifecycle.PER_CLASS) @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) - class Repl_frege_task_works { + class Deps_frege_task_works { @Test void given_minimal_build_file_config() throws Exception { String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); appendToFile(buildFile, minimalBuildFileConfig); - BuildResult result = runGradleTask(REPL_FREGE_TASK_NAME, "-q"); - assertTrue(project.getTasks().getByName(REPL_FREGE_TASK_NAME) instanceof ReplFregeTask); - assertEquals(SUCCESS, result.task(":" + REPL_FREGE_TASK_NAME).getOutcome()); + BuildResult result = runGradleTask(DEPS_FREGE_TASK_NAME, "-q"); + assertTrue(project.getTasks().getByName(DEPS_FREGE_TASK_NAME) instanceof DependencyFregeTask); + assertEquals(SUCCESS, result.task(":" + DEPS_FREGE_TASK_NAME).getOutcome()); assertTrue(result.getOutput().contains("frege3.25.84.jar")); } @@ -415,11 +418,29 @@ public class FregePluginFunctionalTest { appendToFile(buildFile, String.join("\n", "repositories {", "mavenCentral()", "}")); appendToFile(buildFile, String.join("\n", "dependencies {", "implementation group: 'org.json', name: 'json', version: '20211205'", "}")); + BuildResult result = runGradleTask(DEPS_FREGE_TASK_NAME, "-q"); + assertTrue(project.getTasks().getByName(DEPS_FREGE_TASK_NAME) instanceof DependencyFregeTask); + assertEquals(SUCCESS, result.task(":" + DEPS_FREGE_TASK_NAME).getOutcome()); + assertTrue(result.getOutput().contains("frege3.25.84.jar")); + assertTrue(result.getOutput().contains("org.json")); + } + } + + @Nested + @TestInstance(Lifecycle.PER_CLASS) + @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) + class Repl_frege_task_works { + @Test + void given_minimal_build_file_config() throws Exception { + String minimalBuildFileConfig = createFregeSection( + fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); + appendToFile(buildFile, minimalBuildFileConfig); + BuildResult result = runGradleTask(REPL_FREGE_TASK_NAME, "-q"); assertTrue(project.getTasks().getByName(REPL_FREGE_TASK_NAME) instanceof ReplFregeTask); assertEquals(SUCCESS, result.task(":" + REPL_FREGE_TASK_NAME).getOutcome()); + assertTrue(result.getOutput().contains("java -cp")); assertTrue(result.getOutput().contains("frege3.25.84.jar")); - assertTrue(result.getOutput().contains("org.json")); } } } \ No newline at end of file diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java index b4948e6..18016f3 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -3,17 +3,32 @@ package ch.fhnw.thga.gradleplugins; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; +import org.gradle.api.file.FileCollection; +import org.gradle.api.file.RegularFile; +import org.gradle.api.provider.Provider; import org.gradle.api.tasks.TaskProvider; +import ch.fhnw.thga.gradleplugins.internal.DependencyFregeTask; + public class FregePlugin implements Plugin { public static final String SETUP_FREGE_TASK_NAME = "setupFrege"; public static final String COMPILE_FREGE_TASK_NAME = "compileFrege"; public static final String RUN_FREGE_TASK_NAME = "runFrege"; public static final String REPL_FREGE_TASK_NAME = "replFrege"; + public static final String DEPS_FREGE_TASK_NAME = "depsFrege"; public static final String FREGE_PLUGIN_ID = "ch.fhnw.thga.frege"; public static final String FREGE_EXTENSION_NAME = "frege"; public static final String FREGE_IMPLEMENTATION_SCOPE = "implementation"; + private FileCollection setupClasspath(Project project, Configuration dependencies, + Provider fregeCompilerJar) { + if (dependencies.isEmpty()) { + return project.files(fregeCompilerJar); + } else { + return project.files(fregeCompilerJar, dependencies.getAsPath()); + } + } + @Override public void apply(Project project) { Configuration implementation = project.getConfigurations().create(FREGE_IMPLEMENTATION_SCOPE); @@ -41,10 +56,16 @@ public class FregePlugin implements Plugin { task.getMainModule().set(extension.getMainModule()); task.getFregeDependencies().set(implementation.getAsPath()); }); + project.getTasks().register(DEPS_FREGE_TASK_NAME, + DependencyFregeTask.class, task -> { + task.dependsOn(setupFregeCompilerTask); + task.getClasspath().setFrom(setupClasspath(project, implementation, + setupFregeCompilerTask.get().getFregeCompilerOutputPath())); + }); project.getTasks().register(REPL_FREGE_TASK_NAME, ReplFregeTask.class, task -> { task.dependsOn(setupFregeCompilerTask); - task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath()); - task.getFregeDependencies().set(implementation.getAsPath()); + task.getFregeClasspath().setFrom(setupClasspath(project, implementation, + setupFregeCompilerTask.get().getFregeCompilerOutputPath())); }); } } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java index 5a915c0..81da1cd 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java @@ -1,36 +1,19 @@ package ch.fhnw.thga.gradleplugins; import org.gradle.api.DefaultTask; -import org.gradle.api.file.FileCollection; -import org.gradle.api.file.RegularFileProperty; -import org.gradle.api.logging.Logger; -import org.gradle.api.logging.Logging; -import org.gradle.api.provider.Property; -import org.gradle.api.provider.Provider; -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.InputFile; -import org.gradle.api.tasks.Internal; +import org.gradle.api.file.ConfigurableFileCollection; +import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.TaskAction; public abstract class ReplFregeTask extends DefaultTask { - public static final Logger LOGGER = Logging.getLogger(SetupFregeTask.class); + public static final String REPL_MAIN_CLASS = "frege.repl.FregeRepl"; - @InputFile - public abstract RegularFileProperty getFregeCompilerJar(); - - @Input - public abstract Property getFregeDependencies(); - - @Internal - public final Provider getClasspath() { - return getFregeDependencies().map(depsClasspath -> { - return depsClasspath.isEmpty() ? getProject().files(getFregeCompilerJar()) - : getProject().files(getFregeCompilerJar(), depsClasspath); - }); - } + @InputFiles + public abstract ConfigurableFileCollection getFregeClasspath(); @TaskAction - public void fregeReplDependencies() { - System.out.println(getClasspath().get().getAsPath()); + public void printStartFregeReplCommand() { + System.out.println("Execute the following command to start the Frege Repl:"); + System.out.println(String.format("java -cp %s %s", getFregeClasspath().getAsPath(), REPL_MAIN_CLASS)); } } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java new file mode 100644 index 0000000..34b33a2 --- /dev/null +++ b/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java @@ -0,0 +1,16 @@ +package ch.fhnw.thga.gradleplugins.internal; + +import org.gradle.api.DefaultTask; +import org.gradle.api.file.ConfigurableFileCollection; +import org.gradle.api.tasks.InputFiles; +import org.gradle.api.tasks.TaskAction; + +public abstract class DependencyFregeTask extends DefaultTask { + @InputFiles + public abstract ConfigurableFileCollection getClasspath(); + + @TaskAction + public void fregeDependencies() { + System.out.println(getClasspath().getAsPath()); + } +} -- cgit