Added missing tasks

Added default Gradle tasks
This commit is contained in:
Marcin Grzejszczak
2016-06-29 23:27:30 +02:00
parent 2f3887753e
commit 8540e75cfd
13 changed files with 141 additions and 159 deletions

View File

@@ -8,6 +8,8 @@
include::introduction.adoc[]
include::links.adoc[]
== Documentation
You can read more about Spring Cloud Contract Verifier by reading the {documentation_url}[docs]

View File

@@ -0,0 +1,11 @@
== Links
Here you can find interesting links related to Spring Cloud Contract Verifier:
- https://github.com/Codearte/accurest[Spring Cloud Contract Verifier Github Repository]
- http://codearte.github.io/accurest[Spring Cloud Contract Verifier Documentation]
- http://codearte.github.io/accurest/deprecated[Accurest Legacy Documentation]
- https://codearte.github.io/accurest/#spring-cloud-contract-stub-runner[Spring Cloud Contract Stub Runner Documentation]
- http://codearte.github.io/accurest/#stub-runner-for-messaging[Spring Cloud Contract Stub Runner Messaging Documentation]
- https://gitter.im/Codearte/accurest[Spring Cloud Contract Verifier Gitter]
- https://github.com/Codearte/accurest-maven-plugin[Spring Cloud Contract Verifier Maven Plugin]

View File

@@ -17,4 +17,6 @@ include::messaging.adoc[]
include::stubrunner.adoc[]
include::stubrunner_msg.adoc[]
include::stubrunner_msg.adoc[]
include::links.adoc[]

View File

@@ -28,7 +28,6 @@ import java.nio.charset.StandardCharsets
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.Paths
import java.nio.file.StandardCopyOption
/**
* Recursively converts contracts into their stub representations
*
@@ -38,21 +37,26 @@ import java.nio.file.StandardCopyOption
@CompileStatic
class RecursiveFilesConverter {
private static final String DEFAULT_CONTRACTS_FOLDER = "contracts"
private static final String DEFAULT_MAPPINGS_FOLDER = "mappings"
private final SingleFileConverter singleFileConverter
private final ContractVerifierConfigProperties properties
private final String additionalFolder
RecursiveFilesConverter(SingleFileConverter singleFileConverter, ContractVerifierConfigProperties properties) {
this.properties = properties
this.singleFileConverter = singleFileConverter
this.additionalFolder = ""
}
RecursiveFilesConverter(SingleFileConverter singleFileConverter, ContractVerifierConfigProperties properties, String additionalFolder) {
this.properties = properties
this.singleFileConverter = singleFileConverter
this.additionalFolder = additionalFolder
}
void processFiles() {
ContractFileScanner scanner = new ContractFileScanner(properties.contractsDslDir, properties.excludedFiles as Set, [] as Set)
ListMultimap<Path, ContractMetadata> contracts = scanner.findContracts()
log.debug("Found the following contracts $contracts")
createContractDirInOutputStubsFolder()
contracts.asMap().entrySet().each { entry ->
entry.value.each { ContractMetadata contract ->
File sourceFile = contract.path.toFile()
@@ -60,13 +64,11 @@ class RecursiveFilesConverter {
if (!singleFileConverter.canHandleFileName(sourceFile.name)) {
return
}
Path targetContractDir = createAndReturnTargetDirectory(sourceFile, DEFAULT_CONTRACTS_FOLDER)
Files.copy(sourceFile.toPath(), new File(targetContractDir.toFile(), sourceFile.name).toPath(), StandardCopyOption.REPLACE_EXISTING)
String convertedContent = singleFileConverter.convertContent(entry.key.last().toString(), contract)
if (!convertedContent) {
return
}
Path absoluteTargetPath = createAndReturnTargetDirectory(sourceFile, DEFAULT_MAPPINGS_FOLDER)
Path absoluteTargetPath = createAndReturnTargetDirectory(sourceFile)
File newJsonFile = createTargetFileWithProperName(absoluteTargetPath, sourceFile)
newJsonFile.setText(convertedContent, StandardCharsets.UTF_8.toString())
} catch (Exception e) {
@@ -76,17 +78,10 @@ class RecursiveFilesConverter {
}
}
private boolean createContractDirInOutputStubsFolder() {
return contractDir().mkdirs()
}
private File contractDir() {
return new File(properties.stubsOutputDir, DEFAULT_CONTRACTS_FOLDER)
}
private Path createAndReturnTargetDirectory(File sourceFile, String defaultFolder) {
private Path createAndReturnTargetDirectory(File sourceFile) {
Path relativePath = Paths.get(properties.contractsDslDir.toURI()).relativize(sourceFile.parentFile.toPath())
Path absoluteTargetPath = new File(properties.stubsOutputDir, defaultFolder).toPath().resolve(relativePath)
File rootFile = additionalFolder ? new File(properties.stubsOutputDir, additionalFolder) : properties.stubsOutputDir
Path absoluteTargetPath = rootFile.toPath().resolve(relativePath)
Files.createDirectories(absoluteTargetPath)
return absoluteTargetPath
}

View File

@@ -30,12 +30,7 @@ import java.nio.file.Paths
class RecursiveFilesConverterSpec extends Specification {
private static
final Set<Path> EXPECTED_TARGET_FILES = [
Paths.get("contracts/dir1/dsl1.groovy"), Paths.get("contracts/dir1/dsl1b.groovy"),
Paths.get("contracts/dir2/dsl2.groovy"), Paths.get("contracts/dslRoot.groovy"),
Paths.get("mappings/dslRoot.json"), Paths.get("mappings/dir1/dsl1.json"),
Paths.get("mappings/dir1/dsl1b.json"), Paths.get("mappings/dir2/dsl2.json")
]
final Set<Path> EXPECTED_TARGET_FILES = [Paths.get("dslRoot.json"), Paths.get("dir1/dsl1.json"), Paths.get("dir1/dsl1b.json"), Paths.get("dir2/dsl2.json")]
@Rule
public TemporaryFolder tmpFolder = new TemporaryFolder();
@@ -84,8 +79,7 @@ class RecursiveFilesConverterSpec extends Specification {
then:
Collection<File> createdFiles = FileUtils.listFiles(properties.stubsOutputDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE)
Set<String> relativizedCreatedFiles = getRelativePathsForFilesInDirectory(createdFiles, properties.stubsOutputDir)
[ Paths.get("mappings/dslRoot.json"), Paths.get("mappings/dir2/dsl2.json") ,
Paths.get("contracts/dslRoot.groovy"), Paths.get("contracts/dir2/dsl2.groovy")] as Set == relativizedCreatedFiles as Set
[Paths.get("dslRoot.json"), Paths.get("dir2/dsl2.json")] as Set == relativizedCreatedFiles as Set
and:
createdFiles.each { it.text == "converted" }
}

View File

@@ -91,4 +91,9 @@ class ContractVerifierConfigProperties {
*/
File stubsOutputDir
/**
* Suffix for the generated Stubs Jar task
*/
String stubsSuffix = 'stubs'
}

View File

@@ -32,6 +32,8 @@ import org.springframework.cloud.contract.verifier.wiremock.RecursiveFilesConver
*/
class GenerateWireMockClientStubsFromDslTask extends ConventionTask {
private static final String DEFAULT_MAPPINGS_FOLDER = 'mappings'
@InputDirectory
File contractsDslDir
@OutputDirectory
@@ -43,7 +45,8 @@ class GenerateWireMockClientStubsFromDslTask extends ConventionTask {
void generate() {
logger.info("Spring Cloud Contract Verifier Plugin: Invoking DSL to WireMock client stubs conversion")
logger.debug("From '${getContractsDslDir()}' to '${getStubsOutputDir()}'")
RecursiveFilesConverter converter = new RecursiveFilesConverter(new DslToWireMockClientConverter(), getConfigProperties())
RecursiveFilesConverter converter = new RecursiveFilesConverter(new DslToWireMockClientConverter(),
getConfigProperties(), DEFAULT_MAPPINGS_FOLDER)
converter.processFiles()
}
}

View File

@@ -19,8 +19,11 @@ package org.springframework.cloud.contract.verifier.plugin
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.publish.maven.MavenPublication
import org.gradle.api.publish.maven.plugins.MavenPublishPlugin
import org.gradle.api.tasks.Copy
import org.gradle.jvm.tasks.Jar
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
/**
* Gradle plugin for Spring Cloud Contract Verifier that from the DSL contract can
* <ul>
@@ -44,6 +47,8 @@ class SpringCloudContractVerifierGradlePlugin implements Plugin<Project> {
private static final String GENERATE_SERVER_TESTS_TASK_NAME = 'generateContractTests'
private static final String DSL_TO_WIREMOCK_CLIENT_TASK_NAME = 'generateWireMockClientStubs'
private static final String COPY_CONTRACTS_TASK_NAME = 'copyContracts'
private static final String VERIFIER_STUBS_JAR_TASK_NAME = 'verifierStubsJar'
private static final Class IDEA_PLUGIN_CLASS = org.gradle.plugins.ide.idea.IdeaPlugin
private static final String GROUP_NAME = "Verification"
@@ -61,6 +66,9 @@ class SpringCloudContractVerifierGradlePlugin implements Plugin<Project> {
setConfigurationDefaults(extension)
createGenerateTestsTask(extension)
createAndConfigureGenerateWireMockClientStubsFromDslTask(extension)
Task stubsJar = createAndConfigureStubsJarTasks(extension)
createAndConfigureCopyContractsTask(stubsJar, extension)
createAndConfigureMavenPublishPlugin(stubsJar, extension)
project.dependencies.add("testCompile", "com.github.tomakehurst:wiremock:2.0.10-beta")
project.dependencies.add("testCompile", "com.toomuchcoding.jsonassert:jsonassert:0.4.7")
project.dependencies.add("testCompile", "org.assertj:assertj-core:2.3.0")
@@ -111,4 +119,85 @@ class SpringCloudContractVerifierGradlePlugin implements Plugin<Project> {
configProperties = { extension }
}
}
private Task createAndConfigureStubsJarTasks(ContractVerifierConfigProperties extension) {
Task task = stubsTask()
if (task) {
project.logger.warn("Stubs jar task was present - won't create one. Remember about adding it to artifacts as an archive!")
return task
} else {
task = project.tasks.create(type: Jar, name: VERIFIER_STUBS_JAR_TASK_NAME,
dependsOn: DSL_TO_WIREMOCK_CLIENT_TASK_NAME) {
baseName = project.name
classifier = extension.stubsSuffix
from { extension.stubsOutputDir }
}
task.description = "Creates the stubs JAR task"
task.group = GROUP_NAME
project.artifacts {
archives task
}
return task
}
}
private Task stubsTask() {
try {
return project.tasks.getByName(VERIFIER_STUBS_JAR_TASK_NAME)
} catch (Exception e) {
return null
}
}
private Task createAndConfigureCopyContractsTask(Task stubs, ContractVerifierConfigProperties extension) {
Task task = project.tasks.create(type: Copy, name: COPY_CONTRACTS_TASK_NAME) {
from { extension.contractsDslDir }
into { project.file("${extension.stubsOutputDir}/contracts") ?: project.file("${project.buildDir}/stubs/contracts") }
}
task.description = "Copies contracts to the output folder"
task.group = GROUP_NAME
stubs.dependsOn task
return task
}
private void createAndConfigureMavenPublishPlugin(Task stubsTask, ContractVerifierConfigProperties extension) {
if (!classIsOnClasspath("org.gradle.api.publish.maven.plugins.MavenPublishPlugin")) {
return
}
project.logger.debug("Generating default publication")
project.afterEvaluate {
project.plugins.withType(MavenPublishPlugin) { def publishingPlugin ->
def publishingExtension = project.extensions.findByName('publishing')
if (!hasPublication(publishingExtension)) {
project.logger.debug("Stubs publication is not present - will create one")
publishingExtension.publications {
stubs(MavenPublication) {
artifactId "${project.name}-${extension.stubsSuffix}"
artifact stubsTask
}
}
} else {
project.logger.warn("Stubs publication was present - won't create a new one. Remember about passing stubs as artifact")
}
}
}
}
private boolean hasPublication(def publishingExtension) {
try {
return publishingExtension.publications.getByName('stubs')
} catch (Exception e) {
return false
}
}
private boolean classIsOnClasspath(String className) {
try {
Class.forName(className)
return true
} catch (Exception e) {
project.logger.debug("Maven Publish Plugin is not available")
}
}
}

View File

@@ -62,25 +62,6 @@ wrapper {
gradleVersion '2.2.1'
}
task stubsJar(type: Jar, dependsOn: ["generateWireMockClientStubs"]) {
baseName = "${project.name}"
classifier = "stubs"
from stubsOutputDirRoot
}
artifacts {
archives stubsJar
}
publishing {
publications {
stubs(MavenPublication) {
artifactId "${project.name}-stubs"
artifact stubsJar
}
}
}
test {
testLogging {
exceptionFormat = 'full'

View File

@@ -14,8 +14,6 @@ group = 'org.springframework.cloud.testprojects'
ext {
contractsDir = file("repository/mappings")
stubsOutputDirRoot = file("${project.buildDir}/production/${project.name}-stubs/")
wireMockStubsOutputDir = new File(stubsOutputDirRoot, 'repository/mappings/')
contractsOutputDir = new File(stubsOutputDirRoot, 'repository/contracts/')
targetFramework = 'Spock'
}
@@ -66,46 +64,15 @@ contractVerifier {
targetFramework = 'Spock'
contractsDslDir = contractsDir
// generatedTestSourcesDir = file("${project.rootDir}/src/test/groovy/")
stubsOutputDir = wireMockStubsOutputDir
stubsOutputDir = stubsOutputDirRoot
}
//TODO: Put it into the plugin
task createWireMockStubsOutputDir << {
wireMockStubsOutputDir.mkdirs()
}
generateWireMockClientStubs.dependsOn { createWireMockStubsOutputDir }
generateContractTests.dependsOn generateWireMockClientStubs
wrapper {
gradleVersion '2.12'
}
task copyContracts(type: Copy) {
from contractsDir
include '**/*.groovy'
into contractsOutputDir
}
task stubsJar(type: Jar, dependsOn: ["generateWireMockClientStubs", copyContracts]) {
baseName = "${project.name}"
classifier = "stubs"
from stubsOutputDirRoot
}
artifacts {
archives stubsJar
}
publishing {
publications {
stubs(MavenPublication) {
artifactId "${project.name}-stubs"
artifact stubsJar
}
}
}
test {
testLogging {
exceptionFormat = 'full'

View File

@@ -58,8 +58,6 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService')
ext {
contractsDir = file("mappings")
stubsOutputDirRoot = file("${project.buildDir}/production/${project.name}-stubs/")
wireMockStubsOutputDir = file(new File(stubsOutputDirRoot, 'repository/mappings/'))
contractsOutputDir = file(new File(stubsOutputDirRoot, 'repository/contracts/'))
}
contractVerifier {
@@ -68,7 +66,7 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService')
baseClassForTests = 'org.springframework.cloud.MvcSpec'
contractsDslDir = file("${project.projectDir.absolutePath}/mappings/")
generatedTestSourcesDir = file("${project.buildDir}/generated-test-sources/")
stubsOutputDir = wireMockStubsOutputDir
stubsOutputDir = stubsOutputDirRoot
}
jar {
@@ -96,31 +94,6 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService')
clean.dependsOn('cleanup')
task copyContracts(type: Copy) {
from contractsDir
include '**/*.groovy'
into contractsOutputDir
}
task stubsJar(type: Jar, dependsOn: ["generateWireMockClientStubs", copyContracts]) {
baseName = "${project.name}"
classifier = "stubs"
from stubsOutputDirRoot
}
artifacts {
archives stubsJar
}
publishing {
publications {
stubs(MavenPublication) {
artifactId "${project.name}-stubs"
artifact stubsJar
}
}
}
test {
testLogging {
exceptionFormat = 'full'
@@ -137,7 +110,7 @@ configure(project(':loanApplicationService')) {
task copyCollaboratorStubs(type: Copy) {
File fraudBuildDir = project(':fraudDetectionService').buildDir
from(new File(fraudBuildDir, "/production/${project(':fraudDetectionService').name}-stubs/repository/"))
from(new File(fraudBuildDir, "/production/${project(':fraudDetectionService').name}-stubs/"))
into "src/test/resources/"
}

View File

@@ -58,8 +58,6 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService')
ext {
contractsDir = file("mappings")
stubsOutputDirRoot = file("${project.buildDir}/production/${project.name}-stubs/")
wireMockStubsOutputDir = file(new File(stubsOutputDirRoot, 'repository/mappings/'))
contractsOutputDir = file(new File(stubsOutputDirRoot, 'repository/contracts/'))
}
contractVerifier {
@@ -68,7 +66,7 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService')
baseClassForTests = 'org.springframework.cloud.MvcSpec'
contractsDslDir = file("${project.projectDir.absolutePath}/mappings/")
generatedTestSourcesDir = file("${project.buildDir}/generated-test-sources/")
stubsOutputDir = wireMockStubsOutputDir
stubsOutputDir = stubsOutputDirRoot
}
jar {
@@ -94,31 +92,6 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService')
clean.dependsOn('cleanup')
task copyContracts(type: Copy) {
from contractsDir
into contractsOutputDir
includeEmptyDirs = true
}
task stubsJar(type: Jar, dependsOn: ["generateWireMockClientStubs", copyContracts]) {
baseName = "${project.name}"
classifier = "stubs"
from stubsOutputDirRoot
}
artifacts {
archives stubsJar
}
publishing {
publications {
stubs(MavenPublication) {
artifactId "${project.name}-stubs"
artifact stubsJar
}
}
}
test {
testLogging {
exceptionFormat = 'full'
@@ -134,7 +107,7 @@ configure(project(':loanApplicationService')) {
task copyCollaboratorStubs(type: Copy) {
File fraudBuildDir = project(':fraudDetectionService').buildDir
from(new File(fraudBuildDir, "/production/${project(':fraudDetectionService').name}-stubs/repository/"))
from(new File(fraudBuildDir, "/production/${project(':fraudDetectionService').name}-stubs/"))
into "src/test/resources/"
}

View File

@@ -59,31 +59,18 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService')
ext {
contractsDir = file("mappings")
stubsOutputDirRoot = file("${project.buildDir}/production/${project.name}-stubs/")
wireMockStubsOutputDir = file(new File(stubsOutputDirRoot, 'repository/mappings/'))
contractsOutputDir = file(new File(stubsOutputDirRoot, 'repository/contracts/'))
}
task copyContracts(type: Copy) {
from contractsDir
include '**/*.groovy'
into contractsOutputDir
}
task stubsJar(type: Jar, dependsOn: ["generateWireMockClientStubs", copyContracts]) {
baseName = "${project.name}"
classifier = "stubs"
from stubsOutputDirRoot
}
artifacts {
archives stubsJar
}
// Automatically added by plugin:
// copyContracts - copies contracts to the output folder from which JAR will be created
// verifierStubsJar - JAR with a provided stub suffix
// the presented publication is also added by the plugin but you can modify it as you wish
publishing {
publications {
stubs(MavenPublication) {
artifactId "${project.name}-stubs"
artifact stubsJar
artifact verifierStubsJar
}
}
}
@@ -97,7 +84,7 @@ configure([project(':fraudDetectionService'), project(':loanApplicationService')
baseClassForTests = 'org.springframework.cloud.MvcSpec'
contractsDslDir = file("${project.projectDir.absolutePath}/mappings/")
generatedTestSourcesDir = file("${project.buildDir}/generated-test-sources/")
stubsOutputDir = wireMockStubsOutputDir
stubsOutputDir = stubsOutputDirRoot
}
jar {
@@ -138,7 +125,7 @@ configure(project(':loanApplicationService')) {
task copyCollaboratorStubs(type: Copy) {
File fraudBuildDir = project(':fraudDetectionService').buildDir
from(new File(fraudBuildDir, "/production/${project(':fraudDetectionService').name}-stubs/repository/"))
from(new File(fraudBuildDir, "/production/${project(':fraudDetectionService').name}-stubs/"))
into "src/test/resources/"
}