diff options
author | Thibault Gagnaux <tgagnaux@gmail.com> | 2022-02-02 18:50:13 +0100 |
---|---|---|
committer | Thibault Gagnaux <tgagnaux@gmail.com> | 2022-02-02 18:50:13 +0100 |
commit | 47f99d65a09660863cb5d6b25b239ead3389f3ac (patch) | |
tree | c1ca8819f6fa59f4fe481ce2406ffdb2250a193e | |
parent | ddf176c4d9ad16648ea8e2459694d34d6c68e5d7 (diff) | |
download | frege-gradle-plugin-47f99d65a09660863cb5d6b25b239ead3389f3ac.tar.gz frege-gradle-plugin-47f99d65a09660863cb5d6b25b239ead3389f3ac.tar.bz2 frege-gradle-plugin-47f99d65a09660863cb5d6b25b239ead3389f3ac.zip |
feat: simplifies the whole gradle plugin
- the `compileFregeTask` has a new optional input called `mainModuleName`. If
it is set, it and only its dependencies will be compiled, otherwise all
`.fr`files in the `mainSourceDir`will be compiled.
- the internal `DependencyFregeTask` is deleted because it was only
used by the vscode plugin and I decided to remove this gradle plugin
as a dependency.
- an example project folder was added to test the plugin manually.
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | build.gradle | 16 | ||||
-rw-r--r-- | example-project/build.gradle | 10 | ||||
-rw-r--r-- | example-project/gradle/wrapper/gradle-wrapper.jar | bin | 0 -> 59536 bytes | |||
-rw-r--r-- | example-project/gradle/wrapper/gradle-wrapper.properties | 5 | ||||
-rwxr-xr-x | example-project/gradlew | 234 | ||||
-rw-r--r-- | example-project/gradlew.bat | 89 | ||||
-rw-r--r-- | example-project/settings.gradle | 8 | ||||
-rw-r--r-- | example-project/src/main/frege/ch/fhnw/thga/Dep.fr | 3 | ||||
-rw-r--r-- | example-project/src/main/frege/ch/fhnw/thga/Test.fr | 14 | ||||
-rw-r--r-- | gradle.properties | 2 | ||||
-rw-r--r-- | src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java | 151 | ||||
-rw-r--r-- | src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java | 50 | ||||
-rw-r--r-- | src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java | 23 | ||||
-rw-r--r-- | src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java | 9 | ||||
-rw-r--r-- | src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java | 41 | ||||
-rw-r--r-- | src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java | 14 |
17 files changed, 459 insertions, 213 deletions
@@ -5,4 +5,5 @@ build .classpath .settings bin -.DS_Store
\ No newline at end of file +.DS_Store +lib
\ No newline at end of file diff --git a/build.gradle b/build.gradle index 02b545e..6c41fc2 100644 --- a/build.gradle +++ b/build.gradle @@ -13,8 +13,10 @@ dependencies { def junit5Group = 'org.junit.jupiter' def junit5Version = '5.8.2' - testImplementation group: junit5Group, name: 'junit-jupiter-api', version: junit5Version - testRuntimeOnly group: junit5Group, name: 'junit-jupiter-engine', version: junit5Version + testImplementation group: junit5Group, name: 'junit-jupiter-api', version: junit5Version + testRuntimeOnly group: junit5Group, name: 'junit-jupiter-engine', version: junit5Version + testRuntimeOnly group: 'org.junit.platform', name: 'junit-platform-console', version: junit5Version + testImplementation(enforcedPlatform("org.junit:junit-bom:${junit5Version}")) } java @@ -53,6 +55,16 @@ configurations functionalRuntimeOnly.extendsFrom runtimeOnly } +tasks.register('consoleLauncher', JavaExec) +{ + dependsOn testClasses + def reportsDir = layout.buildDirectory.dir('test-results') + mainClass = 'org.junit.platform.console.ConsoleLauncher' + outputs.dir reportsDir + classpath sourceSets.test.runtimeClasspath + sourceSets.functionalTest.runtimeClasspath + args '--scan-classpath', '--details', 'tree', '--reports-dir', reportsDir.get() +} + tasks.register('functionalTest', Test) { description = 'Runs functional tests.' diff --git a/example-project/build.gradle b/example-project/build.gradle new file mode 100644 index 0000000..6fefaec --- /dev/null +++ b/example-project/build.gradle @@ -0,0 +1,10 @@ +plugins { + id 'ch.fhnw.thga.frege' version '1.7.0-alpha' +} + +frege { + version = '3.25.84' + release = '3.25alpha' + mainModule = 'ch.fhnw.thga.Test' + replSource = 'ch.fhnw.thga.Test' +}
\ No newline at end of file diff --git a/example-project/gradle/wrapper/gradle-wrapper.jar b/example-project/gradle/wrapper/gradle-wrapper.jar Binary files differnew file mode 100644 index 0000000..7454180 --- /dev/null +++ b/example-project/gradle/wrapper/gradle-wrapper.jar diff --git a/example-project/gradle/wrapper/gradle-wrapper.properties b/example-project/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e750102 --- /dev/null +++ b/example-project/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/example-project/gradlew b/example-project/gradlew new file mode 100755 index 0000000..1b6c787 --- /dev/null +++ b/example-project/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/example-project/gradlew.bat b/example-project/gradlew.bat new file mode 100644 index 0000000..ac1b06f --- /dev/null +++ b/example-project/gradlew.bat @@ -0,0 +1,89 @@ +@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/example-project/settings.gradle b/example-project/settings.gradle new file mode 100644 index 0000000..91a56b3 --- /dev/null +++ b/example-project/settings.gradle @@ -0,0 +1,8 @@ +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + } +} + +rootProject.name = 'example-project'
\ No newline at end of file diff --git a/example-project/src/main/frege/ch/fhnw/thga/Dep.fr b/example-project/src/main/frege/ch/fhnw/thga/Dep.fr new file mode 100644 index 0000000..1edc713 --- /dev/null +++ b/example-project/src/main/frege/ch/fhnw/thga/Dep.fr @@ -0,0 +1,3 @@ +module ch.fhnw.thga.Dep where + +square x = x * x
\ No newline at end of file diff --git a/example-project/src/main/frege/ch/fhnw/thga/Test.fr b/example-project/src/main/frege/ch/fhnw/thga/Test.fr new file mode 100644 index 0000000..8467d11 --- /dev/null +++ b/example-project/src/main/frege/ch/fhnw/thga/Test.fr @@ -0,0 +1,14 @@ +module ch.fhnw.thga.Test where + +import ch.fhnw.thga.Dep + +frobnicate a = (square a, "Frege rocks") + +add a b = a + b + +sub a b = a - b + +mult a b = a * b + +main = do + println $ frobnicate 5
\ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 9423bd0..497909e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ group = ch.fhnw.thga -version = 1.6.1-alpha
\ No newline at end of file +version = 1.7.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 a7c2b35..ce384cb 100644 --- a/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/functionalTest/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -2,7 +2,6 @@ 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.DEPS_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; @@ -14,7 +13,6 @@ import static org.gradle.testkit.runner.TaskOutcome.FROM_CACHE; import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; import static org.gradle.testkit.runner.TaskOutcome.UP_TO_DATE; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.BufferedWriter; @@ -41,15 +39,22 @@ 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(); - private static final String SIMPLE_FREGE_CODE = String.join(NEW_LINE, "module ch.fhnw.thga.Completion where", - NEW_LINE, NEW_LINE, " complete :: Int -> (Int, String)", NEW_LINE, - " complete i = (i, \"Frege rocks\")", - NEW_LINE); +public class FregePluginFunctionalTest +{ + private static final String NEW_LINE = System.lineSeparator(); + private static final String FREGE_COMPLETION_MODULE_CODE = + String.join + ( + NEW_LINE, + "module ch.fhnw.thga.Completion where", + NEW_LINE, + NEW_LINE, + " complete :: Int -> (Int, String)", + NEW_LINE, + " complete i = (i, \"Frege rocks\")", + NEW_LINE + ); private static FregeDTOBuilder fregeBuilder; @@ -96,9 +101,12 @@ public class FregePluginFunctionalTest { private void setupDefaultFregeProjectStructure(String fregeCode, String fregeFileName, String buildFileConfig) throws Exception { - Files.createDirectories(testProjectDir.toPath().resolve(Paths.get("src", "main", "frege"))); - File fregeFile = testProjectDir.toPath().resolve(Paths.get("src", "main", "frege", fregeFileName)) - .toFile(); + Files.createDirectories(testProjectDir.toPath().resolve(Paths.get( + "src", "main", "frege", "ch", "fhnw", "thga" + ))); + File fregeFile = testProjectDir.toPath().resolve(Paths.get( + "src", "main", "frege", "ch", "fhnw", "thga", fregeFileName + )).toFile(); writeToFile(fregeFile, fregeCode); appendToFile(buildFile, buildFileConfig); } @@ -171,7 +179,7 @@ public class FregePluginFunctionalTest { String completionFr = "Completion.fr"; String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, minimalBuildFileConfig); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME); @@ -193,7 +201,7 @@ public class FregePluginFunctionalTest { String buildConfigWithCompilerFlags = createFregeSection(fregeBuilder.version("'3.25.84'") .release("'3.25alpha'").compilerFlags("['-v', '-make', '-O', '-hints']") .build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, buildConfigWithCompilerFlags); BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME); @@ -216,7 +224,7 @@ public class FregePluginFunctionalTest { Path customMainSourceDir = testProjectDir.toPath().resolve(Paths.get("src", "frege")); Files.createDirectories(customMainSourceDir); File completionFr = customMainSourceDir.resolve("Completion.fr").toFile(); - writeToFile(completionFr, SIMPLE_FREGE_CODE); + writeToFile(completionFr, FREGE_COMPLETION_MODULE_CODE); String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'") .mainSourceDir("layout.projectDirectory.dir('src/frege')") @@ -240,7 +248,7 @@ public class FregePluginFunctionalTest { String completionFr = "Completion.fr"; String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, minimalBuildFileConfig); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); BuildResult first = runGradleTask(COMPILE_FREGE_TASK_NAME); assertEquals(SUCCESS, first.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); @@ -254,7 +262,7 @@ public class FregePluginFunctionalTest { String completionFr = "Completion.fr"; String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, minimalBuildFileConfig); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); BuildResult first = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache"); assertEquals(SUCCESS, first.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); @@ -268,7 +276,7 @@ public class FregePluginFunctionalTest { BuildResult second = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache"); assertEquals(SUCCESS, second.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, ""); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, ""); BuildResult third = runGradleTask(COMPILE_FREGE_TASK_NAME, "--build-cache"); assertEquals(FROM_CACHE, third.task(":" + COMPILE_FREGE_TASK_NAME).getOutcome()); } @@ -284,7 +292,7 @@ public class FregePluginFunctionalTest { String minimalBuildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, minimalBuildFileConfig); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); setupDefaultFregeProjectStructure(frobCode, frobFr, ""); BuildResult result = runGradleTask(COMPILE_FREGE_TASK_NAME); @@ -318,7 +326,7 @@ public class FregePluginFunctionalTest { String buildConfigWithIllegalCompilerFlags = createFregeSection(fregeBuilder .version("'3.25.84'") .release("'3.25alpha'").compilerFlags("['-make', '-bla']").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, buildConfigWithIllegalCompilerFlags); BuildResult result = runAndFailGradleTask(COMPILE_FREGE_TASK_NAME); @@ -339,7 +347,7 @@ public class FregePluginFunctionalTest { String minimalBuildFileConfigWithoutMake = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'").compilerFlags("['-v']") .build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfigWithoutMake); setupDefaultFregeProjectStructure(frobCode, frobFr, ""); @@ -376,7 +384,7 @@ public class FregePluginFunctionalTest { String buildFileConfig = createFregeSection( fregeBuilder.version("'3.25.84'").release("'3.25alpha'") .mainModule("'ch.fhnw.thga.Completion'").build()); - setupDefaultFregeProjectStructure(SIMPLE_FREGE_CODE, completionFr, buildFileConfig); + setupDefaultFregeProjectStructure(FREGE_COMPLETION_MODULE_CODE, completionFr, buildFileConfig); BuildResult result = runAndFailGradleTask(RUN_FREGE_TASK_NAME); assertTrue(project.getTasks().getByName(RUN_FREGE_TASK_NAME) instanceof RunFregeTask); @@ -400,90 +408,6 @@ public class FregePluginFunctionalTest { } } - @Nested - @TestInstance(Lifecycle.PER_CLASS) - @IndicativeSentencesGeneration( - separator = " -> ", - generator = DisplayNameGenerator.ReplaceUnderscores.class) - class Deps_frege_task_works { - @Test - void given_minimal_build_file_config() throws Exception { - String completionFr = "Completion.fr"; - String minimalBuildFileConfig = createFregeSection( - fregeBuilder - .version("'3.25.84'") - .release("'3.25alpha'") - .build()); - setupDefaultFregeProjectStructure( - SIMPLE_FREGE_CODE, - completionFr, - minimalBuildFileConfig); - - BuildResult result = runGradleTask( - DEPS_FREGE_TASK_NAME, - "-q", - String.format("--replSource=%s", completionFr)); - - 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")); - assertFalse(result.getOutput().contains("Completion.java")); - assertFalse( - testProjectDir - .toPath() - .resolve("/build/classes/main/frege/ch/fhnw/thga/Completion.java").toFile() - .exists()); - } - - - @Test - void given_build_file_config_with_dependencies() throws Exception { - String completionFr = "Completion.fr"; - String minimalBuildFileConfig = createFregeSection( - fregeBuilder - .version("'3.25.84'") - .release("'3.25alpha'") - .build()); - setupDefaultFregeProjectStructure( - SIMPLE_FREGE_CODE, - completionFr, - minimalBuildFileConfig); - appendToFile( - buildFile, - String.join( - System.lineSeparator(), - "repositories {", - "mavenCentral()", - "}")); - appendToFile( - buildFile, - String.join( - System.lineSeparator(), - "dependencies {", - "implementation group: 'org.json', name: 'json', version: '20211205'", - "}")); - - BuildResult result = runGradleTask( - DEPS_FREGE_TASK_NAME, - "-q", - String.format("--replSource=%s", completionFr)); - - 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")); - assertFalse(result.getOutput().contains("Completion.java")); - assertFalse( - testProjectDir - .toPath() - .resolve("/build/classes/main/frege/ch/fhnw/thga/Completion.java").toFile() - .exists()); - } - } @Nested @TestInstance(Lifecycle.PER_CLASS) @@ -500,10 +424,10 @@ public class FregePluginFunctionalTest { fregeBuilder .version("'3.25.84'") .release("'3.25alpha'") - .replSource(String.format("'%s'", completionFr)) + .replSource(String.format("'ch.fhnw.thga.Completion'")) .build()); setupDefaultFregeProjectStructure( - SIMPLE_FREGE_CODE, + FREGE_COMPLETION_MODULE_CODE, completionFr, minimalReplModuleConfig); @@ -515,12 +439,7 @@ public class FregePluginFunctionalTest { assertEquals(SUCCESS, result.task(":" + REPL_FREGE_TASK_NAME).getOutcome()); assertTrue(result.getOutput().contains("java -cp")); assertTrue(result.getOutput().contains("frege3.25.84.jar")); - assertFalse(result.getOutput().contains("Completion.java")); - assertFalse( - testProjectDir - .toPath() - .resolve("/build/classes/main/frege/ch/fhnw/thga/Completion.java").toFile() - .exists()); + assertTrue(result.getOutput().contains("Completion.java")); } } @@ -541,7 +460,7 @@ public class FregePluginFunctionalTest { .release("'3.25alpha'") .build()); setupDefaultFregeProjectStructure( - SIMPLE_FREGE_CODE, + FREGE_COMPLETION_MODULE_CODE, completionFr, minimalBuildFileConfig); diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java index bc3c8f7..c280607 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/CompileFregeTask.java @@ -3,16 +3,13 @@ package ch.fhnw.thga.gradleplugins; import java.util.Collection; import java.util.Collections; import java.util.List; -import java.util.function.BiFunction; import java.util.stream.Collectors; import java.util.stream.Stream; import javax.inject.Inject; import org.gradle.api.DefaultTask; -import org.gradle.api.file.Directory; import org.gradle.api.file.DirectoryProperty; -import org.gradle.api.file.FileTree; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.model.ObjectFactory; import org.gradle.api.provider.ListProperty; @@ -31,25 +28,8 @@ import org.gradle.api.tasks.TaskAction; @CacheableTask public abstract class CompileFregeTask extends DefaultTask { + private static final String FREGE_FILES_GLOB_PATTERN = "**/*.fr"; private final JavaExec javaExec; - private static final String FREGE_FILES_GLOB_PATTERN = "**/*.fr"; - private static final BiFunction<String, Directory, FileTree> - excludeReplSourceFile = - (String replSource, - Directory srcDir) -> - { - if (replSource.isEmpty()) return srcDir.getAsFileTree(); - return srcDir.getAsFileTree().matching( - pattern -> - { - pattern.exclude( - String.format( - "**/%s", - replSource) - ); - } - ); - }; @InputFile @PathSensitive(PathSensitivity.RELATIVE) @@ -66,7 +46,7 @@ public abstract class CompileFregeTask extends DefaultTask { public abstract Property<String> getFregeDependencies(); @Input - public abstract Property<String> getReplSource(); + public abstract Property<String> getFregeMainModuleName(); @OutputDirectory public abstract DirectoryProperty getFregeOutputDir(); @@ -82,15 +62,19 @@ public abstract class CompileFregeTask extends DefaultTask { } @Internal - public final Provider<FileTree> getSourceFileTree() { - return getReplSource().zip( - getFregeMainSourceDir(), - excludeReplSourceFile); + public final Provider<List<String>> getCompileItems() { + return getFregeMainModuleName() + .map(name -> + { + return name.isEmpty() ? getFregeSourceFiles().get() + : List.of(name); + }); } @Internal - public final Provider<List<String>> getSourceFiles() { - return getSourceFileTree() + public final Provider<List<String>> getFregeSourceFiles() { + return getFregeMainSourceDir() + .map(srcDir -> srcDir.getAsFileTree()) .map(tree -> tree.matching(pattern -> pattern.include(FREGE_FILES_GLOB_PATTERN))) .map(tree -> tree.getFiles().stream() .map(file -> file.getAbsolutePath()) @@ -111,14 +95,14 @@ public abstract class CompileFregeTask extends DefaultTask { javaExec = objectFactory.newInstance(JavaExec.class); } - private List<String> buildCompilerArgsFromProperties(List<String> directoryArg) + private List<String> buildCompilerArgsFromProperties(List<String> targetDirectoryArg) { return Stream.of( getDependencyArg().get(), getFregeCompilerFlags().get(), - directoryArg, + targetDirectoryArg, getSourcePathArg().get(), - getSourceFiles().get()) + getCompileItems().get()) .filter(lists -> !lists.isEmpty()) .flatMap(Collection::stream) .collect(Collectors.toList()); @@ -126,11 +110,11 @@ public abstract class CompileFregeTask extends DefaultTask { @TaskAction public void compileFrege() { - List<String> directoryArg = List.of( + List<String> targetDirectoryArg = List.of( "-d", getFregeOutputDir().getAsFile().get().getAbsolutePath()); javaExec.setClasspath(getProject().files(getFregeCompilerJar())) - .setArgs(buildCompilerArgsFromProperties(directoryArg)).exec(); + .setArgs(buildCompilerArgsFromProperties(targetDirectoryArg)).exec(); } }
\ 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 a318b81..ce2ce01 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -5,8 +5,6 @@ import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.tasks.TaskProvider; -import ch.fhnw.thga.gradleplugins.internal.DependencyFregeTask; - public class FregePlugin implements Plugin<Project> { public static final String SETUP_FREGE_TASK_NAME = "setupFrege"; @@ -54,7 +52,7 @@ public class FregePlugin implements Plugin<Project> task.getFregeOutputDir().set(extension.getOutputDir()); task.getFregeCompilerFlags().set(extension.getCompilerFlags()); task.getFregeDependencies().set(implementation.getAsPath()); - task.getReplSource().set(""); + task.getFregeMainModuleName().set(""); } ); @@ -63,28 +61,15 @@ public class FregePlugin implements Plugin<Project> RunFregeTask.class, task -> { - task.dependsOn(compileFregeTask); - task.getFregeCompilerJar().set( - setupFregeCompilerTask.get().getFregeCompilerOutputPath()); - task.getFregeOutputDir().set(extension.getOutputDir()); + task.getMainModule().set(extension.getMainModule()); - task.getFregeDependencies().set(implementation.getAsPath()); - } - ); - - project.getTasks().register( - DEPS_FREGE_TASK_NAME, - DependencyFregeTask.class, - task -> - { task.dependsOn(compileFregeTask.map( compileTask -> { - compileTask.getReplSource().set(task.getReplSource()); + compileTask.getFregeMainModuleName().set(task.getMainModule()); return compileTask; }) .get()); - task.dependsOn(compileFregeTask); task.getFregeCompilerJar().set( setupFregeCompilerTask.get().getFregeCompilerOutputPath()); task.getFregeOutputDir().set(extension.getOutputDir()); @@ -101,7 +86,7 @@ public class FregePlugin implements Plugin<Project> task.dependsOn(compileFregeTask.map( compileTask -> { - compileTask.getReplSource().set(task.getReplSource()); + compileTask.getFregeMainModuleName().set(task.getReplSource()); return compileTask; }) .get()); diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java index dd18270..7903d7e 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/ReplFregeTask.java @@ -4,9 +4,11 @@ import org.gradle.api.DefaultTask; import org.gradle.api.file.DirectoryProperty; import org.gradle.api.file.RegularFileProperty; 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.TaskAction; import org.gradle.api.tasks.options.Option; @@ -27,6 +29,13 @@ public abstract class ReplFregeTask extends DefaultTask { description = "The filename which you want to load into the repl, e.g. 'myFregeFile.fr'") public abstract Property<String> getReplSource(); + @Internal + public final Provider<String> getReplClassName() + { + return getReplSource() + .map(replSource -> replSource.substring(replSource.lastIndexOf("."))); + } + @TaskAction public void printStartFregeReplCommand() { System.out.println("Execute the following command to start the Frege Repl:"); diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java deleted file mode 100644 index 87f4d2b..0000000 --- a/src/main/java/ch/fhnw/thga/gradleplugins/internal/DependencyFregeTask.java +++ /dev/null @@ -1,41 +0,0 @@ -package ch.fhnw.thga.gradleplugins.internal; - -import org.gradle.api.DefaultTask; -import org.gradle.api.file.DirectoryProperty; -import org.gradle.api.file.RegularFileProperty; -import org.gradle.api.provider.Property; -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.InputDirectory; -import org.gradle.api.tasks.InputFile; -import org.gradle.api.tasks.TaskAction; -import org.gradle.api.tasks.options.Option; - -import ch.fhnw.thga.gradleplugins.SharedTaskLogic; - -public abstract class DependencyFregeTask extends DefaultTask { - @InputFile - public abstract RegularFileProperty getFregeCompilerJar(); - - @Input - public abstract Property<String> getFregeDependencies(); - - @InputDirectory - public abstract DirectoryProperty getFregeOutputDir(); - - @Input - @Option(option = "replSource", - description = "The filename which you want to load into the repl, e.g. 'myFregeFile.fr'") - public abstract Property<String> getReplSource(); - - - @TaskAction - public void fregeDependencies() { - System.out.println( - SharedTaskLogic.setupClasspath( - getProject(), - getFregeDependencies(), - getFregeCompilerJar(), - getFregeOutputDir()) - .get().getAsPath()); - } -} diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java b/src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java new file mode 100644 index 0000000..6f10d70 --- /dev/null +++ b/src/test/java/ch/fhnw/thga/gradleplugins/SharedTaskLogicTest.java @@ -0,0 +1,14 @@ +package ch.fhnw.thga.gradleplugins; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; + +@TestInstance(Lifecycle.PER_CLASS) +public class SharedTaskLogicTest +{ + @Test + void given_valid_frege_module_name_then_can_extract_class_name() + { + } +}
\ No newline at end of file |