diff --git a/Directory.Build.props b/Directory.Build.props index 5c5234105..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 + $(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 47b3e1516..1f9d98953 100644 --- a/src/System.IO.Abstractions/IPath.cs +++ b/src/System.IO.Abstractions/IPath.cs @@ -79,5 +79,64 @@ 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..9c5151d5d 100644 --- a/src/System.IO.Abstractions/PathWrapper.cs +++ b/src/System.IO.Abstractions/PathWrapper.cs @@ -187,5 +187,115 @@ 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/__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)", 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" },