Moved to Gradle. Introduced gradle plugin

This commit is contained in:
Jakub Kubrynski
2015-01-26 00:38:37 +01:00
parent 94c86af499
commit 3497e94d8d
22 changed files with 474 additions and 167 deletions

42
build.gradle Normal file
View File

@@ -0,0 +1,42 @@
subprojects {
apply plugin: 'groovy'
apply plugin: 'maven-publish'
group = 'io.codearte.accurest'
version = '1.0.0-SNAPSHOT'
sourceCompatibility = 1.7
targetCompatibility = 1.7
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.3.6'
testCompile 'org.spockframework:spock-core:0.7-groovy-2.0'
}
publishing {
publications {
maven(MavenPublication) {
groupId 'io.codearte.accurest'
version '1.0.0-SNAPSHOT'
from components.java
}
}
}
}
project(':gradle-plugin') {
dependencies {
compile project(':core')
compile gradleApi()
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.2.1'
}

View File

@@ -0,0 +1,93 @@
package io.coderate.accurest
import io.coderate.accurest.builder.ClassBuilder
import io.coderate.accurest.builder.TestFramework
import io.coderate.accurest.util.NamesUtil
import java.nio.file.Files
import java.nio.file.Paths
import static ClassBuilder.createClass
import static io.coderate.accurest.builder.MethodBuilder.createTestMethod
/**
* @author Jakub Kubrynski
*/
class TestGenerator {
private final String stubsBaseDirectory
private final String basePackageForTests
private final String baseClassForTests
private final String ruleClassForTests
private final TestFramework lang
private final String targetDirectory
TestGenerator(String stubsBaseDirectory, String basePackageForTests, String baseClassForTests,
String ruleClassForTests, String testFramework, String targetDirectory) {
// URL stubsResource = getClass().getClassLoader().getResource(stubsBaseDirectory)
this.targetDirectory = targetDirectory
File stubsResource = new File(stubsBaseDirectory)
if (stubsResource == null) {
throw new IllegalStateException("Stubs directory not found under " + stubsBaseDirectory)
}
this.stubsBaseDirectory = stubsResource.path
this.basePackageForTests = basePackageForTests
if (testFramework == 'Spock' && !baseClassForTests) {
this.baseClassForTests = 'spock.lang.Specification'
} else {
this.baseClassForTests = baseClassForTests
}
this.ruleClassForTests = ruleClassForTests
this.lang = testFramework == 'Spock' ? TestFramework.SPOCK : TestFramework.JUNIT
}
public String generate() {
StringBuilder builder = new StringBuilder()
List<File> files = new File(stubsBaseDirectory).listFiles()
files.grep({ File file -> file.isDirectory() && containsStubs(file) }).each {
builder << addClass(it)
def testBaseDir = Paths.get(targetDirectory, NamesUtil.packageToDirectory(basePackageForTests))
Files.createDirectories(testBaseDir)
Files.write(Paths.get(testBaseDir.toString(), NamesUtil.capitalize(it.name) + getTestClassExtension()), addClass(it).bytes)
println testBaseDir
}
return builder
}
private String getTestClassExtension() {
return lang == TestFramework.SPOCK ? '.groovy' : '.java'
}
boolean containsStubs(File file) {
return file.list(new FilenameFilter() {
@Override
boolean accept(File dir, String name) {
return "json".equalsIgnoreCase(NamesUtil.afterLastDot(name))
}
}).size() > 0
}
private String addClass(File directory) {
ClassBuilder clazz = createClass(NamesUtil.capitalize(NamesUtil.afterLast(directory.path, '/')), basePackageForTests, baseClassForTests, lang)
.addStaticImport('com.jayway.restassured.RestAssured.*')
.addImport('java.util.regex.Pattern')
if (lang == TestFramework.JUNIT) {
clazz.addImport('org.junit.Test')
}
if (ruleClassForTests) {
clazz.addImport('org.junit.Rule')
.addRule(ruleClassForTests)
}
directory.listFiles().each {
clazz.addMethod(createTestMethod(it, lang))
}
return clazz.build()
}
public static void main(String[] args) {
print new TestGenerator('stubs', 'io.test', '', '', 'Spock').generate()
}
}

View File

@@ -1,4 +1,4 @@
package eu.coderate.accurest.builder
package io.coderate.accurest.builder
import groovy.transform.PackageScope

View File

@@ -1,6 +1,6 @@
package eu.coderate.accurest.builder
package io.coderate.accurest.builder
import eu.coderate.accurest.util.NamesUtil
import io.coderate.accurest.util.NamesUtil
/**
* @author Jakub Kubrynski
@@ -17,7 +17,7 @@ class ClassBuilder {
private final String modifier
private final String suffix
private ClassBuilder(String className, String packageName, String baseClass, Lang lang) {
private ClassBuilder(String className, String packageName, String baseClass, TestFramework lang) {
if (baseClass) {
imports << baseClass
}
@@ -25,21 +25,21 @@ class ClassBuilder {
this.packageName = packageName
this.className = className
switch (lang) {
case Lang.JAVA:
case TestFramework.JUNIT:
modifier = "public "
suffix = ";"
break
case Lang.GROOVY:
case TestFramework.SPOCK:
modifier = ""
suffix = ""
}
}
static ClassBuilder createClass(String className, String packageName, Lang lang) {
static ClassBuilder createClass(String className, String packageName, TestFramework lang) {
return createClass(className, packageName, null, lang)
}
static ClassBuilder createClass(String className, String packageName, String baseClass, Lang lang) {
static ClassBuilder createClass(String className, String packageName, String baseClass, TestFramework lang) {
return new ClassBuilder(className, packageName, baseClass, lang)
}

View File

@@ -1,4 +1,4 @@
package eu.coderate.accurest.builder
package io.coderate.accurest.builder
/**
* @author Jakub Kubrynski

View File

@@ -1,6 +1,6 @@
package eu.coderate.accurest.builder
package io.coderate.accurest.builder
import eu.coderate.accurest.util.NamesUtil
import io.coderate.accurest.util.NamesUtil
import groovy.json.JsonSlurper
/**
@@ -10,15 +10,15 @@ class MethodBuilder {
private final String methodName
private final Map stubContent
private final Lang lang
private final TestFramework lang
private MethodBuilder(String methodName, Map stubContent, Lang lang) {
private MethodBuilder(String methodName, Map stubContent, TestFramework lang) {
this.stubContent = stubContent
this.methodName = methodName
this.lang = lang
}
static MethodBuilder createTestMethod(File stubsFile, Lang lang) {
static MethodBuilder createTestMethod(File stubsFile, TestFramework lang) {
Map stubContent = new JsonSlurper().parse(stubsFile)
String methodName = NamesUtil.uncapitalize(NamesUtil.toLastDot(NamesUtil.afterLast(stubsFile.path, File.separator)))
return new MethodBuilder(methodName, stubContent, lang)
@@ -26,7 +26,7 @@ class MethodBuilder {
void appendTo(BlockBuilder blockBuilder) {
String modifier
if (lang == Lang.JAVA) {
if (lang == TestFramework.JUNIT) {
blockBuilder.addLine('@Test')
modifier = "public void "
} else {

View File

@@ -1,4 +1,4 @@
package eu.coderate.accurest.builder
package io.coderate.accurest.builder
import groovy.transform.PackageScope

View File

@@ -0,0 +1,10 @@
package io.coderate.accurest.builder
/**
* @author Jakub Kubrynski
*/
enum TestFramework {
JUNIT, SPOCK
}

View File

@@ -1,4 +1,4 @@
package eu.coderate.accurest.util
package io.coderate.accurest.util
/**
* @author Jakub Kubrynski
@@ -38,4 +38,8 @@ class NamesUtil {
}
return string
}
static String packageToDirectory(String packageName) {
return packageName.replaceAll('\\.', File.separator)
}
}

View File

@@ -0,0 +1,32 @@
package io.codearte.accurest.plugin
import io.coderate.accurest.TestGenerator
import org.gradle.api.Plugin
import org.gradle.api.Project
/**
* @author Jakub Kubrynski
*/
class AccurestGradlePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.extensions.create('accurest', AccurestPluginExtension)
project.task('generateAccurest') << {
AccurestPluginExtension accurest = project.accurest
project.logger.info("Accurest Plugin: Invoking test sources generation")
// project.sourceSets.test.allSource.class.getDeclaredMethods().each {println it.name}
try {
TestGenerator generator = new TestGenerator(project.projectDir.path + '/src/test/resources/' + accurest.stubsBaseDirectory, accurest.basePackageForTests,
accurest.baseClassForTests, accurest.ruleClassForTests,
accurest.targetFramework, project.buildDir.path + '/' + accurest.generatedTestSourcesDir)
generator.generate()
} catch (IllegalStateException e) {
project.logger.error("Accurest Plugin: {}", e.getMessage())
}
}
}
}

View File

@@ -0,0 +1,13 @@
package io.codearte.accurest.plugin
/**
* @author Jakub Kubrynski
*/
class AccurestPluginExtension {
String targetFramework = 'Spock'
String stubsBaseDirectory = 'mappings'
String basePackageForTests = 'io.codearte.accurest.tests'
String baseClassForTests
String ruleClassForTests
String generatedTestSourcesDir = "generated-test-sources"
}

View File

@@ -0,0 +1 @@
implementation-class=io.codearte.accurest.plugin.AccurestGradlePlugin

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@@ -0,0 +1,6 @@
#Sun Jan 25 20:45:35 CET 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-bin.zip

164
gradlew vendored Executable file
View File

@@ -0,0 +1,164 @@
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
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" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

90
gradlew.bat vendored Normal file
View File

@@ -0,0 +1,90 @@
@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
@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=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@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 init
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 init
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
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
: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 %CMD_LINE_ARGS%
: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

66
pom.xml
View File

@@ -1,66 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>eu.codearte.accurest</groupId>
<artifactId>accurest</artifactId>
<version>1.0.0-SNAPSHOT</version>
<properties>
<groovy.version>2.3.7</groovy.version>
</properties>
<dependencies>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy-all</artifactId>
<version>${groovy.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jayway.restassured</groupId>
<artifactId>rest-assured</artifactId>
<version>2.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<version>0.7-groovy-2.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.tomakehurst</groupId>
<artifactId>wiremock</artifactId>
<version>1.53</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

2
settings.gradle Normal file
View File

@@ -0,0 +1,2 @@
include "core", "gradle-plugin"
rootProject.name = "accurest"

View File

@@ -1,74 +0,0 @@
package eu.coderate.accurest
import eu.coderate.accurest.builder.ClassBuilder
import eu.coderate.accurest.builder.Lang
import eu.coderate.accurest.util.NamesUtil
import static eu.coderate.accurest.builder.ClassBuilder.createClass
import static eu.coderate.accurest.builder.MethodBuilder.createTestMethod
/**
* @author Jakub Kubrynski
*/
class TestGenerator {
private final String mocksBaseDirectory
private final String basePackageForTests
private final String baseClassForTests
private final String ruleClassForTests
private final Lang lang
TestGenerator(String mocksBaseDirectory, String basePackageForTests, String baseClassForTests, String ruleClassForTests, Lang lang) {
this.mocksBaseDirectory = getClass().getClassLoader().getResource(mocksBaseDirectory).path
this.basePackageForTests = basePackageForTests
if (lang == Lang.GROOVY && !baseClassForTests) {
this.baseClassForTests = 'spock.lang.Specification'
} else {
this.baseClassForTests = baseClassForTests
}
this.ruleClassForTests = ruleClassForTests
this.lang = lang
}
public String generate() {
StringBuilder builder = new StringBuilder()
List<File> files = new File(mocksBaseDirectory).listFiles()
files.grep({ File file -> file.isDirectory() && containsStubs(file) }).each {
builder << addClass(it)
}
return builder
}
boolean containsStubs(File file) {
return file.list(new FilenameFilter() {
@Override
boolean accept(File dir, String name) {
return "json".equalsIgnoreCase(NamesUtil.afterLastDot(name))
}
}).size() > 0
}
private String addClass(File directory) {
ClassBuilder clazz = createClass(NamesUtil.capitalize(NamesUtil.afterLast(directory.path, '/')), basePackageForTests, baseClassForTests, lang)
.addStaticImport('com.jayway.restassured.RestAssured.*')
.addImport('java.util.regex.Pattern')
if (lang == Lang.JAVA) {
clazz.addImport('org.junit.Test')
}
if (ruleClassForTests) {
clazz.addImport('org.junit.Rule')
.addRule(ruleClassForTests)
}
directory.listFiles().each {
clazz.addMethod(createTestMethod(it, lang))
}
return clazz.build()
}
public static void main(String[] args) {
print new TestGenerator('stubs', 'io.test', '', '', Lang.GROOVY).generate()
}
}

View File

@@ -1,10 +0,0 @@
package eu.coderate.accurest.builder
/**
* @author Jakub Kubrynski
*/
enum Lang {
JAVA, GROOVY
}