Skip to content

Commit b73ea29

Browse files
authored
Refactor products frontmatter (#1237)
* Refactor products frontmatter * Fix * Optimize * Use Oridnal string comparer * Use DisplayName
1 parent c49c3a3 commit b73ea29

File tree

5 files changed

+88
-235
lines changed

5 files changed

+88
-235
lines changed

Directory.Packages.props

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
<PackageVersion Include="Vecc.YamlDotNet.Analyzers.StaticGenerator" Version="16.1.3" PrivateAssets="All" />
4949
<PackageVersion Include="Westwind.AspNetCore.LiveReload" Version="0.5.2" />
5050
<PackageVersion Include="YamlDotNet" Version="16.3.0" />
51-
<PackageVersion Include="Supernova.Enum.Generators" Version="1.0.17" />
5251
</ItemGroup>
5352
<!-- Test packages -->
5453
<ItemGroup>
@@ -64,4 +63,4 @@
6463
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.2" />
6564
<PackageVersion Include="xunit.v3" Version="1.1.0" />
6665
</ItemGroup>
67-
</Project>
66+
</Project>

src/Elastic.Markdown/Elastic.Markdown.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
<PackageReference Include="Microsoft.Extensions.Logging" />
5757
<PackageReference Include="RazorSlices" />
5858
<PackageReference Include="Slugify.Core" />
59-
<PackageReference Include="Supernova.Enum.Generators" />
6059
<PackageReference Include="Utf8StreamReader" />
6160
<PackageReference Include="Vecc.YamlDotNet.Analyzers.StaticGenerator" />
6261
<PackageReference Include="YamlDotNet" />

src/Elastic.Markdown/Myst/FrontMatter/Products.cs

Lines changed: 81 additions & 224 deletions
Original file line numberDiff line numberDiff line change
@@ -5,231 +5,92 @@
55
using System.Collections.Frozen;
66
using System.ComponentModel.DataAnnotations;
77
using Elastic.Markdown.Suggestions;
8-
using EnumFastToStringGenerated;
98
using YamlDotNet.Core;
109
using YamlDotNet.Core.Events;
1110
using YamlDotNet.Serialization;
1211

1312
namespace Elastic.Markdown.Myst.FrontMatter;
1413

15-
[EnumGenerator]
16-
public enum Product
17-
{
18-
[Display(Name = "apm", Description = "APM")]
19-
Apm,
20-
21-
[Display(Name = "apm-dotnet-agent", Description = "APM .NET Agent")]
22-
ApmDotnetAgent,
23-
24-
[Display(Name = "apm-android-agent", Description = "APM Android Agent")]
25-
ApmAndroidAgent,
26-
27-
[Display(Name = "apm-attacher", Description = "APM Attacher")]
28-
ApmAttacher,
29-
30-
[Display(Name = "apm-aws-lambda-extension", Description = "APM AWS Lambda extension")]
31-
ApmAwsLambdaExtension,
32-
33-
[Display(Name = "apm-go-agent", Description = "APM Go Agent")]
34-
ApmGoAgent,
35-
36-
[Display(Name = "apm-ios-agent", Description = "APM iOS Agent")]
37-
ApmIosAgent,
38-
39-
[Display(Name = "apm-java-agent", Description = "APM Java Agent")]
40-
ApmJavaAgent,
41-
42-
[Display(Name = "apm-node-agent", Description = "APM Node.js Agent")]
43-
ApmNodeAgent,
44-
45-
[Display(Name = "apm-php-agent", Description = "APM PHP Agent")]
46-
ApmPhpAgent,
47-
48-
[Display(Name = "apm-python-agent", Description = "APM Python Agent")]
49-
ApmPythonAgent,
50-
51-
[Display(Name = "apm-ruby-agent", Description = "APM Ruby Agent")]
52-
ApmRubyAgent,
53-
54-
[Display(Name = "apm-rum-agent", Description = "APM RUM Agent")]
55-
ApmRumAgent,
56-
57-
[Display(Name = "beats-logging-plugin", Description = "Beats Logging plugin")]
58-
BeatsLoggingPlugin,
59-
60-
[Display(Name = "cloud-control-ecctl", Description = "Cloud Control ECCTL")]
61-
CloudControlEcctl,
62-
63-
[Display(Name = "cloud-enterprise", Description = "Cloud Enterprise")]
64-
CloudEnterprise,
65-
66-
[Display(Name = "cloud-hosted", Description = "Cloud Hosted")]
67-
CloudHosted,
68-
69-
[Display(Name = "cloud-kubernetes", Description = "Cloud Kubernetes")]
70-
CloudKubernetes,
71-
72-
[Display(Name = "cloud-native-ingest", Description = "Cloud Native Ingest")]
73-
CloudNativeIngest,
74-
75-
[Display(Name = "cloud-serverless", Description = "Cloud Serverless")]
76-
CloudServerless,
77-
78-
[Display(Name = "cloud-terraform", Description = "Cloud Terraform")]
79-
CloudTerraform,
80-
81-
[Display(Name = "ecs-logging", Description = "ECS Logging")]
82-
EcsLogging,
83-
84-
[Display(Name = "ecs-logging-dotnet", Description = "ECS Logging .NET")]
85-
EcsLoggingDotnet,
86-
87-
[Display(Name = "ecs-logging-go-logrus", Description = "ECS Logging Go Logrus")]
88-
EcsLoggingGoLogrus,
89-
90-
[Display(Name = "ecs-logging-go-zap", Description = "ECS Logging Go Zap")]
91-
EcsLoggingGoZap,
92-
93-
[Display(Name = "ecs-logging-go-zerolog", Description = "ECS Logging Go Zerolog")]
94-
EcsLoggingGoZerolog,
95-
96-
[Display(Name = "ecs-logging-java", Description = "ECS Logging Java")]
97-
EcsLoggingJava,
98-
99-
[Display(Name = "ecs-logging-node", Description = "ECS Logging Node.js")]
100-
EcsLoggingNode,
101-
102-
[Display(Name = "ecs-logging-php", Description = "ECS Logging PHP")]
103-
EcsLoggingPhp,
104-
105-
[Display(Name = "ecs-logging-python", Description = "ECS Logging Python")]
106-
EcsLoggingPython,
107-
108-
[Display(Name = "ecs-logging-ruby", Description = "ECS Logging Ruby")]
109-
EcsLoggingRuby,
110-
111-
[Display(Name = "elastic-agent", Description = "Elastic Agent")]
112-
ElasticAgent,
113-
114-
[Display(Name = "ecs", Description = "Elastic Common Schema (ECS)")]
115-
Ecs,
116-
117-
[Display(Name = "elastic-products-platform", Description = "Elastic Products platform")]
118-
ElasticProductsPlatform,
119-
120-
[Display(Name = "elastic-stack", Description = "Elastic Stack")]
121-
ElasticStack,
122-
123-
[Display(Name = "elasticsearch", Description = "Elasticsearch")]
124-
Elasticsearch,
125-
126-
[Display(Name = "elasticsearch-dotnet-client", Description = "Elasticsearch .NET Client")]
127-
ElasticsearchDotnetClient,
14+
public record Product(string Id, string DisplayName);
12815

129-
[Display(Name = "elasticsearch-apache-hadoop", Description = "Elasticsearch Apache Hadoop")]
130-
ElasticsearchApacheHadoop,
131-
132-
[Display(Name = "elasticsearch-cloud-hosted-heroku", Description = "Elasticsearch Cloud Hosted Heroku")]
133-
ElasticsearchCloudHostedHeroku,
134-
135-
[Display(Name = "elasticsearch-community-clients", Description = "Elasticsearch community clients")]
136-
ElasticsearchCommunityClients,
137-
138-
[Display(Name = "elasticsearch-curator", Description = "Elasticsearch Curator")]
139-
ElasticsearchCurator,
140-
141-
[Display(Name = "elasticsearch-eland-python-client", Description = "Elasticsearch Eland Python Client")]
142-
ElasticsearchElandPythonClient,
143-
144-
[Display(Name = "elasticsearch-go-client", Description = "Elasticsearch Go Client")]
145-
ElasticsearchGoClient,
146-
147-
[Display(Name = "elasticsearch-groovy-client", Description = "Elasticsearch Groovy Client")]
148-
ElasticsearchGroovyClient,
149-
150-
[Display(Name = "elasticsearch-java-client", Description = "Elasticsearch Java Client")]
151-
ElasticsearchJavaClient,
152-
153-
[Display(Name = "elasticsearch-java-script-client", Description = "Elasticsearch JavaScript Client")]
154-
ElasticsearchJavaScriptClient,
155-
156-
[Display(Name = "elasticsearch-painless-scripting-language", Description = "Elasticsearch Painless scripting language")]
157-
ElasticsearchPainlessScriptingLanguage,
158-
159-
[Display(Name = "elasticsearch-perl-client", Description = "Elasticsearch Perl Client")]
160-
ElasticsearchPerlClient,
161-
162-
[Display(Name = "elasticsearch-php-client", Description = "Elasticsearch PHP Client")]
163-
ElasticsearchPhpClient,
164-
165-
[Display(Name = "elasticsearch-plugins", Description = "Elasticsearch plugins")]
166-
ElasticsearchPlugins,
167-
168-
[Display(Name = "elasticsearch-python-client", Description = "Elasticsearch Python Client")]
169-
ElasticsearchPythonClient,
170-
171-
[Display(Name = "elasticsearch-resiliency-status", Description = "Elasticsearch Resiliency Status")]
172-
ElasticsearchResiliencyStatus,
173-
174-
[Display(Name = "elasticsearch-ruby-client", Description = "Elasticsearch Ruby Client")]
175-
ElasticsearchRubyClient,
176-
177-
[Display(Name = "elasticsearch-rust-client", Description = "Elasticsearch Rust Client")]
178-
ElasticsearchRustClient,
179-
180-
[Display(Name = "fleet", Description = "Fleet")]
181-
Fleet,
182-
183-
[Display(Name = "ingest", Description = "Ingest")]
184-
Ingest,
185-
186-
[Display(Name = "integrations", Description = "Integrations")]
187-
Integrations,
188-
189-
[Display(Name = "kibana", Description = "Kibana")]
190-
Kibana,
191-
192-
[Display(Name = "logstash", Description = "Logstash")]
193-
Logstash,
194-
195-
[Display(Name = "machine-learning", Description = "Machine Learning")]
196-
MachineLearning,
197-
198-
[Display(Name = "observability", Description = "Observability")]
199-
Observability,
200-
201-
[Display(Name = "reference-architectures", Description = "Reference Architectures")]
202-
ReferenceArchitectures,
203-
204-
[Display(Name = "search-ui", Description = "Search UI")]
205-
SearchUi,
206-
207-
[Display(Name = "security", Description = "Security")]
208-
Security,
209-
210-
[Display(Name = "edot-collector", Description = "Elastic Distribution of OpenTelemetry Collector")]
211-
EdotCollector,
212-
213-
[Display(Name = "edot-java", Description = "Elastic Distribution of OpenTelemetry Java")]
214-
EdotJava,
215-
216-
[Display(Name = "edot-dotnet", Description = "Elastic Distribution of OpenTelemetry .NET")]
217-
EdotDotnet,
218-
219-
[Display(Name = "edot-nodejs", Description = "Elastic Distribution of OpenTelemetry Node.js")]
220-
EdotNodeJs,
221-
222-
[Display(Name = "edot-php", Description = "Elastic Distribution of OpenTelemetry PHP")]
223-
EdotPhp,
224-
225-
[Display(Name = "edot-python", Description = "Elastic Distribution of OpenTelemetry Python")]
226-
EdotPython,
227-
228-
[Display(Name = "edot-android", Description = "Elastic Distribution of OpenTelemetry Android")]
229-
EdotAndroid,
230-
231-
[Display(Name = "edot-ios", Description = "Elastic Distribution of OpenTelemetry iOS")]
232-
EdotIos,
16+
public static class Products
17+
{
18+
public static FrozenSet<Product> All { get; } = [
19+
new("apm", "APM"),
20+
new("apm-dotnet-agent", "APM .NET Agent"),
21+
new("apm-android-agent", "APM Android Agent"),
22+
new("apm-attacher", "APM Attacher"),
23+
new("apm-aws-lambda-extension", "APM AWS Lambda extension"),
24+
new("apm-go-agent", "APM Go Agent"),
25+
new("apm-ios-agent", "APM iOS Agent"),
26+
new("apm-java-agent", "APM Java Agent"),
27+
new("apm-node-agent", "APM Node.js Agent"),
28+
new("apm-php-agent", "APM PHP Agent"),
29+
new("apm-python-agent", "APM Python Agent"),
30+
new("apm-ruby-agent", "APM Ruby Agent"),
31+
new("apm-rum-agent", "APM RUM Agent"),
32+
new("beats-logging-plugin", "Beats Logging plugin"),
33+
new("cloud-control-ecctl", "Cloud Control ECCTL"),
34+
new("cloud-enterprise", "Cloud Enterprise"),
35+
new("cloud-hosted", "Cloud Hosted"),
36+
new("cloud-kubernetes", "Cloud Kubernetes"),
37+
new("cloud-native-ingest", "Cloud Native Ingest"),
38+
new("cloud-serverless", "Cloud Serverless"),
39+
new("cloud-terraform", "Cloud Terraform"),
40+
new("ecs-logging", "ECS Logging"),
41+
new("ecs-logging-dotnet", "ECS Logging .NET"),
42+
new("ecs-logging-go-logrus", "ECS Logging Go Logrus"),
43+
new("ecs-logging-go-zap", "ECS Logging Go Zap"),
44+
new("ecs-logging-go-zerolog", "ECS Logging Go Zerolog"),
45+
new("ecs-logging-java", "ECS Logging Java"),
46+
new("ecs-logging-node", "ECS Logging Node.js"),
47+
new("ecs-logging-php", "ECS Logging PHP"),
48+
new("ecs-logging-python", "ECS Logging Python"),
49+
new("ecs-logging-ruby", "ECS Logging Ruby"),
50+
new("elastic-agent", "Elastic Agent"),
51+
new("ecs", "Elastic Common Schema (ECS)"),
52+
new("elastic-products-platform", "Elastic Products platform"),
53+
new("elastic-stack", "Elastic Stack"),
54+
new("elasticsearch", "Elasticsearch"),
55+
new("elasticsearch-dotnet-client", "Elasticsearch .NET Client"),
56+
new("elasticsearch-apache-hadoop", "Elasticsearch Apache Hadoop"),
57+
new("elasticsearch-cloud-hosted-heroku", "Elasticsearch Cloud Hosted Heroku"),
58+
new("elasticsearch-community-clients", "Elasticsearch community clients"),
59+
new("elasticsearch-curator", "Elasticsearch Curator"),
60+
new("elasticsearch-eland-python-client", "Elasticsearch Eland Python Client"),
61+
new("elasticsearch-go-client", "Elasticsearch Go Client"),
62+
new("elasticsearch-groovy-client", "Elasticsearch Groovy Client"),
63+
new("elasticsearch-java-client", "Elasticsearch Java Client"),
64+
new("elasticsearch-java-script-client", "Elasticsearch JavaScript Client"),
65+
new("elasticsearch-painless-scripting-language", "Elasticsearch Painless scripting language"),
66+
new("elasticsearch-perl-client", "Elasticsearch Perl Client"),
67+
new("elasticsearch-php-client", "Elasticsearch PHP Client"),
68+
new("elasticsearch-plugins", "Elasticsearch plugins"),
69+
new("elasticsearch-python-client", "Elasticsearch Python Client"),
70+
new("elasticsearch-resiliency-status", "Elasticsearch Resiliency Status"),
71+
new("elasticsearch-ruby-client", "Elasticsearch Ruby Client"),
72+
new("elasticsearch-rust-client", "Elasticsearch Rust Client"),
73+
new("fleet", "Fleet"),
74+
new("ingest", "Ingest"),
75+
new("integrations", "Integrations"),
76+
new("kibana", "Kibana"),
77+
new("logstash", "Logstash"),
78+
new("machine-learning", "Machine Learning"),
79+
new("observability", "Observability"),
80+
new("reference-architectures", "Reference Architectures"),
81+
new("search-ui", "Search UI"),
82+
new("security", "Security"),
83+
new("edot-collector", "Elastic Distribution of OpenTelemetry Collector"),
84+
new("edot-java", "Elastic Distribution of OpenTelemetry Java"),
85+
new("edot-dotnet", "Elastic Distribution of OpenTelemetry .NET"),
86+
new("edot-nodejs", "Elastic Distribution of OpenTelemetry Node.js"),
87+
new("edot-php", "Elastic Distribution of OpenTelemetry PHP"),
88+
new("edot-python", "Elastic Distribution of OpenTelemetry Python"),
89+
new("edot-android", "Elastic Distribution of OpenTelemetry Android"),
90+
new("edot-ios", "Elastic Distribution of OpenTelemetry iOS")
91+
];
92+
93+
public static FrozenDictionary<string, Product> AllById { get; } = All.ToDictionary(p => p.Id, StringComparer.Ordinal).ToFrozenDictionary();
23394
}
23495

23596
public class ProductConverter : IYamlTypeConverter
@@ -242,10 +103,7 @@ public object ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeseria
242103
if (string.IsNullOrWhiteSpace(value.Value))
243104
throw new InvalidProductException("");
244105

245-
var product = Enum.GetValues<Product>()
246-
.FirstOrDefault(p => p.ToDisplayFast()?.Equals(value.Value, StringComparison.Ordinal) ?? false);
247-
248-
if (ProductEnumExtensions.IsDefinedFast(product) && product.ToDisplayFast()?.Equals(value.Value) == true)
106+
if (Products.AllById.TryGetValue(value.Value, out var product))
249107
return product;
250108

251109
throw new InvalidProductException(value.Value);
@@ -263,6 +121,5 @@ public class InvalidProductException(string invalidValue)
263121
public static class ProductExtensions
264122
{
265123
public static IReadOnlySet<string> GetProductIds() =>
266-
ProductEnumExtensions.GetValuesFast()
267-
.Select(p => p.ToDisplayFast()).ToFrozenSet();
124+
Products.All.Select(p => p.Id).ToFrozenSet();
268125
}

src/Elastic.Markdown/Slices/Index.cshtml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
@using Elastic.Markdown.Myst.FrontMatter
21
@using Elastic.Markdown.Slices.Components
3-
@using EnumFastToStringGenerated
42
@using Markdig
53
@inherits RazorSliceHttpResult<IndexViewModel>
64
@implements IUsesLayout<Elastic.Markdown.Slices._Layout, LayoutViewModel>
@@ -25,7 +23,7 @@
2523
StaticFileContentHashProvider = Model.StaticFileContentHashProvider,
2624
ReportIssueUrl = Model.ReportIssueUrl,
2725
LegacyPage = Model.LegacyPage,
28-
Products = Model.CurrentDocument.YamlFrontMatter?.Products is { Count: > 0} products ? string.Join(",", products.Select(p => p.ToDescriptionFast()).ToList()) : null,
26+
Products = Model.CurrentDocument.YamlFrontMatter?.Products is { Count: > 0} products ? string.Join(",", products.Select(p => p.DisplayName)) : null,
2927
};
3028
}
3129
<section id="elastic-docs-v3">

tests/Elastic.Markdown.Tests/FrontMatter/YamlFrontMatterTests.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ public void ReadsProducts()
8181
{
8282
File.YamlFrontMatter.Should().NotBeNull();
8383
File.YamlFrontMatter!.Products.Should().NotBeNull()
84-
.And.HaveCount(1)
85-
.And.Contain(Product.Apm);
84+
.And.HaveCount(1);
85+
File.YamlFrontMatter!.Products!.First().Id.Should().Be("apm");
8686
}
8787
}
8888

@@ -103,9 +103,9 @@ public void ReadsProducts()
103103
{
104104
File.YamlFrontMatter.Should().NotBeNull();
105105
File.YamlFrontMatter!.Products.Should().NotBeNull()
106-
.And.HaveCount(2)
107-
.And.Contain(Product.Apm)
108-
.And.Contain(Product.Elasticsearch);
106+
.And.HaveCount(2);
107+
File.YamlFrontMatter!.Products!.First().Id.Should().Be("apm");
108+
File.YamlFrontMatter!.Products!.Last().Id.Should().Be("elasticsearch");
109109
}
110110
}
111111

0 commit comments

Comments
 (0)