diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/GenerateServerTestsTask.groovy b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/GenerateServerTestsTask.groovy index 34be261875..6ca601b0d6 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/GenerateServerTestsTask.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/GenerateServerTestsTask.groovy @@ -17,6 +17,7 @@ package org.springframework.cloud.contract.verifier.plugin import groovy.transform.CompileStatic +import groovy.transform.builder.Builder import org.gradle.api.DefaultTask import org.gradle.api.GradleException import org.gradle.api.file.Directory @@ -50,46 +51,136 @@ class GenerateServerTestsTask extends DefaultTask { @Nested Config config + @CompileStatic + @Builder static class Config { + + final Provider contractsDslDir + final Provider nameSuffixForTests + final Provider basePackageForTests + final Provider baseClassForTests + final Provider packageWithBaseClasses + final ListProperty excludedFiles + final ListProperty ignoredFiles + final ListProperty includedFiles + final ListProperty imports + final ListProperty staticImports + final Provider testMode + final Provider testFramework + final MapProperty baseClassMappings + final Provider assertJsonSize + final Provider failOnInProgress + final DirectoryProperty generatedTestSourcesDir + final DirectoryProperty generatedTestResourcesDir + + Config(Provider contractsDslDir, Provider nameSuffixForTests, Provider basePackageForTests, Provider baseClassForTests, Provider packageWithBaseClasses, ListProperty excludedFiles, ListProperty ignoredFiles, ListProperty includedFiles, ListProperty imports, ListProperty staticImports, Provider testMode, Provider testFramework, MapProperty baseClassMappings, Provider assertJsonSize, Provider failOnInProgress, DirectoryProperty generatedTestSourcesDir, DirectoryProperty generatedTestResourcesDir) { + this.contractsDslDir = contractsDslDir + this.nameSuffixForTests = nameSuffixForTests + this.basePackageForTests = basePackageForTests + this.baseClassForTests = baseClassForTests + this.packageWithBaseClasses = packageWithBaseClasses + this.excludedFiles = excludedFiles + this.ignoredFiles = ignoredFiles + this.includedFiles = includedFiles + this.imports = imports + this.staticImports = staticImports + this.testMode = testMode + this.testFramework = testFramework + this.baseClassMappings = baseClassMappings + this.assertJsonSize = assertJsonSize + this.failOnInProgress = failOnInProgress + this.generatedTestSourcesDir = generatedTestSourcesDir + this.generatedTestResourcesDir = generatedTestResourcesDir + } + @InputDirectory - Provider contractsDslDir + Provider getContractsDslDir() { + return contractsDslDir + } + @Input @Optional - Provider nameSuffixForTests + Provider getNameSuffixForTests() { + return nameSuffixForTests + } + @Input @Optional - Provider basePackageForTests + Provider getBasePackageForTests() { + return basePackageForTests + } + @Input @Optional - Provider baseClassForTests + Provider getBaseClassForTests() { + return baseClassForTests + } + @Input @Optional - Provider packageWithBaseClasses + Provider getPackageWithBaseClasses() { + return packageWithBaseClasses + } + @Input - ListProperty excludedFiles + ListProperty getExcludedFiles() { + return excludedFiles + } + @Input - ListProperty ignoredFiles + ListProperty getIgnoredFiles() { + return ignoredFiles + } + @Input - ListProperty includedFiles + ListProperty getIncludedFiles() { + return includedFiles + } + @Input - ListProperty imports + ListProperty getImports() { + return imports + } + @Input - ListProperty staticImports + ListProperty getStaticImports() { + return staticImports + } + @Input - Provider testMode + Provider getTestMode() { + return testMode + } + @Input - Provider testFramework + Provider getTestFramework() { + return testFramework + } + @Input - MapProperty baseClassMappings + MapProperty getBaseClassMappings() { + return baseClassMappings + } + @Input - Provider assertJsonSize + Provider getAssertJsonSize() { + return assertJsonSize + } + @Input - Provider failOnInProgress + Provider getFailOnInProgress() { + return failOnInProgress + } @OutputDirectory - DirectoryProperty generatedTestSourcesDir + DirectoryProperty getGeneratedTestSourcesDir() { + return generatedTestSourcesDir + } + @OutputDirectory - DirectoryProperty generatedTestResourcesDir + DirectoryProperty getGeneratedTestResourcesDir() { + return generatedTestResourcesDir + } } @TaskAction @@ -139,24 +230,22 @@ class GenerateServerTestsTask extends DefaultTask { static Config fromExtension(ContractVerifierExtension extension, TaskProvider copyContractsTask) { return new Config( - contractsDslDir: copyContractsTask.flatMap { it.config.copiedContractsFolder }, - nameSuffixForTests: extension.nameSuffixForTests, - basePackageForTests: extension.basePackageForTests, - baseClassForTests: extension.baseClassForTests, - packageWithBaseClasses: extension.packageWithBaseClasses, - excludedFiles: extension.excludedFiles, - ignoredFiles: extension.ignoredFiles, - includedFiles: extension.includedFiles, - imports: extension.imports, - staticImports: extension.staticImports, - testMode: extension.testMode, - testFramework: extension.testFramework, - baseClassMappings: extension.baseClassMappings.getBaseClassMappings(), - assertJsonSize: extension.assertJsonSize, - failOnInProgress: extension.failOnInProgress, - - generatedTestSourcesDir: extension.generatedTestSourcesDir, - generatedTestResourcesDir: extension.generatedTestResourcesDir, - ) + copyContractsTask.flatMap { it.config.copiedContractsFolder }, + extension.nameSuffixForTests, + extension.basePackageForTests, + extension.baseClassForTests, + extension.packageWithBaseClasses, + extension.excludedFiles, + extension.ignoredFiles, + extension.includedFiles, + extension.imports, + extension.staticImports, + extension.testMode, + extension.testFramework, + extension.baseClassMappings.getBaseClassMappings(), + extension.assertJsonSize, + extension.failOnInProgress, + extension.generatedTestSourcesDir, + extension.generatedTestResourcesDir) } } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/PublishStubsToScmTask.groovy b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/PublishStubsToScmTask.groovy index 5b11f72173..c368be60f7 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/PublishStubsToScmTask.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/main/groovy/org/springframework/cloud/contract/verifier/plugin/PublishStubsToScmTask.groovy @@ -23,6 +23,10 @@ import org.gradle.api.file.DirectoryProperty import org.gradle.api.model.ObjectFactory import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property +import org.gradle.api.provider.Provider +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.Nested +import org.gradle.api.tasks.OutputDirectory import org.gradle.api.tasks.TaskAction import org.springframework.cloud.contract.stubrunner.ContractProjectUpdater import org.springframework.cloud.contract.stubrunner.ScmStubDownloaderBuilder @@ -42,90 +46,53 @@ import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties class PublishStubsToScmTask extends DefaultTask { static final String TASK_NAME = 'publishStubsToScm' + @Nested Config config private Closure customizationClosure = Closure.IDENTITY + @CompileStatic static class Config { - private ObjectFactory objects - ContractVerifierExtension.ContractRepository contractRepository - Property contractsMode - Property deleteStubsAfterTest - Property failOnNoContracts - MapProperty contractsProperties - DirectoryProperty stubsOutputDir + @Input + final Property contractRepository + @Input + final Property contractsMode + @Input + final Property deleteStubsAfterTest + @Input + final Property failOnNoContracts + @Input + final MapProperty contractsProperties + @OutputDirectory + final DirectoryProperty stubsOutputDir - void setContractsMode(Property contractsMode) { + Config(ObjectFactory objects, ContractVerifierExtension extension) { + this.contractRepository = objects.property(ContractVerifierExtension.ContractRepository) + this.contractRepository.set(extension.contractRepository); + this.contractsMode = objects.property(StubRunnerProperties.StubsMode) + this.contractsMode.set(extension.contractsMode); + this.deleteStubsAfterTest = objects.property(Boolean) + this.deleteStubsAfterTest.set(extension.failOnNoContracts) + this.failOnNoContracts = objects.property(Boolean) + this.failOnNoContracts.set(extension.deleteStubsAfterTest) + this.contractsProperties = objects.mapProperty(String, String) + this.contractsProperties.set(extension.contractsProperties) + this.stubsOutputDir = objects.directoryProperty() + this.stubsOutputDir.set(extension.stubsOutputDir) + } + + Config(Property contractRepository, Property contractsMode, Property deleteStubsAfterTest, Property failOnNoContracts, MapProperty contractsProperties, DirectoryProperty stubsOutputDir) { + this.contractRepository = contractRepository this.contractsMode = contractsMode - } - - void setContractsMode(String contractsMode) { - if (contractsMode) { - this.contractsMode = objects.property(StubRunnerProperties.StubsMode).convention(StubRunnerProperties.StubsMode.valueOf(contractsMode.toUpperCase())) - } - } - - void setDeleteStubsAfterTest(Property deleteStubsAfterTest) { this.deleteStubsAfterTest = deleteStubsAfterTest - } - - void setDeleteStubsAfterTest(Boolean deleteStubsAfterTest) { - if (deleteStubsAfterTest != null) { - this.deleteStubsAfterTest = objects.property(Boolean).convention(deleteStubsAfterTest) - } - } - - void setFailOnNoContracts(Property failOnNoContracts) { this.failOnNoContracts = failOnNoContracts - } - - void setFailOnNoContracts(Boolean failOnNoContracts) { - if (failOnNoContracts != null) { - this.failOnNoContracts = objects.property(Boolean).convention(failOnNoContracts) - } - } - - void setContractsProperties(MapProperty contractsProperties) { this.contractsProperties = contractsProperties - } - - void setContractsProperties(Map contractsProperties) { - if (contractsProperties) { - this.contractsProperties = objects.mapProperty(String, String).convention(contractsProperties) - } - } - - void setStubsOutputDir(DirectoryProperty stubsOutputDir) { this.stubsOutputDir = stubsOutputDir } - void setStubsOutputDir(String stubsOutputDir) { - if (stubsOutputDir) { - this.stubsOutputDir = objects.directoryProperty() - this.stubsOutputDir.set(new File(stubsOutputDir)) - } - } - - void setStubsOutputDir(GString stubsOutputDir) { - if (stubsOutputDir) { - this.stubsOutputDir = objects.directoryProperty() - this.stubsOutputDir.set(new File(stubsOutputDir.toString())) - } - } - void contractRepository(@DelegatesTo(ContractVerifierExtension.ContractRepository) Closure closure) { closure.delegate = contractRepository closure.call() } - - @Deprecated - void contractDependency(Closure closure) { - // Here only to preserve backward compatibility. Was never used here. - } - - @PackageScope - void setObjects(ObjectFactory objects) { - this.objects = objects - } } @TaskAction @@ -137,25 +104,17 @@ class PublishStubsToScmTask extends DefaultTask { String projectName = project.group.toString() + ":" + project.name.toString() + ":" + this.project.version.toString() project.logger.info("Pushing Stubs to SCM for project [" + projectName + "]") StubRunnerOptions stubRunnerOptions = StubRunnerOptionsFactory.createStubRunnerOptions( - config.contractRepository, config.contractsMode.getOrNull(), config.deleteStubsAfterTest.get(), + config.contractRepository.get(), config.contractsMode.getOrNull(), config.deleteStubsAfterTest.get(), config.contractsProperties.get(), config.failOnNoContracts.get()) new ContractProjectUpdater(stubRunnerOptions).updateContractProject(projectName, config.stubsOutputDir.get().asFile.toPath()) } static Config fromExtension(ContractVerifierExtension extension, ObjectFactory objects) { - return new Config( - contractRepository: extension.contractRepository, - contractsMode: extension.contractsMode, - failOnNoContracts: extension.failOnNoContracts, - deleteStubsAfterTest: extension.deleteStubsAfterTest, - contractsProperties: extension.contractsProperties, - stubsOutputDir: extension.stubsOutputDir, - objects: objects - ) + return new Config(objects, extension) } private boolean shouldRun() { - String contractRepoUrl = config.contractRepository.repositoryUrl.getOrNull() ?: "" + String contractRepoUrl = config.contractRepository.get().repositoryUrl.getOrNull() ?: "" if (!contractRepoUrl || !ScmStubDownloaderBuilder.isProtocolAccepted(contractRepoUrl)) { project.logger.warn("Skipping pushing stubs to scm since your contracts repository URL [${contractRepoUrl}] doesn't match any of the accepted protocols for SCM stub downloader") return false @@ -172,7 +131,7 @@ class PublishStubsToScmTask extends DefaultTask { private void applyConfigCustomizations() { // Needs to be copied, otherwise properties won't be updated: - config.contractRepository = copy(config.contractRepository, project.objects) + config.contractRepository.set(copy(config.contractRepository.get(), project.objects)) customizationClosure.delegate = config customizationClosure.call() }