diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy index 1d111eea7b..b12d46917f 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/ConversionAccurestException.groovy @@ -1,9 +1,10 @@ package io.codearte.accurest.wiremock import groovy.transform.CompileStatic +import io.coderate.accurest.AccurestException @CompileStatic -class ConversionAccurestException extends RuntimeException { +class ConversionAccurestException extends AccurestException { ConversionAccurestException(String message, Throwable cause) { super(message, cause) diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/AccurestException.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/AccurestException.groovy index d564661933..740e13e620 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/AccurestException.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/AccurestException.groovy @@ -5,8 +5,11 @@ package io.coderate.accurest */ class AccurestException extends RuntimeException { - def AccurestException(String message) { + AccurestException(String message) { super(message) } + AccurestException(String message, Throwable cause) { + super(message, cause) + } } diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy index 794c6f9635..3cf1edb274 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/config/AccurestConfigProperties.groovy @@ -14,4 +14,6 @@ class AccurestConfigProperties { String generatedTestSourcesDir = 'build/generated-sources/accurest' String[] imports = [] String[] staticImports = [] + File groovyDslDir + File generatedWiremockClientStubsDir } diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/WiremockStubStrategy.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/WiremockStubStrategy.groovy index c4ced294d6..a3d3924fc0 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/WiremockStubStrategy.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/WiremockStubStrategy.groovy @@ -15,12 +15,12 @@ class WiremockStubStrategy { } String toWiremockClientStub() { - return JsonOutput.toJson([request: wiremockRequestStubStrategy.buildClientRequestContent(), - response: wiremockResponseStubStrategy.buildClientResponseContent()]) + return JsonOutput.prettyPrint(JsonOutput.toJson([request: wiremockRequestStubStrategy.buildClientRequestContent(), + response: wiremockResponseStubStrategy.buildClientResponseContent()])) } String toWiremockServerStub() { - return JsonOutput.toJson([request: wiremockRequestStubStrategy.buildServerRequestContent(), - response: wiremockResponseStubStrategy.buildServerResponseContent()]) + return JsonOutput.prettyPrint(JsonOutput.toJson([request: wiremockRequestStubStrategy.buildServerRequestContent(), + response: wiremockResponseStubStrategy.buildServerResponseContent()])) } } diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/Body.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/Body.groovy index 502e18a2ca..dcf033be1d 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/Body.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/dsl/internal/Body.groovy @@ -55,8 +55,8 @@ class Body { } else if(bodyAsList) { bodyAsList.collect { it.clientValue } } - return body.collectEntries { - Map.Entry entry -> [(entry.key) : entry.value.clientValue] + return body.collectEntries { Map.Entry entry -> + [(entry.key) : entry.value.clientValue] } as Map } @@ -66,8 +66,8 @@ class Body { } else if(bodyAsList) { bodyAsList.collect { it.serverValue } } - return body.collectEntries { - Map.Entry entry -> [(entry.key) : entry.value.serverValue] + return body.collectEntries { Map.Entry entry -> + [(entry.key) : entry.value.serverValue] } as Map } } diff --git a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy index b3bd8d6509..b7561ea393 100644 --- a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy +++ b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/AccurestGradlePlugin.groovy @@ -3,15 +3,18 @@ package io.codearte.accurest.plugin import io.coderate.accurest.AccurestException import io.coderate.accurest.TestGenerator import io.coderate.accurest.config.AccurestConfigProperties +import org.gradle.api.GradleException import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.Task /** * @author Jakub Kubrynski */ class AccurestGradlePlugin implements Plugin { - private static final String TASK_NAME = 'generateAccurest' + private static final String GENERATE_SERVER_TESTS_TASK_NAME = 'generateAccurest' + private static final String DSL_TO_WIREMOCK_CLIENT_TASK_NAME = 'generateWiremockClientStubs' private static final Class IDEA_PLUGIN_CLASS = org.gradle.plugins.ide.idea.IdeaPlugin @@ -19,9 +22,25 @@ class AccurestGradlePlugin implements Plugin { void apply(Project project) { AccurestConfigProperties extension = project.extensions.create('accurest', AccurestConfigProperties) - project.compileTestGroovy.dependsOn(TASK_NAME) + project.compileTestGroovy.dependsOn(GENERATE_SERVER_TESTS_TASK_NAME) - project.task(TASK_NAME) << { + createGenerateTestsTask(project, extension) + createAndConfigureGenerateWiremockClientStubsFromDslTask(project, extension) + + project.afterEvaluate { + def hasIdea = project.plugins.findPlugin(IDEA_PLUGIN_CLASS) + if (hasIdea) { + project.idea { + module { + testSourceDirs += project.file(buildGeneratedSourcesDir(project, extension)) + } + } + } + } + } + + private Task createGenerateTestsTask(Project project, AccurestConfigProperties extension) { + project.task(GENERATE_SERVER_TESTS_TASK_NAME) << { project.logger.info("Accurest Plugin: Invoking test sources generation") extension.stubsBaseDirectory = project.projectDir.path + File.separator + extension.stubsBaseDirectory @@ -38,21 +57,18 @@ class AccurestGradlePlugin implements Plugin { int generatedClasses = generator.generate() project.logger.info("Generated {} test classes", generatedClasses) } catch (AccurestException e) { - project.logger.error("Accurest Plugin exception: {}", e.getMessage()) + throw new GradleException("Accurest Plugin exception: ${e.message}", e) } } + } - project.afterEvaluate { - def hasIdea = project.plugins.findPlugin(IDEA_PLUGIN_CLASS) - if (hasIdea) { - project.idea { - module { - testSourceDirs += new File(buildGeneratedSourcesDir(project, extension)) - } - } - } + private void createAndConfigureGenerateWiremockClientStubsFromDslTask(Project project, AccurestConfigProperties extension) { + Task task = project.tasks.create(DSL_TO_WIREMOCK_CLIENT_TASK_NAME, GenerateWiremockClientStubsFromDslTask) + task.description = "Generate" + task.conventionMapping.with { + groovyDslDir = { extension.groovyDslDir } + generatedWiremockClientStubsDir = { extension.generatedWiremockClientStubsDir } } - } private String buildGeneratedSourcesDir(Project project, def extension) { @@ -64,5 +80,4 @@ class AccurestGradlePlugin implements Plugin { } moduleDir } - } diff --git a/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateWiremockClientStubsFromDslTask.groovy b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateWiremockClientStubsFromDslTask.groovy new file mode 100644 index 0000000000..46111dc736 --- /dev/null +++ b/accurest-gradle-plugin/src/main/groovy/io/codearte/accurest/plugin/GenerateWiremockClientStubsFromDslTask.groovy @@ -0,0 +1,24 @@ +package io.codearte.accurest.plugin + +import io.codearte.accurest.wiremock.DslToWiremockClientConverter +import io.codearte.accurest.wiremock.RecursiveFilesConverter +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.TaskAction + +//TODO: Implement as an incremental task: https://gradle.org/docs/current/userguide/custom_tasks.html#incremental_tasks ? +class GenerateWiremockClientStubsFromDslTask extends DefaultTask { + + @InputDirectory File groovyDslDir + @InputDirectory File generatedWiremockClientStubsDir + + @TaskAction + void generate() { + project.logger.info("Accurest Plugin: Invoking GroovyDSL to Wiremock client stubs conversion") + project.logger.debug("From '${getGroovyDslDir()}' to '${getGeneratedWiremockClientStubsDir()}'") + + RecursiveFilesConverter converter = new RecursiveFilesConverter(new DslToWiremockClientConverter(), getGroovyDslDir(), + getGeneratedWiremockClientStubsDir()) + converter.processFiles() + } +} diff --git a/build.gradle b/build.gradle index 571cfb3c35..e0130574b9 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ ext { - projectVersion = '0.3.0-SNAPSHOT' + projectVersion = '0.3.1-SNAPSHOT' projectGroup = 'io.codearte.accurest' } @@ -65,6 +65,7 @@ project(':accurest-converters') { project(':accurest-gradle-plugin') { dependencies { compile project(':accurest-core') + compile project(':accurest-converters') compile gradleApi() } }