diff options
author | Thibault Gagnaux <tgagnaux@gmail.com> | 2021-06-30 15:37:38 +0200 |
---|---|---|
committer | Thibault Gagnaux <tgagnaux@gmail.com> | 2021-06-30 15:37:38 +0200 |
commit | b87c1babf4a1d0b9cdf417b8aaf8da8edc473766 (patch) | |
tree | 918b967b94b6963ae785ed276115eb247f774e84 | |
parent | e7fc5336c818e6ce9f81069df73c258d116acc9f (diff) | |
download | frege-gradle-plugin-b87c1babf4a1d0b9cdf417b8aaf8da8edc473766.tar.gz frege-gradle-plugin-b87c1babf4a1d0b9cdf417b8aaf8da8edc473766.tar.bz2 frege-gradle-plugin-b87c1babf4a1d0b9cdf417b8aaf8da8edc473766.zip |
Adds first `SetupFregeCompilerTaks` with some tests
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | build.gradle | 8 | ||||
-rw-r--r-- | settings.gradle | 1 | ||||
-rw-r--r-- | src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java | 33 | ||||
-rw-r--r-- | src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java | 25 | ||||
-rw-r--r-- | src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java (renamed from src/main/java/ch/fhnw/thga/gradleplugins/FregeInitTask.java) | 27 | ||||
-rw-r--r-- | src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java | 126 |
7 files changed, 177 insertions, 46 deletions
@@ -4,4 +4,5 @@ build .project .classpath .settings -bin
\ No newline at end of file +bin +.DS_Store
\ No newline at end of file diff --git a/build.gradle b/build.gradle index 69dd68c..a0a97cf 100644 --- a/build.gradle +++ b/build.gradle @@ -7,11 +7,13 @@ repositories { } dependencies { - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.2") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.2") - + testImplementation('org.junit.jupiter:junit-jupiter-api:5.7.2') + testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.7.2') } +group = 'ch.fhnw.thga' +version = '0.0.1-SNAPSHOT' + gradlePlugin { plugins { fregePlugin { diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..772bbfe --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'frege-plugin'
\ No newline at end of file diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java new file mode 100644 index 0000000..5e8834d --- /dev/null +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java @@ -0,0 +1,33 @@ +package ch.fhnw.thga.gradleplugins; + +import javax.inject.Inject; + +import org.gradle.api.file.ProjectLayout; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.provider.Property; +import org.gradle.api.provider.Provider; + +import groovy.transform.Internal; + +public abstract class FregeExtension { + public static final String DEFAULT_FREGE_EXTENSION_NAMESPACE = "frege"; + public static final String FREGE_VERSION_BUILD_FILE_KEY = "fregeVersion"; + public static final String FREGE_RELEASE_BUILD_FILE_KEY = "fregeRelease"; + public static final String FREGE_COMPILER_BUILD_FILE_KEY = "fregeCompilerPath"; + + public abstract Property<String> getFregeVersion(); + + public abstract Property<String> getFregeRelease(); + + public abstract RegularFileProperty getFregeCompilerPath(); + + @Internal + public Provider<String> getDefaultJarName() { + return getFregeVersion().map(version -> version + ".jar"); + } + + @Inject + public FregeExtension(ProjectLayout projectLayout) { + getFregeCompilerPath().set(projectLayout.getProjectDirectory().file("lib/frege" + getDefaultJarName())); + } +} diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java index 678a10c..ffa788f 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -2,19 +2,28 @@ 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.RegularFile; +import org.gradle.api.provider.Property; public class FregePlugin implements Plugin<Project> { + public static final String SETUP_FREGE_COMPILER_TASK_NAME = "setupFregeCompiler"; + public static final String FREGE_PLUGIN_ID = "ch.fhnw.thga.frege"; + public static final String FREGE_EXTENSION_NAME = "frege"; @Override public void apply(Project project) { - project.getTasks().create("fregeInit", FregeInitTask.class); - Configuration fregeCompiler = project.getConfigurations().create("fregeCompiler", c -> { - c.setVisible(false); - c.setCanBeConsumed(false); - c.setCanBeResolved(true); - c.setDescription("The frege compiler"); - c.defaultDependencies(d -> d.add(project.getDependencies().create("frege3.25.84.jar"))); + FregeExtension extension = project.getExtensions().create(FREGE_EXTENSION_NAME, FregeExtension.class); + project.getTasks().register(SETUP_FREGE_COMPILER_TASK_NAME, SetupFregeCompilerTask.class, task -> { + task.getFregeVersion().set(extension.getFregeVersion()); + task.getFregeRelease().set(extension.getFregeRelease()); + task.getFregeCompilerPath().set(extension.getFregeCompilerPath()); }); + //Configuration fregeCompiler = project.getConfigurations().create("fregeCompiler", c -> { + // c.setVisible(false); + // c.setCanBeConsumed(false); + // c.setCanBeResolved(true); + // c.setDescription("The frege compiler"); + // c.defaultDependencies(d -> d.add(project.getDependencies().create("frege3.25.84.jar"))); + //}); } } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeInitTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java index e96bfb1..a7f48ba 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeInitTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java @@ -2,26 +2,20 @@ package ch.fhnw.thga.gradleplugins; import java.io.FileOutputStream; import java.io.IOException; -import java.net.MalformedURLException; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.FileChannel; import java.nio.channels.ReadableByteChannel; -import org.apache.log4j.Logger; import org.gradle.api.DefaultTask; -import org.gradle.api.file.ProjectLayout; -import org.gradle.api.file.RegularFile; +import org.gradle.api.GradleException; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.provider.Property; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.TaskAction; -public abstract class FregeInitTask extends DefaultTask { - private final static Logger LOGGER = Logger.getLogger(FregeInitTask.class.getName()); - private static final String DEFAULT_FREGE_VERSION = "3.25.84"; - private static final String DEFAULT_FREGE_RELEASE = "3.25alpha"; +public abstract class SetupFregeCompilerTask extends DefaultTask { @Input public abstract Property<String> getFregeVersion(); @@ -30,25 +24,20 @@ public abstract class FregeInitTask extends DefaultTask { public abstract Property<String> getFregeRelease(); @OutputFile - public abstract RegularFileProperty getFregeCompilerJar(); - - public FregeInitTask() { - getFregeVersion().convention(DEFAULT_FREGE_VERSION); - getFregeRelease().convention(DEFAULT_FREGE_RELEASE); - getFregeCompilerJar().convention(getProject().getLayout().getBuildDirectory().file("lib/frege" + getFregeVersion() + ".jar")); - } + public abstract RegularFileProperty getFregeCompilerPath(); @TaskAction public void downloadFregeCompiler() { try { ReadableByteChannel readChannel = Channels.newChannel( new URL("https://github.com/Frege/frege/releases/download/" + - getFregeRelease().get() + "/frege" + getFregeVersion() + ".jar").openStream()); - FileOutputStream fregeCompilerDestinationPath = new FileOutputStream(getFregeCompilerJar().get().getAsFile().getAbsolutePath()); + getFregeRelease().get() + "/frege" + getFregeVersion().get() + ".jar").openStream()); + FileOutputStream fregeCompilerDestinationPath = new FileOutputStream(getFregeCompilerPath().get().getAsFile().getAbsolutePath()); FileChannel writeChannel = fregeCompilerDestinationPath.getChannel(); writeChannel.transferFrom(readChannel, 0, Long.MAX_VALUE); - } catch (Exception e) { - LOGGER.error(e.getMessage(), e.getCause()); + System.out.println("Successfully downloaded compiler to" + getFregeCompilerPath().get()); + } catch (IOException e) { + throw new GradleException(e.getMessage()); } } } diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index b93ba65..672b065 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -1,13 +1,22 @@ package ch.fhnw.thga.gradleplugins; +import static ch.fhnw.thga.gradleplugins.FregeExtension.FREGE_COMPILER_BUILD_FILE_KEY; +import static ch.fhnw.thga.gradleplugins.FregeExtension.FREGE_RELEASE_BUILD_FILE_KEY; +import static ch.fhnw.thga.gradleplugins.FregeExtension.FREGE_VERSION_BUILD_FILE_KEY; +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.SETUP_FREGE_COMPILER_TASK_NAME; +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.gradle.api.Project; import org.gradle.testfixtures.ProjectBuilder; @@ -20,11 +29,13 @@ import org.junit.jupiter.api.io.TempDir; public class FregePluginFunctionalTest { @TempDir File testProjectDir; private File buildFile; + private File settingsFile; + private Project project; - private void writeFile(File destination, String content) throws IOException { + private void writeFile(File destination, String content, boolean append) throws IOException { BufferedWriter output = null; try { - output = new BufferedWriter(new FileWriter(destination)); + output = new BufferedWriter(new FileWriter(destination, append)); output.write(content); } finally { if (output != null) { @@ -33,22 +44,107 @@ public class FregePluginFunctionalTest { } } + private void writeToFile(File destination, String content) throws IOException { + writeFile(destination, content, false); + } + + private void appendToFile(File destination, String content) throws IOException { + writeFile(destination, content, true); + } + + private static String buildFilePluginString(String pluginId) { + return String.format("id '%s'", pluginId); + } + + private static String buildFileFregeExtension(String fregeVersion, String fregeRelease, + Optional<String> compilerPath) { + String optionalCompilerPathLine = compilerPath.isPresent() ? String.format(" %s = %s\n", FREGE_COMPILER_BUILD_FILE_KEY, compilerPath.get()) : ""; + return String.format("%s {\n %s = %s\n %s = %s\n%s}\n", FREGE_EXTENSION_NAME, FREGE_VERSION_BUILD_FILE_KEY, + fregeVersion, FREGE_RELEASE_BUILD_FILE_KEY, fregeRelease, optionalCompilerPathLine); + } + + private static String writeBuildFilePlugins(Stream<String> pluginIds) { + String plugins = pluginIds.map(pluginId -> buildFilePluginString(pluginId)).collect(Collectors.joining("\n ")); + return String.format("plugins {\n %s\n}\n", plugins); + } + + private void assertSetupFregeCompilerTask(String fregeConfig) throws Exception { + System.out.println(fregeConfig); + appendToFile(buildFile, fregeConfig); + assertTrue(project.getTasks().getByName(SETUP_FREGE_COMPILER_TASK_NAME) instanceof SetupFregeCompilerTask); + BuildResult result = GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath() + .withArguments(SETUP_FREGE_COMPILER_TASK_NAME).build(); + assertEquals(SUCCESS, result.task(":" + SETUP_FREGE_COMPILER_TASK_NAME).getOutcome()); + } + @BeforeEach void setup() throws Exception { buildFile = new File(testProjectDir, "build.gradle"); - String buildFileContent = "plugins {" + - "id 'ch.fhnw.thga.frege'" + - "}"; - writeFile(buildFile, buildFileContent); + settingsFile = new File(testProjectDir, "settings.gradle"); + writeToFile(buildFile, writeBuildFilePlugins(Stream.of(FREGE_PLUGIN_ID))); + writeToFile(settingsFile, "rootProject.name='frege-plugin'"); + project = ProjectBuilder.builder().withProjectDir(testProjectDir).build(); + project.getPluginManager().apply(FREGE_PLUGIN_ID); + } + + @Test + void given_single_plugin_id_then_it_is_correctly_converted_to_build_file_string() { + String pluginId = "frege"; + Stream<String> pluginIds = Stream.of(pluginId); + String expected = "plugins {\n" + " id '" + pluginId + "'\n" + "}\n"; + assertEquals(expected, writeBuildFilePlugins(pluginIds)); } @Test - void given_frege_plugin_when_applying_then_latest_frege_compiler_is_downloaded_and_added_as_a_depenency() { - //Project project = ProjectBuilder.builder().withProjectDir(testProjectDir).build(); - //assertEquals(1, project.getConfigurations().getByName("fregeCompiler").getAllDependencies().size()); - BuildResult result = GradleRunner.create() - .withProjectDir(testProjectDir) - .build(); - assertEquals(SUCCESS, result.task("initFrege").getOutcome()); - } + void given_multiple_plugin_ids_then_they_are_correctly_converted_to_build_file_string() { + String fregeId = "frege"; + String javaId = "java"; + Stream<String> pluginIds = Stream.of(fregeId, javaId); + String expected = "plugins {\n" + " id '" + fregeId + "'\n" + " id '" + javaId + "'\n" + "}\n"; + assertEquals(expected, writeBuildFilePlugins(pluginIds)); + } + + @Test + void given_default_plugin_ids_then_they_are_correctly_converted_to_build_file_string() { + String fregeId = "frege"; + String javaId = "java"; + Stream<String> pluginIds = Stream.of(fregeId, javaId); + String expected = "plugins {\n" + " id '" + fregeId + "'\n" + " id '" + javaId + "'\n" + "}\n"; + assertEquals(expected, writeBuildFilePlugins(pluginIds)); + } + + @Test + void given_frege_version_and_frege_release_then_they_are_correctly_converted_to_build_file_string() { + String fregeVersion = "'3.25.84'"; + String fregeRelease = "'3.25alpha'"; + String expectedFregeConfig = FREGE_EXTENSION_NAME + " {\n" + " fregeVersion = " + fregeVersion + "\n" + + " fregeRelease = " + fregeRelease + "\n" + "}\n"; + assertEquals(expectedFregeConfig, buildFileFregeExtension(fregeVersion, fregeRelease, Optional.empty())); + } + + @Test + void given_frege_version_and_frege_release_and_frege_compiler_path_then_they_are_correctly_converted_to_build_file_string() { + String fregeVersion = "'3.25.84'"; + String fregeRelease = "'3.25alpha'"; + String fregeCompilerPath = "layout.projectDirectory.file('lib/frege3.25.84')"; + String expectedFregeConfig = + FREGE_EXTENSION_NAME + " {\n" + " fregeVersion = " + fregeVersion + "\n" + + " fregeRelease = " + fregeRelease + "\n" + + " fregeCompilerPath = " + fregeCompilerPath + "\n" + "}\n"; + assertEquals(expectedFregeConfig, buildFileFregeExtension(fregeVersion, fregeRelease, Optional.of(fregeCompilerPath))); + } + + @Test + void given_frege_compiler_version_3_25_84_and_3_25_alpha_release_without_frege_compiler_path_when_running_the_setup_frege_compiler_task_then_the_frege_compiler_is_correctly_setup() + throws Exception { + String fregeConfig = buildFileFregeExtension("'3.25.84'", "'3.25alpha'", Optional.empty()); + assertSetupFregeCompilerTask(fregeConfig); + } + + @Test + void given_frege_compiler_version_3_25_84_when_running_the_setup_frege_compiler_task_then_the_frege_compiler_is_correctly_setup() + throws Exception { + String fregeConfig = buildFileFregeExtension("'3.25.84'", "'3.25alpha'", Optional.of("layout.projectDirectory.file('lib/frege3.25.84')")); + assertSetupFregeCompilerTask(fregeConfig); + } }
\ No newline at end of file |