diff --git a/+stdlib/+fileio/absolute_path.m b/+stdlib/+fileio/absolute_path.m index 74eead2..2385f1a 100644 --- a/+stdlib/+fileio/absolute_path.m +++ b/+stdlib/+fileio/absolute_path.m @@ -1,13 +1,13 @@ function abspath = absolute_path(p) % https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/File.html#getAbsolutePath() arguments - p string {mustBeScalarOrEmpty} + p (1,1) string end % have to expand ~ first (like C++ filesystem::path::absolute) abspath = stdlib.fileio.expanduser(p); -if isempty(abspath) || abspath == "" +if abspath == "" return end @@ -21,6 +21,6 @@ abspath = stdlib.fileio.join(pwd, abspath); end -abspath = stdlib.posix(java.io.File(abspath).getAbsolutePath()); +abspath = stdlib.fileio.posix(java.io.File(abspath).getAbsolutePath()); end % function diff --git a/+stdlib/+fileio/canonical.m b/+stdlib/+fileio/canonical.m index d488bee..2680bd7 100644 --- a/+stdlib/+fileio/canonical.m +++ b/+stdlib/+fileio/canonical.m @@ -1,16 +1,12 @@ function c = canonical(p) % https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/File.html#getCanonicalPath() arguments - p string {mustBeScalarOrEmpty} + p (1,1) string end % have to expand ~ first (like C++ filesystem::path::absolute) c = stdlib.fileio.expanduser(p); -if isempty(c) - return -end - if ispc && startsWith(c, "\\") % UNC path is not canonicalized return diff --git a/+stdlib/+fileio/expanduser.m b/+stdlib/+fileio/expanduser.m index fbf5ddd..c3746b2 100644 --- a/+stdlib/+fileio/expanduser.m +++ b/+stdlib/+fileio/expanduser.m @@ -1,7 +1,7 @@ function e = expanduser(p) arguments - p string {mustBeScalarOrEmpty} + p (1,1) string end e = p; diff --git a/+stdlib/+fileio/filename.m b/+stdlib/+fileio/filename.m index 0cb10d6..c3ecbb1 100644 --- a/+stdlib/+fileio/filename.m +++ b/+stdlib/+fileio/filename.m @@ -1,7 +1,7 @@ function p = filename(path) % FILENAME filename (including suffix) without directory arguments - path string + path (1,1) string end % NOT https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/File.html#getName() diff --git a/+stdlib/+fileio/is_absolute_path.m b/+stdlib/+fileio/is_absolute_path.m index c0af56d..bc16fa4 100644 --- a/+stdlib/+fileio/is_absolute_path.m +++ b/+stdlib/+fileio/is_absolute_path.m @@ -1,12 +1,7 @@ function isabs = is_absolute_path(apath) % https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/File.html#isAbsolute() arguments - apath string {mustBeScalarOrEmpty} -end - -if isempty(apath) - isabs = logical.empty(); - return + apath (1,1) string end % expanduser() here to work like C++ filesystem::path::is_absolute() diff --git a/+stdlib/+fileio/is_exe.m b/+stdlib/+fileio/is_exe.m index 3aa8779..fcf7b4c 100644 --- a/+stdlib/+fileio/is_exe.m +++ b/+stdlib/+fileio/is_exe.m @@ -3,12 +3,7 @@ % https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/File.html#canExecute() arguments - file string {mustBeScalarOrEmpty} -end - -if isempty(file) - ok = logical.empty; - return + file (1,1) string end ok = java.io.File(file).canExecute(); diff --git a/+stdlib/+fileio/is_readable.m b/+stdlib/+fileio/is_readable.m index 0325938..2c0f144 100644 --- a/+stdlib/+fileio/is_readable.m +++ b/+stdlib/+fileio/is_readable.m @@ -3,12 +3,7 @@ % https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/file/Files.html#isReadable(java.nio.file.Path) arguments - file string {mustBeScalarOrEmpty} -end - -if isempty(file) - ok = logical.empty; - return + file (1,1) string end diff --git a/+stdlib/+fileio/is_writable.m b/+stdlib/+fileio/is_writable.m index 65d8211..fb50712 100644 --- a/+stdlib/+fileio/is_writable.m +++ b/+stdlib/+fileio/is_writable.m @@ -3,15 +3,9 @@ % https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/file/Files.html#isWritable(java.nio.file.Path) arguments - file string {mustBeScalarOrEmpty} + file (1,1) string end -if isempty(file) - ok = logical.empty; - return -end - - ok = java.nio.file.Files.isWritable(java.io.File(stdlib.fileio.absolute_path(file)).toPath()); end diff --git a/+stdlib/+fileio/join.m b/+stdlib/+fileio/join.m index 78eabb3..10224f4 100644 --- a/+stdlib/+fileio/join.m +++ b/+stdlib/+fileio/join.m @@ -1,8 +1,8 @@ function p = join(a, b) %% JOIN: join two paths with posix file separator arguments - a string {mustBeScalarOrEmpty} - b string {mustBeScalarOrEmpty} + a (1,1) string + b (1,1) string end p = stdlib.fileio.posix(fullfile(a, b)); diff --git a/+stdlib/+fileio/normalize.m b/+stdlib/+fileio/normalize.m index a1dd25e..7ffa780 100644 --- a/+stdlib/+fileio/normalize.m +++ b/+stdlib/+fileio/normalize.m @@ -2,14 +2,9 @@ % normalize(p) remove redundant elements of path p % https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/file/Path.html#normalize() arguments - p string {mustBeScalarOrEmpty} + p (1,1) string end -n = p; -if isempty(p) - return -end - -n = stdlib.fileio.posix(java.io.File(stdlib.fileio.expanduser(n)).toPath().normalize()); +n = stdlib.fileio.posix(java.io.File(stdlib.fileio.expanduser(p)).toPath().normalize()); end diff --git a/+stdlib/+fileio/parent.m b/+stdlib/+fileio/parent.m index f9c5eed..94cf3cf 100644 --- a/+stdlib/+fileio/parent.m +++ b/+stdlib/+fileio/parent.m @@ -2,10 +2,15 @@ % PARENT parent directory of path % https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/File.html#getParent() arguments - path string + path (1,1) string end -p = stdlib.fileio.posix(java.io.File(path).getParent()); +jp = java.io.File(path).getParent(); +if isempty(jp) + jp = ""; +end + +p = stdlib.fileio.posix(jp); % must drop trailing slash - need to as_posix for windows %p = fileparts(strip(stdlib.fileio.posix(path), 'right', '/')); diff --git a/+stdlib/+fileio/resolve.m b/+stdlib/+fileio/resolve.m index d769e27..7971eb8 100644 --- a/+stdlib/+fileio/resolve.m +++ b/+stdlib/+fileio/resolve.m @@ -2,16 +2,12 @@ % distinct from canonical(), resolve() always returns absolute path % non-existant path is made absolute relative to pwd arguments - p string {mustBeScalarOrEmpty} + p (1,1) string end % have to expand ~ first (like C++ filesystem::path::absolute) c = stdlib.fileio.expanduser(p); -if isempty(c) - return -end - if ispc && startsWith(c, "\\") % UNC path is not canonicalized return diff --git a/+stdlib/+fileio/samepath.m b/+stdlib/+fileio/samepath.m index 63fd2e2..b972fa6 100644 --- a/+stdlib/+fileio/samepath.m +++ b/+stdlib/+fileio/samepath.m @@ -1,13 +1,8 @@ function issame = samepath(path1, path2) % https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/nio/file/Files.html#isSameFile(java.nio.file.Path,java.nio.file.Path) arguments - path1 string {mustBeScalarOrEmpty} - path2 string {mustBeScalarOrEmpty} -end - -if isempty(path1) || isempty(path2) - issame = logical.empty; - return + path1 (1,1) string + path2 (1,1) string end % java.nio.file.Files needs CANONICAL -- not just absolute path diff --git a/+stdlib/+fileio/with_suffix.m b/+stdlib/+fileio/with_suffix.m index deb770c..0e8a5ce 100644 --- a/+stdlib/+fileio/with_suffix.m +++ b/+stdlib/+fileio/with_suffix.m @@ -1,7 +1,7 @@ function filename = with_suffix(filename, suffix) arguments - filename string {mustBeScalarOrEmpty} + filename (1,1) string suffix (1,1) string end diff --git a/+stdlib/absolute_path.m b/+stdlib/absolute_path.m index 4b1cad0..17b52ef 100644 --- a/+stdlib/absolute_path.m +++ b/+stdlib/absolute_path.m @@ -12,7 +12,7 @@ % * a: absolute path, if determined arguments - p string {mustBeScalarOrEmpty} + p (1,1) string end a = stdlib.fileio.absolute_path(p); diff --git a/+stdlib/canonical.m b/+stdlib/canonical.m index cd1d18c..1ba238b 100644 --- a/+stdlib/canonical.m +++ b/+stdlib/canonical.m @@ -15,7 +15,7 @@ % * c: canonical path, if determined arguments - p string {mustBeScalarOrEmpty} + p (1,1) string end c = stdlib.fileio.canonical(p); diff --git a/+stdlib/expanduser.m b/+stdlib/expanduser.m index 38ab96b..4e666c0 100644 --- a/+stdlib/expanduser.m +++ b/+stdlib/expanduser.m @@ -2,8 +2,7 @@ %% expanduser(path) % expands tilde ~ into user home directory % -% Useful for Matlab functions like h5read() and some Computer Vision toolbox functions -% that can't handle ~ +% Useful for Matlab functions that can't handle ~ % %%% Inputs % * p: path to expand, if tilde present @@ -11,7 +10,7 @@ % * expanded: expanded path arguments - p string + p (1,1) string end expanded = stdlib.fileio.expanduser(p); diff --git a/+stdlib/extract_zstd.m b/+stdlib/extract_zstd.m index 364252c..46304d9 100644 --- a/+stdlib/extract_zstd.m +++ b/+stdlib/extract_zstd.m @@ -7,7 +7,7 @@ function extract_zstd(archive, out_dir) arguments archive (1,1) string {mustBeFile} - out_dir (1,1) string + out_dir (1,1) string {mustBeFolder} end diff --git a/+stdlib/filename.m b/+stdlib/filename.m index 891d0bb..f3f92ef 100644 --- a/+stdlib/filename.m +++ b/+stdlib/filename.m @@ -1,7 +1,7 @@ function p = filename(path) % FILENAME filename (including suffix) without directory arguments - path string + path (1,1) string end p = stdlib.fileio.filename(path); diff --git a/+stdlib/is_absolute_path.m b/+stdlib/is_absolute_path.m index 0ee88c1..f91326a 100644 --- a/+stdlib/is_absolute_path.m +++ b/+stdlib/is_absolute_path.m @@ -6,7 +6,7 @@ % os.path.isabs("/foo/../bar") == True arguments - apath string {mustBeScalarOrEmpty} + apath (1,1) string end isabs = stdlib.fileio.is_absolute_path(apath); diff --git a/+stdlib/is_exe.m b/+stdlib/is_exe.m index 0ae443e..e8cac13 100644 --- a/+stdlib/is_exe.m +++ b/+stdlib/is_exe.m @@ -8,7 +8,7 @@ % * ok: boolean logical arguments - file string {mustBeScalarOrEmpty} + file (1,1) string end ok = stdlib.fileio.is_exe(file); diff --git a/+stdlib/join.m b/+stdlib/join.m index 398a1d6..0e33c17 100644 --- a/+stdlib/join.m +++ b/+stdlib/join.m @@ -1,8 +1,8 @@ function p = join(a, b) %% JOIN: join two paths with posix file separator arguments - a string {mustBeScalarOrEmpty} - b string {mustBeScalarOrEmpty} + a (1,1) string + b (1,1) string end p = stdlib.fileio.join(a, b); diff --git a/+stdlib/normalize.m b/+stdlib/normalize.m index adfd213..f1d1051 100644 --- a/+stdlib/normalize.m +++ b/+stdlib/normalize.m @@ -8,7 +8,7 @@ % * c: normalized path arguments - p string {mustBeScalarOrEmpty} + p (1,1) string end c = stdlib.fileio.normalize(p); diff --git a/+stdlib/parent.m b/+stdlib/parent.m index fa67475..85efeac 100644 --- a/+stdlib/parent.m +++ b/+stdlib/parent.m @@ -1,7 +1,7 @@ function p = parent(path) % PARENT parent of path arguments - path string + path (1,1) string end p = stdlib.fileio.parent(path); diff --git a/+stdlib/posix.m b/+stdlib/posix.m index 3c719fe..22edec2 100644 --- a/+stdlib/posix.m +++ b/+stdlib/posix.m @@ -1,7 +1,6 @@ function ppath = posix(file) %% posix(file) -% convert a path or sequence of path components to a Posix path separated -% with "/" even on Windows. +% convert a path to a Posix path separated with "/" even on Windows. % If Windows path also have escaping "\" this breaks arguments file string diff --git a/+stdlib/resolve.m b/+stdlib/resolve.m index b3880bd..3637b21 100644 --- a/+stdlib/resolve.m +++ b/+stdlib/resolve.m @@ -15,7 +15,7 @@ % * c: resolved path arguments - p string {mustBeScalarOrEmpty} + p (1,1) string end c = stdlib.fileio.resolve(p); diff --git a/+stdlib/samepath.m b/+stdlib/samepath.m index c2124f6..7a7dc33 100644 --- a/+stdlib/samepath.m +++ b/+stdlib/samepath.m @@ -7,8 +7,8 @@ %%% Outputs % issame: logical arguments - path1 string {mustBeScalarOrEmpty} - path2 string {mustBeScalarOrEmpty} + path1 (1,1) string + path2 (1,1) string end issame = stdlib.fileio.samepath(path1, path2); diff --git a/+stdlib/with_suffix.m b/+stdlib/with_suffix.m index de6516a..ef6f83b 100644 --- a/+stdlib/with_suffix.m +++ b/+stdlib/with_suffix.m @@ -7,7 +7,7 @@ %%% Outputs % * filename: modified filename arguments - filename string + filename (1,1) string suffix (1,1) string end diff --git a/test/TestFilePure.m b/test/TestFilePure.m index 98209f2..3e6605d 100644 --- a/test/TestFilePure.m +++ b/test/TestFilePure.m @@ -94,6 +94,31 @@ function test_is_absolute_path(tc) tc.verifyFalse(stdlib.is_absolute_path("c")) end +function test_absolute_path(tc) +import matlab.unittest.constraints.StartsWithSubstring + +tc.verifyEqual(stdlib.absolute_path(""), "") + +pabs = stdlib.absolute_path('2foo'); +pabs2 = stdlib.absolute_path('4foo'); +tc.verifyThat(pabs, ~StartsWithSubstring("2")) +tc.verifyTrue(strncmp(pabs, pabs2, 2)) + +par1 = stdlib.absolute_path("../2foo"); +tc.verifyNotEmpty(par1) + +par2 = stdlib.absolute_path("../4foo"); +tc.verifyTrue(strncmp(par2, pabs2, 2)) + +pt1 = stdlib.absolute_path("bar/../2foo"); +tc.verifyNotEmpty(pt1) + +va = stdlib.absolute_path("2foo"); +vb = stdlib.absolute_path("4foo"); +tc.verifyThat(va, ~StartsWithSubstring("2")) +tc.verifyTrue(strncmp(va, vb, 2)) + +end function test_normalize(tc)