From ccb55d8cb251bab189c346037d33dd29b56291d3 Mon Sep 17 00:00:00 2001 From: rameel Date: Sat, 17 May 2025 04:51:59 +0500 Subject: [PATCH 1/4] Handle single and empty CompositeFileProvider in Flatten --- .../FileProviderComposer.cs | 20 ++++++++++++++++--- .../FileProviderComposerTests.cs | 14 +++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs b/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs index 3b5c515..a033b3d 100644 --- a/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs +++ b/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs @@ -20,10 +20,24 @@ public static class FileProviderComposer /// public static IFileProvider FlattenProvider(IFileProvider provider) { - if (provider is CompositeFileProvider composite) - foreach (var p in composite.FileProviders) + while (provider is CompositeFileProvider composite) + { + var providers = composite.FileProviders as IFileProvider[] ?? composite.FileProviders.ToArray(); + if (providers.Length == 0) + return new NullFileProvider(); + + if (providers.Length == 1) + { + provider = providers[0]; + continue; + } + + foreach (var p in providers) if (p is CompositeFileProvider or NullFileProvider) - return ComposeProviders(composite.FileProviders); + return ComposeProviders(providers); + + break; + } return provider; } diff --git a/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs b/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs index f36b200..407bd56 100644 --- a/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs +++ b/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs @@ -208,6 +208,20 @@ public void FlattenFileProvider_MaintainOrder_WhenComposite() Assert.That(composite.FileProviders, Is.EquivalentTo(providers)); } + [Test] + public void Flatten_ReturnsSingleProvider_WhenCompositeContainsOnlyOne() + { + var provider = new CompositeFileProvider(new TestFileProvider()).Flatten(); + Assert.That(provider, Is.InstanceOf()); + } + + [Test] + public void Flatten_EmptyComposite_ReturnsNullProvider() + { + var provider = new CompositeFileProvider().Flatten(); + Assert.That(provider, Is.InstanceOf()); + } + private sealed class TestFileProvider : IFileProvider { public IFileInfo GetFileInfo(string subpath) => From 591d53e03769c35e818ae980814ed2c02a1960b2 Mon Sep 17 00:00:00 2001 From: rameel Date: Sat, 17 May 2025 04:54:01 +0500 Subject: [PATCH 2/4] Clean up and formatting --- .../FileProviderComposerTests.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs b/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs index 407bd56..461abb1 100644 --- a/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs +++ b/tests/Ramstack.FileProviders.Composition.Tests/FileProviderComposerTests.cs @@ -4,7 +4,7 @@ public sealed class FileProviderComposerTests { [Test] - public void FlattenFileProvider_ReturnsAsIs_WhenNoComposite() + public void Flatten_ReturnsAsIs_WhenNoComposite() { var provider = new TestFileProvider(); var result = FileProviderComposer.FlattenProvider(provider); @@ -12,7 +12,7 @@ public void FlattenFileProvider_ReturnsAsIs_WhenNoComposite() } [Test] - public void FlattenFileProvider_ReturnsCompositeProvider_WhenNeedComposite() + public void Flatten_ReturnsCompositeProvider_WhenNeedComposite() { var provider = new CompositeFileProvider(new TestFileProvider(), new TestFileProvider()); @@ -21,7 +21,7 @@ public void FlattenFileProvider_ReturnsCompositeProvider_WhenNeedComposite() } [Test] - public void FlattenFileProvider_ReturnsAsIs_WhenAlreadyFlat() + public void Flatten_ReturnsAsIs_WhenAlreadyFlat() { var provider = new CompositeFileProvider(new TestFileProvider(), new TestFileProvider()); @@ -30,7 +30,7 @@ public void FlattenFileProvider_ReturnsAsIs_WhenAlreadyFlat() } [Test] - public void FlattenFileProvider_ReturnsCompositeProvider_Flattened() + public void Flatten_ReturnsCompositeProvider_Flattened() { var provider = new CompositeFileProvider( new TestFileProvider(), @@ -48,7 +48,7 @@ public void FlattenFileProvider_ReturnsCompositeProvider_Flattened() } [Test] - public void FlattenFileProvider_RemovesNullFileProvider() + public void Flatten_RemovesNullFileProvider() { var provider = new CompositeFileProvider( new TestFileProvider(), @@ -66,7 +66,7 @@ public void FlattenFileProvider_RemovesNullFileProvider() } [Test] - public void FlattenFileProvider_ReturnsNullFileProvider_WhenNothingReturn() + public void Flatten_ReturnsNullFileProvider_WhenNothingReturn() { var provider = new CompositeFileProvider( new CompositeFileProvider( @@ -107,7 +107,7 @@ public void FlattenFileProvider_ReturnsNullFileProvider_WhenNothingReturn() } [Test] - public void FlattenFileProvider_ReturnsSingleProvider_WhenRemainOneProvider() + public void Flatten_ReturnsSingleProvider_WhenRemainOneProvider() { var provider = new CompositeFileProvider( new CompositeFileProvider( @@ -148,7 +148,7 @@ public void FlattenFileProvider_ReturnsSingleProvider_WhenRemainOneProvider() } [Test] - public void FlattenFileProvider_MaintainOrder_WhenComposite() + public void Flatten_MaintainOrder_WhenComposite() { var p1 = new TestFileProvider(); var p2 = new TestFileProvider(); From 3df7c99eb4b4b6619da528cf77d2e6b032329f95 Mon Sep 17 00:00:00 2001 From: rameel Date: Sat, 17 May 2025 05:00:12 +0500 Subject: [PATCH 3/4] Add missing Flatten method --- .../FileProviderComposer.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs b/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs index a033b3d..ba97910 100644 --- a/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs +++ b/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs @@ -7,6 +7,20 @@ namespace Ramstack.FileProviders.Composition; /// public static class FileProviderComposer { + /// + /// Tries to flatten the specified into a flat list of file providers. + /// + /// + /// If the is not a , + /// the same instance of the is returned. + /// + /// The to flatten. + /// + /// An representing the flattened version from the specified . + /// + public static IFileProvider Flatten(this IFileProvider provider) => + FlattenProvider(provider); + /// /// Tries to flatten the specified into a flat list of file providers. /// From 6cb34426b341d3efcf5712839f35bb0a4f05eeb3 Mon Sep 17 00:00:00 2001 From: rameel Date: Sat, 17 May 2025 05:02:23 +0500 Subject: [PATCH 4/4] Refine xml-comments --- .../FileProviderComposer.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs b/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs index ba97910..69bd40f 100644 --- a/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs +++ b/src/Ramstack.FileProviders.Composition/FileProviderComposer.cs @@ -8,7 +8,7 @@ namespace Ramstack.FileProviders.Composition; public static class FileProviderComposer { /// - /// Tries to flatten the specified into a flat list of file providers. + /// Attempts to flatten the specified into a flat list of file providers. /// /// /// If the is not a , @@ -22,7 +22,7 @@ public static IFileProvider Flatten(this IFileProvider provider) => FlattenProvider(provider); /// - /// Tries to flatten the specified into a flat list of file providers. + /// Attempts to flatten the specified into a flat list of file providers. /// /// /// If the is not a , @@ -30,7 +30,7 @@ public static IFileProvider Flatten(this IFileProvider provider) => /// /// The to flatten. /// - /// A that represents the flattened version of the specified . + /// An representing the flattened version from the specified . /// public static IFileProvider FlattenProvider(IFileProvider provider) { @@ -57,27 +57,27 @@ public static IFileProvider FlattenProvider(IFileProvider provider) } /// - /// Creates a provider from the specified list of and flattens it into a flat list of file providers. + /// Creates a provider from the specified list of instances and flattens it into a flat list of file providers. /// /// /// This method returns a if more than one provider remains after flattening. /// /// The list of instances to compose and flatten. /// - /// A that represents the flattened version of the specified list of providers. + /// An representing the flattened version from the specified list of providers. /// public static IFileProvider ComposeProviders(params IFileProvider[] providers) => ComposeProviders(providers.AsEnumerable()); /// - /// Creates a provider from the specified list of and flattens it into a flat list of file providers. + /// Creates a provider from the specified list of instances and flattens it into a flat list of file providers. /// /// /// This method returns a if more than one provider remains after flattening. /// /// The list of instances to compose and flatten. /// - /// A that represents the flattened version of the specified list of providers. + /// An representing the flattened version from the specified list of providers. /// public static IFileProvider ComposeProviders(IEnumerable providers) {