From bd9015c1524d02656e489264a4d86f32deaa3d87 Mon Sep 17 00:00:00 2001 From: Jakub Kubrynski Date: Sun, 7 Feb 2016 17:18:57 +0100 Subject: [PATCH] Make Wiremock generator use ContractFileScanner. Fix #189 --- .../wiremock/RecursiveFilesConverter.groovy | 21 +++++--- .../RecursiveFilesConverterSpec.groovy | 53 +++++++++++++++---- .../plugin/AccurestGradlePlugin.groovy | 1 + ...erateWireMockClientStubsFromDslTask.groovy | 6 ++- 4 files changed, 61 insertions(+), 20 deletions(-) diff --git a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy index 8f71f8955b..b031acc174 100644 --- a/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy +++ b/accurest-converters/src/main/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverter.groovy @@ -1,8 +1,12 @@ package io.codearte.accurest.wiremock +import com.google.common.collect.Multimap import groovy.io.FileType import groovy.transform.CompileStatic import groovy.util.logging.Slf4j +import io.codearte.accurest.config.AccurestConfigProperties +import io.codearte.accurest.file.Contract +import io.codearte.accurest.file.ContractFileScanner import java.nio.charset.StandardCharsets import java.nio.file.Files @@ -14,17 +18,18 @@ import java.nio.file.Paths class RecursiveFilesConverter { private final SingleFileConverter singleFileConverter - private final File sourceRootDirectory - private final File targetRootDirectory + private final AccurestConfigProperties properties - RecursiveFilesConverter(SingleFileConverter singleFileConverter, File sourceRootDirectory, File targetRootDirectory) { + RecursiveFilesConverter(SingleFileConverter singleFileConverter, AccurestConfigProperties properties) { + this.properties = properties this.singleFileConverter = singleFileConverter - this.sourceRootDirectory = sourceRootDirectory - this.targetRootDirectory = targetRootDirectory } void processFiles() { - sourceRootDirectory.eachFileRecurse(FileType.FILES) { File sourceFile -> + ContractFileScanner scanner = new ContractFileScanner(properties.contractsDslDir, properties.excludedFiles as Set, [] as Set) + Multimap contracts = scanner.findContracts() + contracts.values().each { Contract contract -> + File sourceFile = contract.path.toFile() try { if (!singleFileConverter.canHandleFileName(sourceFile.name)) { return @@ -40,8 +45,8 @@ class RecursiveFilesConverter { } private Path createAndReturnTargetDirectory(File sourceFile) { - Path relativePath = Paths.get(sourceRootDirectory.toURI()).relativize(sourceFile.parentFile.toPath()) - Path absoluteTargetPath = targetRootDirectory.toPath().resolve(relativePath) + Path relativePath = Paths.get(properties.contractsDslDir.toURI()).relativize(sourceFile.parentFile.toPath()) + Path absoluteTargetPath = properties.stubsOutputDir.toPath().resolve(relativePath) Files.createDirectories(absoluteTargetPath) absoluteTargetPath } diff --git a/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy index 583de32c0b..f5f9022b97 100755 --- a/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy +++ b/accurest-converters/src/test/groovy/io/codearte/accurest/wiremock/RecursiveFilesConverterSpec.groovy @@ -1,5 +1,6 @@ package io.codearte.accurest.wiremock +import io.codearte.accurest.config.AccurestConfigProperties import org.apache.commons.io.FileUtils import org.apache.commons.io.filefilter.TrueFileFilter import org.junit.Rule @@ -11,42 +12,73 @@ import java.nio.file.Paths class RecursiveFilesConverterSpec extends Specification { - private static final Set EXPECTED_TARGET_FILES = [Paths.get("dslRoot.json"), Paths.get("dir1/dsl1.json"), Paths.get("dir1/dsl1b.json"), Paths.get("dir2/dsl2.json")] + private static + final Set 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(); def "should recursively convert all matching files"() { given: + AccurestConfigProperties properties = new AccurestConfigProperties() File originalSourceRootDirectory = new File(this.getClass().getResource("/converter/source").toURI()) - File sourceRootDirectory = tmpFolder.newFolder("source") - File targetRootDirectory = tmpFolder.newFolder("target") - FileUtils.copyDirectory(originalSourceRootDirectory, sourceRootDirectory) + properties.contractsDslDir = tmpFolder.newFolder("source") + properties.stubsOutputDir = tmpFolder.newFolder("target") + FileUtils.copyDirectory(originalSourceRootDirectory, properties.contractsDslDir) and: def singleFileConverterStub = Stub(SingleFileConverter) singleFileConverterStub.canHandleFileName(_) >> { String fileName -> fileName.endsWith(".groovy") } singleFileConverterStub.convertContent(_) >> { "converted" } singleFileConverterStub.generateOutputFileNameForInput(_) >> { String inputFileName -> inputFileName.replaceAll('.groovy', '.json') } - RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub, sourceRootDirectory, targetRootDirectory) + + RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub, properties) when: recursiveFilesConverter.processFiles() then: - Collection createdFiles = FileUtils.listFiles(targetRootDirectory, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE) - Set relativizedCreatedFiles = getRelativePathsForFilesInDirectory(createdFiles, targetRootDirectory) + Collection createdFiles = FileUtils.listFiles(properties.stubsOutputDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE) + Set relativizedCreatedFiles = getRelativePathsForFilesInDirectory(createdFiles, properties.stubsOutputDir) EXPECTED_TARGET_FILES == relativizedCreatedFiles and: createdFiles.each { it.text == "converted" } } + def "should recursively convert matching files with exlusions"() { + given: + AccurestConfigProperties properties = new AccurestConfigProperties() + File originalSourceRootDirectory = new File(this.getClass().getResource("/converter/source").toURI()) + properties.contractsDslDir = tmpFolder.newFolder("source") + properties.stubsOutputDir = tmpFolder.newFolder("target") + properties.excludedFiles = ["dir1/**"] + FileUtils.copyDirectory(originalSourceRootDirectory, properties.contractsDslDir) + and: + def singleFileConverterStub = Stub(SingleFileConverter) + singleFileConverterStub.canHandleFileName(_) >> { String fileName -> fileName.endsWith(".groovy") } + singleFileConverterStub.convertContent(_) >> { "converted" } + singleFileConverterStub.generateOutputFileNameForInput(_) >> { String inputFileName -> inputFileName.replaceAll('.groovy', '.json') } + + RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub, properties) + when: + recursiveFilesConverter.processFiles() + then: + Collection createdFiles = FileUtils.listFiles(properties.stubsOutputDir, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE) + Set relativizedCreatedFiles = getRelativePathsForFilesInDirectory(createdFiles, properties.stubsOutputDir) + [Paths.get("dslRoot.json"), Paths.get("dir2/dsl2.json")] as Set == relativizedCreatedFiles as Set + and: + createdFiles.each { it.text == "converted" } + } + def "on failure should break processing and throw meaningful exception"() { given: - def sourceFile = tmpFolder.newFile() + def sourceFile = tmpFolder.newFile("test.groovy") and: def singleFileConverterStub = Stub(SingleFileConverter) singleFileConverterStub.canHandleFileName(_) >> { true } singleFileConverterStub.convertContent(_) >> { throw new NullPointerException("Test conversion error") } singleFileConverterStub.generateOutputFileNameForInput(_) >> { String inputFileName -> "${inputFileName}2" } - RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub, tmpFolder.root, tmpFolder.root) + AccurestConfigProperties properties = new AccurestConfigProperties() + properties.contractsDslDir = tmpFolder.root + properties.stubsOutputDir = tmpFolder.root + RecursiveFilesConverter recursiveFilesConverter = new RecursiveFilesConverter(singleFileConverterStub, properties) when: recursiveFilesConverter.processFiles() then: @@ -55,7 +87,8 @@ class RecursiveFilesConverterSpec extends Specification { e.cause?.message == "Test conversion error" } - private static Set getRelativePathsForFilesInDirectory(Collection createdFiles, File targetRootDirectory) { + private + static Set getRelativePathsForFilesInDirectory(Collection createdFiles, File targetRootDirectory) { Path rootSourcePath = Paths.get(targetRootDirectory.toURI()) Set relativizedCreatedFiles = createdFiles.collect { File file -> rootSourcePath.relativize(Paths.get(file.toURI())) 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 11a86d33c9..1ad91232f6 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 @@ -70,6 +70,7 @@ class AccurestGradlePlugin implements Plugin { task.conventionMapping.with { contractsDslDir = { extension.contractsDslDir } stubsOutputDir = { extension.stubsOutputDir } + configProperties = { extension } } } 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 index be22c44def..f4a518c1bb 100644 --- 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 @@ -1,5 +1,6 @@ package io.codearte.accurest.plugin +import io.codearte.accurest.config.AccurestConfigProperties import io.codearte.accurest.wiremock.DslToWireMockClientConverter import io.codearte.accurest.wiremock.RecursiveFilesConverter import org.gradle.api.internal.ConventionTask @@ -15,13 +16,14 @@ class GenerateWireMockClientStubsFromDslTask extends ConventionTask { @OutputDirectory File stubsOutputDir + AccurestConfigProperties configProperties + @TaskAction void generate() { logger.info("Accurest Plugin: Invoking GroovyDSL to WireMock client stubs conversion") logger.debug("From '${getContractsDslDir()}' to '${getStubsOutputDir()}'") - RecursiveFilesConverter converter = new RecursiveFilesConverter(new DslToWireMockClientConverter(), getContractsDslDir(), - getStubsOutputDir()) + RecursiveFilesConverter converter = new RecursiveFilesConverter(new DslToWireMockClientConverter(), getConfigProperties()) converter.processFiles() } }