diff --git a/src/Microsoft.OpenApi.YamlReader/Microsoft.OpenApi.YamlReader.csproj b/src/Microsoft.OpenApi.YamlReader/Microsoft.OpenApi.YamlReader.csproj index c836548aa..1f2f5fb36 100644 --- a/src/Microsoft.OpenApi.YamlReader/Microsoft.OpenApi.YamlReader.csproj +++ b/src/Microsoft.OpenApi.YamlReader/Microsoft.OpenApi.YamlReader.csproj @@ -33,7 +33,7 @@ all - + diff --git a/src/Microsoft.OpenApi.YamlReader/YamlConverter.cs b/src/Microsoft.OpenApi.YamlReader/YamlConverter.cs index d76cf8ec8..5acf0c007 100644 --- a/src/Microsoft.OpenApi.YamlReader/YamlConverter.cs +++ b/src/Microsoft.OpenApi.YamlReader/YamlConverter.cs @@ -151,10 +151,19 @@ private static YamlScalarNode ToYamlScalar(this JsonValue val) // Strings that look like numbers, booleans, or null need to be quoted // to preserve their string type when round-tripping var needsQuoting = NeedsQuoting(stringValue); + + var containsNewLine = stringValue.Contains('\n'); + + var style = (needsQuoting, containsNewLine) switch + { + (true, _) => ScalarStyle.DoubleQuoted, + (false, true) => ScalarStyle.Literal, + (false, false) => ScalarStyle.Plain + }; return new YamlScalarNode(stringValue) { - Style = needsQuoting ? ScalarStyle.DoubleQuoted : ScalarStyle.Plain + Style = style }; } diff --git a/test/Microsoft.OpenApi.Readers.Tests/YamlConverterTests.cs b/test/Microsoft.OpenApi.Readers.Tests/YamlConverterTests.cs index 9fa456bab..70073bfaa 100644 --- a/test/Microsoft.OpenApi.Readers.Tests/YamlConverterTests.cs +++ b/test/Microsoft.OpenApi.Readers.Tests/YamlConverterTests.cs @@ -282,6 +282,31 @@ public void BooleanPropertyNamesShouldRemainStringsFromYaml() // Then Assert.Equal(yamlInput.MakeLineBreaksEnvironmentNeutral(), convertedBackOutput.MakeLineBreaksEnvironmentNeutral()); } + + [Fact] + public void LineBreaksShouldRoundTrip() + { + var yamlInput = + """ + python: |- + from openai import OpenAI + + client = OpenAI( + api_key="My API Key", + ) + page = client.beta.assistants.list() + page = page.data[0] + print(page.id) + """; + // When + var jsonNode = ConvertYamlStringToJsonNode(yamlInput); + var convertedBack = jsonNode.ToYamlNode(); + var convertedBackOutput = ConvertYamlNodeToString(convertedBack); + + // Then + Assert.Equal(yamlInput.MakeLineBreaksEnvironmentNeutral(), convertedBackOutput.MakeLineBreaksEnvironmentNeutral()); + } + private static JsonNode ConvertYamlStringToJsonNode(string yamlInput) { var yamlDocument = new YamlStream();