Skip to content

Commit

Permalink
[feat] Allow configuration of yaml minimize quotes (#5933)
Browse files Browse the repository at this point in the history
There are cases where minimizing quotes results in invalid YAML. For
example, an input YAML with string "1234_1234" will be converted to YAML
value 1234_1234 which is an int in YAML 1.1
(https://yaml.org/type/int.html)

THe only option in these cases is to either:

* Revert the option completely to always quote values
* Provide a user-customization to disable quotes minimization

This applies the latter with the assumption that this is an edge case
and users who are unaffected will default to the "prettier" version.

An alternative would be to write a custom serializer for strings, and if
they are in the format of of any of the valid formats defined in YAML:

[-+]?0b[0-1_]+ # (base 2)
|[-+]?0[0-7_]+ # (base 8)
|[-+]?(0|[1-9][0-9_]*) # (base 10)
|[-+]?0x[0-9a-fA-F_]+ # (base 16)
|[-+]?[1-9][0-9_]*(:[0-5]?[0-9])+ # (base 60)

Then wrap the result in quotes. That approach was not taken because of
the potential for significant performance impact on very large specs,
which our users are often tasked with transforming.
  • Loading branch information
jimschubert authored Apr 28, 2020
1 parent 6f9d825 commit f12fb86
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,7 @@ public Map<String, Object> postProcessSupportingFileData(Map<String, Object> obj
}
}

generateJSONSpecFile(objs);
generateYAMLSpecFile(objs);

for (Map<String, Object> operations : getOperations(objs)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,38 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import io.swagger.v3.core.util.Yaml;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import io.swagger.v3.core.util.Json;
import io.swagger.v3.core.util.Yaml;
import io.swagger.v3.oas.models.OpenAPI;
import org.openapitools.codegen.config.GlobalSettings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SerializerUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(SerializerUtils.class);
private static final String YAML_MINIMIZE_QUOTES_PROPERTY = "org.openapitools.codegen.utils.yaml.minimize.quotes";
private static final boolean minimizeYamlQuotes = Boolean.parseBoolean(GlobalSettings.getProperty(YAML_MINIMIZE_QUOTES_PROPERTY, "true"));

public static String toYamlString(OpenAPI openAPI) {
if(openAPI == null) {
if (openAPI == null) {
return null;
}
SimpleModule module = createModule();
try {
return Yaml.mapper()
.copy()
.registerModule(module)
ObjectMapper yamlMapper = Yaml.mapper().copy();
// there is an unfortunate YAML condition where user inputs should be treated as strings (e.g. "1234_1234"), but in yaml this is a valid number and
// removing quotes forcibly by default means we are potentially doing a data conversion resulting in an unexpected change to the user's YAML outputs.
// We may allow for property-based enable/disable, retaining the default of enabled for backward compatibility.
if (minimizeYamlQuotes) {
((YAMLFactory) yamlMapper.getFactory()).enable(YAMLGenerator.Feature.MINIMIZE_QUOTES);
} else {
((YAMLFactory) yamlMapper.getFactory()).disable(YAMLGenerator.Feature.MINIMIZE_QUOTES);
}
return yamlMapper.registerModule(module)
.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true)
.writeValueAsString(openAPI)
.replace("\r\n", "\n");
Expand All @@ -34,7 +47,7 @@ public static String toJsonString(OpenAPI openAPI) {
if (openAPI == null) {
return null;
}

SimpleModule module = createModule();
try {
return Json.mapper()
Expand Down

0 comments on commit f12fb86

Please sign in to comment.