Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
45968f3
Can validate external references now
darrelmiller Aug 15, 2021
89cc609
Fixed inlining settings
darrelmiller Nov 1, 2021
9552a32
Updated from vnext
darrelmiller Nov 25, 2021
971d827
Updated branch from 1.3.1-preview2
darrelmiller Jan 23, 2022
a4519b4
Updated hidi parameters to control both local and remote inlining ind…
darrelmiller Jan 29, 2022
4c26dbb
Added hostdocument to OpenApiReference
darrelmiller Feb 19, 2022
e3fa780
Updated from vnext
darrelmiller Feb 19, 2022
d41cf71
Missed these files
darrelmiller Feb 19, 2022
403fdbc
Updated referencable items to use GetEffective when inlining
darrelmiller Feb 21, 2022
d7616ee
Added IEffective interfaces to models that have references
darrelmiller Feb 22, 2022
e34a4f9
Removed redundant using
darrelmiller Feb 22, 2022
4207845
Fixed merged with vnext
darrelmiller Mar 1, 2022
5034952
Update cmd parameter to accept string values for OpenApi spec version
MaggieKimani1 Mar 3, 2022
5fbb568
Cast string to OpenApiSpecVersion enum value
MaggieKimani1 Mar 3, 2022
9ce2b27
Merge pull request #772 from microsoft/hotfix/hidi-exe-release-script
baywet Mar 3, 2022
da118bf
Refactor logic to accept a string as a regular param and rename the e…
MaggieKimani1 Mar 7, 2022
24daf0c
Better error handling
MaggieKimani1 Mar 8, 2022
0e39178
Remove string interpolation
MaggieKimani1 Mar 8, 2022
7128fb2
Add a try catch block to catch any exceptions thrown during document …
MaggieKimani1 Mar 8, 2022
37ecce2
Clean up code
MaggieKimani1 Mar 8, 2022
7defeda
Add a --clean-output parameter for overwriting existing files
MaggieKimani1 Mar 8, 2022
f683b72
Add an exit statement and use logger to log errors to the console
MaggieKimani1 Mar 8, 2022
abd6f50
Clean up code to bubble up exceptions to the global catch block
MaggieKimani1 Mar 8, 2022
9544806
Add exit codes for process termination handling
MaggieKimani1 Mar 8, 2022
0d9d96b
Merge pull request #785 from microsoft/fix/better-error-display
MaggieKimani1 Mar 8, 2022
1ec5177
Merge remote-tracking branch 'origin/vnext' into enhancement/add-clea…
MaggieKimani1 Mar 8, 2022
27179a9
Merge branch 'vnext' into fix/simplify-openapi-spec-version
darrelmiller Mar 9, 2022
be96424
f
darrelmiller Mar 9, 2022
7db6f8a
Merge pull request #767 from microsoft/fix/simplify-openapi-spec-version
darrelmiller Mar 9, 2022
b785cb9
Add a condition for ensuring the output file path exists before clean…
MaggieKimani1 Mar 9, 2022
e31c9de
Merge branch 'vnext' into enhancement/add-clean-output-param
MaggieKimani1 Mar 9, 2022
3be26f5
Package updates
MaggieKimani1 Mar 9, 2022
6e5d120
Bump up system.commandline
MaggieKimani1 Mar 9, 2022
53748ad
Code cleanup
MaggieKimani1 Mar 9, 2022
194576e
Fix exception thrown when OpenSpecVersion is null
MaggieKimani1 Mar 10, 2022
af25fe4
Add recursive solution for nested collection item object
MaggieKimani1 Mar 10, 2022
bc87d1e
Code refactoring
MaggieKimani1 Mar 10, 2022
c666c4a
Add nested sample collection file and copy it to output directory
MaggieKimani1 Mar 10, 2022
2a8996d
Add unit test
MaggieKimani1 Mar 10, 2022
7ac200e
Fixed issues related to merge conflicts
darrelmiller Mar 12, 2022
f1b3f3b
Added scope to tracing
darrelmiller Mar 13, 2022
d81f53c
Merge pull request #790 from microsoft/fix/dependabot-updates
darrelmiller Mar 13, 2022
2e3055e
Merge pull request #789 from microsoft/enhancement/add-clean-output-p…
darrelmiller Mar 13, 2022
652408b
Merged with vnext
darrelmiller Mar 13, 2022
df0fb11
Fixed input parameters of transform
darrelmiller Mar 14, 2022
3350d86
Rename method
MaggieKimani1 Mar 14, 2022
3445c1d
Log warning to console if url in collection isn't in the input OpenAp…
MaggieKimani1 Mar 15, 2022
3b0c720
Merge pull request #791 from microsoft/dm/fixmerge
darrelmiller Mar 15, 2022
19a9c73
Update powershell script to fetch Hidi version number and use the out…
MaggieKimani1 Mar 16, 2022
74b8b4b
Remove whitespace
MaggieKimani1 Mar 16, 2022
33a573b
Merge pull request #796 from microsoft/fix/update-script
MaggieKimani1 Mar 16, 2022
13812b1
Added CSDL filter for entitysets and singletons
darrelmiller Mar 23, 2022
7aae53b
Fixed issue with v2 external references
darrelmiller Mar 27, 2022
56c07ec
Resolved merged conflicts with vnext
darrelmiller Mar 27, 2022
79c271e
Merge pull request #619 from microsoft/issues/603
darrelmiller Mar 27, 2022
904cd8d
Fixed merge conflicts with vnext
darrelmiller Mar 27, 2022
caa87da
Fixed reporting collections with urls not in OpenAPI
darrelmiller Mar 27, 2022
014cb70
Merge remote-tracking branch 'origin/vnext' into enhancement/nested-p…
darrelmiller Mar 27, 2022
53c56f7
Removed openapi file that snook in.
darrelmiller Mar 27, 2022
976b5cc
Merge pull request #794 from microsoft/enhancement/nested-postman-col…
darrelmiller Mar 27, 2022
acf5c54
Resolved merge conflicts with vnext
darrelmiller Mar 27, 2022
988496a
Fixed command alias and some descriptions
darrelmiller Mar 27, 2022
17e7386
Updated Verify nupkg
darrelmiller Mar 27, 2022
5189855
Merge pull request #803 from microsoft/dm/csdl-filter
darrelmiller Mar 29, 2022
271e1aa
Bump Microsoft.OpenApi.OData from 1.0.10-preview2 to 1.0.10-preview3
dependabot[bot] Mar 29, 2022
0ecaed8
Convert anyOf/oneOf to allOf with first schema when writing v2
darrelmiller Apr 4, 2022
172c453
Bump Verify from 16.4.4 to 16.5.4
dependabot[bot] Apr 4, 2022
c3e8980
Bump FluentAssertions from 6.5.1 to 6.6.0
dependabot[bot] Apr 4, 2022
d0f41af
resolve local file reference with Schema type properly
DeagleGross Apr 8, 2022
0afb104
Merge pull request #817 from microsoft/issues/762
darrelmiller Apr 9, 2022
cd4baf6
Merge pull request #809 from microsoft/dependabot/nuget/Microsoft.Ope…
darrelmiller Apr 9, 2022
7a9012f
Merge pull request #814 from microsoft/dependabot/nuget/Verify-16.5.4
darrelmiller Apr 9, 2022
ff4b8fb
Merge pull request #815 from microsoft/dependabot/nuget/FluentAsserti…
darrelmiller Apr 9, 2022
f1b1be1
Bump Verify.Xunit from 16.4.4 to 16.5.4
dependabot[bot] Apr 9, 2022
28255e4
Merge pull request #816 from microsoft/dependabot/nuget/Verify.Xunit-…
darrelmiller Apr 9, 2022
6848bd0
Merge pull request #821 from DeagleGross/dmkorolev/resolve-local-file…
darrelmiller Apr 9, 2022
c9835c2
Updated package version to preview6
darrelmiller Apr 9, 2022
3b6efb8
Merge remote-tracking branch 'origin/master' into release/1.3.1-preview6
darrelmiller Apr 9, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Can validate external references now
  • Loading branch information
darrelmiller committed Aug 15, 2021
commit 45968f3263f39206bc31dbf9f8488e1991a380cf
6 changes: 3 additions & 3 deletions src/Microsoft.OpenApi.Readers/OpenApiYamlDocumentReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ public async Task<ReadResult> ReadAsync(YamlDocument input)
// Parse the OpenAPI Document
document = context.Parse(input);

await ResolveReferencesAsync(diagnostic, document);
await ResolveReferencesAsync(diagnostic, document, _settings.BaseUrl);
}
catch (OpenApiException ex)
{
Expand Down Expand Up @@ -133,7 +133,7 @@ private void ResolveReferences(OpenApiDiagnostic diagnostic, OpenApiDocument doc
}
}

private async Task ResolveReferencesAsync(OpenApiDiagnostic diagnostic, OpenApiDocument document)
private async Task ResolveReferencesAsync(OpenApiDiagnostic diagnostic, OpenApiDocument document, Uri baseUrl)
{
List<OpenApiError> errors = new List<OpenApiError>();

Expand All @@ -146,7 +146,7 @@ private async Task ResolveReferencesAsync(OpenApiDiagnostic diagnostic, OpenApiD
var openApiWorkSpace = new OpenApiWorkspace();

// Load this root document into the workspace
var streamLoader = new DefaultStreamLoader();
var streamLoader = new DefaultStreamLoader(baseUrl);
var workspaceLoader = new OpenApiWorkspaceLoader(openApiWorkSpace, _settings.CustomExternalLoader ?? streamLoader, _settings);
await workspaceLoader.LoadAsync(new OpenApiReference() { ExternalResource = "/" }, document);

Expand Down
21 changes: 15 additions & 6 deletions src/Microsoft.OpenApi.Readers/Services/DefaultStreamLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,32 +14,41 @@ namespace Microsoft.OpenApi.Readers.Services
/// </summary>
internal class DefaultStreamLoader : IStreamLoader
{
private readonly Uri baseUrl;
private HttpClient _httpClient = new HttpClient();


public DefaultStreamLoader(Uri baseUrl)
{
this.baseUrl = baseUrl;
}

public Stream Load(Uri uri)
{
var absoluteUri = new Uri(baseUrl, uri);
switch (uri.Scheme)
{
case "file":
return File.OpenRead(uri.AbsolutePath);
return File.OpenRead(absoluteUri.AbsolutePath);
case "http":
case "https":
return _httpClient.GetStreamAsync(uri).GetAwaiter().GetResult();

return _httpClient.GetStreamAsync(absoluteUri).GetAwaiter().GetResult();
default:
throw new ArgumentException("Unsupported scheme");
}
}

public async Task<Stream> LoadAsync(Uri uri)
{
switch (uri.Scheme)
var absoluteUri = new Uri(baseUrl, uri);

switch (absoluteUri.Scheme)
{
case "file":
return File.OpenRead(uri.AbsolutePath);
return File.OpenRead(absoluteUri.AbsolutePath);
case "http":
case "https":
return await _httpClient.GetStreamAsync(uri);
return await _httpClient.GetStreamAsync(absoluteUri);
default:
throw new ArgumentException("Unsupported scheme");
}
Expand Down
20 changes: 18 additions & 2 deletions src/Microsoft.OpenApi.Readers/V3/OpenApiV3VersionService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ internal class OpenApiV3VersionService : IOpenApiVersionService
/// <summary>
/// Parse the string to a <see cref="OpenApiReference"/> object.
/// </summary>
/// <param name="reference">The URL of the reference</param>
/// <param name="type">The type of object refefenced based on the context of the reference</param>
public OpenApiReference ConvertToOpenApiReference(
string reference,
ReferenceType? type)
Expand Down Expand Up @@ -95,8 +97,22 @@ public OpenApiReference ConvertToOpenApiReference(
// $ref: externalSource.yaml#/Pet
if (id.StartsWith("/components/"))
{
id = segments[1].Split('/')[3];
}
var localSegments = segments[1].Split('/');
var referencedType = localSegments[2].GetEnumFromDisplayName<ReferenceType>();
if (type == null)
{
type = referencedType;
}
else
{
if (type != referencedType)
{
throw new OpenApiException("Referenced type mismatch");
}
}
id = localSegments[3];
}

return new OpenApiReference
{
ExternalResource = segments[0],
Expand Down
71 changes: 54 additions & 17 deletions src/Microsoft.OpenApi.Tool/OpenApiService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Readers;
Expand All @@ -29,14 +30,16 @@ public static void ProcessOpenApiDocument(
throw new ArgumentNullException("input");
}

var stream = GetStream(input);
var inputUrl = GetInputUrl(input);
var stream = GetStream(inputUrl);

OpenApiDocument document;

var result = new OpenApiStreamReader(new OpenApiReaderSettings
{
ReferenceResolution = resolveExternal == true ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences,
RuleSet = ValidationRuleSet.GetDefaultRuleSet()
RuleSet = ValidationRuleSet.GetDefaultRuleSet(),
BaseUrl = new Uri(inputUrl.AbsoluteUri)
}
).ReadAsync(stream).GetAwaiter().GetResult();

Expand Down Expand Up @@ -91,10 +94,22 @@ public static void ProcessOpenApiDocument(
}
}

private static Stream GetStream(string input)
private static Uri GetInputUrl(string input)
{
Stream stream;
if (input.StartsWith("http"))
{
return new Uri(input);
}
else
{
return new Uri("file://" + Path.GetFullPath(input));
}
}

private static Stream GetStream(Uri input)
{
Stream stream;
if (input.Scheme == "http" || input.Scheme == "https")
{
var httpClient = new HttpClient(new HttpClientHandler()
{
Expand All @@ -105,32 +120,40 @@ private static Stream GetStream(string input)
};
stream = httpClient.GetStreamAsync(input).Result;
}
else
else if (input.Scheme == "file")
{
var fileInput = new FileInfo(input);
var fileInput = new FileInfo(input.AbsolutePath);
stream = fileInput.OpenRead();
}
else
{
throw new ArgumentException("Unrecognized exception");
}

return stream;
}

internal static void ValidateOpenApiDocument(string input)
internal static async Task ValidateOpenApiDocument(string input, bool resolveExternal)
{
if (input == null)
{
throw new ArgumentNullException("input");
}

var stream = GetStream(input);
var inputUrl = GetInputUrl(input);
var stream = GetStream(GetInputUrl(input));

OpenApiDocument document;

document = new OpenApiStreamReader(new OpenApiReaderSettings
var result = await new OpenApiStreamReader(new OpenApiReaderSettings
{
//ReferenceResolution = resolveExternal == true ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences,
RuleSet = ValidationRuleSet.GetDefaultRuleSet()
ReferenceResolution = resolveExternal == true ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences,
RuleSet = ValidationRuleSet.GetDefaultRuleSet(),
BaseUrl = new Uri(inputUrl.AbsoluteUri)
}
).Read(stream, out var context);
).ReadAsync(stream);

document = result.OpenApiDocument;
var context = result.OpenApiDiagnostic;

if (context.Errors.Count != 0)
{
Expand All @@ -140,11 +163,25 @@ internal static void ValidateOpenApiDocument(string input)
}
}

var statsVisitor = new StatsVisitor();
var walker = new OpenApiWalker(statsVisitor);
walker.Walk(document);
if (document.Workspace == null) {
var statsVisitor = new StatsVisitor();
var walker = new OpenApiWalker(statsVisitor);
walker.Walk(document);
Console.WriteLine(statsVisitor.GetStatisticsReport());
}
else
{
foreach (var memberDocument in document.Workspace.Documents)
{
Console.WriteLine("Stats for " + memberDocument.Info.Title);
var statsVisitor = new StatsVisitor();
var walker = new OpenApiWalker(statsVisitor);
walker.Walk(memberDocument);
Console.WriteLine(statsVisitor.GetStatisticsReport());
}
}

Console.WriteLine(statsVisitor.GetStatisticsReport());

}
}
}
5 changes: 3 additions & 2 deletions src/Microsoft.OpenApi.Tool/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,10 @@ static async Task<int> Main(string[] args)

var validateCommand = new Command("validate")
{
new Option("--input", "Input OpenAPI description file path or URL", typeof(string) )
new Option("--input", "Input OpenAPI description file path or URL", typeof(string) ),
new Option("--resolveExternal","Resolve external $refs", typeof(bool))
};
validateCommand.Handler = CommandHandler.Create<string>(OpenApiService.ValidateOpenApiDocument);
validateCommand.Handler = CommandHandler.Create<string,bool>(OpenApiService.ValidateOpenApiDocument);

var transformCommand = new Command("transform")
{
Expand Down
18 changes: 14 additions & 4 deletions src/Microsoft.OpenApi/Models/OpenApiReference.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public string ReferenceV3
{
if (IsExternal)
{
return GetExternalReference();
return GetExternalReferenceV3();
}

if (!Type.HasValue)
Expand Down Expand Up @@ -85,7 +85,7 @@ public string ReferenceV2
{
if (IsExternal)
{
return GetExternalReference();
return GetExternalReferenceV2();
}

if (!Type.HasValue)
Expand Down Expand Up @@ -171,11 +171,21 @@ public void SerializeAsV2(IOpenApiWriter writer)
writer.WriteEndObject();
}

private string GetExternalReference()
private string GetExternalReferenceV3()
{
if (Id != null)
{
return ExternalResource + "#/" + Id;
return ExternalResource + "#/components/" + Type.GetDisplayName() + "/"+ Id;
}

return ExternalResource;
}

private string GetExternalReferenceV2()
{
if (Id != null)
{
return ExternalResource + "#/" + GetReferenceTypeNameAsV2((ReferenceType)Type) + "/" + Id;
}

return ExternalResource;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public class OpenApiWorkspaceStreamTests
// Use OpenApiWorkspace to load a document and a referenced document

[Fact]
public async Task LoadDocumentIntoWorkspace()
public async Task LoadingDocumentWithResolveAllReferencesShouldLoadDocumentIntoWorkspace()
{
// Create a reader that will resolve all references
var reader = new OpenApiStreamReader(new OpenApiReaderSettings()
Expand Down Expand Up @@ -48,7 +48,7 @@ public async Task LoadDocumentIntoWorkspace()


[Fact]
public async Task LoadTodoDocumentIntoWorkspace()
public async Task LoadDocumentWithExternalReferenceShouldLoadBothDocumentsIntoWorkspace()
{
// Create a reader that will resolve all references
var reader = new OpenApiStreamReader(new OpenApiReaderSettings()
Expand All @@ -65,6 +65,7 @@ public async Task LoadTodoDocumentIntoWorkspace()

Assert.NotNull(result.OpenApiDocument.Workspace);
Assert.True(result.OpenApiDocument.Workspace.Contains("TodoComponents.yaml"));

var referencedSchema = result.OpenApiDocument
.Paths["/todos"]
.Operations[OperationType.Get]
Expand Down
Loading