diff options
author | Thibault Gagnaux <tgagnaux@gmail.com> | 2021-11-24 10:27:00 +0100 |
---|---|---|
committer | Thibault Gagnaux <tgagnaux@gmail.com> | 2021-11-24 10:27:00 +0100 |
commit | 1f13c769f57d4670cee462b6cf741efb5f5a8cd6 (patch) | |
tree | 8f701a527ec89459f400fffd3dba8632da29fc8d | |
parent | 4f287790c285a1503bc05d75e1561de122f9a79e (diff) | |
download | frege-gradle-plugin-f-repl-task.tar.gz frege-gradle-plugin-f-repl-task.tar.bz2 frege-gradle-plugin-f-repl-task.zip |
feat: adds `replFrege` taskf-repl-task
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | gradle.properties | 2 | ||||
-rw-r--r-- | src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java | 25 | ||||
-rw-r--r-- | src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java | 8 | ||||
-rw-r--r-- | src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java | 54 | ||||
-rw-r--r-- | src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java | 16 |
6 files changed, 99 insertions, 7 deletions
@@ -35,6 +35,7 @@ Optional configuration parameters inside `build.gradle`: - **setupFrege**: Downloads the specified version of the Frege compiler. - **compileFrege**: All your `*.fr` files in `mainSourceDir` get compiled to `outputDir`. - **runFrege**: Runs the Frege module specified by `mainModule`. Alternatively you can also pass the main module by command line, e.g: `gradle runFrege --mainModule=my.mod.Name`. +- **replFrege**: Starts the Frege REPL with the Frege compiler, `outputDir` and specified `dependencies` on the classpath. ### Compile Dependencies diff --git a/gradle.properties b/gradle.properties index 80dd1bd..ea66424 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ group = ch.fhnw.thga -version = 1.3.2-alpha
\ No newline at end of file +version = 1.4.0-alpha
\ No newline at end of file diff --git a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index c8cc4b3..70756b0 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -1,11 +1,7 @@ package ch.fhnw.thga.gradleplugins; import static ch.fhnw.thga.gradleplugins.FregeExtension.DEFAULT_DOWNLOAD_DIRECTORY; -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.RUN_FREGE_TASK_NAME; -import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_TASK_NAME; +import static ch.fhnw.thga.gradleplugins.FregePlugin.*; 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; @@ -33,6 +29,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayNameGenerator; import org.junit.jupiter.api.IndicativeSentencesGeneration; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; @@ -356,4 +353,22 @@ public class FregePluginFunctionalTest { assertTrue(result.getOutput().contains("Frege rocks")); } } + + @Nested + @TestInstance(Lifecycle.PER_CLASS) + @IndicativeSentencesGeneration(separator = " -> ", generator = DisplayNameGenerator.ReplaceUnderscores.class) + class Repl_frege_task_works { + @Test + @Tag("hard") + void given_minimal_build_file_config() throws Exception { + Files.createDirectories(testProjectDir.toPath().resolve(Paths.get("src", "main", "frege"))); + String minimalBuildFileConfig = createFregeSection( + fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); + appendToFile(buildFile, minimalBuildFileConfig); + + BuildResult result = runGradleTask(REPL_FREGE_TASK_NAME); + assertTrue(project.getTasks().getByName(REPL_FREGE_TASK_NAME) instanceof ReplFregeTask); + assertEquals(SUCCESS, result.task(":" + REPL_FREGE_TASK_NAME).getOutcome()); + } + } }
\ 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 ac6ba94..5fc89b2 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -9,6 +9,7 @@ public class FregePlugin implements Plugin<Project> { 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 FREGE_PLUGIN_ID = "ch.fhnw.thga.frege"; public static final String FREGE_EXTENSION_NAME = "frege"; public static final String FREGE_IMPLEMENTATION_SCOPE = "implementation"; @@ -38,6 +39,13 @@ public class FregePlugin implements Plugin<Project> { task.getFregeCompilerJar().set(setupFregeCompilerTask.get().getFregeCompilerOutputPath()); task.getFregeOutputDir().set(extension.getOutputDir()); task.getMainModule().set(extension.getMainModule()); + task.getFregeDependencies().set(implementation.getAsPath()); + }); + project.getTasks().register(REPL_FREGE_TASK_NAME, ReplFregeTask.class, task -> { + task.dependsOn(compileFregeTask); + 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 new file mode 100644 index 0000000..9ee14df --- /dev/null +++ b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java @@ -0,0 +1,54 @@ +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<String> getFregeDependencies(); + + @Internal + public final Provider<FileCollection> getClasspath() { + return getFregeDependencies().map(depsClasspath -> { + return depsClasspath.isEmpty() ? getProject().files(getFregeCompilerJar(), getFregeOutputDir()) + : getProject().files(getFregeCompilerJar(), getFregeOutputDir(), depsClasspath); + }); + } + + @Inject + public ReplFregeTask(ObjectFactory objectFactory) { + javaExec = objectFactory.newInstance(JavaExec.class); + } + + @TaskAction + public void startFregeRepl() { + javaExec.getMainClass().set(REPL_MAIN_CLASS); + javaExec.setClasspath(getClasspath().get()).exec(); + } +} diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java index d27816c..41ac2a3 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java @@ -4,14 +4,17 @@ 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; import org.gradle.api.tasks.options.Option; @@ -30,6 +33,17 @@ public abstract class RunFregeTask extends DefaultTask { @Option(option = "mainModule", description = "The full name of the Frege module with a main function, e.g. 'my.mod.Name'") public abstract Property<String> getMainModule(); + @Input + public abstract Property<String> getFregeDependencies(); + + @Internal + public final Provider<FileCollection> getClasspath() { + return getFregeDependencies().map(depsClasspath -> { + return depsClasspath.isEmpty() ? getProject().files(getFregeCompilerJar(), getFregeOutputDir()) + : getProject().files(getFregeCompilerJar(), getFregeOutputDir(), depsClasspath); + }); + } + @Inject public RunFregeTask(ObjectFactory objectFactory) { javaExec = objectFactory.newInstance(JavaExec.class); @@ -38,6 +52,6 @@ public abstract class RunFregeTask extends DefaultTask { @TaskAction public void runFrege() { javaExec.getMainClass().set(getMainModule()); - javaExec.setClasspath(getProject().files(getFregeCompilerJar(), getFregeOutputDir())).exec(); + javaExec.setClasspath(getClasspath().get()).exec(); } } |