diff --git a/docs-builder.sln b/docs-builder.sln index 51348c58e..9bce0329e 100644 --- a/docs-builder.sln +++ b/docs-builder.sln @@ -122,6 +122,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "config", "config", "{6FAB56 config\legacy-url-mappings.yml = config\legacy-url-mappings.yml config\navigation.yml = config\navigation.yml config\products.yml = config\products.yml + config\synonyms.yml = config\synonyms.yml EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests-integration", "tests-integration", "{BCAD38D5-6C83-46E2-8398-4BE463931098}" diff --git a/docs/_docset.yml b/docs/_docset.yml index ff445d4cb..e66a3e2ab 100644 --- a/docs/_docset.yml +++ b/docs/_docset.yml @@ -70,6 +70,7 @@ toc: - file: products.md - file: versions.md - file: legacy-url-mappings.md + - file: synonyms.md - folder: content-set children: - file: index.md diff --git a/docs/configure/site/index.md b/docs/configure/site/index.md index e255e46a2..f4d783f3a 100644 --- a/docs/configure/site/index.md +++ b/docs/configure/site/index.md @@ -16,6 +16,10 @@ Configure the documentation site in these files: Redirects are also configured at the site-level. See [](../../contribute/redirects.md) for more information. +## Synonyms + +Synonyms applied to our Serverless observability project are declared as a site-level configuration. See [](./synonyms.md) for more information. + ## V3 site-level diagram *Coming soon* diff --git a/docs/configure/site/synonyms.md b/docs/configure/site/synonyms.md new file mode 100644 index 000000000..aab00ec4b --- /dev/null +++ b/docs/configure/site/synonyms.md @@ -0,0 +1,12 @@ +# `synonyms.yml` + +The [`synonyms.yml`](https://github.com/elastic/docs-builder/blob/main/config/synonyms.yml) file provides a way to define synonyms for our Serverless observability project. + +Synonyms updates are sent during Elasticsearch-specific export procedures in the CI workflow. + +```yml +synonyms: + - [ ".net", "c#", "csharp", "dotnet", "net" ] + - [ "esql", "es|ql" ] + - [ "motlp", "managed otlp" ] + ``` diff --git a/src/Elastic.Documentation.Configuration/BuildContext.cs b/src/Elastic.Documentation.Configuration/BuildContext.cs index 6b3b383c3..e1c1c93d0 100644 --- a/src/Elastic.Documentation.Configuration/BuildContext.cs +++ b/src/Elastic.Documentation.Configuration/BuildContext.cs @@ -8,6 +8,7 @@ using Elastic.Documentation.Configuration.Builder; using Elastic.Documentation.Configuration.LegacyUrlMappings; using Elastic.Documentation.Configuration.Products; +using Elastic.Documentation.Configuration.Synonyms; using Elastic.Documentation.Configuration.Versions; using Elastic.Documentation.Diagnostics; @@ -34,6 +35,7 @@ public record BuildContext : IDocumentationSetContext, IDocumentationConfigurati public ProductsConfiguration ProductsConfiguration { get; } public LegacyUrlMappingConfiguration LegacyUrlMappings { get; } + public SynonymsConfiguration SynonymsConfiguration { get; } public IFileInfo ConfigurationPath { get; } @@ -85,6 +87,7 @@ public BuildContext( ReadFileSystem = readFileSystem; WriteFileSystem = writeFileSystem; AvailableExporters = availableExporters; + SynonymsConfiguration = configurationContext.SynonymsConfiguration; VersionsConfiguration = configurationContext.VersionsConfiguration; ConfigurationFileProvider = configurationContext.ConfigurationFileProvider; ProductsConfiguration = configurationContext.ProductsConfiguration; diff --git a/src/Elastic.Documentation.Configuration/ConfigurationFileProvider.cs b/src/Elastic.Documentation.Configuration/ConfigurationFileProvider.cs index 57e61a60d..b20111fad 100644 --- a/src/Elastic.Documentation.Configuration/ConfigurationFileProvider.cs +++ b/src/Elastic.Documentation.Configuration/ConfigurationFileProvider.cs @@ -49,7 +49,7 @@ public ConfigurationFileProvider( ConfigurationSource = source; else { - string[] spotChecks = ["navigation.yml", "versions.yml", "products.yml", "assembler.yml"]; + string[] spotChecks = ["navigation.yml", "versions.yml", "products.yml", "assembler.yml", "synonyms.yml"]; var defaultSource = fileSystem.Directory.Exists(LocalConfigurationDirectory) && spotChecks.All(f => fileSystem.File.Exists(Path.Combine(LocalConfigurationDirectory, f))) @@ -92,6 +92,7 @@ public ConfigurationFileProvider( AssemblerFile = CreateTemporaryConfigurationFile("assembler.yml"); NavigationFile = CreateTemporaryConfigurationFile("navigation.yml"); LegacyUrlMappingsFile = CreateTemporaryConfigurationFile("legacy-url-mappings.yml"); + SynonymsFile = CreateTemporaryConfigurationFile("synonyms.yml"); } public bool SkipPrivateRepositories { get; } @@ -108,6 +109,7 @@ public ConfigurationFileProvider( public IFileInfo LegacyUrlMappingsFile { get; } + public IFileInfo SynonymsFile { get; } public IFileInfo CreateNavigationFile(AssemblyConfiguration configuration) { var privateRepositories = configuration.PrivateRepositories; diff --git a/src/Elastic.Documentation.Configuration/Elastic.Documentation.Configuration.csproj b/src/Elastic.Documentation.Configuration/Elastic.Documentation.Configuration.csproj index c7defd0a3..f48dbe4de 100644 --- a/src/Elastic.Documentation.Configuration/Elastic.Documentation.Configuration.csproj +++ b/src/Elastic.Documentation.Configuration/Elastic.Documentation.Configuration.csproj @@ -24,5 +24,6 @@ + diff --git a/src/Elastic.Documentation.Configuration/IDocumentationConfigurationContext.cs b/src/Elastic.Documentation.Configuration/IDocumentationConfigurationContext.cs index 4a44881cc..694b27771 100644 --- a/src/Elastic.Documentation.Configuration/IDocumentationConfigurationContext.cs +++ b/src/Elastic.Documentation.Configuration/IDocumentationConfigurationContext.cs @@ -4,6 +4,7 @@ using Elastic.Documentation.Configuration.LegacyUrlMappings; using Elastic.Documentation.Configuration.Products; +using Elastic.Documentation.Configuration.Synonyms; using Elastic.Documentation.Configuration.Versions; namespace Elastic.Documentation.Configuration; @@ -15,6 +16,8 @@ public interface IConfigurationContext DocumentationEndpoints Endpoints { get; } ProductsConfiguration ProductsConfiguration { get; } LegacyUrlMappingConfiguration LegacyUrlMappings { get; } + SynonymsConfiguration SynonymsConfiguration { get; } + } /// Used only to seed in DI, you primarily want to depend on @@ -35,6 +38,8 @@ public class ConfigurationContext : IConfigurationContext /// public required LegacyUrlMappingConfiguration LegacyUrlMappings { get; init; } + /// + public required SynonymsConfiguration SynonymsConfiguration { get; init; } } public interface IDocumentationConfigurationContext : IDocumentationContext, IConfigurationContext; diff --git a/src/Elastic.Documentation.Configuration/Serialization/YamlStaticContext.cs b/src/Elastic.Documentation.Configuration/Serialization/YamlStaticContext.cs index 5a9c6ef8a..92d930f24 100644 --- a/src/Elastic.Documentation.Configuration/Serialization/YamlStaticContext.cs +++ b/src/Elastic.Documentation.Configuration/Serialization/YamlStaticContext.cs @@ -5,6 +5,7 @@ using Elastic.Documentation.Configuration.Assembler; using Elastic.Documentation.Configuration.LegacyUrlMappings; using Elastic.Documentation.Configuration.Products; +using Elastic.Documentation.Configuration.Synonyms; using Elastic.Documentation.Configuration.Versions; using YamlDotNet.Serialization; @@ -23,4 +24,5 @@ namespace Elastic.Documentation.Configuration.Serialization; [YamlSerializable(typeof(ProductDto))] [YamlSerializable(typeof(LegacyUrlMappingDto))] [YamlSerializable(typeof(LegacyUrlMappingConfigDto))] +[YamlSerializable(typeof(SynonymsConfigDto))] public partial class YamlStaticContext; diff --git a/src/Elastic.Documentation.Configuration/Synonyms/SynonymsConfiguration.cs b/src/Elastic.Documentation.Configuration/Synonyms/SynonymsConfiguration.cs new file mode 100644 index 000000000..47872f2d3 --- /dev/null +++ b/src/Elastic.Documentation.Configuration/Synonyms/SynonymsConfiguration.cs @@ -0,0 +1,32 @@ +// Licensed to Elasticsearch B.V under one or more agreements. +// Elasticsearch B.V licenses this file to you under the Apache 2.0 License. +// See the LICENSE file in the project root for more information + +using System.Collections.Immutable; + +namespace Elastic.Documentation.Configuration.Synonyms; + +public record SynonymsConfiguration +{ + public required IReadOnlyCollection Synonyms { get; init; } +} + +internal sealed record SynonymsConfigDto +{ + public List> Synonyms { get; set; } = []; +} + +public static class SynonymsConfigurationExtensions +{ + public static SynonymsConfiguration CreateSynonymsConfiguration(this ConfigurationFileProvider provider) + { + var synonymsFile = provider.SynonymsFile; + + if (!synonymsFile.Exists) + return new SynonymsConfiguration { Synonyms = [] }; + + var synonymsDto = ConfigurationFileProvider.Deserializer.Deserialize(synonymsFile.OpenText()); + var flattenedSynonyms = synonymsDto.Synonyms.Select(sl => string.Join(',', sl)).ToImmutableArray(); + return new SynonymsConfiguration { Synonyms = flattenedSynonyms }; + } +} diff --git a/src/Elastic.Documentation.ServiceDefaults/AppDefaultsExtensions.cs b/src/Elastic.Documentation.ServiceDefaults/AppDefaultsExtensions.cs index 1786f3a1f..18691fb34 100644 --- a/src/Elastic.Documentation.ServiceDefaults/AppDefaultsExtensions.cs +++ b/src/Elastic.Documentation.ServiceDefaults/AppDefaultsExtensions.cs @@ -5,6 +5,7 @@ using Elastic.Documentation.Configuration; using Elastic.Documentation.Configuration.LegacyUrlMappings; using Elastic.Documentation.Configuration.Products; +using Elastic.Documentation.Configuration.Synonyms; using Elastic.Documentation.Configuration.Versions; using Elastic.Documentation.ServiceDefaults.Logging; using Microsoft.Extensions.DependencyInjection; @@ -34,9 +35,11 @@ public static TBuilder AddDocumentationServiceDefaults(this TBuilder b { var versionConfiguration = p.CreateVersionConfiguration(); var products = p.CreateProducts(versionConfiguration); + var synonyms = p.CreateSynonymsConfiguration(); _ = s.AddSingleton(p.CreateLegacyUrlMappings(products)); _ = s.AddSingleton(products); _ = s.AddSingleton(versionConfiguration); + _ = s.AddSingleton(synonyms); configure?.Invoke(s, p); }); _ = builder.Services.AddElasticDocumentationLogging(globalArgs.LogLevel); diff --git a/src/Elastic.Documentation/Serialization/SourceGenerationContext.cs b/src/Elastic.Documentation/Serialization/SourceGenerationContext.cs index 5feb7a18f..7a97730a3 100644 --- a/src/Elastic.Documentation/Serialization/SourceGenerationContext.cs +++ b/src/Elastic.Documentation/Serialization/SourceGenerationContext.cs @@ -28,4 +28,5 @@ namespace Elastic.Documentation.Serialization; [JsonSerializable(typeof(Applicability))] [JsonSerializable(typeof(ProductLifecycle))] [JsonSerializable(typeof(SemVersion))] +[JsonSerializable(typeof(string[]))] public sealed partial class SourceGenerationContext : JsonSerializerContext; diff --git a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchExporter.cs b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchExporter.cs index 3068e8f59..cf94aabd1 100644 --- a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchExporter.cs +++ b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchExporter.cs @@ -33,7 +33,7 @@ DistributedTransport transport { "batch_index_date", d.BatchIndexDate.ToString("o") } }), GetMapping = () => CreateMapping(null), - GetMappingSettings = CreateMappingSetting, + GetMappingSettings = () => CreateMappingSetting("docs"), IndexFormat = $"{endpoint.IndexNamePrefix.Replace("semantic", "lexical").ToLowerInvariant()}-{indexNamespace.ToLowerInvariant()}-{{0:yyyy.MM.dd.HHmmss}}", ActiveSearchAlias = $"{endpoint.IndexNamePrefix.Replace("semantic", "lexical").ToLowerInvariant()}-{indexNamespace.ToLowerInvariant()}" @@ -51,7 +51,7 @@ DistributedTransport transport { BulkOperationIdLookup = d => d.Url, GetMapping = (inferenceId, _) => CreateMapping(inferenceId), - GetMappingSettings = (_, _) => CreateMappingSetting(), + GetMappingSettings = (_, _) => CreateMappingSetting("docs"), IndexFormat = $"{endpoint.IndexNamePrefix.ToLowerInvariant()}-{indexNamespace.ToLowerInvariant()}-{{0:yyyy.MM.dd.HHmmss}}", ActiveSearchAlias = $"{endpoint.IndexNamePrefix}-{indexNamespace.ToLowerInvariant()}", IndexNumThreads = endpoint.IndexNumThreads, @@ -139,9 +139,9 @@ public async ValueTask TryWrite(DocumentationDocument document, Cancel ctx } - protected static string CreateMappingSetting() => + protected static string CreateMappingSetting(string synonymSetName) => // language=json - """ + $$""" { "analysis": { "analyzer": { @@ -163,10 +163,9 @@ protected static string CreateMappingSetting() => }, "filter": { "synonyms_filter": { - "type": "synonym", - "synonyms_set": "docs", - "updateable": true - }, + "type": "synonym_graph", + "synonyms_set": "{{synonymSetName}}" + }, "english_stop": { "type": "stop", "stopwords": "_english_" diff --git a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs index bba070ce4..d3662d3d5 100644 --- a/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs +++ b/src/Elastic.Markdown/Exporters/Elasticsearch/ElasticsearchMarkdownExporter.cs @@ -3,8 +3,11 @@ // See the LICENSE file in the project root for more information using System.IO.Abstractions; +using System.Text.Json; +using System.Text.Json.Serialization; using Elastic.Documentation.AppliesTo; using Elastic.Documentation.Configuration; +using Elastic.Documentation.Configuration.Synonyms; using Elastic.Documentation.Diagnostics; using Elastic.Documentation.Search; using Elastic.Ingest.Elasticsearch; @@ -22,6 +25,16 @@ namespace Elastic.Markdown.Exporters.Elasticsearch; [EnumExtensions] public enum IngestStrategy { Reindex, Multiplex } +internal sealed record SynonymSetRequest +{ + [JsonPropertyName("synonyms")] + public required string[] Synonyms { get; init; } +} + +[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.SnakeCaseLower)] +[JsonSerializable(typeof(SynonymSetRequest))] +internal sealed partial class SynonymSerializerContext : JsonSerializerContext { }; + public class ElasticsearchMarkdownExporter : IMarkdownExporter, IDisposable { private readonly IDiagnosticsCollector _collector; @@ -37,11 +50,14 @@ public class ElasticsearchMarkdownExporter : IMarkdownExporter, IDisposable private string _currentLexicalHash = string.Empty; private string _currentSemanticHash = string.Empty; + private readonly IReadOnlyCollection _synonyms; + public ElasticsearchMarkdownExporter( ILoggerFactory logFactory, IDiagnosticsCollector collector, DocumentationEndpoints endpoints, - string indexNamespace + string indexNamespace, + SynonymsConfiguration synonyms ) { _collector = collector; @@ -75,7 +91,7 @@ string indexNamespace }; _transport = new DistributedTransport(configuration); - + _synonyms = synonyms.Synonyms; _lexicalChannel = new ElasticsearchLexicalExporter(logFactory, collector, es, indexNamespace, _transport); _semanticChannel = new ElasticsearchSemanticExporter(logFactory, collector, es, indexNamespace, _transport); } @@ -86,6 +102,7 @@ public async ValueTask StartAsync(Cancel ctx = default) _currentLexicalHash = await _lexicalChannel.Channel.GetIndexTemplateHashAsync(ctx) ?? string.Empty; _currentSemanticHash = await _semanticChannel.Channel.GetIndexTemplateHashAsync(ctx) ?? string.Empty; + await PublishSynonymsAsync("docs", ctx); _ = await _lexicalChannel.Channel.BootstrapElasticsearchAsync(BootstrapMethod.Failure, null, ctx); // if the previous hash does not match the current hash, we know already we want to multiplex to a new index @@ -132,6 +149,25 @@ public async ValueTask StartAsync(Cancel ctx = default) async ValueTask IndexExists(string name) => (await _transport.HeadAsync(name, ctx)).ApiCallDetails.HasSuccessfulStatusCode; } + private async Task PublishSynonymsAsync(string setName, CancellationToken ctx) + { + _logger.LogInformation("Publishing synonym set '{SetName}' to Elasticsearch", setName); + + var requestBody = new SynonymSetRequest { Synonyms = _synonyms.ToArray() }; + var json = JsonSerializer.Serialize(requestBody, SynonymSerializerContext.Default.SynonymSetRequest); + + var response = await _transport.PutAsync($"_synonyms/{setName}", PostData.String(json), ctx); + + if (!response.ApiCallDetails.HasSuccessfulStatusCode) + { + _collector.EmitGlobalError($"Failed to publish synonym set '{setName}'. Reason: {response.ApiCallDetails.OriginalException?.Message ?? response.ToString()}"); + } + else + { + _logger.LogInformation("Successfully published synonym set '{SetName}'.", setName); + } + } + private async ValueTask CountAsync(string index, string body, Cancel ctx = default) { var countResponse = await _transport.PostAsync($"/{index}/_count", PostData.String(body), ctx); diff --git a/src/Elastic.Markdown/Exporters/ExporterExtensions.cs b/src/Elastic.Markdown/Exporters/ExporterExtensions.cs index 298244330..3f63c7281 100644 --- a/src/Elastic.Markdown/Exporters/ExporterExtensions.cs +++ b/src/Elastic.Markdown/Exporters/ExporterExtensions.cs @@ -25,7 +25,7 @@ string indexNamespace if (exportOptions.Contains(Exporter.Configuration)) markdownExporters.Add(new ConfigurationExporter(logFactory, context.ConfigurationFileProvider, context)); if (exportOptions.Contains(Exporter.Elasticsearch)) - markdownExporters.Add(new ElasticsearchMarkdownExporter(logFactory, context.Collector, context.Endpoints, indexNamespace)); + markdownExporters.Add(new ElasticsearchMarkdownExporter(logFactory, context.Collector, context.Endpoints, indexNamespace, context.SynonymsConfiguration)); return markdownExporters; } } diff --git a/src/services/Elastic.Documentation.Assembler/AssembleContext.cs b/src/services/Elastic.Documentation.Assembler/AssembleContext.cs index 7ef37b5e2..f7ee32689 100644 --- a/src/services/Elastic.Documentation.Assembler/AssembleContext.cs +++ b/src/services/Elastic.Documentation.Assembler/AssembleContext.cs @@ -7,6 +7,7 @@ using Elastic.Documentation.Configuration.Assembler; using Elastic.Documentation.Configuration.LegacyUrlMappings; using Elastic.Documentation.Configuration.Products; +using Elastic.Documentation.Configuration.Synonyms; using Elastic.Documentation.Configuration.Versions; using Elastic.Documentation.Diagnostics; @@ -31,6 +32,7 @@ public class AssembleContext : IDocumentationConfigurationContext public ProductsConfiguration ProductsConfiguration { get; } public LegacyUrlMappingConfiguration LegacyUrlMappings { get; } + public SynonymsConfiguration SynonymsConfiguration { get; } public IDirectoryInfo CheckoutDirectory { get; } @@ -56,6 +58,7 @@ public AssembleContext( Configuration = configuration; ConfigurationFileProvider = configurationContext.ConfigurationFileProvider; VersionsConfiguration = configurationContext.VersionsConfiguration; + SynonymsConfiguration = configurationContext.SynonymsConfiguration; Endpoints = configurationContext.Endpoints; ProductsConfiguration = configurationContext.ProductsConfiguration; LegacyUrlMappings = configurationContext.LegacyUrlMappings; diff --git a/src/tooling/Elastic.Documentation.Tooling/DocumentationTooling.cs b/src/tooling/Elastic.Documentation.Tooling/DocumentationTooling.cs index 32c714b7b..4653c3db4 100644 --- a/src/tooling/Elastic.Documentation.Tooling/DocumentationTooling.cs +++ b/src/tooling/Elastic.Documentation.Tooling/DocumentationTooling.cs @@ -9,6 +9,7 @@ using Elastic.Documentation.Configuration; using Elastic.Documentation.Configuration.LegacyUrlMappings; using Elastic.Documentation.Configuration.Products; +using Elastic.Documentation.Configuration.Synonyms; using Elastic.Documentation.Configuration.Versions; using Elastic.Documentation.Diagnostics; using Elastic.Documentation.ServiceDefaults; @@ -76,13 +77,15 @@ public static TBuilder AddDocumentationToolingDefaults(this TBuilder b var versionsConfiguration = sp.GetRequiredService(); var products = sp.GetRequiredService(); var legacyUrlMappings = sp.GetRequiredService(); + var synonyms = sp.GetRequiredService(); return new ConfigurationContext { ConfigurationFileProvider = configurationFileProvider, VersionsConfiguration = versionsConfiguration, Endpoints = endpoints, ProductsConfiguration = products, - LegacyUrlMappings = legacyUrlMappings + LegacyUrlMappings = legacyUrlMappings, + SynonymsConfiguration = synonyms }; }); diff --git a/tests/Elastic.ApiExplorer.Tests/TestHelpers.cs b/tests/Elastic.ApiExplorer.Tests/TestHelpers.cs index 7efab701c..a073f999d 100644 --- a/tests/Elastic.ApiExplorer.Tests/TestHelpers.cs +++ b/tests/Elastic.ApiExplorer.Tests/TestHelpers.cs @@ -8,6 +8,7 @@ using Elastic.Documentation.Configuration; using Elastic.Documentation.Configuration.LegacyUrlMappings; using Elastic.Documentation.Configuration.Products; +using Elastic.Documentation.Configuration.Synonyms; using Elastic.Documentation.Configuration.Versions; using Microsoft.Extensions.Logging.Abstractions; @@ -45,6 +46,7 @@ public static IConfigurationContext CreateConfigurationContext(IFileSystem fileS } }.ToFrozenDictionary() }; + var synonyms = new SynonymsConfiguration { Synonyms = [] }; return new ConfigurationContext { Endpoints = new DocumentationEndpoints @@ -55,6 +57,7 @@ public static IConfigurationContext CreateConfigurationContext(IFileSystem fileS VersionsConfiguration = versionsConfiguration, ProductsConfiguration = productsConfiguration, LegacyUrlMappings = new LegacyUrlMappingConfiguration { Mappings = [] }, + SynonymsConfiguration = synonyms }; } } diff --git a/tests/Elastic.Markdown.Tests/TestHelpers.cs b/tests/Elastic.Markdown.Tests/TestHelpers.cs index cadad408c..e6f653a63 100644 --- a/tests/Elastic.Markdown.Tests/TestHelpers.cs +++ b/tests/Elastic.Markdown.Tests/TestHelpers.cs @@ -8,6 +8,7 @@ using Elastic.Documentation.Configuration; using Elastic.Documentation.Configuration.LegacyUrlMappings; using Elastic.Documentation.Configuration.Products; +using Elastic.Documentation.Configuration.Synonyms; using Elastic.Documentation.Configuration.Versions; namespace Elastic.Markdown.Tests; @@ -60,6 +61,7 @@ public static IConfigurationContext CreateConfigurationContext(IFileSystem fileS } }.ToFrozenDictionary() }; + var synonyms = new SynonymsConfiguration { Synonyms = [] }; return new ConfigurationContext { Endpoints = new DocumentationEndpoints @@ -69,6 +71,7 @@ public static IConfigurationContext CreateConfigurationContext(IFileSystem fileS ConfigurationFileProvider = new ConfigurationFileProvider(new TestLoggerFactory(TestContext.Current.TestOutputHelper), fileSystem), VersionsConfiguration = versionsConfiguration, ProductsConfiguration = productsConfiguration, + SynonymsConfiguration = synonyms, LegacyUrlMappings = new LegacyUrlMappingConfiguration { Mappings = [] }, }; } diff --git a/tests/authoring/Framework/Setup.fs b/tests/authoring/Framework/Setup.fs index 83ecd7a33..6876c4fa2 100644 --- a/tests/authoring/Framework/Setup.fs +++ b/tests/authoring/Framework/Setup.fs @@ -16,6 +16,7 @@ open Elastic.Documentation.Configuration open Elastic.Documentation.Configuration.LegacyUrlMappings open Elastic.Documentation.Configuration.Versions open Elastic.Documentation.Configuration.Products +open Elastic.Documentation.Configuration.Synonyms open Elastic.Markdown open Elastic.Markdown.IO open JetBrains.Annotations @@ -280,7 +281,8 @@ type Setup = ConfigurationFileProvider = configurationFileProvider, Endpoints=DocumentationEndpoints(Elasticsearch = ElasticsearchEndpoint.Default), ProductsConfiguration = ProductsConfiguration(Products = productDict.ToFrozenDictionary()), - LegacyUrlMappings = LegacyUrlMappingConfiguration(Mappings = []) + LegacyUrlMappings = LegacyUrlMappingConfiguration(Mappings = []), + SynonymsConfiguration = SynonymsConfiguration(Synonyms = []) ) let context = BuildContext( collector, diff --git a/tests/docs-assembler.Tests/src/docs-assembler.Tests/AssemblerConfigurationTests.cs b/tests/docs-assembler.Tests/src/docs-assembler.Tests/AssemblerConfigurationTests.cs index b4f9b347b..12b30a74b 100644 --- a/tests/docs-assembler.Tests/src/docs-assembler.Tests/AssemblerConfigurationTests.cs +++ b/tests/docs-assembler.Tests/src/docs-assembler.Tests/AssemblerConfigurationTests.cs @@ -71,6 +71,7 @@ public void ReadsConfigurationFiles() Context.ConfigurationFileProvider.NavigationFile.Name.Should().Be("navigation.yml"); Context.ConfigurationFileProvider.AssemblerFile.Name.Should().Be("assembler.yml"); Context.ConfigurationFileProvider.LegacyUrlMappingsFile.Name.Should().Be("legacy-url-mappings.yml"); + Context.ConfigurationFileProvider.SynonymsFile.Name.Should().Be("synonyms.yml"); } [Fact] diff --git a/tests/docs-assembler.Tests/src/docs-assembler.Tests/TestHelpers.cs b/tests/docs-assembler.Tests/src/docs-assembler.Tests/TestHelpers.cs index 778c2b926..1bc2a19a8 100644 --- a/tests/docs-assembler.Tests/src/docs-assembler.Tests/TestHelpers.cs +++ b/tests/docs-assembler.Tests/src/docs-assembler.Tests/TestHelpers.cs @@ -8,6 +8,7 @@ using Elastic.Documentation.Configuration; using Elastic.Documentation.Configuration.LegacyUrlMappings; using Elastic.Documentation.Configuration.Products; +using Elastic.Documentation.Configuration.Synonyms; using Elastic.Documentation.Configuration.Versions; using Microsoft.Extensions.Logging.Abstractions; @@ -51,6 +52,7 @@ public static IConfigurationContext CreateConfigurationContext( } }.ToFrozenDictionary() }; + var synonyms = new SynonymsConfiguration { Synonyms = [] }; return new ConfigurationContext { Endpoints = new DocumentationEndpoints @@ -60,6 +62,7 @@ public static IConfigurationContext CreateConfigurationContext( ConfigurationFileProvider = configurationFileProvider, VersionsConfiguration = versionsConfiguration, ProductsConfiguration = productsConfiguration, + SynonymsConfiguration = synonyms, LegacyUrlMappings = new LegacyUrlMappingConfiguration { Mappings = [] }, }; }