Mercurial > octave
annotate scripts/miscellaneous/fieldnames.m @ 28166:fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
* fieldnames.m: Use @var{} around output variable name used in documentation.
Add new elesif branch to check if input is a classdef object and call
properties() to return list of names. Add BIST test for new behavior.
author | Rik <rik@octave.org> |
---|---|
date | Sat, 21 Mar 2020 19:30:32 -0700 |
parents | bd51beb6205e |
children | 47d4a84a5725 |
rev | line source |
---|---|
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
1 ######################################################################## |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
2 ## |
27919
1891570abac8
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
27918
diff
changeset
|
3 ## Copyright (C) 2012-2020 The Octave Project Developers |
27918
b442ec6dda5c
use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents:
26376
diff
changeset
|
4 ## |
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
5 ## See the file COPYRIGHT.md in the top-level directory of this |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
6 ## distribution or <https://octave.org/copyright/>. |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
7 ## |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
8 ## This file is part of Octave. |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
9 ## |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
24491
diff
changeset
|
10 ## Octave is free software: you can redistribute it and/or modify it |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
11 ## under the terms of the GNU General Public License as published by |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
24491
diff
changeset
|
12 ## the Free Software Foundation, either version 3 of the License, or |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22497
diff
changeset
|
13 ## (at your option) any later version. |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
14 ## |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
15 ## Octave is distributed in the hope that it will be useful, but |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
16 ## WITHOUT ANY WARRANTY; without even the implied warranty of |
22755
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22497
diff
changeset
|
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
3a2b891d0b33
maint: Standardize Copyright formatting.
Rik <rik@octave.org>
parents:
22497
diff
changeset
|
18 ## GNU General Public License for more details. |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
19 ## |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
20 ## You should have received a copy of the GNU General Public License |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
21 ## along with Octave; see the file COPYING. If not, see |
24534
194eb4bd202b
maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents:
24491
diff
changeset
|
22 ## <https://www.gnu.org/licenses/>. |
27923
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
23 ## |
bd51beb6205e
update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents:
27919
diff
changeset
|
24 ######################################################################## |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
25 |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
26 ## -*- texinfo -*- |
20852
516bb87ea72e
2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents:
20158
diff
changeset
|
27 ## @deftypefn {} {@var{names} =} fieldnames (@var{struct}) |
516bb87ea72e
2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents:
20158
diff
changeset
|
28 ## @deftypefnx {} {@var{names} =} fieldnames (@var{obj}) |
516bb87ea72e
2015 Code Sprint: remove class of function from docstring for all m-files.
Rik <rik@octave.org>
parents:
20158
diff
changeset
|
29 ## @deftypefnx {} {@var{names} =} fieldnames (@var{javaobj}) |
22166
44244c9c177f
doc: Reword and clarify fieldnames doc string for Java classes and objects
Mike Miller <mtmiller@octave.org>
parents:
21092
diff
changeset
|
30 ## @deftypefnx {} {@var{names} =} fieldnames ("@var{javaclassname}") |
28166
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
31 ## Return a cell array of strings with the names of the fields in the specified |
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
32 ## input. |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
33 ## |
28166
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
34 ## When the input is a structure @var{struct}, the @var{names} are the elements |
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
35 ## of the structure. |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
36 ## |
28166
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
37 ## When the input is an Octave object @var{obj}, the @var{names} are the public |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
38 ## properties of the object. |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
39 ## |
22166
44244c9c177f
doc: Reword and clarify fieldnames doc string for Java classes and objects
Mike Miller <mtmiller@octave.org>
parents:
21092
diff
changeset
|
40 ## When the input is a Java object @var{javaobj} or a string containing the |
28166
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
41 ## name of a Java class @var{javaclassname}, the @var{names} are the public |
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
42 ## fields (data members) of the object or class. |
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
43 ## @seealso{numfields, isfield, orderfields, struct, properties} |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
44 ## @end deftypefn |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
45 |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
46 function names = fieldnames (obj) |
19593
446c46af4b42
strip trailing whitespace from most source files
John W. Eaton <jwe@octave.org>
parents:
18533
diff
changeset
|
47 |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
48 if (nargin != 1) |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
49 print_usage (); |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
50 endif |
19593
446c46af4b42
strip trailing whitespace from most source files
John W. Eaton <jwe@octave.org>
parents:
18533
diff
changeset
|
51 |
28166
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
52 if (isstruct (obj)) |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
53 names = __fieldnames__ (obj); |
28166
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
54 elseif (isobject (obj)) |
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
55 names = properties (obj); |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
56 elseif (isjava (obj) || ischar (obj)) |
22489
93ea313301f9
test: Add bug ids (<#####>) to BIST tests.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
57 ## FIXME: Function prototype that accepts java obj exists, but doesn't |
15816
59b6c6aee042
Don't box return values from javaObject. Always return a Java object.
Rik <rik@octave.org>
parents:
15790
diff
changeset
|
58 ## work if obj is java.lang.String. Convert obj to classname. |
21092
429f83903400
maint: Use "FIXME:" more places in code base.
Rik <rik@octave.org>
parents:
20852
diff
changeset
|
59 ## FIXME: this is now working for objects whose class is in the dynamic |
20033
490ae1d98f27
fieldnames.m: back out cset 68aec55f5eb6, bug is still present (bug #42710)
Carnë Draug <carandraug@octave.org>
parents:
20032
diff
changeset
|
60 ## classpath but will continue to fail if such classnames are used |
22489
93ea313301f9
test: Add bug ids (<#####>) to BIST tests.
Rik <rik@octave.org>
parents:
22323
diff
changeset
|
61 ## instead (see bug #42710). |
19823
b2c4f869ff7c
fieldnames: fix for java objects from dynamic classpath (bug #42710)
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
62 if (isa (obj, "java.lang.String")) |
15816
59b6c6aee042
Don't box return values from javaObject. Always return a Java object.
Rik <rik@octave.org>
parents:
15790
diff
changeset
|
63 obj = class (obj); |
59b6c6aee042
Don't box return values from javaObject. Always return a Java object.
Rik <rik@octave.org>
parents:
15790
diff
changeset
|
64 endif |
15790
921912c92102
Deprecate java_invoke, replace with javaMethod.
Rik <rik@octave.org>
parents:
15781
diff
changeset
|
65 names_str = javaMethod ("getFields", "org.octave.ClassHelper", obj); |
16724
b7667fcb9fbc
Substitute ostrsplit() for strsplit().
Ben Abbott <bpabbott@mac.com>
parents:
16403
diff
changeset
|
66 names = ostrsplit (names_str, ';'); |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
67 else |
19593
446c46af4b42
strip trailing whitespace from most source files
John W. Eaton <jwe@octave.org>
parents:
18533
diff
changeset
|
68 error ("fieldnames: Invalid input argument"); |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
69 endif |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
70 |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
71 endfunction |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
72 |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
73 |
28166
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
74 ## Test preservation of fieldname order |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
75 %!test |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
76 %! x(3).d=1; x(2).a=2; x(1).b=3; x(2).c=3; |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
77 %! assert (fieldnames (x), {"d"; "a"; "b"; "c"}); |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
78 |
28166
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
79 ## Test empty structure |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
80 %!test |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
81 %! s = struct (); |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
82 %! assert (fieldnames (s), cell (0, 1)); |
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
83 |
28166
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
84 ## Test classdef object |
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
85 %!test |
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
86 %! m = containers.Map (); |
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
87 %! f = fieldnames (m); |
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
88 %! assert (f, {"Count"; "KeyType"; "ValueType"; "map"; "numeric_keys"}); |
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
89 |
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
90 ## Test Java classname by passing classname |
23405
32ec90068be5
use %!testif runtime tests to properly skip java tests
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
91 %!testif HAVE_JAVA; usejava ("jvm") |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
92 %! names = fieldnames ("java.lang.Double"); |
18902
e6872e945553
fieldnames: return only field names of java objects instead of description.
Carnë Draug <carandraug@octave.org>
parents:
18538
diff
changeset
|
93 %! assert (any (strcmp (names, "MAX_VALUE"))); |
15781
c33594eefda7
Add fieldnames.m which extensds fieldnames() to work on Java objects.
Rik <rik@octave.org>
parents:
diff
changeset
|
94 |
28166
fab3eeb1fc7e
fieldnames.m: Return only public properties for classdef objects (bug #58012)
Rik <rik@octave.org>
parents:
27923
diff
changeset
|
95 ## Test Java classname by passing java object |
23405
32ec90068be5
use %!testif runtime tests to properly skip java tests
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
96 %!testif HAVE_JAVA; usejava ("jvm") |
18902
e6872e945553
fieldnames: return only field names of java objects instead of description.
Carnë Draug <carandraug@octave.org>
parents:
18538
diff
changeset
|
97 %! names = fieldnames (javaObject ("java.lang.Double", 10)); |
e6872e945553
fieldnames: return only field names of java objects instead of description.
Carnë Draug <carandraug@octave.org>
parents:
18538
diff
changeset
|
98 %! assert (any (strcmp (names, "MAX_VALUE"))); |
19876
f799bf70350f
fieldnames.m: Change BIST test to pass with Java 1.8 (bug #44382).
Rik <rik@octave.org>
parents:
19823
diff
changeset
|
99 %! assert (all (ismember ({"POSITIVE_INFINITY", "NEGATIVE_INFINITY", ... |
f799bf70350f
fieldnames.m: Change BIST test to pass with Java 1.8 (bug #44382).
Rik <rik@octave.org>
parents:
19823
diff
changeset
|
100 %! "NaN", "MAX_VALUE", "MIN_NORMAL", "MIN_VALUE", ... |
f799bf70350f
fieldnames.m: Change BIST test to pass with Java 1.8 (bug #44382).
Rik <rik@octave.org>
parents:
19823
diff
changeset
|
101 %! "MAX_EXPONENT", "MIN_EXPONENT", "SIZE", "TYPE"}, |
f799bf70350f
fieldnames.m: Change BIST test to pass with Java 1.8 (bug #44382).
Rik <rik@octave.org>
parents:
19823
diff
changeset
|
102 %! names))); |
18902
e6872e945553
fieldnames: return only field names of java objects instead of description.
Carnë Draug <carandraug@octave.org>
parents:
18538
diff
changeset
|
103 |
23405
32ec90068be5
use %!testif runtime tests to properly skip java tests
John W. Eaton <jwe@octave.org>
parents:
23220
diff
changeset
|
104 %!testif HAVE_JAVA; usejava ("jvm") |
19823
b2c4f869ff7c
fieldnames: fix for java objects from dynamic classpath (bug #42710)
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
105 %! names = fieldnames (javaObject ("java.lang.String", "Hello")); |
b2c4f869ff7c
fieldnames: fix for java objects from dynamic classpath (bug #42710)
Carnë Draug <carandraug@octave.org>
parents:
19697
diff
changeset
|
106 %! assert (any (strcmp (names, "CASE_INSENSITIVE_ORDER"))); |