diff --git a/src/Elastic.Documentation/AppliesTo/ApplicableToJsonConverter.cs b/src/Elastic.Documentation/AppliesTo/ApplicableToJsonConverter.cs index c8d987064..a6dba46c4 100644 --- a/src/Elastic.Documentation/AppliesTo/ApplicableToJsonConverter.cs +++ b/src/Elastic.Documentation/AppliesTo/ApplicableToJsonConverter.cs @@ -131,7 +131,7 @@ public class ApplicableToJsonConverter : JsonConverter Self = deploymentProps.TryGetValue("self", out var self) ? new AppliesCollection(self.ToArray()) : null, Ece = deploymentProps.TryGetValue("ece", out var ece) ? new AppliesCollection(ece.ToArray()) : null, Eck = deploymentProps.TryGetValue("eck", out var eck) ? new AppliesCollection(eck.ToArray()) : null, - Ess = deploymentProps.TryGetValue("ess", out var ess) ? new AppliesCollection(ess.ToArray()) : null + Ess = deploymentProps.TryGetValue("ech", out var ess) || deploymentProps.TryGetValue("ess", out ess) ? new AppliesCollection(ess.ToArray()) : null }; } diff --git a/src/Elastic.Documentation/AppliesTo/ApplicableToYamlConverter.cs b/src/Elastic.Documentation/AppliesTo/ApplicableToYamlConverter.cs index b22c59ed4..91fe52b57 100644 --- a/src/Elastic.Documentation/AppliesTo/ApplicableToYamlConverter.cs +++ b/src/Elastic.Documentation/AppliesTo/ApplicableToYamlConverter.cs @@ -15,7 +15,7 @@ public class ApplicableToYamlConverter(IReadOnlyCollection productKeys) private readonly string[] _knownKeys = [ "stack", "deployment", "serverless", "product", // Applicability categories - "ece", "eck", "ess", "self", // Deployment options + "ece", "eck", "ess", "ech", "self", // Deployment options ("ech" aliasing to "ess") "elasticsearch", "observability", "security", // Serverless flavors .. productKeys ]; @@ -146,11 +146,17 @@ private static bool TryGetDeployment(Dictionary dictionary, Lis var d = new DeploymentApplicability(); var assigned = false; + var hasEss = dictionary.ContainsKey("ess"); + var hasEch = dictionary.ContainsKey("ech"); + if (hasEss && hasEch) + diagnostics.Add((Severity.Warning, "Both 'ess' and 'ech' are defined. Move 'ess' content into 'ech' to avoid information loss.")); + var mapping = new Dictionary> { { "ece", a => d.Ece = a }, { "eck", a => d.Eck = a }, { "ess", a => d.Ess = a }, + { "ech", a => d.Ess = a }, { "self", a => d.Self = a } }; diff --git a/tests/Elastic.Markdown.Tests/AppliesTo/ApplicableToJsonConverterRoundTripTests.cs b/tests/Elastic.Markdown.Tests/AppliesTo/ApplicableToJsonConverterRoundTripTests.cs index 1bf241171..190dce116 100644 --- a/tests/Elastic.Markdown.Tests/AppliesTo/ApplicableToJsonConverterRoundTripTests.cs +++ b/tests/Elastic.Markdown.Tests/AppliesTo/ApplicableToJsonConverterRoundTripTests.cs @@ -269,6 +269,43 @@ public void RoundTripComplexAllFieldsPopulated() deserialized.ProductApplicability.ApmAgentDotnet.Should().BeEquivalentTo(original.ProductApplicability.ApmAgentDotnet); } + [Fact] + public void RoundTripDeploymentEssRoundTripsCorrectly() + { + var original = new ApplicableTo + { + Deployment = new DeploymentApplicability + { + Ess = new AppliesCollection([new Applicability { Lifecycle = ProductLifecycle.GenerallyAvailable, Version = (VersionSpec)"9.0.0" }]) + } + }; + + var json = JsonSerializer.Serialize(original, _options); + var deserialized = JsonSerializer.Deserialize(json, _options); + + deserialized.Should().NotBeNull(); + deserialized!.Deployment.Should().NotBeNull(); + deserialized.Deployment!.Ess.Should().BeEquivalentTo(original.Deployment!.Ess); + } + + [Fact] + public void BothEssAndEchSubTypes_EchWins() + { + var json = """ + [ + { "type": "deployment", "sub_type": "ess", "lifecycle": "ga", "version": "9.0.0" }, + { "type": "deployment", "sub_type": "ech", "lifecycle": "beta", "version": "9.1.0" } + ] + """; + + var deserialized = JsonSerializer.Deserialize(json, _options); + + deserialized.Should().NotBeNull(); + deserialized!.Deployment.Should().NotBeNull(); + deserialized.Deployment!.Ess.Should().NotBeNull(); + deserialized.Deployment.Ess!.First().Lifecycle.Should().Be(ProductLifecycle.Beta); + } + [Fact] public void RoundTripAllLifecycles() { diff --git a/tests/authoring/Applicability/AppliesToFrontMatter.fs b/tests/authoring/Applicability/AppliesToFrontMatter.fs index 95483372e..1b0c0c6f4 100644 --- a/tests/authoring/Applicability/AppliesToFrontMatter.fs +++ b/tests/authoring/Applicability/AppliesToFrontMatter.fs @@ -121,6 +121,74 @@ applies_to: ) )) +type ``parses ech as alias for ess`` () = + static let markdown = frontMatter """ +applies_to: + deployment: + ech: ga 9.0 +""" + [] + let ``apply matches expected`` () = + markdown |> appliesTo (ApplicableTo( + Deployment=DeploymentApplicability( + Ess=AppliesCollection.op_Explicit "ga 9.0" + ) + )) + +type ``parses ech with version alongside other deployment types`` () = + static let markdown = frontMatter """ +applies_to: + deployment: + ech: beta 9.1 + eck: ga 9.0 + ece: removed 9.2.0 + self: unavailable 9.3.0 +""" + [] + let ``apply matches expected`` () = + markdown |> appliesTo (ApplicableTo( + Deployment=DeploymentApplicability( + Ess=AppliesCollection.op_Explicit "beta 9.1", + Eck=AppliesCollection.op_Explicit "ga 9.0", + Ece=AppliesCollection.op_Explicit "removed 9.2.0", + Self=AppliesCollection.op_Explicit "unavailable 9.3.0" + ) + )) + +type ``both ess and ech defined uses ech value and warns`` () = + static let markdown = frontMatter """ +applies_to: + deployment: + ess: ga 9.0 + ech: beta 9.1 +""" + [] + let ``ech value wins`` () = + markdown |> appliesTo (ApplicableTo( + Deployment=DeploymentApplicability( + Ess=AppliesCollection.op_Explicit "beta 9.1" + ) + )) + + [] + let ``emits warning about both being defined`` () = + markdown |> hasWarning "Both 'ess' and 'ech' are defined" + +type ``parses ech at top level`` () = + static let markdown = frontMatter """ +applies_to: + ech: preview 9.1 + stack: ga 9.1 +""" + [] + let ``apply matches expected`` () = + markdown |> appliesTo (ApplicableTo( + Deployment=DeploymentApplicability( + Ess=AppliesCollection.op_Explicit "preview 9.1" + ), + Stack=AppliesCollection.op_Explicit "ga 9.1.0" + )) + type ``parses product coming DEPRECATED`` () = static let markdown = frontMatter """ applies_to: diff --git a/tests/authoring/Inline/AppliesToRole.fs b/tests/authoring/Inline/AppliesToRole.fs index 145efe67b..9d144dbd7 100644 --- a/tests/authoring/Inline/AppliesToRole.fs +++ b/tests/authoring/Inline/AppliesToRole.fs @@ -53,6 +53,22 @@ This is an inline {applies_to}`ess: preview 9.1` element. ) )) +type ``parses nested ech moniker as ess`` () = + static let markdown = Setup.Markdown """ + +This is an inline {applies_to}`ech: preview 9.1` element. +""" + + [] + let ``parses to AppliesDirective`` () = + let directives = markdown |> converts "index.md" |> parses + test <@ directives.Length = 1 @> + directives |> appliesToDirective (ApplicableTo( + Deployment=DeploymentApplicability( + Ess=AppliesCollection.op_Explicit "preview 9.1.0" + ) + )) + type ``parses {preview} shortcut`` () = static let markdown = Setup.Markdown """