Skip to content

Commit 68fc2de

Browse files
committed
Merge branch 'mk/add-filter-commandOption' into mk/add-filter-by-tags
2 parents 6bb23b6 + a1d46e5 commit 68fc2de

File tree

9 files changed

+1171
-60
lines changed

9 files changed

+1171
-60
lines changed

src/Microsoft.OpenApi.Tool/OpenApiService.cs

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@ namespace Microsoft.OpenApi.Tool
1616
{
1717
static class OpenApiService
1818
{
19+
public const string GraphVersion_V1 = "v1.0";
20+
public const string Title = "Partial Graph API";
21+
1922
public static void ProcessOpenApiDocument(
2023
string input,
2124
FileInfo output,
2225
OpenApiSpecVersion version,
2326
OpenApiFormat format,
27+
string filterbyOperationId,
2428
bool inline,
2529
bool resolveExternal)
2630
{
@@ -35,12 +39,20 @@ public static void ProcessOpenApiDocument(
3539

3640
var result = new OpenApiStreamReader(new OpenApiReaderSettings
3741
{
38-
ReferenceResolution = resolveExternal == true ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences,
42+
ReferenceResolution = resolveExternal ? ReferenceResolutionSetting.ResolveAllReferences : ReferenceResolutionSetting.ResolveLocalReferences,
3943
RuleSet = ValidationRuleSet.GetDefaultRuleSet()
4044
}
4145
).ReadAsync(stream).GetAwaiter().GetResult();
4246

4347
document = result.OpenApiDocument;
48+
49+
// Check if filter options are provided, then execute
50+
if (!string.IsNullOrEmpty(filterbyOperationId))
51+
{
52+
var predicate = OpenApiFilterService.CreatePredicate(filterbyOperationId);
53+
document = OpenApiFilterService.CreateFilteredDocument(document, Title, GraphVersion_V1, predicate);
54+
}
55+
4456
var context = result.OpenApiDiagnostic;
4557

4658
if (context.Errors.Count != 0)
@@ -52,43 +64,26 @@ public static void ProcessOpenApiDocument(
5264
errorReport.AppendLine(error.ToString());
5365
}
5466

55-
throw new ArgumentException(String.Join(Environment.NewLine, context.Errors.Select(e => e.Message).ToArray()));
67+
throw new ArgumentException(string.Join(Environment.NewLine, context.Errors.Select(e => e.Message).ToArray()));
5668
}
5769

58-
using (var outputStream = output?.Create())
59-
{
60-
TextWriter textWriter;
61-
62-
if (outputStream != null)
63-
{
64-
textWriter = new StreamWriter(outputStream);
65-
}
66-
else
67-
{
68-
textWriter = Console.Out;
69-
}
70+
using var outputStream = output?.Create();
7071

71-
var settings = new OpenApiWriterSettings()
72-
{
73-
ReferenceInline = inline == true ? ReferenceInlineSetting.InlineLocalReferences : ReferenceInlineSetting.DoNotInlineReferences
74-
};
75-
IOpenApiWriter writer;
76-
switch (format)
77-
{
78-
case OpenApiFormat.Json:
79-
writer = new OpenApiJsonWriter(textWriter, settings);
80-
break;
81-
case OpenApiFormat.Yaml:
82-
writer = new OpenApiYamlWriter(textWriter, settings);
83-
break;
84-
default:
85-
throw new ArgumentException("Unknown format");
86-
}
72+
var textWriter = outputStream != null ? new StreamWriter(outputStream) : Console.Out;
8773

88-
document.Serialize(writer, version);
74+
var settings = new OpenApiWriterSettings()
75+
{
76+
ReferenceInline = inline ? ReferenceInlineSetting.InlineLocalReferences : ReferenceInlineSetting.DoNotInlineReferences
77+
};
78+
IOpenApiWriter writer = format switch
79+
{
80+
OpenApiFormat.Json => new OpenApiJsonWriter(textWriter, settings),
81+
OpenApiFormat.Yaml => new OpenApiYamlWriter(textWriter, settings),
82+
_ => throw new ArgumentException("Unknown format"),
83+
};
84+
document.Serialize(writer, version);
8985

90-
textWriter.Flush();
91-
}
86+
textWriter.Flush();
9287
}
9388

9489
private static Stream GetStream(string input)

src/Microsoft.OpenApi.Tool/Program.cs

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,12 @@
1-
using System;
2-
using System.CommandLine;
1+
using System.CommandLine;
32
using System.CommandLine.Invocation;
43
using System.IO;
54
using System.Threading.Tasks;
6-
using Microsoft.OpenApi;
75

86
namespace Microsoft.OpenApi.Tool
97
{
10-
class Program
8+
static class Program
119
{
12-
static async Task<int> OldMain(string[] args)
13-
{
14-
15-
var command = new RootCommand
16-
{
17-
new Option("--input", "Input OpenAPI description file path or URL", typeof(string) ),
18-
new Option("--output","Output OpenAPI description file", typeof(FileInfo), arity: ArgumentArity.ZeroOrOne),
19-
new Option("--version", "OpenAPI specification version", typeof(OpenApiSpecVersion)),
20-
new Option("--format", "File format",typeof(OpenApiFormat) ),
21-
new Option("--inline", "Inline $ref instances", typeof(bool) ),
22-
new Option("--resolveExternal","Resolve external $refs", typeof(bool))
23-
};
24-
25-
command.Handler = CommandHandler.Create<string,FileInfo,OpenApiSpecVersion,OpenApiFormat,bool, bool>(
26-
OpenApiService.ProcessOpenApiDocument);
27-
28-
// Parse the incoming args and invoke the handler
29-
return await command.InvokeAsync(args);
30-
}
31-
3210
static async Task<int> Main(string[] args)
3311
{
3412
var rootCommand = new RootCommand() {
@@ -47,9 +25,10 @@ static async Task<int> Main(string[] args)
4725
new Option("--version", "OpenAPI specification version", typeof(OpenApiSpecVersion)),
4826
new Option("--format", "File format",typeof(OpenApiFormat) ),
4927
new Option("--inline", "Inline $ref instances", typeof(bool) ),
50-
new Option("--resolveExternal","Resolve external $refs", typeof(bool))
28+
new Option("--resolveExternal","Resolve external $refs", typeof(bool)),
29+
new Option("--filterByOperationId", "Filters by OperationId provided", typeof(string))
5130
};
52-
transformCommand.Handler = CommandHandler.Create<string, FileInfo, OpenApiSpecVersion, OpenApiFormat, bool, bool>(
31+
transformCommand.Handler = CommandHandler.Create<string, FileInfo, OpenApiSpecVersion, OpenApiFormat, string, bool, bool>(
5332
OpenApiService.ProcessOpenApiDocument);
5433

5534
rootCommand.Add(transformCommand);

src/Microsoft.OpenApi/Microsoft.OpenApi.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
33
<TargetFrameworks>netstandard2.0</TargetFrameworks>
4+
<LangVersion>9.0</LangVersion>
45
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
56
<PackageIconUrl>http://go.microsoft.com/fwlink/?LinkID=288890</PackageIconUrl>
67
<PackageProjectUrl>https://github.com/Microsoft/OpenAPI.NET</PackageProjectUrl>
@@ -36,7 +37,8 @@
3637
</PropertyGroup>
3738

3839
<ItemGroup>
39-
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All"/>
40+
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
41+
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
4042
</ItemGroup>
4143

4244
<ItemGroup>
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
using System.Collections.Generic;
2+
using Microsoft.OpenApi.Interfaces;
3+
using Microsoft.OpenApi.Models;
4+
5+
namespace Microsoft.OpenApi.Services
6+
{
7+
internal class CopyReferences : OpenApiVisitorBase
8+
{
9+
private readonly OpenApiDocument target;
10+
public OpenApiComponents Components = new OpenApiComponents();
11+
12+
public CopyReferences(OpenApiDocument target)
13+
{
14+
this.target = target;
15+
}
16+
17+
public override void Visit(IOpenApiReferenceable referenceable)
18+
{
19+
switch (referenceable)
20+
{
21+
case OpenApiSchema schema:
22+
EnsureComponentsExists();
23+
EnsureSchemasExists();
24+
if (!Components.Schemas.ContainsKey(schema.Reference.Id))
25+
{
26+
Components.Schemas.Add(schema.Reference.Id, schema);
27+
}
28+
break;
29+
30+
case OpenApiParameter parameter:
31+
EnsureComponentsExists();
32+
EnsureParametersExists();
33+
if (!Components.Parameters.ContainsKey(parameter.Reference.Id))
34+
{
35+
Components.Parameters.Add(parameter.Reference.Id, parameter);
36+
}
37+
break;
38+
39+
case OpenApiResponse response:
40+
EnsureComponentsExists();
41+
EnsureResponsesExists();
42+
if (!Components.Responses.ContainsKey(response.Reference.Id))
43+
{
44+
Components.Responses.Add(response.Reference.Id, response);
45+
}
46+
break;
47+
48+
default:
49+
break;
50+
}
51+
base.Visit(referenceable);
52+
}
53+
54+
public override void Visit(OpenApiSchema schema)
55+
{
56+
// This is needed to handle schemas used in Responses in components
57+
if (schema.Reference != null)
58+
{
59+
EnsureComponentsExists();
60+
EnsureSchemasExists();
61+
if (!Components.Schemas.ContainsKey(schema.Reference.Id))
62+
{
63+
Components.Schemas.Add(schema.Reference.Id, schema);
64+
}
65+
}
66+
base.Visit(schema);
67+
}
68+
69+
private void EnsureComponentsExists()
70+
{
71+
if (target.Components == null)
72+
{
73+
target.Components = new OpenApiComponents();
74+
}
75+
}
76+
77+
private void EnsureSchemasExists()
78+
{
79+
if (target.Components.Schemas == null)
80+
{
81+
target.Components.Schemas = new Dictionary<string, OpenApiSchema>();
82+
}
83+
}
84+
85+
private void EnsureParametersExists()
86+
{
87+
if (target.Components.Parameters == null)
88+
{
89+
target.Components.Parameters = new Dictionary<string, OpenApiParameter>();
90+
}
91+
}
92+
93+
private void EnsureResponsesExists()
94+
{
95+
if (target.Components.Responses == null)
96+
{
97+
target.Components.Responses = new Dictionary<string, OpenApiResponse>();
98+
}
99+
}
100+
}
101+
}

0 commit comments

Comments
 (0)