/** Ensures all attributes of this {@code CommandSpec} have a valid value; throws an {@link InitializationException} if this cannot be achieved. */ void validate() { Collections.sort(positionalParameters, new PositionalParametersSorter()); validatePositionalParameters(positionalParameters); List<String> wrongUsageHelpAttr = new ArrayList<String>(); List<String> wrongVersionHelpAttr = new ArrayList<String>(); List<String> usageHelpAttr = new ArrayList<String>(); List<String> versionHelpAttr = new ArrayList<String>(); for (OptionSpec option : options()) { if (option.usageHelp()) { usageHelpAttr.add(option.longestName()); if (!isBoolean(option.type())) { wrongUsageHelpAttr.add(option.longestName()); } } if (option.versionHelp()) { versionHelpAttr.add(option.longestName()); if (!isBoolean(option.type())) { wrongVersionHelpAttr.add(option.longestName()); } } } String wrongType = "Non-boolean options like %s should not be marked as '%s=true'. Usually a command has one %s boolean flag that triggers display of the %s. Alternatively, consider using @Command(mixinStandardHelpOptions = true) on your command instead."; String multiple = "Multiple options %s are marked as '%s=true'. Usually a command has only one %s option that triggers display of the %s. Alternatively, consider using @Command(mixinStandardHelpOptions = true) on your command instead.%n"; if (!wrongUsageHelpAttr.isEmpty()) { throw new InitializationException(String.format(wrongType, wrongUsageHelpAttr, "usageHelp", "--help", "usage help message")); } if (!wrongVersionHelpAttr.isEmpty()) { throw new InitializationException(String.format(wrongType, wrongVersionHelpAttr, "versionHelp", "--version", "version information")); } if (usageHelpAttr.size() > 1) { new Tracer().warn(multiple, usageHelpAttr, "usageHelp", "--help", "usage help message"); } if (versionHelpAttr.size() > 1) { new Tracer().warn(multiple, versionHelpAttr, "versionHelp", "--version", "version information"); } }
private static void generateCompletionCandidates(StringBuilder buff, OptionSpec f) { buff.append(format(" %s_OPTION_ARGS=\"%s\" # %s values\n", bashify(f.paramLabel()), concat(" ", extract(f.completionCandidates())).trim(), f.longestName())); } private static List<String> extract(Iterable<String> generator) {
/** Ensures all attributes of this {@code OptionSpec} have a valid value; throws an {@link InitializationException} if this cannot be achieved. */ private OptionSpec(Builder builder) { super(builder); if (builder.names == null) { throw new InitializationException("OptionSpec names cannot be null. Specify at least one option name."); } names = builder.names.clone(); help = builder.help; usageHelp = builder.usageHelp; versionHelp = builder.versionHelp; order = builder.order; if (names.length == 0 || Arrays.asList(names).contains("")) { throw new InitializationException("Invalid names: " + Arrays.toString(names)); } if (toString() == null) { toString = "option " + longestName(); } // if (arity().max == 0 && !(isBoolean(type()) || (isMultiValue() && isBoolean(auxiliaryTypes()[0])))) { // throw new InitializationException("Option " + longestName() + " is not a boolean so should not be defined with arity=" + arity()); // } }
String name = argSpec.isOption() ? ((OptionSpec) argSpec).longestName() : "position " + position; String prompt = String.format("Enter value for %s (%s): ", name, str(argSpec.renderedDescription(), 0)); if (tracer.isDebug()) {tracer.debug("Reading value for %s from console...%n", name);}
/** Ensures all attributes of this {@code CommandSpec} have a valid value; throws an {@link InitializationException} if this cannot be achieved. */ void validate() { Collections.sort(positionalParameters, new PositionalParametersSorter()); validatePositionalParameters(positionalParameters); List<String> wrongUsageHelpAttr = new ArrayList<String>(); List<String> wrongVersionHelpAttr = new ArrayList<String>(); List<String> usageHelpAttr = new ArrayList<String>(); List<String> versionHelpAttr = new ArrayList<String>(); for (OptionSpec option : options()) { if (option.usageHelp()) { usageHelpAttr.add(option.longestName()); if (!isBoolean(option.type())) { wrongUsageHelpAttr.add(option.longestName()); } } if (option.versionHelp()) { versionHelpAttr.add(option.longestName()); if (!isBoolean(option.type())) { wrongVersionHelpAttr.add(option.longestName()); } } } String wrongType = "Non-boolean options like %s should not be marked as '%s=true'. Usually a command has one %s boolean flag that triggers display of the %s. Alternatively, consider using @Command(mixinStandardHelpOptions = true) on your command instead."; String multiple = "Multiple options %s are marked as '%s=true'. Usually a command has only one %s option that triggers display of the %s. Alternatively, consider using @Command(mixinStandardHelpOptions = true) on your command instead.%n"; if (!wrongUsageHelpAttr.isEmpty()) { throw new InitializationException(String.format(wrongType, wrongUsageHelpAttr, "usageHelp", "--help", "usage help message")); } if (!wrongVersionHelpAttr.isEmpty()) { throw new InitializationException(String.format(wrongType, wrongVersionHelpAttr, "versionHelp", "--version", "version information")); } if (usageHelpAttr.size() > 1) { new Tracer().warn(multiple, usageHelpAttr, "usageHelp", "--help", "usage help message"); } if (versionHelpAttr.size() > 1) { new Tracer().warn(multiple, versionHelpAttr, "versionHelp", "--version", "version information"); } }
/** Ensures all attributes of this {@code OptionSpec} have a valid value; throws an {@link InitializationException} if this cannot be achieved. */ private OptionSpec(Builder builder) { super(builder); if (builder.names == null) { throw new InitializationException("OptionSpec names cannot be null. Specify at least one option name."); } names = builder.names.clone(); help = builder.help; usageHelp = builder.usageHelp; versionHelp = builder.versionHelp; order = builder.order; if (names.length == 0 || Arrays.asList(names).contains("")) { throw new InitializationException("Invalid names: " + Arrays.toString(names)); } if (toString() == null) { toString = "option " + longestName(); } // if (arity().max == 0 && !(isBoolean(type()) || (isMultiValue() && isBoolean(auxiliaryTypes()[0])))) { // throw new InitializationException("Option " + longestName() + " is not a boolean so should not be defined with arity=" + arity()); // } }
private String optionDescription(String prefix, ArgSpec argSpec, int index) { String desc = ""; if (argSpec.isOption()) { desc = prefix + "option '" + ((OptionSpec) argSpec).longestName() + "'"; if (index >= 0) { if (argSpec.arity().max > 1) { desc += " at index " + index; } desc += " (" + argSpec.paramLabel() + ")"; } } else { desc = prefix + "positional parameter at index " + ((PositionalParamSpec) argSpec).index() + " (" + argSpec.paramLabel() + ")"; } return desc; }
@Test public void testOptionLongestName_multipleEqualLength_returnsFirst() { assertEquals("-x", OptionSpec.builder("-x", "-a").build().longestName()); }
@Test public void testOptionLongestName_oneName() { assertEquals("-x", OptionSpec.builder("-x").build().longestName()); }
private String getConfigurationKey(final OptionSpec optionSpec) { // remove leading dashes on option name as we can have "--" or "-" options return optionSpec.longestName().replaceFirst("^-+", ""); }
@Test public void testOptionLongestName_returnsLongest() { assertEquals("-xxx", OptionSpec.builder("-x", "-xx", "-xxx").build().longestName()); assertEquals("-aaa", OptionSpec.builder("-x", "-xx", "-aaa").build().longestName()); assertEquals("-abcd", OptionSpec.builder("-x", "-abcd", "-aaa").build().longestName()); }
private static String describe(ArgSpec argSpec, String separator) { String prefix = (argSpec.isOption()) ? ((OptionSpec) argSpec).longestName() + separator : "params[" + ((PositionalParamSpec) argSpec).index() + "]" + separator; return prefix + argSpec.paramLabel(); } }
private static void generateCompletionCandidates(StringBuilder buff, OptionSpec f) { buff.append(format(" %s_OPTION_ARGS=\"%s\" # %s values\n", bashify(f.paramLabel()), concat(" ", extract(f.completionCandidates())).trim(), f.longestName())); } private static List<String> extract(Iterable<String> generator) {
String name = argSpec.isOption() ? ((OptionSpec) argSpec).longestName() : "position " + position; String prompt = String.format("Enter value for %s (%s): ", name, str(argSpec.renderedDescription(), 0)); if (tracer.isDebug()) {tracer.debug("Reading value for %s from console...%n", name);}
private String optionDescription(String prefix, ArgSpec argSpec, int index) { String desc = ""; if (argSpec.isOption()) { desc = prefix + "option '" + ((OptionSpec) argSpec).longestName() + "'"; if (index >= 0) { if (argSpec.arity().max > 1) { desc += " at index " + index; } desc += " (" + argSpec.paramLabel() + ")"; } } else { desc = prefix + "positional parameter at index " + ((PositionalParamSpec) argSpec).index() + " (" + argSpec.paramLabel() + ")"; } return desc; }
@Test public void testOptionLongestName_oneName() { assertEquals("-x", OptionSpec.builder("-x").build().longestName()); }
@Test public void testOptionLongestName_multipleEqualLength_returnsFirst() { assertEquals("-x", OptionSpec.builder("-x", "-a").build().longestName()); }
private static boolean isMixedIn(OptionSpec option, CommandSpec spec) { for (CommandSpec mixin : spec.mixins().values()) { if (mixin.findOption(option.longestName()) != null) { return true; } } return false; }
@Test public void testOptionLongestName_returnsLongest() { assertEquals("-xxx", OptionSpec.builder("-x", "-xx", "-xxx").build().longestName()); assertEquals("-aaa", OptionSpec.builder("-x", "-xx", "-aaa").build().longestName()); assertEquals("-abcd", OptionSpec.builder("-x", "-abcd", "-aaa").build().longestName()); }
private static String describe(ArgSpec argSpec, String separator) { String prefix = (argSpec.isOption()) ? ((OptionSpec) argSpec).longestName() + separator : "params[" + ((PositionalParamSpec) argSpec).index() + "]" + separator; return prefix + argSpec.paramLabel(); } }