Skip to content

Commit 78b0154

Browse files
authored
Merge pull request #334 from Microsoft/master
Regular master -> vNext merge
2 parents 3eb2200 + 7ada65a commit 78b0154

37 files changed

+948
-74
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ The base JSON and YAML processors are built into this project. Below is the list
2020

2121
- [**C# Comment / Annotation Processor**](https://github.com/Microsoft/OpenAPI.NET.CSharpAnnotations) : Converts standard .NET annotations ( /// comments ) emitted from your build (MSBuild.exe) into OpenAPI.NET document object.
2222

23+
- [**OData CSDL Processor**](https://github.com/Microsoft/OpenAPI.NET.OData) : Converts the XML representation of the Entity Data Model (EDM) describing an OData Service into OpenAPI.NET document object.
24+
2325
# Example Usage
2426

2527
Creating an OpenAPI Document

src/Microsoft.OpenApi.Readers/Microsoft.OpenApi.Readers.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<TargetFrameworks>net46; netstandard2.0</TargetFrameworks>
44
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
@@ -10,7 +10,7 @@
1010
<Company>Microsoft</Company>
1111
<Title>Microsoft.OpenApi.Readers</Title>
1212
<PackageId>Microsoft.OpenApi.Readers</PackageId>
13-
<Version>1.1.0</Version>
13+
<Version>1.1.1</Version>
1414
<Description>OpenAPI.NET Readers for JSON and YAML documents</Description>
1515
<Copyright>© Microsoft Corporation. All rights reserved.</Copyright>
1616
<PackageTags>OpenAPI .NET</PackageTags>

src/Microsoft.OpenApi.Readers/ParseNodes/ValueNode.cs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
// Licensed under the MIT license.
33

44
using System;
5+
using System.Globalization;
56
using Microsoft.OpenApi.Any;
6-
using Microsoft.OpenApi.Exceptions;
77
using Microsoft.OpenApi.Readers.Exceptions;
88
using SharpYaml.Serialization;
99

@@ -52,28 +52,26 @@ public override IOpenApiAny CreateAny()
5252
return new OpenApiBoolean(false);
5353
}
5454

55-
if (int.TryParse(value, out var intValue))
55+
// The NumberStyles below are the default ones based on
56+
// https://docs.microsoft.com/en-us/dotnet/api/?view=netframework-4.7.2
57+
if (int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var intValue))
5658
{
5759
return new OpenApiInteger(intValue);
5860
}
5961

60-
if (long.TryParse(value, out var longValue))
62+
if (long.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var longValue))
6163
{
62-
return
63-
new OpenApiLong(
64-
longValue);
64+
return new OpenApiLong(longValue);
6565
}
6666

67-
if (double.TryParse(value, out var dblValue))
67+
if (double.TryParse(value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture, out var doubleValue))
6868
{
69-
return
70-
new OpenApiDouble(
71-
dblValue); // Note(darrmi): This may be better as decimal. Further investigation required.
69+
return new OpenApiDouble(doubleValue);
7270
}
7371

74-
if (DateTimeOffset.TryParse(value, out var datetimeValue))
72+
if (DateTimeOffset.TryParse(value, CultureInfo.InvariantCulture, DateTimeStyles.None, out var dateTimeValue))
7573
{
76-
return new OpenApiDateTime(datetimeValue);
74+
return new OpenApiDateTime(dateTimeValue);
7775
}
7876

7977
// if we can't identify the type of value, return it as string.

src/Microsoft.OpenApi.Readers/V2/OpenApiDocumentDeserializer.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6+
using System.Globalization;
67
using System.Linq;
78
using Microsoft.OpenApi.Extensions;
89
using Microsoft.OpenApi.Interfaces;
@@ -72,11 +73,12 @@ internal static partial class OpenApiV2Deserializer
7273

7374
o.Components.RequestBodies = n.CreateMapWithReference(ReferenceType.RequestBody, p =>
7475
{
75-
var parameter = LoadParameter(p, evenBody: true);
76-
if (parameter.In == null)
76+
var parameter = LoadParameter(p, loadRequestBody: true);
77+
if (parameter != null)
7778
{
78-
return CreateRequestBody(n.Context,parameter);
79+
return CreateRequestBody(n.Context, parameter);
7980
}
81+
8082
return null;
8183
}
8284
);
@@ -191,7 +193,7 @@ private static string BuildUrl(string scheme, string host, string basePath)
191193
{
192194
var pieces = host.Split(':');
193195
host = pieces.First();
194-
port = int.Parse(pieces.Last());
196+
port = int.Parse(pieces.Last(), CultureInfo.InvariantCulture);
195197
}
196198

197199
var uriBuilder = new UriBuilder()

src/Microsoft.OpenApi.Readers/V2/OpenApiHeaderDeserializer.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT license.
33

44
using System;
5+
using System.Globalization;
56
using Microsoft.OpenApi.Any;
67
using Microsoft.OpenApi.Extensions;
78
using Microsoft.OpenApi.Models;
@@ -54,10 +55,10 @@ internal static partial class OpenApiV2Deserializer
5455
GetOrCreateSchema(o).Default = n.CreateAny();
5556
}
5657
},
57-
{
58+
{
5859
"maximum", (o, n) =>
5960
{
60-
GetOrCreateSchema(o).Maximum = decimal.Parse(n.GetScalarValue());
61+
GetOrCreateSchema(o).Maximum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
6162
}
6263
},
6364
{
@@ -69,7 +70,7 @@ internal static partial class OpenApiV2Deserializer
6970
{
7071
"minimum", (o, n) =>
7172
{
72-
GetOrCreateSchema(o).Minimum = decimal.Parse(n.GetScalarValue());
73+
GetOrCreateSchema(o).Minimum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
7374
}
7475
},
7576
{
@@ -81,13 +82,13 @@ internal static partial class OpenApiV2Deserializer
8182
{
8283
"maxLength", (o, n) =>
8384
{
84-
GetOrCreateSchema(o).MaxLength = int.Parse(n.GetScalarValue());
85+
GetOrCreateSchema(o).MaxLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
8586
}
8687
},
8788
{
8889
"minLength", (o, n) =>
8990
{
90-
GetOrCreateSchema(o).MinLength = int.Parse(n.GetScalarValue());
91+
GetOrCreateSchema(o).MinLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
9192
}
9293
},
9394
{
@@ -99,13 +100,13 @@ internal static partial class OpenApiV2Deserializer
99100
{
100101
"maxItems", (o, n) =>
101102
{
102-
GetOrCreateSchema(o).MaxItems = int.Parse(n.GetScalarValue());
103+
GetOrCreateSchema(o).MaxItems = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
103104
}
104105
},
105106
{
106107
"minItems", (o, n) =>
107108
{
108-
GetOrCreateSchema(o).MinItems = int.Parse(n.GetScalarValue());
109+
GetOrCreateSchema(o).MinItems = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
109110
}
110111
},
111112
{
@@ -117,7 +118,7 @@ internal static partial class OpenApiV2Deserializer
117118
{
118119
"multipleOf", (o, n) =>
119120
{
120-
GetOrCreateSchema(o).MultipleOf = decimal.Parse(n.GetScalarValue());
121+
GetOrCreateSchema(o).MultipleOf = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
121122
}
122123
},
123124
{

src/Microsoft.OpenApi.Readers/V2/OpenApiParameterDeserializer.cs

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
using System;
55
using System.Collections.Generic;
6-
using Microsoft.OpenApi.Any;
6+
using System.Globalization;
77
using Microsoft.OpenApi.Extensions;
88
using Microsoft.OpenApi.Models;
99
using Microsoft.OpenApi.Readers.ParseNodes;
@@ -16,7 +16,7 @@ namespace Microsoft.OpenApi.Readers.V2
1616
/// </summary>
1717
internal static partial class OpenApiV2Deserializer
1818
{
19-
private static ParameterLocation? _in;
19+
private static bool _isBodyOrFormData;
2020

2121
private static readonly FixedFieldMap<OpenApiParameter> _parameterFixedFields =
2222
new FixedFieldMap<OpenApiParameter>
@@ -90,25 +90,25 @@ internal static partial class OpenApiV2Deserializer
9090
{
9191
"minimum", (o, n) =>
9292
{
93-
GetOrCreateSchema(o).Minimum = decimal.Parse(n.GetScalarValue());
93+
GetOrCreateSchema(o).Minimum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
9494
}
9595
},
9696
{
9797
"maximum", (o, n) =>
9898
{
99-
GetOrCreateSchema(o).Maximum = decimal.Parse(n.GetScalarValue());
99+
GetOrCreateSchema(o).Maximum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
100100
}
101101
},
102102
{
103103
"maxLength", (o, n) =>
104104
{
105-
GetOrCreateSchema(o).MaxLength = int.Parse(n.GetScalarValue());
105+
GetOrCreateSchema(o).MaxLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
106106
}
107107
},
108108
{
109109
"minLength", (o, n) =>
110110
{
111-
GetOrCreateSchema(o).MinLength = int.Parse(n.GetScalarValue());
111+
GetOrCreateSchema(o).MinLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
112112
}
113113
},
114114
{
@@ -204,9 +204,11 @@ private static void ProcessIn(OpenApiParameter o, ParseNode n)
204204
switch (value)
205205
{
206206
case "body":
207+
_isBodyOrFormData = true;
207208
n.Context.SetTempStorage(TempStorageKeys.BodyParameter, o);
208209
break;
209210
case "formData":
211+
_isBodyOrFormData = true;
210212
var formParameters = n.Context.GetFromTempStorage<List<OpenApiParameter>>("formParameters");
211213
if (formParameters == null)
212214
{
@@ -216,9 +218,13 @@ private static void ProcessIn(OpenApiParameter o, ParseNode n)
216218

217219
formParameters.Add(o);
218220
break;
221+
case "query":
222+
case "header":
223+
case "path":
224+
o.In = value.GetEnumFromDisplayName<ParameterLocation>();
225+
break;
219226
default:
220-
_in = value.GetEnumFromDisplayName<ParameterLocation>();
221-
o.In = _in;
227+
o.In = null;
222228
break;
223229
}
224230
}
@@ -228,10 +234,10 @@ public static OpenApiParameter LoadParameter(ParseNode node)
228234
return LoadParameter(node, false);
229235
}
230236

231-
public static OpenApiParameter LoadParameter(ParseNode node, bool evenBody)
237+
public static OpenApiParameter LoadParameter(ParseNode node, bool loadRequestBody)
232238
{
233239
// Reset the local variables every time this method is called.
234-
_in = null;
240+
_isBodyOrFormData = false;
235241

236242
var mapNode = node.CheckMapNode("parameter");
237243

@@ -253,9 +259,14 @@ public static OpenApiParameter LoadParameter(ParseNode node, bool evenBody)
253259
node.Context.SetTempStorage("schema", null);
254260
}
255261

256-
if (_in == null && !evenBody)
262+
if (_isBodyOrFormData && !loadRequestBody)
263+
{
264+
return null; // Don't include Form or Body parameters when normal parameters are loaded.
265+
}
266+
267+
if ( loadRequestBody && !_isBodyOrFormData )
257268
{
258-
return null; // Don't include Form or Body parameters in OpenApiOperation.Parameters list
269+
return null; // Don't include non-Body or non-Form parameters when request bodies are loaded.
259270
}
260271

261272
return parameter;

src/Microsoft.OpenApi.Readers/V2/OpenApiSchemaDeserializer.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Microsoft.OpenApi.Models;
77
using Microsoft.OpenApi.Readers.ParseNodes;
88
using System.Collections.Generic;
9+
using System.Globalization;
910

1011
namespace Microsoft.OpenApi.Readers.V2
1112
{
@@ -26,13 +27,13 @@ internal static partial class OpenApiV2Deserializer
2627
{
2728
"multipleOf", (o, n) =>
2829
{
29-
o.MultipleOf = decimal.Parse(n.GetScalarValue());
30+
o.MultipleOf = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
3031
}
3132
},
3233
{
3334
"maximum", (o, n) =>
3435
{
35-
o.Maximum = decimal.Parse(n.GetScalarValue());
36+
o.Maximum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
3637
}
3738
},
3839
{
@@ -44,7 +45,7 @@ internal static partial class OpenApiV2Deserializer
4445
{
4546
"minimum", (o, n) =>
4647
{
47-
o.Minimum = decimal.Parse(n.GetScalarValue());
48+
o.Minimum = decimal.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
4849
}
4950
},
5051
{
@@ -56,13 +57,13 @@ internal static partial class OpenApiV2Deserializer
5657
{
5758
"maxLength", (o, n) =>
5859
{
59-
o.MaxLength = int.Parse(n.GetScalarValue());
60+
o.MaxLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
6061
}
6162
},
6263
{
6364
"minLength", (o, n) =>
6465
{
65-
o.MinLength = int.Parse(n.GetScalarValue());
66+
o.MinLength = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
6667
}
6768
},
6869
{
@@ -74,13 +75,13 @@ internal static partial class OpenApiV2Deserializer
7475
{
7576
"maxItems", (o, n) =>
7677
{
77-
o.MaxItems = int.Parse(n.GetScalarValue());
78+
o.MaxItems = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
7879
}
7980
},
8081
{
8182
"minItems", (o, n) =>
8283
{
83-
o.MinItems = int.Parse(n.GetScalarValue());
84+
o.MinItems = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
8485
}
8586
},
8687
{
@@ -92,13 +93,13 @@ internal static partial class OpenApiV2Deserializer
9293
{
9394
"maxProperties", (o, n) =>
9495
{
95-
o.MaxProperties = int.Parse(n.GetScalarValue());
96+
o.MaxProperties = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
9697
}
9798
},
9899
{
99100
"minProperties", (o, n) =>
100101
{
101-
o.MinProperties = int.Parse(n.GetScalarValue());
102+
o.MinProperties = int.Parse(n.GetScalarValue(), CultureInfo.InvariantCulture);
102103
}
103104
},
104105
{

src/Microsoft.OpenApi.Readers/V3/OpenApiParameterDeserializer.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright (c) Microsoft Corporation. All rights reserved.
22
// Licensed under the MIT license.
33

4-
using System.Collections.Generic;
4+
using System;
55
using System.Linq;
66
using Microsoft.OpenApi.Extensions;
77
using Microsoft.OpenApi.Models;
@@ -27,7 +27,18 @@ internal static partial class OpenApiV3Deserializer
2727
{
2828
"in", (o, n) =>
2929
{
30-
o.In = n.GetScalarValue().GetEnumFromDisplayName<ParameterLocation>();
30+
var inString = n.GetScalarValue();
31+
32+
if ( Enum.GetValues(typeof(ParameterLocation)).Cast<ParameterLocation>()
33+
.Select( e => e.GetDisplayName() )
34+
.Contains(inString) )
35+
{
36+
o.In = n.GetScalarValue().GetEnumFromDisplayName<ParameterLocation>();
37+
}
38+
else
39+
{
40+
o.In = null;
41+
}
3142
}
3243
},
3344
{
@@ -115,7 +126,6 @@ public static OpenApiParameter LoadParameter(ParseNode node)
115126
}
116127

117128
var parameter = new OpenApiParameter();
118-
var required = new List<string> {"name", "in"};
119129

120130
ParseMap(mapNode, parameter, _parameterFixedFields, _parameterPatternFields);
121131

0 commit comments

Comments
 (0)