Browse Source

Support custom delimiter KeyPerFile configuration source (#33693)

Kahbazi 4 years ago
parent
commit
1cf16e1a90

+ 2 - 2
src/Configuration.KeyPerFile/src/KeyPerFileConfigurationProvider.cs

@@ -36,8 +36,8 @@ namespace Microsoft.Extensions.Configuration.KeyPerFile
 
         }
 
-        private static string NormalizeKey(string key)
-            => key.Replace("__", ConfigurationPath.KeyDelimiter);
+        private string NormalizeKey(string key)
+            => key.Replace(Source.SectionDelimiter, ConfigurationPath.KeyDelimiter);
 
         private static string TrimNewLine(string value)
             => value.EndsWith(Environment.NewLine, StringComparison.Ordinal)

+ 6 - 0
src/Configuration.KeyPerFile/src/KeyPerFileConfigurationSource.cs

@@ -48,6 +48,12 @@ namespace Microsoft.Extensions.Configuration.KeyPerFile
         /// </summary>
         public int ReloadDelay { get; set; } = 250;
 
+        /// <summary>
+        /// The delimiter used to separate individual keys in a path.
+        /// </summary>
+        /// <value>Default is <c>__</c>.</value>
+        public string SectionDelimiter { get; set; } = "__";
+
         /// <summary>
         /// Builds the <see cref="KeyPerFileConfigurationProvider"/> for this source.
         /// </summary>

+ 2 - 0
src/Configuration.KeyPerFile/src/PublicAPI.Unshipped.txt

@@ -14,6 +14,8 @@
 *REMOVED*~static Microsoft.Extensions.Configuration.KeyPerFileConfigurationBuilderExtensions.AddKeyPerFile(this Microsoft.Extensions.Configuration.IConfigurationBuilder builder, string directoryPath, bool optional, bool reloadOnChange) -> Microsoft.Extensions.Configuration.IConfigurationBuilder
 Microsoft.Extensions.Configuration.KeyPerFile.KeyPerFileConfigurationProvider.KeyPerFileConfigurationProvider(Microsoft.Extensions.Configuration.KeyPerFile.KeyPerFileConfigurationSource! source) -> void
 Microsoft.Extensions.Configuration.KeyPerFile.KeyPerFileConfigurationSource.Build(Microsoft.Extensions.Configuration.IConfigurationBuilder! builder) -> Microsoft.Extensions.Configuration.IConfigurationProvider!
+Microsoft.Extensions.Configuration.KeyPerFile.KeyPerFileConfigurationSource.SectionDelimiter.get -> string!
+Microsoft.Extensions.Configuration.KeyPerFile.KeyPerFileConfigurationSource.SectionDelimiter.set -> void
 Microsoft.Extensions.Configuration.KeyPerFile.KeyPerFileConfigurationSource.FileProvider.get -> Microsoft.Extensions.FileProviders.IFileProvider?
 Microsoft.Extensions.Configuration.KeyPerFile.KeyPerFileConfigurationSource.FileProvider.set -> void
 Microsoft.Extensions.Configuration.KeyPerFile.KeyPerFileConfigurationSource.IgnoreCondition.get -> System.Func<string!, bool>!

+ 21 - 0
src/Configuration.KeyPerFile/test/KeyPerFileTests.cs

@@ -84,6 +84,27 @@ namespace Microsoft.Extensions.Configuration.KeyPerFile.Test
             Assert.Equal("SecretValue2", config["Secret0:Secret1:Secret2:Key"]);
         }
 
+        [Fact]
+        public void LoadWithCustomSectionDelimiter()
+        {
+            var testFileProvider = new TestFileProvider(
+                new TestFile("Secret0--Secret1--Secret2--Key", "SecretValue2"),
+                new TestFile("Secret0--Secret1--Key", "SecretValue1"),
+                new TestFile("Secret0--Key", "SecretValue0"));
+
+            var config = new ConfigurationBuilder()
+                .AddKeyPerFile(o =>
+                {
+                    o.FileProvider = testFileProvider;
+                    o.SectionDelimiter = "--";
+                })
+                .Build();
+
+            Assert.Equal("SecretValue0", config["Secret0:Key"]);
+            Assert.Equal("SecretValue1", config["Secret0:Secret1:Key"]);
+            Assert.Equal("SecretValue2", config["Secret0:Secret1:Secret2:Key"]);
+        }
+
         [Fact]
         public void CanIgnoreFilesWithDefault()
         {