Skip to content

Commit a5499df

Browse files
tsundbergmpkorstanje
authored andcommitted
Print supported languages details (#1290)
Prints code, name, and native name of supported languages in a three column list. ``` af Afrikaans Afrikaans am Armenian հայերեն ar Arabic العربية ast Asturian asturianu az Azerbaijani Azərbaycanca ...
1 parent 1f90854 commit a5499df

File tree

4 files changed

+69
-15
lines changed

4 files changed

+69
-15
lines changed

core/src/main/java/io/cucumber/core/cli/Main.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
@API(status = API.Status.STABLE)
2424
public class Main {
2525

26-
public static void main(String[] argv) {
26+
public static void main(String... argv) {
2727
byte exitStatus = run(argv, Thread.currentThread().getContextClassLoader());
2828
System.exit(exitStatus);
2929
}

core/src/main/java/io/cucumber/core/options/RuntimeOptionsParser.java

+57-13
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import java.util.ArrayList;
1818
import java.util.List;
1919
import java.util.ResourceBundle;
20+
import java.util.function.Function;
2021
import java.util.regex.Pattern;
2122
import java.util.stream.Collectors;
2223

@@ -57,10 +58,22 @@ private static int printI18n(String language) {
5758
List<String> languages = dialectProvider.getLanguages();
5859

5960
if (language.equalsIgnoreCase("help")) {
60-
for (String code : languages) {
61-
System.out.println(code);
61+
if (language.equalsIgnoreCase("help")) {
62+
List<GherkinDialect> dialects = new ArrayList<>();
63+
for (String code : languages) {
64+
GherkinDialect dialect = dialectProvider.getDialect(code, null);
65+
dialects.add(dialect);
66+
}
67+
68+
int widestLanguage = findWidest(dialects, GherkinDialect::getLanguage);
69+
int widestName = findWidest(dialects, GherkinDialect::getName);
70+
int widestNativeName = findWidest(dialects, GherkinDialect::getNativeName);
71+
72+
for (GherkinDialect dialect : dialects) {
73+
printDialect(dialect, widestLanguage, widestName, widestNativeName);
74+
}
75+
return 0;
6276
}
63-
return 0;
6477
}
6578
if (languages.contains(language)) {
6679
return printKeywordsFor(dialectProvider.getDialect(language, null));
@@ -70,6 +83,14 @@ private static int printI18n(String language) {
7083
return 1;
7184
}
7285

86+
private static int findWidest(List<GherkinDialect> dialects, Function<GherkinDialect, String> getNativeName) {
87+
return dialects.stream()
88+
.map(getNativeName)
89+
.mapToInt(String::length)
90+
.max()
91+
.orElse(0);
92+
}
93+
7394
private static int printKeywordsFor(GherkinDialect dialect) {
7495
StringBuilder builder = new StringBuilder();
7596
List<List<String>> table = new ArrayList<>();
@@ -108,6 +129,21 @@ private static void addKeywordRow(List<List<String>> table, String key, List<Str
108129
table.add(asList(key, keywords.stream().map(o -> '"' + o + '"').collect(joining(", "))));
109130
}
110131

132+
private static void printDialect(GherkinDialect dialect, int widestLanguage, int widestName, int widestNativeName) {
133+
String langCode = rightPad(dialect.getLanguage(), widestLanguage);
134+
String name = rightPad(dialect.getName(), widestName);
135+
String nativeName = rightPad(dialect.getNativeName(), widestNativeName);
136+
137+
System.out.println(langCode + name + nativeName);
138+
}
139+
140+
private static String rightPad(String text, int maxWidth) {
141+
int padding = 7;
142+
int width = maxWidth + padding;
143+
144+
return String.format("%" + -width + "s", text);
145+
}
146+
111147
RuntimeOptionsBuilder parse(List<String> args) {
112148
args = new ArrayList<>(args);
113149
RuntimeOptionsBuilder parsedOptions = new RuntimeOptionsBuilder();
@@ -122,47 +158,47 @@ RuntimeOptionsBuilder parse(List<String> args) {
122158
System.out.println(VERSION);
123159
System.exit(0);
124160
} else if (arg.equals("--i18n")) {
125-
String nextArg = args.remove(0);
161+
String nextArg = removeArgFor(arg, args);
126162
System.exit(printI18n(nextArg));
127163
} else if (arg.equals("--threads")) {
128-
int threads = Integer.parseInt(args.remove(0));
164+
int threads = Integer.parseInt(removeArgFor(arg, args));
129165
if (threads < 1) {
130166
throw new CucumberException("--threads must be > 0");
131167
}
132168
parsedOptions.setThreads(threads);
133169
} else if (arg.equals("--glue") || arg.equals("-g")) {
134-
String gluePath = args.remove(0);
170+
String gluePath = removeArgFor(arg, args);
135171
URI parse = GluePath.parse(gluePath);
136172
parsedOptions.addGlue(parse);
137173
} else if (arg.equals("--tags") || arg.equals("-t")) {
138-
parsedOptions.addTagFilter(args.remove(0));
174+
parsedOptions.addTagFilter(removeArgFor(arg, args));
139175
} else if (arg.equals("--plugin") || arg.equals("--add-plugin") || arg.equals("-p")) {
140-
parsedOptions.addPluginName(args.remove(0), arg.equals("--add-plugin"));
176+
parsedOptions.addPluginName(removeArgFor(arg, args), arg.equals("--add-plugin"));
141177
} else if (arg.equals("--no-dry-run") || arg.equals("--dry-run") || arg.equals("-d")) {
142178
parsedOptions.setDryRun(!arg.startsWith("--no-"));
143179
} else if (arg.equals("--no-strict") || arg.equals("--strict") || arg.equals("-s")) {
144180
parsedOptions.setStrict(!arg.startsWith("--no-"));
145181
} else if (arg.equals("--no-monochrome") || arg.equals("--monochrome") || arg.equals("-m")) {
146182
parsedOptions.setMonochrome(!arg.startsWith("--no-"));
147183
} else if (arg.equals("--snippets")) {
148-
String nextArg = args.remove(0);
184+
String nextArg = removeArgFor(arg, args);
149185
parsedOptions.setSnippetType(SnippetTypeParser.parseSnippetType(nextArg));
150186
} else if (arg.equals("--name") || arg.equals("-n")) {
151-
String nextArg = args.remove(0);
187+
String nextArg = removeArgFor(arg, args);
152188
Pattern pattern = Pattern.compile(nextArg);
153189
parsedOptions.addNameFilter(pattern);
154190
} else if (arg.equals("--wip") || arg.equals("-w")) {
155191
parsedOptions.setWip(true);
156192
} else if (arg.equals("--order")) {
157-
parsedOptions.setPickleOrder(PickleOrderParser.parse(args.remove(0)));
193+
parsedOptions.setPickleOrder(PickleOrderParser.parse(removeArgFor(arg, args)));
158194
} else if (arg.equals("--count")) {
159-
int count = Integer.parseInt(args.remove(0));
195+
int count = Integer.parseInt(removeArgFor(arg, args));
160196
if (count < 1) {
161197
throw new CucumberException("--count must be > 0");
162198
}
163199
parsedOptions.setCount(count);
164200
} else if (arg.equals("--object-factory")) {
165-
String objectFactoryClassName = args.remove(0);
201+
String objectFactoryClassName = removeArgFor(arg, args);
166202
parsedOptions.setObjectFactoryClass(parseObjectFactory(objectFactoryClassName));
167203
} else if (arg.startsWith("-")) {
168204
printUsage();
@@ -181,4 +217,12 @@ RuntimeOptionsBuilder parse(List<String> args) {
181217
return parsedOptions;
182218
}
183219

220+
private String removeArgFor(String arg, List<String> args) {
221+
if (!args.isEmpty()) {
222+
return args.remove(0);
223+
}
224+
printUsage();
225+
throw new CucumberException("Missing argument for " + arg);
226+
}
227+
184228
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package io.cucumber.core.cli;
2+
3+
public class MainDemo {
4+
5+
public static void main(String[] args) {
6+
// Main.main("--i18n");
7+
// Main.main("--i18n", "help");
8+
Main.main("--i18n", "tlh");
9+
}
10+
}

core/src/test/java/io/cucumber/core/options/RuntimeOptionsParserTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ final class RuntimeOptionsParserTest {
1616

1717
@Test
1818
void testParseWithObjectFactoryArgument() {
19-
RuntimeOptionsBuilder optionsBuilder = this.parser.parse(Arrays.asList("--object-factory", TestObjectFactory.class.getName()));
19+
RuntimeOptionsBuilder optionsBuilder = parser.parse(Arrays.asList("--object-factory", TestObjectFactory.class.getName()));
2020
assertNotNull(optionsBuilder);
2121
RuntimeOptions options = optionsBuilder.build();
2222
assertNotNull(options);

0 commit comments

Comments
 (0)