aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Gagnaux <tgagnaux@gmail.com>2021-11-24 10:27:00 +0100
committerThibault Gagnaux <tgagnaux@gmail.com>2021-11-24 10:27:00 +0100
commit1f13c769f57d4670cee462b6cf741efb5f5a8cd6 (patch)
tree8f701a527ec89459f400fffd3dba8632da29fc8d
parent4f287790c285a1503bc05d75e1561de122f9a79e (diff)
downloadfrege-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.md1
-rw-r--r--gradle.properties2
-rw-r--r--src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java25
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java8
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java54
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/RunFregeTask.java16
6 files changed, 99 insertions, 7 deletions
diff --git a/README.md b/README.md
index df2e101..94364a1 100644
--- a/README.md
+++ b/README.md
@@ -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();
}
}