Skip to content

Commit 5c64108

Browse files
committed
Adjust tests to cope with positional args (#91)
Starts working on CLI command group usage generator
1 parent 7aeeb4c commit 5c64108

File tree

6 files changed

+43
-14
lines changed

6 files changed

+43
-14
lines changed

airline-core/src/main/java/com/github/rvesse/airline/help/cli/CliCommandGroupUsageGenerator.java

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
import java.io.IOException;
1919
import java.util.*;
2020

21+
import org.apache.commons.lang3.StringUtils;
22+
23+
import com.github.rvesse.airline.builder.ParserBuilder;
2124
import com.github.rvesse.airline.help.UsageHelper;
2225
import com.github.rvesse.airline.help.common.AbstractPrintedCommandGroupUsageGenerator;
2326
import com.github.rvesse.airline.help.sections.HelpHint;
@@ -26,6 +29,8 @@
2629
import com.github.rvesse.airline.model.CommandMetadata;
2730
import com.github.rvesse.airline.model.GlobalMetadata;
2831
import com.github.rvesse.airline.model.OptionMetadata;
32+
import com.github.rvesse.airline.model.ParserMetadata;
33+
2934
import static com.github.rvesse.airline.help.UsageHelper.DEFAULT_COMMAND_COMPARATOR;
3035
import static com.github.rvesse.airline.help.UsageHelper.DEFAULT_OPTION_COMPARATOR;
3136
import static com.github.rvesse.airline.help.UsageHelper.DEFAULT_HINT_COMPARATOR;
@@ -86,7 +91,8 @@ protected void usage(GlobalMetadata<T> global, CommandGroupMetadata[] groups, Us
8691
* @param groups
8792
* Group(s) meta-data
8893
*
89-
* @throws IOException Thrown if there is a problem generating usage output
94+
* @throws IOException
95+
* Thrown if there is a problem generating usage output
9096
*/
9197
protected void outputOptions(UsagePrinter out, GlobalMetadata<T> global, CommandGroupMetadata[] groups)
9298
throws IOException {
@@ -119,6 +125,20 @@ protected void outputOptions(UsagePrinter out, GlobalMetadata<T> global, Command
119125
}
120126
}
121127

128+
protected String getArgsUsage(CommandMetadata command) {
129+
StringBuilder builder = new StringBuilder();
130+
if (command.hasPositionalArguments()) {
131+
builder.append(toUsage(command.getPositionalArguments()));
132+
}
133+
if (command.hasNonPositionalArguments()) {
134+
if (command.hasPositionalArguments()) {
135+
builder.append(' ');
136+
}
137+
builder.append(toUsage(command.getArguments()));
138+
}
139+
return builder.toString();
140+
}
141+
122142
/**
123143
* Outputs a documentation section detailing a usage synopsis
124144
*
@@ -128,7 +148,8 @@ protected void outputOptions(UsagePrinter out, GlobalMetadata<T> global, Command
128148
* Global meta-data
129149
* @param groups
130150
* Groups meta-data
131-
* @throws IOException Thrown if there is a problem generating usage output
151+
* @throws IOException
152+
* Thrown if there is a problem generating usage output
132153
*/
133154
protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, CommandGroupMetadata[] groups)
134155
throws IOException {
@@ -137,6 +158,8 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
137158

138159
CommandGroupMetadata group = groups[groups.length - 1];
139160
List<CommandMetadata> commands = sortCommands(group.getCommands());
161+
ParserMetadata<T> parserConfig = global != null ? global.getParserConfiguration()
162+
: ParserBuilder.<T> defaultConfiguration();
140163

141164
// Populate group info via an extra for loop through commands
142165
boolean hasDefaultCommand = group.getDefaultCommand() != null;
@@ -156,17 +179,20 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
156179
commonGroupOptions = new ArrayList<>(command.getCommandOptions());
157180
}
158181
if (commonGroupArgs == null) {
159-
commonGroupArgs = (command.getArguments() != null ? toUsage(command.getArguments()) : "");
182+
commonGroupArgs = getArgsUsage(command);
160183
}
161184

162185
commonGroupOptions.retainAll(command.getCommandOptions());
163186
if (command.getCommandOptions().size() > commonGroupOptions.size()) {
164187
hasCommandSpecificOptions = true;
165188
}
166-
if (commonGroupArgs != (command.getArguments() != null ? toUsage(command.getArguments()) : "")) {
189+
if (!StringUtils.equals(commonGroupArgs, getArgsUsage(command))) {
167190
hasCommandSpecificArgs = true;
168191
}
169192
}
193+
if (commands.size() == 1) {
194+
hasCommandSpecificArgs = true;
195+
}
170196
for (CommandGroupMetadata subGroup : group.getSubGroups()) {
171197
groupNames.add(subGroup.getName());
172198
if (commonGroupOptions == null) {
@@ -206,17 +232,19 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
206232
synopsis.append(" | ");
207233
}
208234
}
209-
synopsis.append("} [--]");
235+
synopsis.append("}");
210236
if (commonGroupOptions.size() > 0) {
211237
synopsis.appendWords(toSynopsisUsage(commonGroupOptions));
212238
}
213239
if (hasCommandSpecificOptions) {
214240
synopsis.append(" [cmd-options]");
215241
}
216242
if (hasCommandSpecificArgs) {
243+
synopsis.append(String.format("[%s]", parserConfig.getArgumentsSeparator()));
217244
synopsis.append(" <cmd-args>");
218245
}
219246
synopsis.newline();
247+
synopsis.flush();
220248
Map<String, String> cmdOptions = new TreeMap<>();
221249
Map<String, String> cmdArguments = new TreeMap<>();
222250
Map<String, String> subGroups = new TreeMap<>();
@@ -249,6 +277,7 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
249277
grps.append(groupName + ": " + subGroups.get(groupName)).newline();
250278
}
251279
}
280+
synopsis.flush();
252281

253282
for (CommandMetadata command : commands) {
254283

@@ -264,7 +293,7 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
264293
}
265294
if (hasCommandSpecificArgs) {
266295
cmdArguments.put(command.getName(),
267-
(command.getArguments() != null ? toUsage(command.getArguments()) : ""));
296+
getArgsUsage(command));
268297
}
269298
}
270299
}
@@ -288,6 +317,7 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
288317
synopsis.newline().append("See").append("'" + global.getName()).append("help ")
289318
.appendWords(UsageHelper.toGroupNames(Arrays.asList(groups)))
290319
.appendOnOneLine(" <command>' for more information on a specific command.").newline();
320+
synopsis.flush();
291321
}
292322

293323
/**
@@ -299,7 +329,8 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
299329
* Global meta-data
300330
* @param groups
301331
* Groups meta-data
302-
* @throws IOException Thrown if there is a problem generating usage output
332+
* @throws IOException
333+
* Thrown if there is a problem generating usage output
303334
*/
304335
protected void outputDescription(UsagePrinter out, GlobalMetadata<T> global, CommandGroupMetadata[] groups)
305336
throws IOException {

airline-core/src/main/java/com/github/rvesse/airline/help/cli/CliCommandUsageGenerator.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,7 @@ public <T> void usage(String programName, String[] groupNames, String commandNam
8888

8989
// Options
9090
ArgumentsMetadata arguments = command.getArguments();
91-
if (options.size() > 0 || (arguments != null
92-
|| (command.getPositionalArguments() != null && command.getPositionalArguments().size() > 0))) {
91+
if (options.size() > 0 || command.hasAnyArguments()) {
9392
outputOptionsAndArguments(out, command, options, command.getPositionalArguments(), arguments, parserConfig);
9493
}
9594

@@ -162,7 +161,7 @@ protected <T> List<OptionMetadata> outputSynopsis(UsagePrinter out, String progr
162161

163162
boolean needsArgumentsSeparator = command.hasAnyArguments();
164163
if (needsArgumentsSeparator) {
165-
synopsis.append("[").append(parserConfig.getArgumentsSeparator()).append("]");
164+
synopsis.append(String.format("[%s]", parserConfig.getArgumentsSeparator()));
166165
}
167166

168167
if (command.hasPositionalArguments()) {

airline-core/src/main/java/com/github/rvesse/airline/help/common/AbstractUsageGenerator.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,6 @@ protected String toUsage(ArgumentsMetadata arguments) {
187187
StringBuilder stringBuilder = new StringBuilder();
188188

189189
// NB Any additional arguments are either considered all required or
190-
// optional whether that is actually the case or not. If users want fine
191190
// grained control over whether each argument is required or not they
192191
// need to use positional arguments instead
193192

airline-core/src/test/java/com/github/rvesse/airline/TestHelp.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ public void testGit() throws IOException {
335335
" git remote - Manage set of tracked repositories\n" +
336336
"\n" +
337337
"SYNOPSIS\n" +
338-
" git [ -v ] remote { add | show* } [--] [cmd-options] <cmd-args>\n" +
338+
" git [ -v ] remote { add | show* } [cmd-options] [--] <cmd-args>\n" +
339339
"\n" +
340340
" Where command-specific options [cmd-options] are:\n" +
341341
" add: [ -t <branch> ]\n" +

airline-core/src/test/java/com/github/rvesse/airline/TestSubGroups.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ public void sub_groups_help_03() throws IOException {
209209
" test foo -",
210210
"",
211211
"SYNOPSIS",
212-
" test foo { bar <sub-command> } [--]",
212+
" test foo { bar <sub-command> }",
213213
"",
214214
" Where command groups contain the following sub-groups and commands:",
215215
" bar: help*",

airline-core/src/test/java/com/github/rvesse/airline/args/positional/TestPositionalArgs.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,6 @@ public void positional_args_help_01() throws IOException {
173173

174174
String actual = output.toString(StandardCharsets.UTF_8.name());
175175

176-
assertTrue(actual.contains("ArgsPositional [ -- ] <File> [ <Mode> ] [ <ExtraArg>... ]"));
176+
assertTrue(actual.contains("ArgsPositional [--] <File> [ <Mode> ] [ <ExtraArg>... ]"));
177177
}
178178
}

0 commit comments

Comments
 (0)