Skip to content

Commit 234504c

Browse files
committed
fix: an issue where numeric property names would be missing quotes in yaml conversion
Signed-off-by: Vincent Biret <[email protected]>
1 parent 537dc98 commit 234504c

File tree

2 files changed

+56
-4
lines changed

2 files changed

+56
-4
lines changed

src/Microsoft.OpenApi.YamlReader/YamlConverter.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,10 @@ public static JsonObject ToJsonObject(this YamlMappingNode yaml)
8787

8888
private static YamlMappingNode ToYamlMapping(this JsonObject obj)
8989
{
90-
return new YamlMappingNode(obj.ToDictionary(x => (YamlNode)new YamlScalarNode(x.Key), x => x.Value!.ToYamlNode()));
90+
return new YamlMappingNode(obj.ToDictionary(x => (YamlNode)new YamlScalarNode(x.Key)
91+
{
92+
Style = double.TryParse(x.Key, out _) ? ScalarStyle.DoubleQuoted : ScalarStyle.Plain
93+
}, x => x.Value!.ToYamlNode()));
9194
}
9295

9396
/// <summary>

test/Microsoft.OpenApi.Readers.Tests/YamlConverterTests.cs

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Microsoft.OpenApi.YamlReader;
1+
using Microsoft.OpenApi.Tests;
2+
using Microsoft.OpenApi.YamlReader;
23
using SharpYaml;
34
using SharpYaml.Serialization;
45
using System.IO;
@@ -225,12 +226,60 @@ public void ToYamlNode_StringWithLineBreaks_PreservesLineBreaks()
225226
Assert.Contains("\n", roundTripDescription);
226227
}
227228

229+
[Fact]
230+
public void NumericPropertyNamesShouldRemainStringsFromJson()
231+
{
232+
// Given
233+
var yamlInput =
234+
"""
235+
"123": value1
236+
"456": value2
237+
""";
238+
239+
// Given
240+
var jsonNode = Assert.IsType<JsonObject>(JsonNode.Parse(@"{
241+
""123"": ""value1"",
242+
""456"": ""value2""
243+
}"));
244+
245+
// When
246+
var convertedBack = jsonNode.ToYamlNode();
247+
var convertedBackOutput = ConvertYamlNodeToString(convertedBack);
248+
249+
// Then
250+
Assert.Equal(yamlInput.MakeLineBreaksEnvironmentNeutral(), convertedBackOutput.MakeLineBreaksEnvironmentNeutral());
251+
}
252+
253+
[Fact]
254+
public void NumericPropertyNamesShouldRemainStringsFromYaml()
255+
{
256+
// Given
257+
var yamlInput =
258+
"""
259+
"123": value1
260+
"456": value2
261+
""";
262+
263+
var yamlDocument = new YamlStream();
264+
using var sr = new StringReader(yamlInput);
265+
yamlDocument.Load(sr);
266+
var yamlRoot = yamlDocument.Documents[0].RootNode;
267+
// When
268+
269+
var jsonNode = yamlRoot.ToJsonNode();
270+
271+
var convertedBack = jsonNode.ToYamlNode();
272+
var convertedBackOutput = ConvertYamlNodeToString(convertedBack);
273+
// Then
274+
Assert.Equal(yamlInput.MakeLineBreaksEnvironmentNeutral(), convertedBackOutput.MakeLineBreaksEnvironmentNeutral());
275+
}
276+
228277
private static string ConvertYamlNodeToString(YamlNode yamlNode)
229278
{
230279
using var ms = new MemoryStream();
231-
var yamlStream = new YamlStream(new YamlDocument(yamlNode));
280+
var document = new YamlStream(new YamlDocument(yamlNode));
232281
var writer = new StreamWriter(ms);
233-
yamlStream.Save(writer);
282+
document.Save(writer, isLastDocumentEndImplicit: true);
234283
writer.Flush();
235284
ms.Seek(0, SeekOrigin.Begin);
236285
var reader = new StreamReader(ms);

0 commit comments

Comments
 (0)