Should fix Gradle plugin
This commit is contained in:
@@ -23,9 +23,12 @@ import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Consumer;
|
||||
|
||||
import javax.inject.Inject;
|
||||
|
||||
import groovy.lang.Closure;
|
||||
import groovy.lang.DelegatesTo;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.gradle.api.Action;
|
||||
@@ -157,6 +160,8 @@ public class ContractVerifierExtension implements Serializable {
|
||||
|
||||
private ContractRepository contractRepository;
|
||||
|
||||
private PublishStubsToScm publishStubsToScm;
|
||||
|
||||
/**
|
||||
* Dependency that contains packaged contracts
|
||||
*/
|
||||
@@ -236,6 +241,8 @@ public class ContractVerifierExtension implements Serializable {
|
||||
*/
|
||||
private Property<String> sourceSet;
|
||||
|
||||
private final ObjectFactory objects;
|
||||
|
||||
@Inject
|
||||
public ContractVerifierExtension(ProjectLayout layout, ObjectFactory objects) {
|
||||
this.testFramework = objects.property(TestFramework.class).convention(TestFramework.JUNIT5);
|
||||
@@ -258,6 +265,7 @@ public class ContractVerifierExtension implements Serializable {
|
||||
this.failOnNoContracts = objects.property(Boolean.class).convention(true);
|
||||
this.failOnInProgress = objects.property(Boolean.class).convention(true);
|
||||
this.contractRepository = objects.newInstance(ContractRepository.class);
|
||||
this.publishStubsToScm = objects.newInstance(PublishStubsToScm.class);
|
||||
this.contractDependency = objects.newInstance(Dependency.class);
|
||||
this.contractsPath = objects.property(String.class);
|
||||
this.contractsMode = objects.property(StubRunnerProperties.StubsMode.class).convention(StubRunnerProperties.StubsMode.CLASSPATH);
|
||||
@@ -270,6 +278,7 @@ public class ContractVerifierExtension implements Serializable {
|
||||
this.contractsProperties = objects.mapProperty(String.class, String.class).convention(new HashMap<>());
|
||||
this.disableStubPublication = objects.property(Boolean.class).convention(false);
|
||||
this.sourceSet = objects.property(String.class);
|
||||
this.objects = objects;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
@@ -464,6 +473,15 @@ public class ContractVerifierExtension implements Serializable {
|
||||
action.execute(contractRepository);
|
||||
}
|
||||
|
||||
@Nested
|
||||
public PublishStubsToScm getPublishStubsToScm() {
|
||||
return publishStubsToScm;
|
||||
}
|
||||
|
||||
public void publishStubsToScm(Action<PublishStubsToScm> action) {
|
||||
action.execute(publishStubsToScm);
|
||||
}
|
||||
|
||||
public Dependency getContractDependency() {
|
||||
return contractDependency;
|
||||
}
|
||||
@@ -769,12 +787,6 @@ public class ContractVerifierExtension implements Serializable {
|
||||
return proxyPort;
|
||||
}
|
||||
|
||||
// favor unwrapped int
|
||||
@Deprecated
|
||||
public void setProxyPort(Integer proxyPort) {
|
||||
this.proxyPort.set(proxyPort);
|
||||
}
|
||||
|
||||
public void setProxyPort(int proxyPort) {
|
||||
Assert.state(0 < proxyPort && proxyPort <= 65536, "Proxy port should be between 1 and 65536");
|
||||
this.proxyPort.set(proxyPort);
|
||||
@@ -803,4 +815,46 @@ public class ContractVerifierExtension implements Serializable {
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
public static class PublishStubsToScm implements Serializable {
|
||||
|
||||
/**
|
||||
* Dependency that contains packaged contracts
|
||||
*/
|
||||
private Dependency contractDependency;
|
||||
|
||||
private ContractRepository contractRepository;
|
||||
|
||||
@Inject
|
||||
public PublishStubsToScm(ObjectFactory objects) {
|
||||
contractDependency = objects.newInstance(Dependency.class);
|
||||
contractRepository = objects.newInstance(ContractRepository.class);
|
||||
}
|
||||
|
||||
@Nested
|
||||
public Dependency getContractDependency() {
|
||||
return contractDependency;
|
||||
}
|
||||
|
||||
public void contractDependency(Action<Dependency> action) {
|
||||
action.execute(contractDependency);
|
||||
}
|
||||
|
||||
@Nested
|
||||
public ContractRepository getContractRepository() {
|
||||
return contractRepository;
|
||||
}
|
||||
|
||||
public void contractRepository(Action<ContractRepository> action) {
|
||||
action.execute(contractRepository);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PublishStubsToScm{" +
|
||||
"contractDependency=" + contractDependency +
|
||||
", contractRepository=" + contractRepository +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@ class ContractsCopyTask extends DefaultTask {
|
||||
}
|
||||
|
||||
private boolean contractFolderMissing() {
|
||||
contractsDirectory.isPresent() && !contractsDirectory.get().asFile.exists()
|
||||
return contractsDirectory.isPresent() && !contractsDirectory.get().asFile.exists()
|
||||
}
|
||||
|
||||
@Internal
|
||||
@@ -139,6 +139,8 @@ class ContractsCopyTask extends DefaultTask {
|
||||
|
||||
@OutputDirectory
|
||||
DirectoryProperty copiedContractsFolder
|
||||
@OutputDirectory
|
||||
DirectoryProperty stubsOutputDir
|
||||
@Optional
|
||||
@OutputDirectory
|
||||
DirectoryProperty backupContractsFolder
|
||||
@@ -162,7 +164,7 @@ class ContractsCopyTask extends DefaultTask {
|
||||
contractsDirectory = null
|
||||
}
|
||||
logger.info("For project [{}] will use contracts provided in the folder [{}]", project.name, contractsDirectory)
|
||||
final String contractsRepository = config.contractRepository.repositoryUrl.isPresent() ? config.contractRepository.repositoryUrl : ""
|
||||
final String contractsRepository = config.contractRepository.repositoryUrl.isPresent() ? config.contractRepository.repositoryUrl.get() : ""
|
||||
throwExceptionWhenFailOnNoContracts(contractsDirectory, contractsRepository)
|
||||
if (contractsDirectory == null) {
|
||||
logger.info("Contracts directory not set and contracts weren't downloaded. There's nothing to copy")
|
||||
@@ -170,7 +172,7 @@ class ContractsCopyTask extends DefaultTask {
|
||||
}
|
||||
final String slashSeparatedGroupId = project.group.toString().replace(".", File.separator)
|
||||
final String slashSeparatedAntPattern = antPattern.replace(slashSeparatedGroupId, project.group.toString())
|
||||
final File output = config.copiedContractsFolder.get().asFile
|
||||
File output = config.copiedContractsFolder.get().getAsFile()
|
||||
logger.info("Downloading and unpacking files from [${contractsDirectory}] to [$output]. The inclusion ant patterns are [${antPattern}] and [${slashSeparatedAntPattern}]")
|
||||
sync(contractsDirectory, antPattern, slashSeparatedAntPattern, config.excludeBuildFolders.get(), output)
|
||||
if (config.convertToYaml.get()) {
|
||||
@@ -184,6 +186,7 @@ class ContractsCopyTask extends DefaultTask {
|
||||
excludeBuildFolders: extension.excludeBuildFolders,
|
||||
failOnNoContracts: extension.failOnNoContracts,
|
||||
contractsDirectory: extension.contractsDslDir,
|
||||
stubsOutputDir: extension.stubsOutputDir,
|
||||
copiedContractsFolder: createTaskOutput(root, extension.stubsOutputDir, ContractsCopyTask.CONTRACTS, project),
|
||||
backupContractsFolder: createTaskOutput(root, extension.stubsOutputDir, ContractsCopyTask.BACKUP, project),
|
||||
contractDependency: extension.contractDependency,
|
||||
|
||||
@@ -17,14 +17,13 @@
|
||||
package org.springframework.cloud.contract.verifier.plugin
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
import groovy.transform.PackageScope
|
||||
import org.gradle.api.DefaultTask
|
||||
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.Internal
|
||||
import org.gradle.api.tasks.Nested
|
||||
import org.gradle.api.tasks.OutputDirectory
|
||||
import org.gradle.api.tasks.TaskAction
|
||||
@@ -48,12 +47,13 @@ class PublishStubsToScmTask extends DefaultTask {
|
||||
static final String TASK_NAME = 'publishStubsToScm'
|
||||
@Nested
|
||||
Config config
|
||||
private Closure customizationClosure = Closure.IDENTITY
|
||||
|
||||
@CompileStatic
|
||||
static class Config {
|
||||
@Nested
|
||||
final Property<ContractVerifierExtension.ContractRepository> contractRepository
|
||||
@Nested
|
||||
final Property<ContractVerifierExtension.PublishStubsToScm> publishStubsToScm
|
||||
@Input
|
||||
final Property<StubRunnerProperties.StubsMode> contractsMode
|
||||
@Input
|
||||
@@ -64,12 +64,17 @@ class PublishStubsToScmTask extends DefaultTask {
|
||||
final MapProperty<String, String> contractsProperties
|
||||
@OutputDirectory
|
||||
final DirectoryProperty stubsOutputDir
|
||||
@Internal
|
||||
final ObjectFactory objects
|
||||
|
||||
Config(ObjectFactory objects, ContractVerifierExtension extension) {
|
||||
this.objects = objects
|
||||
this.contractRepository = objects.property(ContractVerifierExtension.ContractRepository)
|
||||
this.contractRepository.set(extension.contractRepository);
|
||||
this.contractRepository.set(extension.contractRepository)
|
||||
this.publishStubsToScm = objects.property(ContractVerifierExtension.PublishStubsToScm)
|
||||
this.publishStubsToScm.set(extension.publishStubsToScm)
|
||||
this.contractsMode = objects.property(StubRunnerProperties.StubsMode)
|
||||
this.contractsMode.set(extension.contractsMode);
|
||||
this.contractsMode.set(extension.contractsMode)
|
||||
this.deleteStubsAfterTest = objects.property(Boolean)
|
||||
this.deleteStubsAfterTest.set(extension.failOnNoContracts)
|
||||
this.failOnNoContracts = objects.property(Boolean)
|
||||
@@ -79,32 +84,18 @@ class PublishStubsToScmTask extends DefaultTask {
|
||||
this.stubsOutputDir = objects.directoryProperty()
|
||||
this.stubsOutputDir.set(extension.stubsOutputDir)
|
||||
}
|
||||
|
||||
Config(Property<ContractVerifierExtension.ContractRepository> contractRepository, Property<StubRunnerProperties.StubsMode> contractsMode, Property<Boolean> deleteStubsAfterTest, Property<Boolean> failOnNoContracts, MapProperty<String, String> contractsProperties, DirectoryProperty stubsOutputDir) {
|
||||
this.contractRepository = contractRepository
|
||||
this.contractsMode = contractsMode
|
||||
this.deleteStubsAfterTest = deleteStubsAfterTest
|
||||
this.failOnNoContracts = failOnNoContracts
|
||||
this.contractsProperties = contractsProperties
|
||||
this.stubsOutputDir = stubsOutputDir
|
||||
}
|
||||
|
||||
void contractRepository(@DelegatesTo(ContractVerifierExtension.ContractRepository) Closure closure) {
|
||||
closure.delegate = contractRepository.get()
|
||||
closure.call()
|
||||
}
|
||||
}
|
||||
|
||||
@TaskAction
|
||||
void publishStubsToScm() {
|
||||
applyConfigCustomizations()
|
||||
if (!shouldRun()) {
|
||||
ContractVerifierExtension.ContractRepository repository = merged()
|
||||
if (!shouldRun(repository)) {
|
||||
return
|
||||
}
|
||||
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.get(), config.contractsMode.getOrNull(), config.deleteStubsAfterTest.get(),
|
||||
repository, config.contractsMode.getOrElse(StubRunnerProperties.StubsMode.REMOTE), config.deleteStubsAfterTest.get(),
|
||||
config.contractsProperties.get(), config.failOnNoContracts.get())
|
||||
new ContractProjectUpdater(stubRunnerOptions).updateContractProject(projectName, config.stubsOutputDir.get().asFile.toPath())
|
||||
}
|
||||
@@ -113,8 +104,8 @@ class PublishStubsToScmTask extends DefaultTask {
|
||||
return new Config(objects, extension)
|
||||
}
|
||||
|
||||
private boolean shouldRun() {
|
||||
String contractRepoUrl = config.contractRepository.get().repositoryUrl.getOrNull() ?: ""
|
||||
private boolean shouldRun(ContractVerifierExtension.ContractRepository repository) {
|
||||
String contractRepoUrl = repository.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
|
||||
@@ -122,37 +113,18 @@ class PublishStubsToScmTask extends DefaultTask {
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* Some builds might want to customize this task only, overriding settings from plugin.
|
||||
*/
|
||||
void customize(@DelegatesTo(Config) Closure closure) {
|
||||
customizationClosure = closure
|
||||
}
|
||||
|
||||
private void applyConfigCustomizations() {
|
||||
// Needs to be copied, otherwise properties won't be updated:
|
||||
config.contractRepository.set(copy(config.contractRepository.get(), project.objects))
|
||||
customizationClosure.delegate = config
|
||||
customizationClosure.call()
|
||||
}
|
||||
|
||||
private static ContractVerifierExtension.ContractRepository copy(ContractVerifierExtension.ContractRepository original, ObjectFactory objects) {
|
||||
ContractVerifierExtension.ContractRepository copied = new ContractVerifierExtension.ContractRepository(objects)
|
||||
if (original.repositoryUrl.getOrNull()) {
|
||||
copied.repositoryUrl.set(original.repositoryUrl.get())
|
||||
}
|
||||
if (original.username.getOrNull()) {
|
||||
copied.username.set(original.username.get())
|
||||
}
|
||||
if (original.password.getOrNull()) {
|
||||
copied.password.set(original.password.get())
|
||||
}
|
||||
if (original.proxyPort.getOrNull()) {
|
||||
copied.proxyPort.set(original.proxyPort.get())
|
||||
}
|
||||
if (original.proxyHost.getOrNull()) {
|
||||
copied.proxyHost.set(original.proxyHost.get())
|
||||
private ContractVerifierExtension.ContractRepository merged() {
|
||||
ContractVerifierExtension.ContractRepository original = config.contractRepository.get()
|
||||
ContractVerifierExtension.ContractRepository stubs = config.publishStubsToScm.get().getContractRepository()
|
||||
ContractVerifierExtension.ContractRepository copied = new ContractVerifierExtension.ContractRepository(config.objects)
|
||||
copied.setRepositoryUrl(stubs.getRepositoryUrl().getOrElse(original.getRepositoryUrl().getOrNull()))
|
||||
copied.setUsername(stubs.getUsername().getOrElse(original.getUsername().getOrNull()))
|
||||
copied.setPassword(stubs.getPassword().getOrElse(original.getPassword().getOrNull()))
|
||||
Integer port = stubs.getProxyPort().getOrElse(original.getProxyPort().getOrNull())
|
||||
if (port != null ) {
|
||||
copied.setProxyPort(port)
|
||||
}
|
||||
copied.setProxyHost(stubs.getProxyHost().getOrElse(original.getProxyHost().getOrNull()))
|
||||
return copied
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user