From 7a618de45cad3b4c11e624bf518f37ee3a558b9f Mon Sep 17 00:00:00 2001 From: Florian Greinacher Date: Fri, 10 Dec 2021 23:13:51 +0100 Subject: [PATCH 1/3] feat: add missing APIs to IPath --- Directory.Build.props | 2 +- src/System.IO.Abstractions/IPath.cs | 63 ++++++++++ src/System.IO.Abstractions/PathBase.cs | 51 ++++++++ src/System.IO.Abstractions/PathWrapper.cs | 113 ++++++++++++++++++ .../System.IO.Abstractions.Tests.csproj | 2 +- .../ApiParityTests.Path_.NET 5.0.snap | 20 +--- .../ApiParityTests.Path_.NET 6.0.snap | 20 +--- .../ApiParityTests.Path_.NET Core 3.1.snap | 8 -- 8 files changed, 231 insertions(+), 48 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 5c5234105..27f5be661 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -14,7 +14,7 @@ $(DefineConstants);FEATURE_ASYNC_FILE;FEATURE_ENUMERATION_OPTIONS;FEATURE_ADVANCED_PATH_OPERATIONS;FEATURE_PATH_JOIN_WITH_SPAN $(DefineConstants);FEATURE_FILE_MOVE_WITH_OVERWRITE $(DefineConstants);FEATURE_SUPPORTED_OS_ATTRIBUTE - $(DefineConstants);FEATURE_FILE_SYSTEM_WATCHER_FILTERS + $(DefineConstants);FEATURE_FILE_SYSTEM_WATCHER_FILTERS;FEATURE_ENDS_IN_DIRECTORY_SEPARATOR;FEATURE_PATH_JOIN_WITH_PARAMS;FEATURE_PATH_JOIN_WITH_FOUR_PATHS diff --git a/src/System.IO.Abstractions/IPath.cs b/src/System.IO.Abstractions/IPath.cs index 47b3e1516..e6e2bc36b 100644 --- a/src/System.IO.Abstractions/IPath.cs +++ b/src/System.IO.Abstractions/IPath.cs @@ -79,5 +79,68 @@ public interface IPath /// bool TryJoin(ReadOnlySpan path1, ReadOnlySpan path2, Span destination, out int charsWritten); #endif + +#if FEATURE_ADVANCED_PATH_OPERATIONS + + /// + bool HasExtension(ReadOnlySpan path); + + /// + bool IsPathFullyQualified(ReadOnlySpan path); + + /// + bool IsPathRooted(ReadOnlySpan path); + + /// + ReadOnlySpan GetDirectoryName(ReadOnlySpan path); + + /// + ReadOnlySpan GetExtension(ReadOnlySpan path); + + /// + ReadOnlySpan GetFileName(ReadOnlySpan path); + + /// + ReadOnlySpan GetFileNameWithoutExtension(ReadOnlySpan path); + + /// + ReadOnlySpan GetPathRoot(ReadOnlySpan path); + +#endif + +#if FEATURE_PATH_JOIN_WITH_PARAMS + + /// + string Join(string path1, string path2); + + + /// + string Join(string path1, string path2, string path3); + + /// + string Join(params string[] paths); +#endif + +#if FEATURE_ENDS_IN_DIRECTORY_SEPARATOR + /// + bool EndsInDirectorySeparator(ReadOnlySpan path); + + /// + bool EndsInDirectorySeparator(string path); + + /// + ReadOnlySpan TrimEndingDirectorySeparator(ReadOnlySpan path); + /// + string TrimEndingDirectorySeparator(string path); +#endif + + +#if FEATURE_PATH_JOIN_WITH_FOUR_PATHS + /// + string Join(ReadOnlySpan path1, ReadOnlySpan path2, ReadOnlySpan path3, ReadOnlySpan path4); + + /// + string Join(string path1, string path2, string path3, string path4); +#endif } } \ No newline at end of file diff --git a/src/System.IO.Abstractions/PathBase.cs b/src/System.IO.Abstractions/PathBase.cs index d8ad2f23b..37d036053 100644 --- a/src/System.IO.Abstractions/PathBase.cs +++ b/src/System.IO.Abstractions/PathBase.cs @@ -114,5 +114,56 @@ internal PathBase() { } /// public abstract bool TryJoin(ReadOnlySpan path1, ReadOnlySpan path2, Span destination, out int charsWritten); #endif + +#if FEATURE_ADVANCED_PATH_OPERATIONS + /// + public abstract bool HasExtension(ReadOnlySpan path); + /// + public abstract bool IsPathFullyQualified(ReadOnlySpan path); + /// + public abstract bool IsPathRooted(ReadOnlySpan path); + /// + public abstract ReadOnlySpan GetDirectoryName(ReadOnlySpan path); + /// + public abstract ReadOnlySpan GetExtension(ReadOnlySpan path); + /// + public abstract ReadOnlySpan GetFileName(ReadOnlySpan path); + /// + public abstract ReadOnlySpan GetFileNameWithoutExtension(ReadOnlySpan path); + /// + public abstract ReadOnlySpan GetPathRoot(ReadOnlySpan path); + +#endif +#if FEATURE_PATH_JOIN_WITH_PARAMS + /// + public abstract string Join(params string[] paths); + + /// + public abstract string Join(string path1, string path2); + /// + + public abstract string Join(string path1, string path2, string path3); + +#endif + +#if FEATURE_ENDS_IN_DIRECTORY_SEPARATOR + /// + public abstract bool EndsInDirectorySeparator(ReadOnlySpan path); + /// + public abstract bool EndsInDirectorySeparator(string path); + /// + public abstract ReadOnlySpan TrimEndingDirectorySeparator(ReadOnlySpan path); + + /// + public abstract string TrimEndingDirectorySeparator(string path); +#endif + +#if FEATURE_PATH_JOIN_WITH_FOUR_PATHS + + /// + public abstract string Join(ReadOnlySpan path1, ReadOnlySpan path2, ReadOnlySpan path3, ReadOnlySpan path4); + /// + public abstract string Join(string path1, string path2, string path3, string path4); +#endif } } diff --git a/src/System.IO.Abstractions/PathWrapper.cs b/src/System.IO.Abstractions/PathWrapper.cs index bfe8bbbea..cfb9e7ffb 100644 --- a/src/System.IO.Abstractions/PathWrapper.cs +++ b/src/System.IO.Abstractions/PathWrapper.cs @@ -187,5 +187,118 @@ public override bool IsPathRooted(string path) { return Path.IsPathRooted(path); } + +#if FEATURE_ENDS_IN_DIRECTORY_SEPARATOR + /// + public override bool EndsInDirectorySeparator(ReadOnlySpan path) + { + return Path.EndsInDirectorySeparator(path); + } + + /// + public override bool EndsInDirectorySeparator(string path) + { + return Path.EndsInDirectorySeparator(path); + } + + /// + public override ReadOnlySpan TrimEndingDirectorySeparator(ReadOnlySpan path) + { + return Path.TrimEndingDirectorySeparator(path); + } + /// + public override string TrimEndingDirectorySeparator(string path) + { + return Path.TrimEndingDirectorySeparator(path); + } +#endif + +#if FEATURE_ADVANCED_PATH_OPERATIONS + + + /// + public override bool HasExtension(ReadOnlySpan path) + { + return Path.HasExtension(path); + } + + /// + public override bool IsPathFullyQualified(ReadOnlySpan path) + { + return Path.IsPathFullyQualified(path); + } + + /// + public override bool IsPathRooted(ReadOnlySpan path) + { + return Path.IsPathRooted(path); + } + + /// + public override ReadOnlySpan GetDirectoryName(ReadOnlySpan path) + { + return Path.GetDirectoryName(path); + } + + /// + public override ReadOnlySpan GetExtension(ReadOnlySpan path) + { + return Path.GetExtension(path); + } + + /// + public override ReadOnlySpan GetFileName(ReadOnlySpan path) + { + return Path.GetFileName(path); + } + + /// + public override ReadOnlySpan GetFileNameWithoutExtension(ReadOnlySpan path) + { + return Path.GetFileNameWithoutExtension(path); + } + + /// + public override ReadOnlySpan GetPathRoot(ReadOnlySpan path) + { + return Path.GetPathRoot(path); + } + +#endif + +#if FEATURE_PATH_JOIN_WITH_FOUR_PATHS + /// + public override string Join(string path1, string path2, string path3, string path4) + { + return Path.Join(path1, path2, path3, path4); + } + /// + public override string Join(ReadOnlySpan path1, ReadOnlySpan path2, ReadOnlySpan path3, ReadOnlySpan path4) + { + return Path.Join(path1, path2, path3, path4); + } + +#endif + +#if FEATURE_PATH_JOIN_WITH_PARAMS + + + /// + public override string Join(string path1, string path2) + { + return Path.Join(path1, path2); + } + + /// + public override string Join(string path1, string path2, string path3) + { + return Path.Join(path1, path2, path3); + } + /// + public override string Join(params string[] paths) + { + return Path.Join(paths); + } +#endif } } diff --git a/tests/System.IO.Abstractions.Tests/System.IO.Abstractions.Tests.csproj b/tests/System.IO.Abstractions.Tests/System.IO.Abstractions.Tests.csproj index 5dcfd576b..ebc21d6b6 100644 --- a/tests/System.IO.Abstractions.Tests/System.IO.Abstractions.Tests.csproj +++ b/tests/System.IO.Abstractions.Tests/System.IO.Abstractions.Tests.csproj @@ -1,6 +1,6 @@  - net6.0;net5.0;netcoreapp3.1 + net5.0;netcoreapp3.1 $(TargetFrameworks);net461 The unit tests for our the core abstractions System.IO.Abstractions.Tests diff --git a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 5.0.snap b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 5.0.snap index 99bae9707..d83d023ac 100644 --- a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 5.0.snap +++ b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 5.0.snap @@ -6,23 +6,5 @@ "Char get_VolumeSeparatorChar()", "Char[] get_InvalidPathChars()" ], - "MissingMembers": [ - "Boolean EndsInDirectorySeparator(System.ReadOnlySpan`1[System.Char])", - "Boolean EndsInDirectorySeparator(System.String)", - "Boolean HasExtension(System.ReadOnlySpan`1[System.Char])", - "Boolean IsPathFullyQualified(System.ReadOnlySpan`1[System.Char])", - "Boolean IsPathRooted(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetDirectoryName(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetExtension(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetFileName(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetFileNameWithoutExtension(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetPathRoot(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] TrimEndingDirectorySeparator(System.ReadOnlySpan`1[System.Char])", - "System.String Join(System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char])", - "System.String Join(System.String, System.String)", - "System.String Join(System.String, System.String, System.String)", - "System.String Join(System.String, System.String, System.String, System.String)", - "System.String Join(System.String[])", - "System.String TrimEndingDirectorySeparator(System.String)" - ] + "MissingMembers": [] } diff --git a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 6.0.snap b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 6.0.snap index 99bae9707..d83d023ac 100644 --- a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 6.0.snap +++ b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET 6.0.snap @@ -6,23 +6,5 @@ "Char get_VolumeSeparatorChar()", "Char[] get_InvalidPathChars()" ], - "MissingMembers": [ - "Boolean EndsInDirectorySeparator(System.ReadOnlySpan`1[System.Char])", - "Boolean EndsInDirectorySeparator(System.String)", - "Boolean HasExtension(System.ReadOnlySpan`1[System.Char])", - "Boolean IsPathFullyQualified(System.ReadOnlySpan`1[System.Char])", - "Boolean IsPathRooted(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetDirectoryName(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetExtension(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetFileName(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetFileNameWithoutExtension(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetPathRoot(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] TrimEndingDirectorySeparator(System.ReadOnlySpan`1[System.Char])", - "System.String Join(System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char])", - "System.String Join(System.String, System.String)", - "System.String Join(System.String, System.String, System.String)", - "System.String Join(System.String, System.String, System.String, System.String)", - "System.String Join(System.String[])", - "System.String TrimEndingDirectorySeparator(System.String)" - ] + "MissingMembers": [] } diff --git a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET Core 3.1.snap b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET Core 3.1.snap index 99bae9707..26dafd137 100644 --- a/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET Core 3.1.snap +++ b/tests/System.IO.Abstractions.Tests/__snapshots__/ApiParityTests.Path_.NET Core 3.1.snap @@ -9,14 +9,6 @@ "MissingMembers": [ "Boolean EndsInDirectorySeparator(System.ReadOnlySpan`1[System.Char])", "Boolean EndsInDirectorySeparator(System.String)", - "Boolean HasExtension(System.ReadOnlySpan`1[System.Char])", - "Boolean IsPathFullyQualified(System.ReadOnlySpan`1[System.Char])", - "Boolean IsPathRooted(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetDirectoryName(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetExtension(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetFileName(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetFileNameWithoutExtension(System.ReadOnlySpan`1[System.Char])", - "System.ReadOnlySpan`1[System.Char] GetPathRoot(System.ReadOnlySpan`1[System.Char])", "System.ReadOnlySpan`1[System.Char] TrimEndingDirectorySeparator(System.ReadOnlySpan`1[System.Char])", "System.String Join(System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char], System.ReadOnlySpan`1[System.Char])", "System.String Join(System.String, System.String)", From 52ad6072211f46f4d9b1ab1daba6613d8319ba6c Mon Sep 17 00:00:00 2001 From: Florian Greinacher Date: Tue, 21 Dec 2021 15:08:24 +0000 Subject: [PATCH 2/3] test: run core tests against .NET 6 --- Directory.Build.props | 4 +--- src/System.IO.Abstractions/IPath.cs | 4 ---- src/System.IO.Abstractions/PathWrapper.cs | 9 +++------ .../System.IO.Abstractions.Tests.csproj | 2 +- 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 27f5be661..93ebc9a67 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -12,9 +12,7 @@ README.md $(DefineConstants);FEATURE_FILE_SYSTEM_ACL_EXTENSIONS $(DefineConstants);FEATURE_ASYNC_FILE;FEATURE_ENUMERATION_OPTIONS;FEATURE_ADVANCED_PATH_OPERATIONS;FEATURE_PATH_JOIN_WITH_SPAN - $(DefineConstants);FEATURE_FILE_MOVE_WITH_OVERWRITE - $(DefineConstants);FEATURE_SUPPORTED_OS_ATTRIBUTE - $(DefineConstants);FEATURE_FILE_SYSTEM_WATCHER_FILTERS;FEATURE_ENDS_IN_DIRECTORY_SEPARATOR;FEATURE_PATH_JOIN_WITH_PARAMS;FEATURE_PATH_JOIN_WITH_FOUR_PATHS + $(DefineConstants);FEATURE_FILE_MOVE_WITH_OVERWRITE;FEATURE_SUPPORTED_OS_ATTRIBUTE;FEATURE_FILE_SYSTEM_WATCHER_FILTERS;FEATURE_ENDS_IN_DIRECTORY_SEPARATOR;FEATURE_PATH_JOIN_WITH_PARAMS;FEATURE_PATH_JOIN_WITH_FOUR_PATHS diff --git a/src/System.IO.Abstractions/IPath.cs b/src/System.IO.Abstractions/IPath.cs index e6e2bc36b..1f9d98953 100644 --- a/src/System.IO.Abstractions/IPath.cs +++ b/src/System.IO.Abstractions/IPath.cs @@ -81,7 +81,6 @@ public interface IPath #endif #if FEATURE_ADVANCED_PATH_OPERATIONS - /// bool HasExtension(ReadOnlySpan path); @@ -109,11 +108,9 @@ public interface IPath #endif #if FEATURE_PATH_JOIN_WITH_PARAMS - /// string Join(string path1, string path2); - /// string Join(string path1, string path2, string path3); @@ -134,7 +131,6 @@ public interface IPath string TrimEndingDirectorySeparator(string path); #endif - #if FEATURE_PATH_JOIN_WITH_FOUR_PATHS /// string Join(ReadOnlySpan path1, ReadOnlySpan path2, ReadOnlySpan path3, ReadOnlySpan path4); diff --git a/src/System.IO.Abstractions/PathWrapper.cs b/src/System.IO.Abstractions/PathWrapper.cs index cfb9e7ffb..9c5151d5d 100644 --- a/src/System.IO.Abstractions/PathWrapper.cs +++ b/src/System.IO.Abstractions/PathWrapper.cs @@ -206,6 +206,7 @@ public override ReadOnlySpan TrimEndingDirectorySeparator(ReadOnlySpan public override string TrimEndingDirectorySeparator(string path) { @@ -214,8 +215,6 @@ public override string TrimEndingDirectorySeparator(string path) #endif #if FEATURE_ADVANCED_PATH_OPERATIONS - - /// public override bool HasExtension(ReadOnlySpan path) { @@ -263,7 +262,6 @@ public override ReadOnlySpan GetPathRoot(ReadOnlySpan path) { return Path.GetPathRoot(path); } - #endif #if FEATURE_PATH_JOIN_WITH_FOUR_PATHS @@ -272,17 +270,15 @@ public override string Join(string path1, string path2, string path3, string pat { return Path.Join(path1, path2, path3, path4); } + /// public override string Join(ReadOnlySpan path1, ReadOnlySpan path2, ReadOnlySpan path3, ReadOnlySpan path4) { return Path.Join(path1, path2, path3, path4); } - #endif #if FEATURE_PATH_JOIN_WITH_PARAMS - - /// public override string Join(string path1, string path2) { @@ -294,6 +290,7 @@ public override string Join(string path1, string path2, string path3) { return Path.Join(path1, path2, path3); } + /// public override string Join(params string[] paths) { diff --git a/tests/System.IO.Abstractions.Tests/System.IO.Abstractions.Tests.csproj b/tests/System.IO.Abstractions.Tests/System.IO.Abstractions.Tests.csproj index 389d7760f..d8b1ea034 100644 --- a/tests/System.IO.Abstractions.Tests/System.IO.Abstractions.Tests.csproj +++ b/tests/System.IO.Abstractions.Tests/System.IO.Abstractions.Tests.csproj @@ -1,6 +1,6 @@  - net5.0;netcoreapp3.1 + net6.0;net5.0;netcoreapp3.1 $(TargetFrameworks);net461 The unit tests for our the core abstractions System.IO.Abstractions.Tests From 93f2f83c58b31c03348ee9708a791f9978d51001 Mon Sep 17 00:00:00 2001 From: Florian Greinacher Date: Wed, 22 Dec 2021 15:14:30 +0000 Subject: [PATCH 3/3] chore: bump major --- version.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.json b/version.json index 18f7ab10c..bb8d6cc6c 100644 --- a/version.json +++ b/version.json @@ -1,6 +1,6 @@ { "$schema": "https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json", - "version": "14.0", + "version": "15.0", "assemblyVersion": { "precision": "major" },