Generate stubs at runtime (#1152)
* Generate stubs at runtime without this change the producer side must publish the stubs for the consumer side to use them with this change the consumer can toggle a switch so that the stubs get generated at runtime. This might of course lead to false positivies but we assume that the users know what they're doing fixes gh-881
This commit is contained in:
committed by
GitHub
parent
d97db26001
commit
dbb1af8d98
@@ -1,54 +0,0 @@
|
||||
/*
|
||||
* Copyright 2013-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.cloud.contract.verifier.converter
|
||||
|
||||
import groovy.transform.CompileStatic
|
||||
|
||||
import org.springframework.cloud.contract.spec.Contract
|
||||
import org.springframework.cloud.contract.verifier.file.ContractMetadata
|
||||
|
||||
/**
|
||||
* Converts contracts into their stub representation.
|
||||
*
|
||||
* @since 1.1.0
|
||||
*/
|
||||
@CompileStatic
|
||||
interface StubGenerator {
|
||||
|
||||
/**
|
||||
* @return {@code true} if the converter can handle the file to convert it into a stub.
|
||||
*/
|
||||
boolean canHandleFileName(String fileName)
|
||||
|
||||
/**
|
||||
* @return the collection of converted contracts into stubs. One contract can
|
||||
* result in multiple stubs.
|
||||
*/
|
||||
Map<Contract, String> convertContents(String rootName, ContractMetadata content)
|
||||
|
||||
/**
|
||||
* @return the name of the converted stub file. If you have multiple contracts
|
||||
* in a single file then a prefix will be added to the generated file. If you
|
||||
* provide the {@link Contract#name} field then that field will override the
|
||||
* generated file name.
|
||||
*
|
||||
* Example: name of file with 2 contracts is {@code foo.groovy}, it will be
|
||||
* converted by the implementation to {@code foo.json}. The recursive file
|
||||
* converter will create two files {@code 0_foo.json} and {@code 1_foo.json}
|
||||
*/
|
||||
String generateOutputFileNameForInput(String inputFileName)
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright 2013-2019 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.cloud.contract.verifier.converter;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import org.springframework.cloud.contract.spec.Contract;
|
||||
import org.springframework.cloud.contract.verifier.file.ContractMetadata;
|
||||
|
||||
/**
|
||||
* Converts contracts into their stub representation.
|
||||
*
|
||||
* @since 1.1.0
|
||||
*/
|
||||
public interface StubGenerator {
|
||||
|
||||
/**
|
||||
* @param fileName - file name
|
||||
* @return {@code true} if the converter can handle the file to convert it into a
|
||||
* stub.
|
||||
*/
|
||||
default boolean canHandleFileName(String fileName) {
|
||||
return fileName.endsWith(fileExtension());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param rootName - root name of the contract
|
||||
* @param content - metadata of the contract
|
||||
* @return the collection of converted contracts into stubs. One contract can result
|
||||
* in multiple stubs.
|
||||
*/
|
||||
Map<Contract, String> convertContents(String rootName, ContractMetadata content);
|
||||
|
||||
/**
|
||||
* @param inputFileName - name of the input file
|
||||
* @return the name of the converted stub file. If you have multiple contracts in a
|
||||
* single file then a prefix will be added to the generated file. If you provide the
|
||||
* {@link Contract#name} field then that field will override the generated file name.
|
||||
*
|
||||
* Example: name of file with 2 contracts is {@code foo.groovy}, it will be converted
|
||||
* by the implementation to {@code foo.json}. The recursive file converter will create
|
||||
* two files {@code 0_foo.json} and {@code 1_foo.json}
|
||||
*/
|
||||
String generateOutputFileNameForInput(String inputFileName);
|
||||
|
||||
/**
|
||||
* Describes the file extension that this stub generator can handle.
|
||||
* @return string describing the file extension
|
||||
*/
|
||||
default String fileExtension() {
|
||||
return ".json";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -28,11 +28,6 @@ import org.springframework.cloud.contract.verifier.converter.StubGenerator
|
||||
@CompileStatic
|
||||
abstract class DslToWireMockConverter implements StubGenerator {
|
||||
|
||||
@Override
|
||||
boolean canHandleFileName(String fileName) {
|
||||
return fileName.endsWith('.groovy')
|
||||
}
|
||||
|
||||
@Override
|
||||
String generateOutputFileNameForInput(String inputFileName) {
|
||||
return inputFileName.replaceAll(extension(inputFileName), 'json')
|
||||
|
||||
@@ -38,10 +38,10 @@ import org.springframework.cloud.contract.verifier.converter.RecursiveFilesConve
|
||||
import org.springframework.cloud.contract.verifier.converter.ToYamlConverter;
|
||||
|
||||
/**
|
||||
* Convert Spring Cloud Contract Verifier contracts into WireMock stubs mappings.
|
||||
* Convert Spring Cloud Contract Verifier contracts into stubs mappings.
|
||||
* <p>
|
||||
* This goal allows you to generate `stubs-jar` or execute `spring-cloud-contract:run`
|
||||
* with generated WireMock mappings.
|
||||
* with generated mappings.
|
||||
*
|
||||
* @author Mariusz Smykula
|
||||
*/
|
||||
|
||||
@@ -47,9 +47,6 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import org.springframework.cloud.contract.spec.Contract;
|
||||
import org.springframework.cloud.contract.stubrunner.spring.StubRunnerProperties;
|
||||
import org.springframework.cloud.contract.verifier.converter.StubGenerator;
|
||||
import org.springframework.cloud.contract.verifier.converter.StubGeneratorProvider;
|
||||
import org.springframework.cloud.contract.verifier.file.ContractMetadata;
|
||||
import org.springframework.cloud.contract.verifier.spec.pact.PactContractConverter;
|
||||
import org.springframework.core.io.AbstractResource;
|
||||
import org.springframework.core.io.Resource;
|
||||
@@ -216,32 +213,16 @@ class PactStubDownloader implements StubDownloader {
|
||||
log.debug("Converted pact file [" + file + "] to [" + contracts.size()
|
||||
+ "] contracts");
|
||||
}
|
||||
StubGeneratorProvider provider = new StubGeneratorProvider();
|
||||
Collection<StubGenerator> stubGenerators = provider
|
||||
.converterForName(ARTIFICIAL_NAME_ENDING_WITH_GROOVY);
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Found following matching stub generators " + stubGenerators);
|
||||
}
|
||||
for (StubGenerator stubGenerator : stubGenerators) {
|
||||
Map<Contract, String> map = stubGenerator.convertContents(file.getName(),
|
||||
new ContractMetadata(file.toPath(), false, contracts.size(), null,
|
||||
contracts));
|
||||
for (Map.Entry<Contract, String> entry : map.entrySet()) {
|
||||
String value = entry.getValue();
|
||||
File mapping = new File(mappingsFolder,
|
||||
StringUtils.stripFilenameExtension(file.getName()) + "_"
|
||||
+ Math.abs(entry.getKey().hashCode()) + ".json");
|
||||
storeFile(mapping.toPath(), value.getBytes());
|
||||
}
|
||||
}
|
||||
MappingGenerator.toMappings(file, contracts, mappingsFolder);
|
||||
}
|
||||
|
||||
private void storeFile(Path path, byte[] contents) {
|
||||
private Path storeFile(Path path, byte[] contents) {
|
||||
try {
|
||||
Files.write(path, contents);
|
||||
Path storedPath = Files.write(path, contents);
|
||||
if (log.isDebugEnabled()) {
|
||||
log.debug("Stored file [" + path.toString() + "]");
|
||||
}
|
||||
return storedPath;
|
||||
}
|
||||
catch (IOException e) {
|
||||
throw new IllegalStateException(e);
|
||||
|
||||
Reference in New Issue
Block a user