Skip to content

Commit 49b0e1d

Browse files
committed
read_symlink: choose_method
1 parent 8ece3f0 commit 49b0e1d

File tree

5 files changed

+36
-47
lines changed

5 files changed

+36
-47
lines changed

+stdlib/+native/read_symlink.m

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
function r = read_symlink(file)
2+
3+
[ok, r] = isSymbolicLink(file);
4+
if ~ok
5+
r = string.empty;
6+
end
7+
8+
end

+stdlib/private/choose_method.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
case "dotnet"
1616
has = @stdlib.has_dotnet;
1717

18-
if endsWith(name, "ram_total")
18+
if endsWith(name, ["ram_total", "read_symlink"])
1919
if stdlib.dotnet_api() < 6, continue, end
2020
end
2121
case "java"

+stdlib/read_symlink.m

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,14 @@
33
% empty string if path is not a symlink
44
% always of string class in Matlab
55

6-
function r = read_symlink(p)
6+
function r = read_symlink(file, method)
77
arguments
8-
p {mustBeTextScalar}
8+
file {mustBeTextScalar}
9+
method (1,:) string = ["native", "java", "dotnet", "python", "sys"]
910
end
1011

11-
if ~isMATLABReleaseOlderThan('R2024b')
12-
[ok, r] = isSymbolicLink(p);
13-
if ~ok
14-
r = string.empty;
15-
end
16-
elseif stdlib.dotnet_api() >= 6
17-
r = stdlib.dotnet.read_symlink(p);
18-
elseif stdlib.has_java()
19-
r = stdlib.java.read_symlink(p);
20-
elseif stdlib.has_python()
21-
r = stdlib.python.read_symlink(p);
22-
elseif stdlib.isoctave()
23-
r = readlink(p);
24-
else
25-
r = stdlib.sys.read_symlink(p);
26-
end
12+
fun = choose_method(method, "read_symlink");
2713

28-
end
14+
r = fun(file);
2915

30-
%!test
31-
%! if !ispc
32-
%! p = tempname();
33-
%! this = strcat(mfilename("fullpath"), '.m');
34-
%! assert (read_symlink(p), "")
35-
%! assert (create_symlink(this, p))
36-
%! assert (read_symlink(p), this)
37-
%! endif
16+
end

test/TestSymlink.m

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
{mfilename("fullpath") + ".m", false}, ...
1212
{"", false}};
1313
create_symlink_fun = {@stdlib.create_symlink, @stdlib.sys.create_symlink, @stdlib.dotnet.create_symlink, @stdlib.python.create_symlink}
14-
is_symlink_fun = {'native', 'sys', 'dotnet', 'java', 'python'}
15-
read_symlink_fun = {@stdlib.read_symlink, @stdlib.sys.read_symlink, @stdlib.dotnet.read_symlink, @stdlib.java.read_symlink, @stdlib.python.read_symlink}
14+
Pre = {'', "", tempname()}
15+
rs_fun = {'native', 'sys', 'dotnet', 'java', 'python'}
1616
end
1717

1818
methods(TestClassSetup)
@@ -44,31 +44,33 @@ function setup_symlink(tc)
4444

4545
methods (Test, TestTags=["impure", "symlink"])
4646

47-
function test_is_symlink(tc, p, is_symlink_fun)
48-
tc.assertNotEmpty(which("stdlib." + is_symlink_fun + ".is_symlink"))
47+
function test_is_symlink(tc, p, rs_fun)
48+
tc.assertNotEmpty(which("stdlib." + rs_fun + ".is_symlink"))
4949
try
50-
tc.verifyTrue(stdlib.is_symlink(tc.link, is_symlink_fun), "failed to detect own link")
51-
tc.verifyEqual(stdlib.is_symlink(p{1}, is_symlink_fun), p{2}, p{1})
50+
tc.verifyTrue(stdlib.is_symlink(tc.link, rs_fun), "failed to detect own link")
51+
tc.verifyEqual(stdlib.is_symlink(p{1}, rs_fun), p{2}, p{1})
5252
catch e
5353
tc.verifyEqual(e.identifier, 'stdlib:choose_method:NameError', e.message)
5454
end
5555
end
5656

5757

58-
function test_read_symlink(tc, read_symlink_fun)
59-
is_capable(tc, read_symlink_fun)
60-
61-
tc.verifyEmpty(read_symlink_fun(""))
62-
tc.verifyEmpty(read_symlink_fun(''))
63-
tc.verifyEmpty(read_symlink_fun(tempname))
64-
tc.verifyEmpty(read_symlink_fun(tc.target))
65-
66-
link_read = read_symlink_fun(tc.link);
67-
68-
targ = string(tc.target);
58+
function test_read_symlink_empty(tc, Pre, rs_fun)
59+
try
60+
tc.verifyEmpty(stdlib.read_symlink(Pre, rs_fun))
61+
catch e
62+
tc.verifyEqual(e.identifier, 'stdlib:choose_method:NameError', e.message)
63+
end
64+
end
6965

70-
tc.verifyEqual(link_read, targ)
7166

67+
function test_read_symlink(tc, rs_fun)
68+
tc.assertNotEmpty(which("stdlib." + rs_fun + ".read_symlink"))
69+
try
70+
tc.verifyEqual(stdlib.read_symlink(tc.link, rs_fun), string(tc.target))
71+
catch e
72+
tc.verifyEqual(e.identifier, 'stdlib:choose_method:NameError', e.message)
73+
end
7274
end
7375

7476

test/is_capable.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ function is_capable(tc, f)
1616
tc.assumeTrue(ispc(), "Windows only function")
1717
end
1818

19-
if endsWith(n, ["create_symlink", "ram_total", "read_symlink"])
19+
if endsWith(n, ["create_symlink", "ram_total"])
2020
tc.assumeGreaterThanOrEqual(dapi, 6);
2121
end
2222

0 commit comments

Comments
 (0)