Skip to content

Commit ac7896e

Browse files
committed
Console outputs improvements
1 parent 9044c06 commit ac7896e

26 files changed

+217
-72
lines changed

jurl

+2
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@ if [ ! -x "$JAVA_CMD" ] ; then
2525
exit 1
2626
fi
2727

28+
export JURL_CONSOLE_WIDTH=$( tput cols )
29+
2830
exec "$JAVA_CMD" -jar "$JURL_CMD" ${1+"$@"} >&2

jurl.bat

+9-1
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,18 @@ goto existsJava
2626
set "JAVA_CMD=%JAVA_HOME%\bin\java.exe"
2727

2828
:existsJava
29-
if exist "%JAVA_CMD%" goto executeJurl
29+
if exist "%JAVA_CMD%" goto setWidth
3030
echo 'java' command is not installed or >&2
3131
echo JAVA_HOME environment variable is not defined correctly >&2
3232
exit /b 1
3333

34+
:setWidth
35+
for /F "usebackq tokens=1,2* delims=: " %%V in (`mode con`) do (
36+
if .%%V==.Columns (
37+
set JURL_CONSOLE_WIDTH=%%W
38+
goto executeJurl
39+
)
40+
)
41+
3442
:executeJurl
3543
"%JAVA_CMD%" -jar "%JURL_CMD%" %* >&2

src/main/java/com/legadi/cli/jurl/common/Command.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import java.util.ArrayList;
99
import java.util.Arrays;
1010
import java.util.List;
11-
import java.util.Locale;
1211
import java.util.function.Consumer;
1312
import java.util.logging.Level;
1413
import java.util.logging.Logger;
@@ -30,8 +29,7 @@ public static void exec(Settings settings, Consumer<String> consumer,
3029
List<String> commandParts = new ArrayList<>();
3130

3231
if(inInterpreter) {
33-
String os = System.getProperty("jurl.os.name").toLowerCase(Locale.ROOT);
34-
if(os.contains("win")) {
32+
if(settings.isWindowsOS()) {
3533
commandParts.add("cmd.exe");
3634
commandParts.add("/c");
3735
} else {

src/main/java/com/legadi/cli/jurl/common/CommonUtils.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ public static String trim(String value) {
5353
return strip(value, null);
5454
}
5555

56-
public static String fileSeparatorAsDelimiter() {
57-
String separator = System.getProperty("jurl.file.separator");
56+
public static String fileSeparatorAsDelimiter(Settings settings) {
57+
String separator = settings.getFileSeparator();
5858
if(separator.equals("\\")) {
5959
return "\\\\";
6060
} else {

src/main/java/com/legadi/cli/jurl/common/ConsoleInput.java

+52-10
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import static com.legadi.cli.jurl.common.CommonUtils.isNotBlank;
55
import static com.legadi.cli.jurl.common.CommonUtils.trim;
66

7+
import java.util.ArrayList;
78
import java.util.List;
89
import java.util.Objects;
910
import java.util.Optional;
@@ -23,6 +24,8 @@ public class ConsoleInput {
2324
public static final int START_INDEX = 1;
2425
public static final int INVALID_INDEX = -1;
2526

27+
public static final int TABS_FOR_MARGIN = 2;
28+
2629
private final Settings settings;
2730
private final List<String> options;
2831
private final Function<String, String> optionDecorator;
@@ -120,23 +123,62 @@ private Optional<String> toMenu(int defaultIndex) {
120123
}
121124

122125
StringBuilder menu = new StringBuilder();
126+
List<String> formattedOptions = getFormattedOptions(defaultIndex);
127+
int maxLength = formattedOptions.stream()
128+
.mapToInt(String::length)
129+
.max()
130+
.orElse(1);
131+
int columns = (settings.getConsoleWidth() - settings.getConsoleTabLength() * TABS_FOR_MARGIN)
132+
/ maxLength;
133+
134+
if(columns > 1) {
135+
appendInColumns(menu, formattedOptions, columns, maxLength);
136+
} else {
137+
formattedOptions.forEach(opt -> menu.append(opt).append("\n"));
138+
}
139+
140+
menu.append(OPTION_INPUT);
141+
142+
return Optional.of(menu.toString());
143+
}
144+
145+
private List<String> getFormattedOptions(int defaultIndex) {
146+
List<String> formattedOptions = new ArrayList<>();
123147
int index = START_INDEX;
124148

125149
for(String option : options) {
126-
menu
127-
.append(index)
128-
.append(") ")
129-
.append(index == defaultIndex
130-
? "(default) " : "")
131-
.append(optionDecorator.apply(option))
132-
.append("\n");
133-
150+
formattedOptions.add(
151+
index + ") "
152+
+ (index == defaultIndex ? "(default) " : "")
153+
+ optionDecorator.apply(option)
154+
+ settings.getTab()
155+
);
134156
index++;
135157
}
136158

137-
menu.append(OPTION_INPUT);
159+
return formattedOptions;
160+
}
138161

139-
return Optional.of(menu.toString());
162+
private void appendInColumns(StringBuilder menu, List<String> formattedOptions, int columns, int maxLength) {
163+
boolean newLine = false;
164+
int column = 0;
165+
166+
for(String option : formattedOptions) {
167+
menu.append(String.format("%-" + maxLength + "s", option));
168+
169+
if(column < (columns - 1)) {
170+
newLine = false;
171+
column++;
172+
} else {
173+
newLine = true;
174+
column = 0;
175+
menu.append("\n");
176+
}
177+
}
178+
179+
if(!newLine) {
180+
menu.append("\n");
181+
}
140182
}
141183

142184
protected Optional<String> readLine(String message) {

src/main/java/com/legadi/cli/jurl/common/OutputPathBuilder.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ public OutputPathBuilder(Settings settings) {
2727
}
2828

2929
public OutputPathBuilder setRequestPath(String requestPath) {
30-
String[] pathParts = stripStart(requestPath, File.separator + ".").split(fileSeparatorAsDelimiter());
30+
String[] pathParts = stripStart(requestPath, File.separator + ".")
31+
.split(fileSeparatorAsDelimiter(settings));
3132
this.requestPath = Arrays
3233
.stream(pathParts)
3334
.map(part -> part.replaceAll(" ", "_"))

src/main/java/com/legadi/cli/jurl/common/Settings.java

+17-12
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,31 @@
22

33
import static com.legadi.cli.jurl.common.JsonUtils.loadInternalJsonProperties;
44
import static com.legadi.cli.jurl.common.JsonUtils.loadJsonProperties;
5+
import static com.legadi.cli.jurl.common.SettingsConstants.DEFAULT_CONFIG_FILE;
6+
import static com.legadi.cli.jurl.common.SettingsConstants.DEFAULT_ENVIRONMENT;
7+
import static com.legadi.cli.jurl.common.SettingsConstants.DEFAULT_OVERRIDE_FILE;
8+
import static com.legadi.cli.jurl.common.SettingsConstants.DEFAULT_SETTINGS_FILE;
9+
import static com.legadi.cli.jurl.common.SettingsConstants.EXTERNAL_CONSOLE_WIDTH;
10+
import static com.legadi.cli.jurl.common.SettingsConstants.EXTERNAL_OS_NAME;
11+
import static com.legadi.cli.jurl.common.SettingsConstants.FORMAT_CONFIG_FILE;
12+
import static com.legadi.cli.jurl.common.SettingsConstants.FORMAT_OVERRIDE_FILE;
13+
import static com.legadi.cli.jurl.common.SettingsConstants.JURL_CONSOLE_WIDTH;
14+
import static com.legadi.cli.jurl.common.SettingsConstants.JURL_FILE_SEPARATOR;
15+
import static com.legadi.cli.jurl.common.SettingsConstants.JURL_OS_NAME;
516
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_CONFIG_OUTPUT_PATH;
617
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_CONFIG_PATH;
718
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_EXECUTION_TAG;
819
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_WORKSPACE_PATH;
20+
import static com.legadi.cli.jurl.common.SettingsConstants.TAG_FORMATTER;
921
import static com.legadi.cli.jurl.common.WriterUtils.createDirectories;
1022

1123
import java.io.File;
1224
import java.nio.file.Path;
1325
import java.nio.file.Paths;
1426
import java.time.LocalDateTime;
15-
import java.time.format.DateTimeFormatter;
1627
import java.util.HashMap;
1728
import java.util.Map;
29+
import java.util.Optional;
1830
import java.util.function.Function;
1931

2032
import com.legadi.cli.jurl.exception.CommandException;
@@ -24,18 +36,11 @@ public class Settings implements SettingsDefaults {
2436
private static final EnvironmentResource<String> SETTINGS = new EnvironmentResource<>();
2537
private static final Map<String, String> EMPTY = new HashMap<>();
2638

27-
public static final DateTimeFormatter TAG_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd.HH-mm-ss.n");
28-
public static final String DEFAULT_ENVIRONMENT = "default";
29-
30-
private static final String DEFAULT_SETTINGS_FILE = "settings.default.json";
31-
private static final String DEFAULT_CONFIG_FILE = "config.json";
32-
private static final String DEFAULT_OVERRIDE_FILE = "override.json";
33-
private static final String FORMAT_CONFIG_FILE = "config.%s.json";
34-
private static final String FORMAT_OVERRIDE_FILE = "override.%s.json";
35-
3639
static {
37-
System.setProperty("jurl.os.name", System.getProperty("os.name"));
38-
System.setProperty("jurl.file.separator", File.separator);
40+
System.setProperty(JURL_OS_NAME, System.getProperty(EXTERNAL_OS_NAME));
41+
System.setProperty(JURL_FILE_SEPARATOR, File.separator);
42+
System.setProperty(JURL_CONSOLE_WIDTH, Optional.ofNullable(System.getenv(EXTERNAL_CONSOLE_WIDTH))
43+
.orElse(""));
3944

4045
SETTINGS.putAllInCommon(loadInternalJsonProperties(DEFAULT_SETTINGS_FILE));
4146

src/main/java/com/legadi/cli/jurl/common/SettingsConstants.java

+18-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,24 @@
11
package com.legadi.cli.jurl.common;
22

3+
import java.time.format.DateTimeFormatter;
4+
35
public class SettingsConstants {
46

7+
public static final DateTimeFormatter TAG_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd.HH-mm-ss.n");
8+
public static final String DEFAULT_ENVIRONMENT = "default";
9+
10+
public static final String DEFAULT_SETTINGS_FILE = "settings.default.json";
11+
public static final String DEFAULT_CONFIG_FILE = "config.json";
12+
public static final String DEFAULT_OVERRIDE_FILE = "override.json";
13+
public static final String FORMAT_CONFIG_FILE = "config.%s.json";
14+
public static final String FORMAT_OVERRIDE_FILE = "override.%s.json";
15+
16+
public static final String EXTERNAL_OS_NAME = "os.name";
17+
public static final String JURL_OS_NAME = "jurl.os.name";
18+
public static final String JURL_FILE_SEPARATOR = "jurl.file.separator";
19+
public static final String EXTERNAL_CONSOLE_WIDTH = "JURL_CONSOLE_WIDTH";
20+
public static final String JURL_CONSOLE_WIDTH = "jurl.console.width";
21+
522
public static final String PROP_EXECUTION_TAG = "executionTag";
623
public static final String PROP_WORKSPACE_PATH = "workspacePath";
724
public static final String PROP_CONFIG_PATH = "configPath";
@@ -30,7 +47,7 @@ public class SettingsConstants {
3047
public static final String PROP_OVERRIDE_REQUEST_FILE_PATH = "overrideRequestFilePath";
3148
public static final String PROP_PRINTABLE_MIME_TYPES = "printableMimeTypes";
3249
public static final String PROP_CONSOLE_TAB_LENGTH = "consoleTabLength";
33-
public static final String PROP_CONSOLE_MENU_COLUMNS = "consoleMenuColumns";
50+
public static final String PROP_DEFAULT_CONSOLE_WIDTH = "defaultConsoleWidth";
3451

3552
private SettingsConstants() {}
3653
}

src/main/java/com/legadi/cli/jurl/common/SettingsDefaults.java

+33-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.legadi.cli.jurl.common;
22

3+
import static com.legadi.cli.jurl.common.SettingsConstants.JURL_CONSOLE_WIDTH;
4+
import static com.legadi.cli.jurl.common.SettingsConstants.JURL_FILE_SEPARATOR;
5+
import static com.legadi.cli.jurl.common.SettingsConstants.JURL_OS_NAME;
36
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_ADD_ON_OPTION_CLASSES;
47
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_CONFIG_OUTPUT_PATH;
58
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_CONFIG_PATH;
6-
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_CONSOLE_MENU_COLUMNS;
79
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_CONSOLE_TAB_LENGTH;
10+
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_DEFAULT_CONSOLE_WIDTH;
811
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_DOWNLOADS_LOCATION;
912
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_EXECUTION_PATH;
1013
import static com.legadi.cli.jurl.common.SettingsConstants.PROP_EXECUTION_TIMES;
@@ -32,6 +35,7 @@
3235
import java.nio.file.Path;
3336
import java.nio.file.Paths;
3437
import java.util.Map;
38+
import java.util.Optional;
3539
import java.util.function.Function;
3640

3741
import com.legadi.cli.jurl.model.RequestBehaviour;
@@ -49,6 +53,28 @@ public interface SettingsDefaults {
4953
String getOrDefaultWithValues(String propertyName, Map<String, String> values,
5054
String defaultValue);
5155

56+
default String getOSName() {
57+
return System.getProperty(JURL_OS_NAME);
58+
}
59+
60+
default boolean isWindowsOS() {
61+
return Optional.ofNullable(getOSName())
62+
.map(String::toLowerCase)
63+
.filter(os -> os.contains("win"))
64+
.isPresent();
65+
}
66+
67+
default String getFileSeparator() {
68+
return System.getProperty(JURL_FILE_SEPARATOR);
69+
}
70+
71+
default int getConsoleWidth() {
72+
return Optional.ofNullable(System.getProperty(JURL_CONSOLE_WIDTH))
73+
.filter(CommonUtils::isNumeric)
74+
.map(Integer::parseInt)
75+
.orElse(getDefaultConsoleWidth());
76+
}
77+
5278
default Path getWorkspacePath() {
5379
return Paths.get(".").toAbsolutePath().normalize();
5480
}
@@ -157,7 +183,11 @@ default int getConsoleTabLength() {
157183
return get(PROP_CONSOLE_TAB_LENGTH, Integer::parseInt);
158184
}
159185

160-
default int getConsoleMenuColumns() {
161-
return get(PROP_CONSOLE_MENU_COLUMNS, Integer::parseInt);
186+
default int getDefaultConsoleWidth() {
187+
return get(PROP_DEFAULT_CONSOLE_WIDTH, Integer::parseInt);
188+
}
189+
190+
default String getTab() {
191+
return String.format("%-" + getConsoleTabLength() + "s", "");
162192
}
163193
}

src/main/java/com/legadi/cli/jurl/options/CleanOutputOption.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public String[] getArgs() {
2929

3030
@Override
3131
public String getDescription() {
32-
return "Remove all the execution outputs and history files from\nthe specified date (inclusive): 'yyyy-MM-dd'.\nIf 'all' is received in the argument all output files\nwill be deleted.";
32+
return "Remove all the execution outputs and history files from the specified date (inclusive): 'yyyy-MM-dd'. If 'all' is received in the argument all output files will be deleted.";
3333
}
3434

3535
@Override

src/main/java/com/legadi/cli/jurl/options/CustomClassOption.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ public String[] getArgs() {
2929

3030
@Override
3131
public String getDescription() {
32-
return "Registers a custom class.\nIf there is an existing class that accepts the\nsame input the last one will be taken.\nThese are the allowed types:\n"
33-
+ getGroupClasses().stream().map(Class::getName).sorted().collect(Collectors.joining("\n"));
32+
return "Registers a custom class. If there is an existing class that accepts the same input the last one will be taken. These are the allowed types:"
33+
+ "\n" + getGroupClasses().stream().map(Class::getName).sorted().collect(Collectors.joining("\n"));
3434
}
3535

3636
@Override
@@ -51,7 +51,7 @@ private Class<?> getGroupClass(Class<?> typeClass) {
5151
return expectedType;
5252
}
5353
}
54-
throw new CommandException("Type not allowed: " + typeClass + "\nIt must be a sub-type of:\n"
55-
+ getGroupClasses().stream().map(Class::getName).sorted().collect(Collectors.joining("\n")));
54+
throw new CommandException("Type not allowed: " + typeClass + "\nIt must be a sub-type of:"
55+
+ "\n" + getGroupClasses().stream().map(Class::getName).sorted().collect(Collectors.joining("\n")));
5656
}
5757
}

src/main/java/com/legadi/cli/jurl/options/DownloadInOption.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public String[] getArgs() {
2323

2424
@Override
2525
public String getDescription() {
26-
return "Tells request to save the output in a download directory.\nUses 'downloadsLocation' from request settings.";
26+
return "Tells request to save the output in a download directory. Uses 'downloadsLocation' from request settings.";
2727
}
2828

2929
@Override

src/main/java/com/legadi/cli/jurl/options/EnvironmentCopyOption.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public String[] getArgs() {
2626

2727
@Override
2828
public String getDescription() {
29-
return "Copies the content of a environment file './config[.<env>].json' to another one.\nIt creates a new environment file if it doesn't exist.";
29+
return "Copies the content of a environment file './config[.<env>].json' to another one. It creates a new environment file if it doesn't exist.";
3030
}
3131

3232
@Override

src/main/java/com/legadi/cli/jurl/options/EnvironmentOption.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public String[] getArgs() {
2525

2626
@Override
2727
public String getDescription() {
28-
return "Loads to the settings the file: \n'./config[.<env>].json'.";
28+
return "Loads to the settings the file: './config[.<env>].json'";
2929
}
3030

3131
@Override

src/main/java/com/legadi/cli/jurl/options/EnvironmentSetValueOption.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public String[] getArgs() {
2626

2727
@Override
2828
public String getDescription() {
29-
return "Saves a property value to the environment file './config[.<env>].json'.\nIt creates a new environment file if it doesn't exist.";
29+
return "Saves a property value to the environment file './config[.<env>].json'. It creates a new environment file if it doesn't exist.";
3030
}
3131

3232
@Override

0 commit comments

Comments
 (0)