Skip to content

Commit 6b4fab7

Browse files
committed
Make API generation non interactive (#5078)
(cherry picked from commit 06d9c52) (cherry picked from commit 6a1ca48)
1 parent 90ff011 commit 6b4fab7

18 files changed

+245
-8611
lines changed

src/ApiGenerator/ApiGenerator.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<TargetFramework>netcoreapp3.0</TargetFramework>
66
<IsPackable>false</IsPackable>
77

8-
<NoWarn>NU1701</NoWarn>
8+
<NoWarn>CS1591;NU1701</NoWarn>
99
<PreserveCompilationContext>true</PreserveCompilationContext>
1010
</PropertyGroup>
1111
<ItemGroup>
@@ -15,6 +15,8 @@
1515
<PackageReference Include="CsQuery.Core" Version="2.0.1" />
1616
<!-- https://github.com/toddams/RazorLight/issues/172 -->
1717
<PackageReference Include="RazorLight.Unofficial" Version="2.0.0-beta1.3" />
18+
<PackageReference Include="Spectre.Console" Version="0.27.1-preview.0.8" />
19+
<PackageReference Include="System.CommandLine.DragonFruit" Version="0.3.0-alpha.20371.2" />
1820
<!--<PackageReference Include="RazorLight" Version="2.0.0-beta1" />-->
1921
</ItemGroup>
2022
<ItemGroup>

src/ApiGenerator/Configuration/GeneratorLocations.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public static class GeneratorLocations
1111
{
1212
// @formatter:off — disable formatter after this line
1313
public static string EsNetFolder { get; } = $@"{Root}../../src/Elasticsearch.Net/";
14-
public static string LastDownloadedVersionFile { get; } = Path.Combine(Root, "last_downloaded_version.txt");
14+
public static string LastDownloadedRef { get; } = Path.Combine(Root, "last_downloaded_version.txt");
1515

1616
public static string NestFolder { get; } = $@"{Root}../../src/Nest/";
1717
public static string RestSpecificationFolder { get; } = $@"{Root}RestSpecification/";

src/ApiGenerator/Generator/ApiEndpointFactory.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,13 @@ private static void EnforceRequiredOnParts(string jsonFile, UrlInformation url)
5656
{
5757
var required = url.Paths.All(p => p.Path.Contains($"{{{part.Name}}}"));
5858
if (part.Required != required)
59-
ApiGenerator.Warnings.Add($"{jsonFile} has part: {part.Name} listed as {part.Required} but should be {required}");
59+
{
60+
var message = required
61+
? "is [b green] required [/] but appears in spec as [b red] optional [/]"
62+
: "is [b green] optional [/] but marked as [b red] required [/] ";
63+
// TODO submit PR to fix these, too noisy for now
64+
//ApiGenerator.Warnings.Add($"[grey]{jsonFile}[/] part [b white] {part.Name} [/] {message}");
65+
}
6066
part.Required = required;
6167
}
6268
}

src/ApiGenerator/Generator/ApiGenerator.cs

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
using System.Collections.Generic;
77
using System.IO;
88
using System.Linq;
9-
using System.Threading.Tasks;
9+
using System.Threading;
10+
using System.Threading.Tasks;
1011
using ApiGenerator.Configuration;
1112
using ApiGenerator.Domain;
1213
using ApiGenerator.Domain.Specification;
@@ -20,17 +21,17 @@ public class ApiGenerator
2021
{
2122
public static List<string> Warnings { get; private set; } = new List<string>();
2223

23-
public static async Task Generate(string downloadBranch, bool lowLevelOnly, RestApiSpec spec)
24+
public static async Task Generate(string downloadBranch, bool lowLevelOnly, RestApiSpec spec, CancellationToken token)
2425
{
25-
static async Task DoGenerate(ICollection<RazorGeneratorBase> generators, RestApiSpec restApiSpec, bool highLevel)
26+
static async Task DoGenerate(ICollection<RazorGeneratorBase> generators, RestApiSpec restApiSpec, bool highLevel, CancellationToken token)
2627
{
27-
var pbarOpts = new ProgressBarOptions { BackgroundColor = ConsoleColor.DarkGray };
28+
var pbarOpts = new ProgressBarOptions { ProgressCharacter = '─', BackgroundColor = ConsoleColor.Yellow };
2829
var message = $"Generating {(highLevel ? "high" : "low")} level code";
2930
using var pbar = new ProgressBar(generators.Count, message, pbarOpts);
3031
foreach (var generator in generators)
3132
{
3233
pbar.Message = "Generating " + generator.Title;
33-
await generator.Generate(restApiSpec, pbar);
34+
await generator.Generate(restApiSpec, pbar, token);
3435
pbar.Tick("Generated " + generator.Title);
3536
}
3637
}
@@ -55,23 +56,10 @@ static async Task DoGenerate(ICollection<RazorGeneratorBase> generators, RestApi
5556
new RequestsGenerator(),
5657
};
5758

58-
await DoGenerate(lowLevelGenerators, spec, highLevel: false);
59+
await DoGenerate(lowLevelGenerators, spec, highLevel: false, token);
5960
if (!lowLevelOnly)
60-
await DoGenerate(highLevelGenerators, spec, highLevel: true);
61+
await DoGenerate(highLevelGenerators, spec, highLevel: true, token);
6162

62-
// Check if there are any non-Stable endpoints present.
63-
foreach (var endpoint in spec.Endpoints)
64-
{
65-
if (endpoint.Value.Stability != Stability.Stable)
66-
Warnings.Add($"Endpoint {endpoint.Value.Name} is not marked as Stable ({endpoint.Value.Stability})");
67-
}
68-
69-
if (Warnings.Count == 0) return;
70-
71-
Console.ForegroundColor = ConsoleColor.Yellow;
72-
foreach (var warning in Warnings.Distinct().OrderBy(w => w))
73-
Console.WriteLine(warning);
74-
Console.ResetColor();
7563
}
7664

7765
public static RestApiSpec CreateRestApiSpecModel(string downloadBranch, params string[] folders)
@@ -84,7 +72,7 @@ public static RestApiSpec CreateRestApiSpecModel(string downloadBranch, params s
8472
var endpoints = new SortedDictionary<string, ApiEndpoint>();
8573
var seenFiles = new HashSet<string>();
8674
using (var pbar = new ProgressBar(directories.Count, $"Listing {directories.Count} directories",
87-
new ProgressBarOptions { BackgroundColor = ConsoleColor.DarkGray, CollapseWhenFinished = false }))
75+
new ProgressBarOptions { ProgressCharacter = '─', BackgroundColor = ConsoleColor.DarkGray, CollapseWhenFinished = false }))
8876
{
8977
var folderFiles = directories.Select(dir =>
9078
Directory.GetFiles(dir)

src/ApiGenerator/Generator/Razor/ApiUrlsLookupsGenerator.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
33
// See the LICENSE file in the project root for more information
44

5+
using System.Threading;
56
using System.Threading.Tasks;
67
using ApiGenerator.Configuration;
78
using ApiGenerator.Domain;
@@ -13,12 +14,12 @@ public class ApiUrlsLookupsGenerator : RazorGeneratorBase
1314
{
1415
public override string Title => "NEST static url lookups";
1516

16-
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar)
17+
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar, CancellationToken token)
1718
{
1819
var view = ViewLocations.HighLevel("Requests", "ApiUrlsLookup.cshtml");
1920
var target = GeneratorLocations.HighLevel("_Generated", "ApiUrlsLookup.generated.cs");
2021

21-
await DoRazor(spec, view, target);
22+
await DoRazor(spec, view, target, null, token);
2223
}
2324
}
2425
}

src/ApiGenerator/Generator/Razor/DescriptorsGenerator.cs

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

55
using System.IO;
66
using System.Linq;
7+
using System.Threading;
78
using System.Threading.Tasks;
89
using ApiGenerator.Configuration;
910
using ApiGenerator.Domain;
@@ -15,20 +16,20 @@ public class DescriptorsGenerator : RazorGeneratorBase
1516
{
1617
public override string Title => "NEST descriptors";
1718

18-
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar)
19+
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar, CancellationToken token)
1920
{
2021
// Delete existing files
2122
foreach (var file in Directory.GetFiles(GeneratorLocations.NestFolder, "Descriptors.*.cs"))
2223
File.Delete(file);
2324

2425
var view = ViewLocations.HighLevel("Descriptors", "RequestDescriptorBase.cshtml");
2526
var target = GeneratorLocations.HighLevel("Descriptors.cs");
26-
await DoRazor(spec, view, target);
27+
await DoRazor(spec, view, target, null, token);
2728

2829
var dependantView = ViewLocations.HighLevel("Descriptors", "Descriptors.cshtml");
2930
string Target(string id) => GeneratorLocations.HighLevel($"Descriptors.{id}.cs");
3031
var namespaced = spec.EndpointsPerNamespaceHighLevel.ToList();
31-
await DoRazorDependantFiles(progressBar, namespaced, dependantView, kv => kv.Key, id => Target(id));
32+
await DoRazorDependantFiles(progressBar, namespaced, dependantView, kv => kv.Key, id => Target(id), token);
3233
}
3334
}
3435
}

src/ApiGenerator/Generator/Razor/EnumsGenerator.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
33
// See the LICENSE file in the project root for more information
44

5+
using System.Threading;
56
using System.Threading.Tasks;
67
using ApiGenerator.Configuration;
78
using ApiGenerator.Domain;
@@ -13,12 +14,12 @@ public class EnumsGenerator : RazorGeneratorBase
1314
{
1415
public override string Title => "Elasticsearch.Net enums";
1516

16-
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar)
17+
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar, CancellationToken token)
1718
{
1819
var view = ViewLocations.LowLevel("Enums.Generated.cshtml");
1920
var target = GeneratorLocations.LowLevel("Api", "Enums.Generated.cs");
2021

21-
await DoRazor(spec, view, target);
22+
await DoRazor(spec, view, target, null, token);
2223
}
2324
}
2425
}

src/ApiGenerator/Generator/Razor/HighLevelClientImplementationGenerator.cs

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

55
using System.IO;
66
using System.Linq;
7+
using System.Threading;
78
using System.Threading.Tasks;
89
using ApiGenerator.Configuration;
910
using ApiGenerator.Domain;
@@ -16,21 +17,21 @@ public class HighLevelClientImplementationGenerator : RazorGeneratorBase
1617
{
1718
public override string Title => "NEST client implementation";
1819

19-
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar)
20+
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar, CancellationToken token)
2021
{
2122
// Delete existing files
2223
foreach (var file in Directory.GetFiles(GeneratorLocations.NestFolder, "ElasticClient.*.cs"))
2324
File.Delete(file);
2425

2526
var view = ViewLocations.HighLevel("Client", "Implementation", "ElasticClient.cshtml");
2627
var target = GeneratorLocations.HighLevel($"ElasticClient.{CsharpNames.RootNamespace}.cs");
27-
await DoRazor(spec, view, target);
28+
await DoRazor(spec, view, target, null, token);
2829

2930
string Target(string id) => GeneratorLocations.HighLevel($"ElasticClient.{id}.cs");
3031

3132
var namespaced = spec.EndpointsPerNamespaceHighLevel.Where(kv => kv.Key != CsharpNames.RootNamespace).ToList();
3233
var dependantView = ViewLocations.HighLevel("Client", "Implementation", "ElasticClient.Namespace.cshtml");
33-
await DoRazorDependantFiles(progressBar, namespaced, dependantView, kv => kv.Key, id => Target(id));
34+
await DoRazorDependantFiles(progressBar, namespaced, dependantView, kv => kv.Key, id => Target(id), token);
3435

3536
}
3637
}

src/ApiGenerator/Generator/Razor/HighLevelClientInterfaceGenerator.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
33
// See the LICENSE file in the project root for more information
44

5+
using System.Threading;
56
using System.Threading.Tasks;
67
using ApiGenerator.Configuration;
78
using ApiGenerator.Domain;
@@ -13,12 +14,12 @@ public class HighLevelClientInterfaceGenerator : RazorGeneratorBase
1314
{
1415
public override string Title => "NEST client interface";
1516

16-
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar)
17+
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar, CancellationToken token)
1718
{
1819
var view = ViewLocations.HighLevel("Client", "Interface", "IElasticClient.cshtml");
1920
var target = GeneratorLocations.HighLevel("IElasticClient.Generated.cs");
2021

21-
await DoRazor(spec, view, target);
22+
await DoRazor(spec, view, target, null, token);
2223
}
2324
}
2425
}

src/ApiGenerator/Generator/Razor/LowLevelClientImplementationGenerator.cs

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

55
using System.IO;
66
using System.Linq;
7+
using System.Threading;
78
using System.Threading.Tasks;
89
using ApiGenerator.Configuration;
910
using ApiGenerator.Domain;
@@ -16,20 +17,20 @@ public class LowLevelClientImplementationGenerator : RazorGeneratorBase
1617
{
1718
public override string Title { get; } = "Elasticsearch.Net client implementation";
1819

19-
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar)
20+
public override async Task Generate(RestApiSpec spec, ProgressBar progressBar, CancellationToken token)
2021
{
2122
// Delete existing files
2223
foreach (var file in Directory.GetFiles(GeneratorLocations.EsNetFolder, "ElasticLowLevelClient.*.cs"))
2324
File.Delete(file);
2425

2526
var view = ViewLocations.LowLevel("Client", "Implementation", "ElasticLowLevelClient.cshtml");
2627
var target = GeneratorLocations.LowLevel($"ElasticLowLevelClient.{CsharpNames.RootNamespace}.cs");
27-
await DoRazor(spec, view, target);
28+
await DoRazor(spec, view, target, null, token);
2829

2930
var namespaced = spec.EndpointsPerNamespaceLowLevel.Where(kv => kv.Key != CsharpNames.RootNamespace).ToList();
3031
var namespacedView = ViewLocations.LowLevel("Client", "Implementation", "ElasticLowLevelClient.Namespace.cshtml");
3132
await DoRazorDependantFiles(progressBar, namespaced, namespacedView, kv => kv.Key,
32-
id => GeneratorLocations.LowLevel($"ElasticLowLevelClient.{id}.cs"));
33+
id => GeneratorLocations.LowLevel($"ElasticLowLevelClient.{id}.cs"), token);
3334
}
3435
}
3536
}

0 commit comments

Comments
 (0)