Skip to content

Commit 50db168

Browse files
authored
Update applicability lifecycles to match versioning RFC (#1393)
* Update applicability lifecycles to match versioning RFC * update test failures * update applies to documentation * emit hints for obsolete lifecycles so we don't trip up --strict builds * add todo to emit as error in the future
1 parent 69fab5f commit 50db168

File tree

15 files changed

+145
-247
lines changed

15 files changed

+145
-247
lines changed

.github/workflows/preview-build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ jobs:
200200
with:
201201
prefix: ${{ env.PATH_PREFIX }}
202202
strict: ${{ fromJSON(inputs.strict != '' && inputs.strict || 'true') }}
203-
metadata-only: ${{ fromJSON(inputs.metadata-only != '' && inputs.metadata-only || 'true') }}
203+
metadata-only: ${{ fromJSON(inputs.metadata-only != '' && inputs.metadata-only || 'false') }}
204204

205205
- name: 'Validate inbound links'
206206
if: |

docs/syntax/applies.md

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ applies_to:
1010
security: ga 9.0.0
1111
elasticsearch: beta 9.1.0
1212
observability: discontinued 9.2.0
13-
product: planned 9.5, discontinued 9.7
13+
product: preview 9.5, discontinued 9.7
1414
---
1515

1616
# Applies to
@@ -28,12 +28,10 @@ Taking a mandatory [life-cycle](#life-cycle) with an optional version.
2828
#### Life cycle:
2929
* `preview`
3030
* `beta`
31-
* `development`
31+
* `ga`
3232
* `deprecated`
33-
* `planned`
34-
* `discontinued`
33+
* `removed`
3534
* `unavailable`
36-
* `ga`
3735

3836
#### Version
3937

@@ -42,7 +40,7 @@ Can be in either `major.minor` or `major.minor.patch` format
4240
#### Examples
4341

4442
```
45-
planned 9.5, discontinued 9.7
43+
preview 9.5, discontinued 9.7
4644
discontinued 9.2.0
4745
all
4846
```
@@ -107,7 +105,7 @@ applies_to:
107105
security: ga 9.0.0
108106
elasticsearch: beta 9.1.0
109107
observability: discontinued 9.2.0
110-
product: planned 9.5, discontinued 9.7
108+
product: preview 9.5, discontinued 9.7
111109
---
112110
```
113111

@@ -125,7 +123,7 @@ serverless:
125123
security: ga 9.0.0
126124
elasticsearch: beta 9.1.0
127125
observability: discontinued 9.2.0
128-
product: planned 9.5, discontinued 9.7
126+
product: preview 9.5, discontinued 9.7
129127
```
130128

131129
A header may be followed by an `{applies_to}` directive which will contextualize the applicability

src/Elastic.Documentation/Diagnostics/DiagnosticsCollector.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public void Write(Diagnostic diagnostic)
102102
Channel.Write(diagnostic);
103103
}
104104

105-
private void Emit(Severity severity, string file, string message) =>
105+
public void Emit(Severity severity, string file, string message) =>
106106
Write(new Diagnostic
107107
{
108108
Severity = severity,

src/Elastic.Documentation/Diagnostics/IDiagnosticsCollector.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public interface IDiagnosticsCollector : IAsyncDisposable
1717
HashSet<string> OffendingFiles { get; }
1818
ConcurrentDictionary<string, bool> InUseSubstitutionKeys { get; }
1919

20+
void Emit(Severity severity, string file, string message);
2021
void EmitError(string file, string message, Exception? e = null);
2122
void EmitWarning(string file, string message);
2223
void EmitHint(string file, string message);
@@ -27,6 +28,10 @@ public interface IDiagnosticsCollector : IAsyncDisposable
2728

2829
public static class DiagnosticsCollectorExtensions
2930
{
31+
32+
public static void Emit(this IDiagnosticsCollector collector, Severity severity, IFileInfo file, string message) =>
33+
collector.Emit(severity, file.FullName, message);
34+
3035
public static void EmitError(this IDiagnosticsCollector collector, IFileInfo file, string message, Exception? e = null) =>
3136
collector.EmitError(file.FullName, message, e);
3237

src/Elastic.Markdown/Diagnostics/ProcessorDiagnosticExtensions.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,13 @@ public static void EmitWarning(this ParserContext context, int line, int column,
7878
context.Build.Collector.Write(d);
7979
}
8080

81-
public static void EmitError(this IBlockExtension block, string message, Exception? e = null) => EmitDiagnostic(block, Severity.Error, message, e);
81+
public static void EmitError(this IBlockExtension block, string message, Exception? e = null) => Emit(block, Severity.Error, message, e);
8282

83-
public static void EmitWarning(this IBlockExtension block, string message) => EmitDiagnostic(block, Severity.Warning, message);
83+
public static void EmitWarning(this IBlockExtension block, string message) => Emit(block, Severity.Warning, message);
8484

85-
public static void EmitHint(this IBlockExtension block, string message) => EmitDiagnostic(block, Severity.Hint, message);
85+
public static void EmitHint(this IBlockExtension block, string message) => Emit(block, Severity.Hint, message);
8686

87-
private static void EmitDiagnostic(IBlockExtension block, Severity severity, string message, Exception? e = null)
87+
public static void Emit(this IBlockExtension block, Severity severity, string message, Exception? e = null)
8888
{
8989
if (block.SkipValidation)
9090
return;
@@ -102,7 +102,7 @@ private static void EmitDiagnostic(IBlockExtension block, Severity severity, str
102102
}
103103

104104

105-
private static void LinkDiagnostic(InlineProcessor processor, Severity severity, Inline inline, int length, string message, Exception? e = null)
105+
public static void Emit(this InlineProcessor processor, Severity severity, Inline inline, int length, string message, Exception? e = null)
106106
{
107107
var line = inline.Line + 1;
108108
var column = inline.Column;
@@ -123,20 +123,20 @@ private static void LinkDiagnostic(InlineProcessor processor, Severity severity,
123123
}
124124

125125
public static void EmitError(this InlineProcessor processor, LinkInline inline, string message) =>
126-
LinkDiagnostic(processor, Severity.Error, inline, inline.Url?.Length ?? 1, message);
126+
Emit(processor, Severity.Error, inline, inline.Url?.Length ?? 1, message);
127127

128128
public static void EmitWarning(this InlineProcessor processor, LinkInline inline, string message) =>
129-
LinkDiagnostic(processor, Severity.Warning, inline, inline.Url?.Length ?? 1, message);
129+
Emit(processor, Severity.Warning, inline, inline.Url?.Length ?? 1, message);
130130

131131
public static void EmitHint(this InlineProcessor processor, LinkInline inline, string message) =>
132-
LinkDiagnostic(processor, Severity.Hint, inline, inline.Url?.Length ?? 1, message);
132+
Emit(processor, Severity.Hint, inline, inline.Url?.Length ?? 1, message);
133133

134134
public static void EmitError(this InlineProcessor processor, Inline inline, int length, string message, Exception? e = null) =>
135-
LinkDiagnostic(processor, Severity.Error, inline, length, message, e);
135+
Emit(processor, Severity.Error, inline, length, message, e);
136136

137137
public static void EmitWarning(this InlineProcessor processor, Inline inline, int length, string message) =>
138-
LinkDiagnostic(processor, Severity.Warning, inline, length, message);
138+
Emit(processor, Severity.Warning, inline, length, message);
139139

140140
public static void EmitHint(this InlineProcessor processor, Inline inline, int length, string message) =>
141-
LinkDiagnostic(processor, Severity.Hint, inline, length, message);
141+
Emit(processor, Severity.Hint, inline, length, message);
142142
}

src/Elastic.Markdown/IO/MarkdownFile.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,12 @@ private YamlFrontMatter ProcessYamlFrontMatter(MarkdownDocument document)
320320
var raw = string.Join(Environment.NewLine, yaml.Lines.Lines);
321321
var fm = ReadYamlFrontMatter(raw);
322322

323+
if (fm.AppliesTo?.Diagnostics is not null)
324+
{
325+
foreach (var (severity, message) in fm.AppliesTo.Diagnostics)
326+
Collector.Emit(severity, FilePath, message);
327+
}
328+
323329
// TODO remove when migration tool and our demo content sets are updated
324330
var deprecatedTitle = fm.Title;
325331
if (!string.IsNullOrEmpty(deprecatedTitle))

src/Elastic.Markdown/Myst/CodeBlocks/EnhancedCodeBlockParser.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -126,11 +126,11 @@ private static void ProcessAppliesToDirective(AppliesToDirective appliesToDirect
126126
{
127127
var applicableTo = YamlSerialization.Deserialize<ApplicableTo>(yaml);
128128
appliesToDirective.AppliesTo = applicableTo;
129-
if (appliesToDirective.AppliesTo.Warnings is null)
129+
if (appliesToDirective.AppliesTo.Diagnostics is null)
130130
return;
131-
foreach (var warning in appliesToDirective.AppliesTo.Warnings)
132-
appliesToDirective.EmitWarning(warning);
133-
applicableTo.Warnings = null;
131+
foreach (var (severity, message) in appliesToDirective.AppliesTo.Diagnostics)
132+
appliesToDirective.Emit(severity, message);
133+
applicableTo.Diagnostics = null;
134134
}
135135
catch (Exception e)
136136
{

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

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using System.Diagnostics.CodeAnalysis;
77
using System.Text;
88
using Elastic.Documentation;
9+
using Elastic.Documentation.Diagnostics;
910
using YamlDotNet.Serialization;
1011

1112
namespace Elastic.Markdown.Myst.FrontMatter;
@@ -17,7 +18,7 @@ public record AppliesCollection : IReadOnlyCollection<Applicability>
1718
public AppliesCollection(Applicability[] items) => _items = items;
1819

1920
// <lifecycle> [version]
20-
public static bool TryParse(string? value, out AppliesCollection? availability)
21+
public static bool TryParse(string? value, IList<(Severity, string)> diagnostics, out AppliesCollection? availability)
2122
{
2223
availability = null;
2324
if (string.IsNullOrWhiteSpace(value) || string.Equals(value.Trim(), "all", StringComparison.InvariantCultureIgnoreCase))
@@ -30,7 +31,7 @@ public static bool TryParse(string? value, out AppliesCollection? availability)
3031
var applications = new List<Applicability>(items.Length);
3132
foreach (var item in items)
3233
{
33-
if (Applicability.TryParse(item.Trim(), out var a))
34+
if (Applicability.TryParse(item.Trim(), diagnostics, out var a))
3435
applications.Add(a);
3536
}
3637

@@ -64,7 +65,10 @@ public override int GetHashCode()
6465

6566
public static explicit operator AppliesCollection(string b)
6667
{
67-
var productAvailability = TryParse(b, out var version) ? version : null;
68+
var diagnostics = new List<(Severity, string)>();
69+
var productAvailability = TryParse(b, diagnostics, out var version) ? version : null;
70+
if (diagnostics.Count > 0)
71+
throw new ArgumentException("Explicit conversion from string to AppliesCollection failed." + string.Join(Environment.NewLine, diagnostics));
6872
return productAvailability ?? throw new ArgumentException($"'{b}' is not a valid applicability string array.");
6973
}
7074

@@ -112,6 +116,7 @@ public string GetLifeCycleName() =>
112116
ProductLifecycle.Discontinued => "Discontinued",
113117
ProductLifecycle.Unavailable => "Unavailable",
114118
ProductLifecycle.GenerallyAvailable => "GA",
119+
ProductLifecycle.Removed => "Removed",
115120
_ => throw new ArgumentOutOfRangeException(nameof(Lifecycle), Lifecycle, null)
116121
};
117122

@@ -131,6 +136,7 @@ public override string ToString()
131136
ProductLifecycle.Discontinued => "discontinued",
132137
ProductLifecycle.Unavailable => "unavailable",
133138
ProductLifecycle.GenerallyAvailable => "ga",
139+
ProductLifecycle.Removed => "removed",
134140
_ => throw new ArgumentOutOfRangeException()
135141
};
136142
_ = sb.Append(lifecycle);
@@ -141,11 +147,14 @@ public override string ToString()
141147

142148
public static explicit operator Applicability(string b)
143149
{
144-
var productAvailability = TryParse(b, out var version) ? version : TryParse(b + ".0", out version) ? version : null;
150+
var diagnostics = new List<(Severity, string)>();
151+
var productAvailability = TryParse(b, diagnostics, out var version) ? version : TryParse(b + ".0", diagnostics, out version) ? version : null;
152+
if (diagnostics.Count > 0)
153+
throw new ArgumentException("Explicit conversion from string to AppliesCollection failed." + string.Join(Environment.NewLine, diagnostics));
145154
return productAvailability ?? throw new ArgumentException($"'{b}' is not a valid applicability string.");
146155
}
147156

148-
public static bool TryParse(string? value, [NotNullWhen(true)] out Applicability? availability)
157+
public static bool TryParse(string? value, IList<(Severity, string)> diagnostics, [NotNullWhen(true)] out Applicability? availability)
149158
{
150159
if (string.IsNullOrWhiteSpace(value) || string.Equals(value.Trim(), "all", StringComparison.InvariantCultureIgnoreCase))
151160
{
@@ -160,22 +169,30 @@ public static bool TryParse(string? value, [NotNullWhen(true)] out Applicability
160169
return false;
161170
}
162171

163-
var lifecycle = tokens[0].ToLowerInvariant() switch
172+
var lookup = tokens[0].ToLowerInvariant();
173+
var lifecycle = lookup switch
164174
{
165175
"preview" => ProductLifecycle.TechnicalPreview,
166176
"tech-preview" => ProductLifecycle.TechnicalPreview,
167177
"beta" => ProductLifecycle.Beta,
178+
"ga" => ProductLifecycle.GenerallyAvailable,
179+
"deprecated" => ProductLifecycle.Deprecated,
180+
"removed" => ProductLifecycle.Removed,
181+
"unavailable" => ProductLifecycle.Unavailable,
182+
183+
// OBSOLETE should be removed once docs are cleaned up
168184
"dev" => ProductLifecycle.Development,
169185
"development" => ProductLifecycle.Development,
170-
"deprecated" => ProductLifecycle.Deprecated,
171186
"coming" => ProductLifecycle.Planned,
172187
"planned" => ProductLifecycle.Planned,
173188
"discontinued" => ProductLifecycle.Discontinued,
174-
"unavailable" => ProductLifecycle.Unavailable,
175-
"ga" => ProductLifecycle.GenerallyAvailable,
176189
_ => throw new Exception($"Unknown product lifecycle: {tokens[0]}")
177190
};
178191

192+
// TODO emit as error when all docs have been updated
193+
if (lifecycle is ProductLifecycle.Planned or ProductLifecycle.Deprecated or ProductLifecycle.Development)
194+
diagnostics.Add((Severity.Hint, $"The '{lookup}' lifecycle is deprecated and will be removed in a future release."));
195+
179196
var version = tokens.Length < 2
180197
? null
181198
: tokens[1] switch

0 commit comments

Comments
 (0)