From 8f5a9d64b7bee460493f45ad2659e9c4ad96bae5 Mon Sep 17 00:00:00 2001 From: Sakib Hadziavdic Date: Mon, 10 Mar 2025 14:59:12 +0100 Subject: [PATCH 1/4] Add isReadable, isWritable, isExecutable utilities --- os/src/StatOps.scala | 31 +++++++++++++++++++++++ os/test/src/FilesystemMetadataTests.scala | 19 ++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/os/src/StatOps.scala b/os/src/StatOps.scala index cf8695ef..09c217cf 100644 --- a/os/src/StatOps.scala +++ b/os/src/StatOps.scala @@ -40,6 +40,37 @@ object isDir extends Function1[Path, Boolean] { } } + +/** + * Checks whether the given path is readable + * + * Returns `false` if the path does not exist + */ +object isReadable extends Function1[Path, Boolean] { + def apply(p: Path): Boolean = Files.isReadable(p.wrapped) +} + + +/** + * Checks whether the given path is writable + * + * Returns `false` if the path does not exist + */ +object isWritable extends Function1[Path, Boolean] { + def apply(p: Path): Boolean = Files.isWritable(p.wrapped) +} + + +/** + * Checks whether the given path is executable + * + * Returns `false` if the path does not exist + */ +object isExecutable extends Function1[Path, Boolean] { + def apply(p: Path): Boolean = Files.isExecutable(p.wrapped) +} + + /** * Gets the size of the given file or folder * diff --git a/os/test/src/FilesystemMetadataTests.scala b/os/test/src/FilesystemMetadataTests.scala index f5d654db..074b5d75 100644 --- a/os/test/src/FilesystemMetadataTests.scala +++ b/os/test/src/FilesystemMetadataTests.scala @@ -50,6 +50,25 @@ object FilesystemMetadataTests extends TestSuite { os.isLink(wd / "folder1") ==> false } } + test("isReadable") { + test - prep { wd => + os.isReadable(wd / "File.txt") ==> true + os.isReadable(wd / "folder1") ==> true + } + } + test("isWritable") { + test - prep { wd => + os.isWritable(wd / "File.txt") ==> true + os.isWritable(wd / "folder1") ==> true + } + } + test("isExecutable") { + test - prep { wd => + os.perms.set(wd / "File.txt", "rw-rw-rw-") + os.isExecutable(wd / "File.txt") ==> false + os.isExecutable(wd / "misc/echo") ==> true + } + } test("size") { test - prep { wd => os.size(wd / "File.txt") ==> 8 From 882d6a82b44e09bd0bb19239a268675169803dce Mon Sep 17 00:00:00 2001 From: Sakib Hadziavdic Date: Mon, 10 Mar 2025 15:52:09 +0100 Subject: [PATCH 2/4] fmt --- os/src/StatOps.scala | 4 ---- 1 file changed, 4 deletions(-) diff --git a/os/src/StatOps.scala b/os/src/StatOps.scala index 09c217cf..b85db779 100644 --- a/os/src/StatOps.scala +++ b/os/src/StatOps.scala @@ -40,7 +40,6 @@ object isDir extends Function1[Path, Boolean] { } } - /** * Checks whether the given path is readable * @@ -50,7 +49,6 @@ object isReadable extends Function1[Path, Boolean] { def apply(p: Path): Boolean = Files.isReadable(p.wrapped) } - /** * Checks whether the given path is writable * @@ -60,7 +58,6 @@ object isWritable extends Function1[Path, Boolean] { def apply(p: Path): Boolean = Files.isWritable(p.wrapped) } - /** * Checks whether the given path is executable * @@ -70,7 +67,6 @@ object isExecutable extends Function1[Path, Boolean] { def apply(p: Path): Boolean = Files.isExecutable(p.wrapped) } - /** * Gets the size of the given file or folder * From 76c20eaab8970b4ce4864d5ca330508d0688a7fc Mon Sep 17 00:00:00 2001 From: Sakib Hadziavdic Date: Mon, 10 Mar 2025 15:55:54 +0100 Subject: [PATCH 3/4] add readme docs for isReadable-isWritable-isExecutable --- Readme.adoc | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/Readme.adoc b/Readme.adoc index 61bb1bad..faf9bfbb 100644 --- a/Readme.adoc +++ b/Readme.adoc @@ -1555,6 +1555,51 @@ os.isLink(wd / "misc/folder-symlink") ==> true os.isLink(wd / "folder1") ==> false ---- +==== `os.isReadable` + +[source,scala] +---- +os.isReadable(p: Path): Boolean +---- + +Returns `true` if the given path is readable. + +[source,scala] +---- +os.isReadable(wd / "misc/file1") ==> false +os.isReadable(wd / "misc/file2") ==> true +---- + +==== `os.isWritable` + +[source,scala] +---- +os.isWritable(p: Path): Boolean +---- + +Returns `true` if the given path is writable. + +[source,scala] +---- +os.isWritable(wd / "misc/file1") ==> false +os.isWritable(wd / "misc/file2") ==> true +---- + +==== `os.isExecutable` + +[source,scala] +---- +os.isExecutable(p: Path): Boolean +---- + +Returns `true` if the given path is executable. + +[source,scala] +---- +os.isExecutable(wd / "misc/file1") ==> false +os.isExecutable(wd / "misc/file2.sh") ==> true +---- + ==== `os.size` [source,scala] From 5ef3d984d8ed6f3f2863377ec92bbf7189f96b1e Mon Sep 17 00:00:00 2001 From: Sakib Hadziavdic Date: Mon, 10 Mar 2025 15:58:15 +0100 Subject: [PATCH 4/4] Fix windows test --- os/test/src/FilesystemMetadataTests.scala | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/os/test/src/FilesystemMetadataTests.scala b/os/test/src/FilesystemMetadataTests.scala index 074b5d75..a340cadd 100644 --- a/os/test/src/FilesystemMetadataTests.scala +++ b/os/test/src/FilesystemMetadataTests.scala @@ -64,9 +64,11 @@ object FilesystemMetadataTests extends TestSuite { } test("isExecutable") { test - prep { wd => - os.perms.set(wd / "File.txt", "rw-rw-rw-") - os.isExecutable(wd / "File.txt") ==> false - os.isExecutable(wd / "misc/echo") ==> true + if (Unix()) { + os.perms.set(wd / "File.txt", "rw-rw-rw-") + os.isExecutable(wd / "File.txt") ==> false + os.isExecutable(wd / "misc/echo") ==> true + } } } test("size") {