Skip to content

Commit 0506ef5

Browse files
reakaleekCopilot
andauthored
Refactor applies_to (#1878)
* Refactor applies_to * Update src/Elastic.Markdown/Myst/Components/ApplicabilityMappings.cs Co-authored-by: Copilot <[email protected]> * Update src/Elastic.Markdown/Myst/Components/ApplicableToComponent.cshtml Co-authored-by: Copilot <[email protected]> * Fix naming * Simplify a bit * Use properties instead of dictionary * Refactor repeating logic --------- Co-authored-by: Copilot <[email protected]>
1 parent e7044ec commit 0506ef5

File tree

6 files changed

+373
-344
lines changed

6 files changed

+373
-344
lines changed
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information
4+
5+
using Elastic.Documentation.AppliesTo;
6+
7+
namespace Elastic.Markdown.Myst.Components;
8+
9+
public record ApplicabilityItem(
10+
string Key,
11+
Applicability Applicability,
12+
ApplicabilityRenderer.ApplicabilityRenderData RenderData
13+
);
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information
4+
5+
using Elastic.Documentation.Configuration.Versions;
6+
7+
namespace Elastic.Markdown.Myst.Components;
8+
9+
public static class ApplicabilityMappings
10+
{
11+
public record ApplicabilityDefinition(string Key, string DisplayName, VersioningSystemId VersioningSystemId);
12+
13+
// Stack
14+
public static readonly ApplicabilityDefinition Stack = new("Stack", "Elastic&nbsp;Stack", VersioningSystemId.Stack);
15+
16+
// Serverless
17+
public static readonly ApplicabilityDefinition Serverless = new("Serverless", "Elastic&nbsp;Cloud&nbsp;Serverless", VersioningSystemId.Serverless);
18+
public static readonly ApplicabilityDefinition ServerlessElasticsearch = new("Serverless Elasticsearch", "Serverless&nbsp;Elasticsearch projects", VersioningSystemId.ElasticsearchProject);
19+
public static readonly ApplicabilityDefinition ServerlessObservability = new("Serverless Observability", "Serverless&nbsp;Observability projects", VersioningSystemId.ObservabilityProject);
20+
public static readonly ApplicabilityDefinition ServerlessSecurity = new("Serverless Security", "Serverless&nbsp;Security projects", VersioningSystemId.SecurityProject);
21+
22+
// Deployment
23+
public static readonly ApplicabilityDefinition Ech = new("ECH", "Elastic&nbsp;Cloud&nbsp;Hosted", VersioningSystemId.Ess);
24+
public static readonly ApplicabilityDefinition Eck = new("ECK", "Elastic&nbsp;Cloud&nbsp;on&nbsp;Kubernetes", VersioningSystemId.Eck);
25+
public static readonly ApplicabilityDefinition Ece = new("ECE", "Elastic&nbsp;Cloud&nbsp;Enterprise", VersioningSystemId.Ece);
26+
public static readonly ApplicabilityDefinition Self = new("Self-Managed", "Self-managed Elastic&nbsp;deployments", VersioningSystemId.Self);
27+
28+
// Product Applicability
29+
public static readonly ApplicabilityDefinition Ecctl = new("ECCTL", "Elastic&nbsp;Cloud&nbsp;Control", VersioningSystemId.Ecctl);
30+
public static readonly ApplicabilityDefinition Curator = new("Curator", "Curator", VersioningSystemId.Curator);
31+
32+
// EDOT Products
33+
public static readonly ApplicabilityDefinition EdotAndroid = new("EDOT Android", "Elastic&nbsp;Distribution of OpenTelemetry&nbsp;Android", VersioningSystemId.EdotAndroid);
34+
public static readonly ApplicabilityDefinition EdotCfAws = new("EDOT CF AWS", "Elastic&nbsp;Distribution of OpenTelemetry&nbsp;Cloud&nbsp;Forwarder for AWS", VersioningSystemId.EdotCfAws);
35+
public static readonly ApplicabilityDefinition EdotCollector = new("EDOT Collector", "Elastic Distribution of OpenTelemetry Collector", VersioningSystemId.EdotCollector);
36+
public static readonly ApplicabilityDefinition EdotDotnet = new("EDOT .NET", "Elastic&nbsp;Distribution of OpenTelemetry&nbsp;.NET", VersioningSystemId.EdotDotnet);
37+
public static readonly ApplicabilityDefinition EdotIos = new("EDOT iOS", "Elastic&nbsp;Distribution of OpenTelemetry&nbsp;iOS", VersioningSystemId.EdotIos);
38+
public static readonly ApplicabilityDefinition EdotJava = new("EDOT Java", "Elastic&nbsp;Distribution of OpenTelemetry&nbsp;Java", VersioningSystemId.EdotJava);
39+
public static readonly ApplicabilityDefinition EdotNode = new("EDOT Node.js", "Elastic&nbsp;Distribution of OpenTelemetry&nbsp;Node.js", VersioningSystemId.EdotNode);
40+
public static readonly ApplicabilityDefinition EdotPhp = new("EDOT PHP", "Elastic&nbsp;Distribution of OpenTelemetry&nbsp;PHP", VersioningSystemId.EdotPhp);
41+
public static readonly ApplicabilityDefinition EdotPython = new("EDOT Python", "Elastic&nbsp;Distribution of OpenTelemetry&nbsp;Python", VersioningSystemId.EdotPython);
42+
43+
// APM Agents
44+
public static readonly ApplicabilityDefinition ApmAgentAndroid = new("APM Agent Android", "Application&nbsp;Performance&nbsp;Monitoring Agent for Android", VersioningSystemId.ApmAgentAndroid);
45+
public static readonly ApplicabilityDefinition ApmAgentDotnet = new("APM Agent .NET", "Application&nbsp;Performance&nbsp;Monitoring Agent for .NET", VersioningSystemId.ApmAgentDotnet);
46+
public static readonly ApplicabilityDefinition ApmAgentGo = new("APM Agent Go", "Application&nbsp;Performance&nbsp;Monitoring Agent for Go", VersioningSystemId.ApmAgentGo);
47+
public static readonly ApplicabilityDefinition ApmAgentIos = new("APM Agent iOS", "Application&nbsp;Performance&nbsp;Monitoring Agent for iOS", VersioningSystemId.ApmAgentIos);
48+
public static readonly ApplicabilityDefinition ApmAgentJava = new("APM Agent Java", "Application&nbsp;Performance&nbsp;Monitoring Agent for Java", VersioningSystemId.ApmAgentJava);
49+
public static readonly ApplicabilityDefinition ApmAgentNode = new("APM Agent Node.js", "Application&nbsp;Performance&nbsp;Monitoring Agent for Node.js", VersioningSystemId.ApmAgentNode);
50+
public static readonly ApplicabilityDefinition ApmAgentPhp = new("APM Agent PHP", "Application&nbsp;Performance&nbsp;Monitoring Agent for PHP", VersioningSystemId.ApmAgentPhp);
51+
public static readonly ApplicabilityDefinition ApmAgentPython = new("APM Agent Python", "Application&nbsp;Performance&nbsp;Monitoring Agent for Python", VersioningSystemId.ApmAgentPython);
52+
public static readonly ApplicabilityDefinition ApmAgentRuby = new("APM Agent Ruby", "Application&nbsp;Performance&nbsp;Monitoring Agent for Ruby", VersioningSystemId.ApmAgentRuby);
53+
public static readonly ApplicabilityDefinition ApmAgentRum = new("APM Agent RUM", "Application&nbsp;Performance&nbsp;Monitoring Agent for Real&nbsp;User&nbsp;Monitoring", VersioningSystemId.ApmAgentRum);
54+
55+
// Generic product
56+
public static readonly ApplicabilityDefinition Product = new("", "", VersioningSystemId.All);
57+
}
Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
// Licensed to Elasticsearch B.V under one or more agreements.
2+
// Elasticsearch B.V licenses this file to you under the Apache 2.0 License.
3+
// See the LICENSE file in the project root for more information
4+
5+
using System.Diagnostics.CodeAnalysis;
6+
using Elastic.Documentation;
7+
using Elastic.Documentation.AppliesTo;
8+
using Elastic.Documentation.Configuration.Versions;
9+
10+
namespace Elastic.Markdown.Myst.Components;
11+
12+
public class ApplicabilityRenderer
13+
{
14+
public record ApplicabilityRenderData(
15+
string BadgeLifecycleText,
16+
string Version,
17+
string TooltipText,
18+
string LifecycleClass,
19+
bool ShowLifecycleName,
20+
bool ShowVersion
21+
);
22+
23+
public ApplicabilityRenderData RenderApplicability(
24+
Applicability applicability,
25+
ApplicabilityMappings.ApplicabilityDefinition applicabilityDefinition,
26+
VersioningSystem versioningSystem,
27+
AppliesCollection allApplications)
28+
{
29+
var lifecycleClass = applicability.GetLifeCycleName().ToLowerInvariant().Replace(" ", "-");
30+
var lifecycleFull = GetLifecycleFullText(applicability.Lifecycle);
31+
var realVersion = TryGetRealVersion(applicability, out var v) ? v : null;
32+
33+
var tooltipText = BuildTooltipText(applicability, applicabilityDefinition, versioningSystem, realVersion, lifecycleFull);
34+
var badgeLifecycleText = BuildBadgeLifecycleText(applicability, versioningSystem, realVersion, allApplications);
35+
36+
var showLifecycle = applicability.Lifecycle != ProductLifecycle.GenerallyAvailable && string.IsNullOrEmpty(badgeLifecycleText);
37+
var showVersion = applicability.Version is not null and not AllVersions && versioningSystem.Current >= applicability.Version;
38+
var version = applicability.Version?.ToString() ?? "";
39+
return new ApplicabilityRenderData(
40+
BadgeLifecycleText: badgeLifecycleText,
41+
Version: version,
42+
TooltipText: tooltipText,
43+
LifecycleClass: lifecycleClass,
44+
ShowLifecycleName: showLifecycle,
45+
ShowVersion: showVersion
46+
);
47+
}
48+
49+
private static string GetLifecycleFullText(ProductLifecycle lifecycle) => lifecycle switch
50+
{
51+
ProductLifecycle.GenerallyAvailable => "Available",
52+
ProductLifecycle.Beta => "Available in beta",
53+
ProductLifecycle.TechnicalPreview => "Available in technical preview",
54+
ProductLifecycle.Deprecated => "Deprecated",
55+
ProductLifecycle.Removed => "Removed",
56+
ProductLifecycle.Unavailable => "Not available",
57+
_ => ""
58+
};
59+
60+
private static string BuildTooltipText(
61+
Applicability applicability,
62+
ApplicabilityMappings.ApplicabilityDefinition applicabilityDefinition,
63+
VersioningSystem versioningSystem,
64+
SemVersion? realVersion,
65+
string lifecycleFull)
66+
{
67+
var tooltipText = "";
68+
69+
tooltipText = realVersion is not null
70+
? realVersion <= versioningSystem.Current
71+
? $"{lifecycleFull} on {applicabilityDefinition.DisplayName} version {realVersion} and later unless otherwise specified."
72+
: applicability.Lifecycle switch
73+
{
74+
ProductLifecycle.GenerallyAvailable
75+
or ProductLifecycle.Beta
76+
or ProductLifecycle.TechnicalPreview
77+
or ProductLifecycle.Planned =>
78+
$"We plan to add this functionality in a future {applicabilityDefinition.DisplayName} update. Subject to change.",
79+
ProductLifecycle.Deprecated => $"We plan to deprecate this functionality in a future {applicabilityDefinition.DisplayName} update. Subject to change.",
80+
ProductLifecycle.Removed => $"We plan to remove this functionality in a future {applicabilityDefinition.DisplayName} update. Subject to change.",
81+
_ => tooltipText
82+
}
83+
: $"{lifecycleFull} on {applicabilityDefinition.DisplayName} unless otherwise specified.";
84+
85+
var disclaimer = GetDisclaimer(applicability.Lifecycle, versioningSystem.Id);
86+
if (disclaimer is not null)
87+
tooltipText = $"{tooltipText}\n\n{disclaimer}";
88+
89+
return tooltipText;
90+
}
91+
92+
private static string? GetDisclaimer(ProductLifecycle lifecycle, VersioningSystemId versioningSystemId) => lifecycle switch
93+
{
94+
ProductLifecycle.Beta => "Beta features are subject to change. The design and code is less mature than official GA features and is being provided as-is with no warranties. Beta features are not subject to the support SLA of official GA features.",
95+
ProductLifecycle.TechnicalPreview => "This functionality may be changed or removed in a future release. Elastic will work to fix any issues, but features in technical preview are not subject to the support SLA of official GA features.",
96+
ProductLifecycle.GenerallyAvailable => versioningSystemId is VersioningSystemId.Stack
97+
? "If this functionality is unavailable or behaves differently when deployed on ECH, ECE, ECK, or a self-managed installation, it will be indicated on the page."
98+
: null,
99+
_ => null
100+
};
101+
102+
private static string BuildBadgeLifecycleText(
103+
Applicability applicability,
104+
VersioningSystem versioningSystem,
105+
SemVersion? realVersion,
106+
AppliesCollection allApplications)
107+
{
108+
var badgeText = "";
109+
if (realVersion is not null && realVersion > versioningSystem.Current)
110+
{
111+
badgeText = applicability.Lifecycle switch
112+
{
113+
ProductLifecycle.TechnicalPreview => "Planned",
114+
ProductLifecycle.Beta => "Planned",
115+
ProductLifecycle.GenerallyAvailable =>
116+
allApplications.Any(a => a.Lifecycle is ProductLifecycle.TechnicalPreview or ProductLifecycle.Beta)
117+
? "GA planned"
118+
: "Planned",
119+
ProductLifecycle.Deprecated => "Deprecation planned",
120+
ProductLifecycle.Removed => "Removal planned",
121+
ProductLifecycle.Planned => "Planned",
122+
ProductLifecycle.Unavailable => "Unavailable",
123+
_ => badgeText
124+
};
125+
}
126+
127+
return badgeText;
128+
}
129+
130+
private static bool TryGetRealVersion(Applicability applicability, [NotNullWhen(true)] out SemVersion? version)
131+
{
132+
version = null;
133+
if (applicability.Version is not null && applicability.Version != AllVersions.Instance)
134+
{
135+
version = applicability.Version;
136+
return true;
137+
}
138+
139+
return false;
140+
}
141+
}

0 commit comments

Comments
 (0)