Remove deprecated MockDefaultGenerator (#18857)

* Make DryRunStatus path field final

* Add templateData capture functionality to DryRunTemplateManager

* Replace MockDefaultGenerator with DryRunTemplateManager captures

* Remove MockDefaultGenerator
This commit is contained in:
Philzen
2024-06-05 11:10:17 +02:00
committed by GitHub
parent 2fcf825e19
commit 446e168f43
5 changed files with 90 additions and 191 deletions

View File

@@ -16,7 +16,7 @@ import java.util.Locale;
*
* @return a {@link Path} instance
*/
private Path path;
private final Path path;
/**
* -- GETTER --
* Gets the

View File

@@ -18,6 +18,9 @@ import java.util.Map;
public class DryRunTemplateManager implements TemplateProcessor {
private final TemplateManagerOptions options;
private final Map<String, DryRunStatus> dryRunStatusMap = new HashMap<>();
private final Map<String, Map<String, Object>> capturedTemplateData = new HashMap<>();
private boolean recordTemplateData = false;
/**
* Constructs a new instance of {@link DryRunTemplateManager} for the provided options
@@ -47,6 +50,9 @@ public class DryRunTemplateManager implements TemplateProcessor {
*/
@Override
public File write(Map<String, Object> data, String template, File target) throws IOException {
if (recordTemplateData) {
this.capturedTemplateData.put(target.getAbsolutePath(), data);
}
return writeToFile(target.getAbsolutePath(), "dummy".getBytes(StandardCharsets.UTF_8));
}
@@ -101,4 +107,25 @@ public class DryRunTemplateManager implements TemplateProcessor {
public void error(Path path, String context) {
dryRunStatusMap.put(path.toString(), new DryRunStatus(path, DryRunStatus.State.Error, context));
}
/**
* Enable capturing of data being passed to the files as they are being written.<br>
* Call this method <b><u>before</u></b> calling {@link Generator#generate()}.
*/
public DryRunTemplateManager enableTemplateDataCapturing() {
recordTemplateData = true;
return this;
}
/**
* Retrieve the captured template data for a specific file. Capturing must have
* been enabled via {@link #enableTemplateDataCapturing()} prior to generation.<br>
* Note: Not all files have template data (e.g. Metadata files) in such case an empty
* map is returned.
* @param generatedFile An absolute path to the generated file
* @return Typically one of the *Map types found in {@link org.openapitools.codegen.model}
*/
public Map<String, Object> getCapturedTemplateData(Path generatedFile) {
return capturedTemplateData.getOrDefault(generatedFile.toString(), Map.of());
}
}

View File

@@ -1,107 +0,0 @@
/*
* Copyright 2018 OpenAPI-Generator Contributors (https://openapi-generator.tech)
*
* 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.openapitools.codegen;
import lombok.Getter;
import org.openapitools.codegen.templating.TemplateManagerOptions;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Decorates {@link DefaultCodegen and tracks some internal calls}.
*
* @deprecated Please avoid using this type, as it is not a mock and invokes real generation. Prefer {@link DefaultGenerator#DefaultGenerator(Boolean)} with dryRun=true and/or true mocked spies.
*/
@Getter @Deprecated
public class MockDefaultGenerator extends DefaultGenerator {
// public static final String INPUT_STREAM_CONTENT = "INPUT STREAM CONTENT";
private List<WrittenTemplateBasedFile> templateBasedFiles = new ArrayList<>();
private Map<String, String> files = new HashMap<>();
public MockDefaultGenerator() {
super(true);
}
public MockDefaultGenerator(boolean dryRun) {
super(dryRun);
}
@Override
public Generator opts(ClientOptInput opts) {
Generator o = super.opts(opts);
TemplateManagerOptions templateManagerOptions = new TemplateManagerOptions(this.config.isEnableMinimalUpdate(),this.config.isSkipOverwrite());
this.templateProcessor = new ObservableDryRunTemplateManager(templateManagerOptions);
return o;
}
@Getter public static class WrittenTemplateBasedFile {
private Map<String, Object> templateData;
private String templateName;
private String outputFilename;
public WrittenTemplateBasedFile(Map<String, Object> templateData, String templateName, String outputFilename) {
this.templateData = templateData;
this.templateName = templateName;
this.outputFilename = outputFilename;
}
@Override
public String toString() {
return "WrittenTemplateBasedFile [" +
"outputFilename=" + outputFilename + ", " +
"templateName=" + templateName + ", " +
"templateData=" + templateData + "]";
}
}
class ObservableDryRunTemplateManager extends DryRunTemplateManager {
public ObservableDryRunTemplateManager(TemplateManagerOptions options) {
super(options);
}
private String normalizePath(String filename) {
return filename.replace("\\", "/").replace("//", "/");
}
@Override
public File write(Map<String, Object> data, String template, File target) throws IOException {
String filename = normalizePath(target.toPath().normalize().toString());
templateBasedFiles.add(new WrittenTemplateBasedFile(data, template, filename));
File file = super.write(data, template, target);
if (file != null && file.exists()) {
byte[] contents = Files.readAllBytes(file.toPath());
files.put(normalizePath(filename), new String(contents, StandardCharsets.UTF_8));
}
return file;
}
@Override
public File writeToFile(String filename, byte[] contents) throws IOException {
files.put(normalizePath(filename), new String(contents, StandardCharsets.UTF_8));
return super.writeToFile(filename, contents);
}
}
}

View File

@@ -15,12 +15,10 @@ import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.servers.Server;
import io.swagger.v3.parser.core.models.ParseOptions;
import org.openapitools.codegen.MockDefaultGenerator.WrittenTemplateBasedFile;
import org.openapitools.codegen.java.assertions.JavaFileAssert;
import org.openapitools.codegen.model.ModelMap;
import org.openapitools.codegen.model.ModelsMap;
import org.openapitools.codegen.utils.ModelUtils;
import org.testng.Assert;
import java.io.File;
import java.io.IOException;
@@ -95,24 +93,6 @@ public class TestUtils {
return openAPI;
}
/**
* Extract file from {@link MockDefaultGenerator}
*
* @param generator Generator
* @param root root path
* @param filename filename under root
*
* @return a {@link WrittenTemplateBasedFile}
* @deprecated Since 5.0. Please avoid this method and usage of {@link MockDefaultGenerator}, prefer {@link DefaultGenerator#DefaultGenerator(Boolean)} with dryRun=true.
*/
@Deprecated
public static WrittenTemplateBasedFile getTemplateBasedFile(MockDefaultGenerator generator, File root, String filename) {
String defaultApiFilename = new File(root, filename).getAbsolutePath().replace("\\", "/");
Optional<WrittenTemplateBasedFile> optional = generator.getTemplateBasedFiles().stream().filter(f -> defaultApiFilename.equals(f.getOutputFilename())).findFirst();
Assert.assertTrue(optional.isPresent());
return optional.get();
}
public static void ensureContainsFile(List<File> generatedFiles, File root, String filename) {
Path path = root.toPath().resolve(filename);
assertTrue(generatedFiles.contains(path.toFile()), "File '" + path.toAbsolutePath() + "' was not found in the list of generated files");

View File

@@ -4,12 +4,7 @@ import io.swagger.parser.OpenAPIParser;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.parser.core.models.ParseOptions;
import org.openapitools.codegen.ClientOptInput;
import org.openapitools.codegen.CodegenOperation;
import org.openapitools.codegen.CodegenConstants;
import org.openapitools.codegen.DefaultGenerator;
import org.openapitools.codegen.MockDefaultGenerator;
import org.openapitools.codegen.TestUtils;
import org.openapitools.codegen.*;
import org.openapitools.codegen.java.assertions.JavaFileAssert;
import org.openapitools.codegen.languages.AbstractJavaJAXRSServerCodegen;
import org.openapitools.codegen.languages.features.CXFServerFeatures;
@@ -147,51 +142,53 @@ public abstract class JavaJaxrsBaseTest {
codegen.setUseTags(true);
codegen.setOutputDir(output.getAbsolutePath());
MockDefaultGenerator generator = new MockDefaultGenerator();
generator.opts(new ClientOptInput().openAPI(openAPI).config(codegen)).generate();
DefaultGenerator generator = new DefaultGenerator(true);
generator.opts(new ClientOptInput().openAPI(openAPI).config(codegen));
var dryRunTMan = ((DryRunTemplateManager) generator.getTemplateProcessor()).enableTemplateDataCapturing();
generator.generate();
MockDefaultGenerator.WrittenTemplateBasedFile tag0File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/Tag0Api.java");
Assert.assertEquals(tag0File.getTemplateData().get("baseName"), "Tag0");
Assert.assertEquals(tag0File.getTemplateData().get("commonPath"), "");
List<CodegenOperation> tag0 = getOperationsList(tag0File.getTemplateData());
final var tag0ApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/Tag0Api.java"));
Assert.assertEquals(tag0ApiTemplateData.get("baseName"), "Tag0");
Assert.assertEquals(tag0ApiTemplateData.get("commonPath"), "");
List<CodegenOperation> tag0 = getOperationsList(tag0ApiTemplateData);
Assert.assertEquals(tag0.size(), 2);
assertOperation(tag0.get(0), "Tag0", "/", false);
assertOperation(tag0.get(1), "Tag0", "/{id}", true);
MockDefaultGenerator.WrittenTemplateBasedFile tag1File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/Tag1Api.java");
Assert.assertEquals(tag1File.getTemplateData().get("baseName"), "Tag1");
Assert.assertEquals(tag1File.getTemplateData().get("commonPath"), "/group1/op1");
List<CodegenOperation> tag1 = getOperationsList(tag1File.getTemplateData());
final var tag1ApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/Tag1Api.java"));
Assert.assertEquals(tag1ApiTemplateData.get("baseName"), "Tag1");
Assert.assertEquals(tag1ApiTemplateData.get("commonPath"), "/group1/op1");
List<CodegenOperation> tag1 = getOperationsList(tag1ApiTemplateData);
Assert.assertEquals(tag1.size(), 1);
assertOperation(tag1.get(0), "Tag1", "", false);
MockDefaultGenerator.WrittenTemplateBasedFile tag2File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/Tag2Api.java");
Assert.assertEquals(tag2File.getTemplateData().get("baseName"), "Tag2");
Assert.assertEquals(tag2File.getTemplateData().get("commonPath"), "");
List<CodegenOperation> tag2 = getOperationsList(tag2File.getTemplateData());
final var tag2ApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/Tag2Api.java"));
Assert.assertEquals(tag2ApiTemplateData.get("baseName"), "Tag2");
Assert.assertEquals(tag2ApiTemplateData.get("commonPath"), "");
List<CodegenOperation> tag2 = getOperationsList(tag2ApiTemplateData);
Assert.assertEquals(tag2.size(), 2);
assertOperation(tag2.get(0), "Tag2", "/group1/op2", true);
assertOperation(tag2.get(1), "Tag2", "/group2/op3", true);
MockDefaultGenerator.WrittenTemplateBasedFile defaultFile = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/DefaultApi.java");
Assert.assertEquals(defaultFile.getTemplateData().get("baseName"), "Default");
Assert.assertEquals(defaultFile.getTemplateData().get("commonPath"), "/group3/op4");
List<CodegenOperation> noTag = getOperationsList(defaultFile.getTemplateData());
final var defaultApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/DefaultApi.java"));
Assert.assertEquals(defaultApiTemplateData.get("baseName"), "Default");
Assert.assertEquals(defaultApiTemplateData.get("commonPath"), "/group3/op4");
List<CodegenOperation> noTag = getOperationsList(defaultApiTemplateData);
Assert.assertEquals(noTag.size(), 1);
assertOperation(noTag.get(0), "Default", "", false);
MockDefaultGenerator.WrittenTemplateBasedFile group4File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/Group4Api.java");
Assert.assertEquals(group4File.getTemplateData().get("baseName"), "Group4");
Assert.assertEquals(group4File.getTemplateData().get("commonPath"), "/group4");
List<CodegenOperation> group4 = getOperationsList(group4File.getTemplateData());
final var group4ApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/Group4Api.java"));
Assert.assertEquals(group4ApiTemplateData.get("baseName"), "Group4");
Assert.assertEquals(group4ApiTemplateData.get("commonPath"), "/group4");
List<CodegenOperation> group4 = getOperationsList(group4ApiTemplateData);
Assert.assertEquals(group4.size(), 2);
assertOperation(group4.get(0), "Group4", "/op5", true);
assertOperation(group4.get(1), "Group4", "/op6", true);
MockDefaultGenerator.WrittenTemplateBasedFile group5File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/Group5Api.java");
Assert.assertEquals(group5File.getTemplateData().get("baseName"), "Group5");
Assert.assertEquals(group5File.getTemplateData().get("commonPath"), "");
List<CodegenOperation> group5 = getOperationsList(group5File.getTemplateData());
final var group5ApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/Group5Api.java"));
Assert.assertEquals(group5ApiTemplateData.get("baseName"), "Group5");
Assert.assertEquals(group5ApiTemplateData.get("commonPath"), "");
List<CodegenOperation> group5 = getOperationsList(group5ApiTemplateData);
Assert.assertEquals(group5.size(), 2);
assertOperation(group5.get(0), "Group5", "/group5/op7", true);
assertOperation(group5.get(1), "Group5", "/group6/op8", true);
@@ -206,58 +203,60 @@ public abstract class JavaJaxrsBaseTest {
codegen.setUseTags(false);
codegen.setOutputDir(output.getAbsolutePath());
MockDefaultGenerator generator = new MockDefaultGenerator();
generator.opts(new ClientOptInput().openAPI(openAPI).config(codegen)).generate();
DefaultGenerator generator = new DefaultGenerator(true);
generator.opts(new ClientOptInput().openAPI(openAPI).config(codegen));
var dryRunTMan = ((DryRunTemplateManager) generator.getTemplateProcessor()).enableTemplateDataCapturing();
generator.generate();
MockDefaultGenerator.WrittenTemplateBasedFile tag0File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/DefaultApi.java");
Assert.assertEquals(tag0File.getTemplateData().get("baseName"), "default");
Assert.assertEquals(tag0File.getTemplateData().get("commonPath"), "");
List<CodegenOperation> tag0 = getOperationsList(tag0File.getTemplateData());
final var defaultApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/DefaultApi.java"));
Assert.assertEquals(defaultApiTemplateData.get("baseName"), "default");
Assert.assertEquals(defaultApiTemplateData.get("commonPath"), "");
List<CodegenOperation> tag0 = getOperationsList(defaultApiTemplateData);
Assert.assertEquals(tag0.size(), 2);
assertOperation(tag0.get(0), "default", "/", false);
assertOperation(tag0.get(1), "default", "/{id}", true);
MockDefaultGenerator.WrittenTemplateBasedFile group1File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/Group1Api.java");
Assert.assertEquals(group1File.getTemplateData().get("baseName"), "group1");
Assert.assertEquals(group1File.getTemplateData().get("commonPath"), "/group1");
List<CodegenOperation> group1 = getOperationsList(group1File.getTemplateData());
final var group1ApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/Group1Api.java"));
Assert.assertEquals(group1ApiTemplateData.get("baseName"), "group1");
Assert.assertEquals(group1ApiTemplateData.get("commonPath"), "/group1");
List<CodegenOperation> group1 = getOperationsList(group1ApiTemplateData);
Assert.assertEquals(group1.size(), 2);
assertOperation(group1.get(0), "group1", "/op1", true);
assertOperation(group1.get(1), "group1", "/op2", true);
MockDefaultGenerator.WrittenTemplateBasedFile group2File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/Group2Api.java");
Assert.assertEquals(group2File.getTemplateData().get("baseName"), "group2");
Assert.assertEquals(group2File.getTemplateData().get("commonPath"), "/group2/op3");
List<CodegenOperation> group2 = getOperationsList(group2File.getTemplateData());
final var group2ApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/Group2Api.java"));
Assert.assertEquals(group2ApiTemplateData.get("baseName"), "group2");
Assert.assertEquals(group2ApiTemplateData.get("commonPath"), "/group2/op3");
List<CodegenOperation> group2 = getOperationsList(group2ApiTemplateData);
Assert.assertEquals(group2.size(), 1);
assertOperation(group2.get(0), "group2", "", false);
MockDefaultGenerator.WrittenTemplateBasedFile group3File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/Group3Api.java");
Assert.assertEquals(group3File.getTemplateData().get("baseName"), "group3");
Assert.assertEquals(group3File.getTemplateData().get("commonPath"), "/group3/op4");
List<CodegenOperation> group3 = getOperationsList(group3File.getTemplateData());
final var group3ApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/Group3Api.java"));
Assert.assertEquals(group3ApiTemplateData.get("baseName"), "group3");
Assert.assertEquals(group3ApiTemplateData.get("commonPath"), "/group3/op4");
List<CodegenOperation> group3 = getOperationsList(group3ApiTemplateData);
Assert.assertEquals(group3.size(), 1);
assertOperation(group3.get(0), "group3", "", false);
MockDefaultGenerator.WrittenTemplateBasedFile group4File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/Group4Api.java");
Assert.assertEquals(group4File.getTemplateData().get("baseName"), "group4");
Assert.assertEquals(group4File.getTemplateData().get("commonPath"), "/group4");
List<CodegenOperation> group4 = getOperationsList(group4File.getTemplateData());
final var group4ApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/Group4Api.java"));
Assert.assertEquals(group4ApiTemplateData.get("baseName"), "group4");
Assert.assertEquals(group4ApiTemplateData.get("commonPath"), "/group4");
List<CodegenOperation> group4 = getOperationsList(group4ApiTemplateData);
Assert.assertEquals(group4.size(), 2);
assertOperation(group4.get(0), "group4", "/op5", true);
assertOperation(group4.get(1), "group4", "/op6", true);
MockDefaultGenerator.WrittenTemplateBasedFile group5File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/Group5Api.java");
Assert.assertEquals(group5File.getTemplateData().get("baseName"), "group5");
Assert.assertEquals(group5File.getTemplateData().get("commonPath"), "/group5/op7");
List<CodegenOperation> group5 = getOperationsList(group5File.getTemplateData());
final var group5ApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/Group5Api.java"));
Assert.assertEquals(group5ApiTemplateData.get("baseName"), "group5");
Assert.assertEquals(group5ApiTemplateData.get("commonPath"), "/group5/op7");
List<CodegenOperation> group5 = getOperationsList(group5ApiTemplateData);
Assert.assertEquals(group5.size(), 1);
assertOperation(group5.get(0), "group5", "", false);
MockDefaultGenerator.WrittenTemplateBasedFile group6File = TestUtils.getTemplateBasedFile(generator, output, "src/gen/java/org/openapitools/api/Group6Api.java");
Assert.assertEquals(group6File.getTemplateData().get("baseName"), "group6");
Assert.assertEquals(group6File.getTemplateData().get("commonPath"), "/group6/op8");
List<CodegenOperation> group6 = getOperationsList(group6File.getTemplateData());
final var group6ApiTemplateData = dryRunTMan.getCapturedTemplateData(output.toPath().resolve("src/gen/java/org/openapitools/api/Group6Api.java"));
Assert.assertEquals(group6ApiTemplateData.get("baseName"), "group6");
Assert.assertEquals(group6ApiTemplateData.get("commonPath"), "/group6/op8");
List<CodegenOperation> group6 = getOperationsList(group6ApiTemplateData);
Assert.assertEquals(group6.size(), 1);
assertOperation(group6.get(0), "group6", "", false);
}