Skip to content

Commit

Permalink
[remkop#1380] Fix for requiredOptionMarker displayed on ArgGroup
Browse files Browse the repository at this point in the history
  • Loading branch information
ahmede41 authored and aelkhali committed Dec 8, 2021
1 parent 0ff6d84 commit 917dbe6
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ public boolean getVerbose() {
return this.verbose;
}

@Option(names = {"-j", "--json"}, description = "JSON printing", required = true)
@Option(names = {"-j", "--json"}, description = "JSON printing", required = false)
private boolean json;

/**
Expand Down Expand Up @@ -124,9 +124,10 @@ public void testingWithExclusiveTrue() {
new CommandLine(new TestingClassExclusiveTrue()).usage(printStream);

String returnedText = tempOut.toString();
String expectedText = "Usage: <main class> [[-s] | [-v] | -j]\n" +
"* -j, --json JSON printing\n" +
" -s, --silent Silent mode\n" +
String expectedText =
"Usage: <main class> [-s | -v | -j]\n"+
" -j, --json JSON printing\n"+
" -s, --silent Silent mode\n"+
" -v, --verbose Verbose mode\n";

assertEquals(expectedText, returnedText);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package picocli;

import org.junit.Ignore;
import org.junit.Test;
import picocli.CommandLine.ArgGroup;
import picocli.CommandLine.Command;
Expand Down Expand Up @@ -43,7 +44,7 @@ private static class ExclusiveOptions {
}



@Ignore
/**
* JUnit testing class for issue 1420
*/
Expand Down
29 changes: 14 additions & 15 deletions src/main/java/picocli/CommandLine.java
Original file line number Diff line number Diff line change
Expand Up @@ -8528,6 +8528,7 @@ public abstract static class ArgSpec {

// parser fields
private boolean required;
private boolean optionIsNotRequired;
private final boolean interactive;
private final boolean echo;
private final String prompt;
Expand Down Expand Up @@ -8580,6 +8581,7 @@ private <T extends Builder<T>> ArgSpec(Builder<T> builder) {
annotatedElement = builder.annotatedElement;
defaultValue = NO_DEFAULT_VALUE.equals(builder.defaultValue) ? null : builder.defaultValue;
required = builder.required;
optionIsNotRequired = builder.optionIsNotRequired;
toString = builder.toString;
getter = builder.getter;
setter = builder.setter;
Expand Down Expand Up @@ -8636,6 +8638,13 @@ void applyInitialValue(Tracer tracer) {
}
}

/** Returns whether this is a required option or positional parameter without a default value.
* If this argument is part of a {@linkplain ArgGroup group}, this method returns whether this argument is required <em>within the group</em> (so it is not necessarily a required argument for the command).
* @see Option#required() */
public boolean optionIsNotRequired(){
return optionIsNotRequired;
}

/** Returns whether this is a required option or positional parameter without a default value.
* If this argument is part of a {@linkplain ArgGroup group}, this method returns whether this argument is required <em>within the group</em> (so it is not necessarily a required argument for the command).
* @see Option#required() */
Expand Down Expand Up @@ -9187,6 +9196,7 @@ abstract static class Builder<T extends Builder<T>> {
private String[] description;
private String descriptionKey;
private boolean required;
private boolean optionIsNotRequired;
private boolean interactive;
private boolean echo;
private String prompt;
Expand Down Expand Up @@ -9224,6 +9234,7 @@ abstract static class Builder<T extends Builder<T>> {
description = original.description;
descriptionKey = original.descriptionKey;
required = original.required;
optionIsNotRequired = original.optionIsNotRequired;
interactive = original.interactive;
echo = original.echo;
prompt = original.prompt;
Expand Down Expand Up @@ -10117,27 +10128,15 @@ public static class ArgGroupSpec implements IOrdered {
}
if (exclusive) {
String modifiedArgs = ""; String sep = "";
/**
* preserved stores arg required status on map
*/
Map<ArgSpec, Boolean> preserved = new HashMap<ArgSpec, Boolean>();
for (ArgSpec arg : args) {
preserved.put(arg, arg.required());
if (!arg.required()) {
modifiedArgs += sep + (arg.isOption() ? ((OptionSpec) arg).longestName() : (arg.paramLabel() + "[" + ((PositionalParamSpec) arg).index() + "]"));
sep = ",";
//Keep initial required as optionIsNotRequired for Issue#1380 https://github.com/remkop/picocli/issues/1380
arg.optionIsNotRequired = true;
arg.required = true;
}
}
/**
* Only reseting back args with required true on map rest will go for false
*/
for (ArgSpec arg : args) {
if (preserved.get(arg) != null && preserved.get(arg))
arg.required = true;
else
arg.required = false;
}
if (modifiedArgs.length() > 0) {
new Tracer().info("Made %s required in the group because %s is an exclusive group.%n", modifiedArgs, synopsisUnit());
}
Expand Down Expand Up @@ -16129,7 +16128,7 @@ public Text[][] render(OptionSpec option, IParamLabelRenderer paramLabelRenderer
String longOption = join(names, shortOptionCount, names.length - shortOptionCount, ", ");
Text longOptionText = createLongOptionText(option, paramLabelRenderer, scheme, longOption);

String requiredOption = option.required() ? requiredMarker : "";
String requiredOption = !option.optionIsNotRequired() && option.required() ? requiredMarker : "";
return renderDescriptionLines(option, scheme, requiredOption, shortOption, longOptionText);
}

Expand Down

0 comments on commit 917dbe6

Please sign in to comment.