Skip to content

Commit 28eadb4

Browse files
gselzerhinerm
authored andcommitted
Rewrite verbose descriptions
1 parent 1be6218 commit 28eadb4

4 files changed

Lines changed: 57 additions & 15 deletions

File tree

scijava-ops-engine/src/main/java/org/scijava/ops/engine/matcher/simplify/SimplifiedOpDescriptionGenerator.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,13 @@ public String verboseDescriptions(OpEnvironment env, OpRequest req) {
8686
var infos = env.infos(req.getName());
8787
var filtered = filterInfos(infos, req);
8888
String opString = filtered.stream() //
89-
.map(info -> Infos.describeVerbose(info, name)) //
89+
.map(Infos::describeMultiLine) //
9090
.map(s -> s.replaceAll("\n", "\n\t")) //
9191
.distinct() //
92-
.collect(Collectors.joining("\n\t> "));
92+
.collect(Collectors.joining("\n\t- "));
9393
if (opString.isEmpty()) return "No Ops found matching this request.";
94-
return "Ops:\n\t> " + opString;
94+
var key = "Key: *=container, ^=mutable";
95+
return name + ":\n\t- " + opString + "\n" + key;
9596
}
9697

9798
private String allNamespaces(final OpEnvironment env) {

scijava-ops-engine/src/main/java/org/scijava/ops/engine/util/Infos.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,48 @@ private static String description(final OpInfo info, final String name, final Me
278278
return sb.toString();
279279
}
280280

281+
public static String describeMultiLine(final OpInfo info) {
282+
final StringBuilder sb = new StringBuilder(info.implementationName());
283+
// Step 2: Inputs
284+
String key;
285+
for (var member: info.inputs()) {
286+
sb.append("\n\t");
287+
switch (member.getIOType()) {
288+
case INPUT:
289+
key = member.getKey();
290+
break;
291+
case MUTABLE:
292+
key = "^" + member.getKey();
293+
break;
294+
case CONTAINER:
295+
key = "*" + member.getKey();
296+
break;
297+
default:
298+
throw new IllegalArgumentException("Invalid IO type: " + member.getIOType());
299+
}
300+
sb.append("> ").append(key) //
301+
.append(member.isRequired() ? "" : " (optional)") //
302+
.append(" : ") //
303+
.append(typeString(member.getType(), true)); //
304+
if (!member.getDescription().isBlank()) {
305+
sb.append("\n\t\t").append(member.getDescription().replaceAll("\n\\s*", "\n\t\t"));
306+
}
307+
}
308+
// Step 3: Output
309+
Member<?> output = info.output();
310+
switch (output.getIOType()) {
311+
case OUTPUT:
312+
sb.append("\n\tReturns : ").append(typeString(output.getType(), true));
313+
break;
314+
case MUTABLE:
315+
case CONTAINER:
316+
break;
317+
default:
318+
throw new IllegalArgumentException("Invalid IO type: " + output.getIOType());
319+
}
320+
return sb.toString();
321+
}
322+
281323
public static String describeOneLine(final OpInfo info) {
282324
final StringBuilder sb = new StringBuilder("(");
283325
// Step 2: Inputs

scijava-ops-engine/src/test/java/org/scijava/ops/engine/OpEnvironmentTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public void testHelpVerbose() {
9393

9494
// Get the Op matching the description
9595
descriptions = helpEnv.helpVerbose("help.verbose1");
96-
expected = "Ops:\n\t> help.verbose1(\n\t\t Output:\n\t\t\tjava.lang.String output1\n\t)\n\t";
96+
expected = "help.verbose1:\n\t- org.scijava.ops.engine.OpifyOp\n\t\tReturns : java.lang.String\nKey: *=container, ^=mutable";
9797
Assertions.assertEquals(expected, descriptions);
9898

9999
// Finally assert a message is thrown when no Ops match

scijava-ops-engine/src/test/java/org/scijava/ops/engine/matcher/simplify/SimplifiedOpInfoTest.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -122,17 +122,16 @@ public void testSimplifiedOpFromEnvironment() {
122122
@Test
123123
public void testSimpleDescriptions() {
124124
String actual = ops.unary("test.coalesceSimpleDescription").helpVerbose();
125-
String expected = //
126-
"Ops:" +
127-
"\n\t> test.coalesceSimpleDescription(\n" +
128-
"\t\t Inputs:\n\t\t\tjava.util.List<java.lang.Long> input1\n" +
129-
"\t\t Container (I/O):\n\t\t\tjava.util.List<java.lang.Long> container1\n\t)\n\t" +
130-
"\n\t> test.coalesceSimpleDescription(\n" +
131-
"\t\t Inputs:\n\t\t\tjava.lang.Double input1\n" +
132-
"\t\t Output:\n\t\t\tjava.lang.Double output1\n\t)\n\t" +
133-
"\n\t> test.coalesceSimpleDescription(\n" +
134-
"\t\t Inputs:\n\t\t\tjava.lang.Long input1\n" +
135-
"\t\t Output:\n\t\t\tjava.lang.Long output1\n\t)\n\t";
125+
String expected = "test.coalesceSimpleDescription:\n" +
126+
"\t- org.scijava.ops.engine.matcher.simplify.SimplifiedOpInfoTest$comp1\n" +
127+
"\t\t> input1 : java.util.List<java.lang.Long>\n" +
128+
"\t\t> *container1 : java.util.List<java.lang.Long>\n" +
129+
"\t- org.scijava.ops.engine.matcher.simplify.SimplifiedOpInfoTest$func1\n" +
130+
"\t\t> input1 : java.lang.Double\n" + "\t\tReturns : java.lang.Double\n" +
131+
"\t- org.scijava.ops.engine.matcher.simplify.SimplifiedOpInfoTest$func2\n" +
132+
"\t\t> input1 : java.lang.Long\n" + "\t\tReturns : java.lang.Long\n" +
133+
"Key: *=container, ^=mutable";
134+
136135
Assertions.assertEquals(expected, actual);
137136

138137
actual = ops.unary("test.coalesceSimpleDescription").help();

0 commit comments

Comments
 (0)