Skip to content

Commit 5286f5e

Browse files
committed
Add :format command to change format in interactive shell
1 parent 58796cd commit 5286f5e

File tree

3 files changed

+94
-0
lines changed

3 files changed

+94
-0
lines changed

src/main/java/kmql/CommandRegistry.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.concurrent.ConcurrentMap;
88

99
import kmql.command.ExpireCommand;
10+
import kmql.command.FormatCommand;
1011
import kmql.command.HelpCommand;
1112

1213
/**
@@ -18,6 +19,7 @@ public class CommandRegistry implements Iterable<Entry<String, Command>> {
1819
static {
1920
registerDefault("help", new HelpCommand());
2021
registerDefault("expire", new ExpireCommand());
22+
registerDefault("format", new FormatCommand());
2123
}
2224

2325
private final ConcurrentMap<String, Command> commands;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package kmql.command;
2+
3+
import java.io.BufferedOutputStream;
4+
import java.io.PrintWriter;
5+
import java.util.List;
6+
7+
import kmql.Command;
8+
import kmql.Engine;
9+
10+
/**
11+
* Expire table caches.
12+
*/
13+
public class FormatCommand implements Command {
14+
@Override
15+
public String help() {
16+
return ":format FORMAT - Set output format";
17+
}
18+
19+
@Override
20+
public void execute(List<String> args, Engine engine, BufferedOutputStream output) {
21+
PrintWriter pw = new PrintWriter(output);
22+
try {
23+
if (args.size() != 1) {
24+
pw.println("Error usage: :format FORMAT");
25+
return;
26+
}
27+
String format = args.get(0);
28+
try {
29+
engine.setOutputFormat(format);
30+
pw.printf("Output format set to '%s'\n", format);
31+
} catch (IllegalArgumentException ignored) {
32+
pw.printf("Error: no such format '%s'\n", format);
33+
}
34+
} finally {
35+
pw.flush();
36+
}
37+
}
38+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package kmql.command;
2+
3+
import static java.util.Collections.emptyList;
4+
import static java.util.Collections.singletonList;
5+
import static org.mockito.ArgumentMatchers.any;
6+
import static org.mockito.Mockito.doReturn;
7+
import static org.mockito.Mockito.mock;
8+
import static org.mockito.Mockito.never;
9+
import static org.mockito.Mockito.times;
10+
import static org.mockito.Mockito.verify;
11+
12+
import java.io.BufferedOutputStream;
13+
import java.sql.SQLException;
14+
import java.util.Arrays;
15+
16+
import org.junit.Before;
17+
import org.junit.Rule;
18+
import org.junit.Test;
19+
import org.mockito.Mock;
20+
import org.mockito.junit.MockitoJUnit;
21+
import org.mockito.junit.MockitoRule;
22+
23+
import kmql.Database;
24+
import kmql.Engine;
25+
26+
public class FormatCommandTest {
27+
@Rule
28+
public MockitoRule rule = MockitoJUnit.rule();
29+
@Mock
30+
private Database db;
31+
@Mock
32+
private Engine engine;
33+
private final FormatCommand cmd = new FormatCommand();
34+
35+
@Before
36+
public void setUp() {
37+
doReturn(db).when(engine).db();
38+
}
39+
40+
@Test
41+
public void execute() throws SQLException {
42+
cmd.execute(singletonList("json"), engine, mock(BufferedOutputStream.class));
43+
44+
verify(engine, times(1)).setOutputFormat("json");
45+
}
46+
47+
@Test
48+
public void executeInvalidArgs() throws SQLException {
49+
cmd.execute(emptyList(), engine, mock(BufferedOutputStream.class));
50+
cmd.execute(Arrays.asList("json", "table"), engine, mock(BufferedOutputStream.class));
51+
52+
verify(engine, never()).setOutputFormat(any(String.class));
53+
}
54+
}

0 commit comments

Comments
 (0)