First proper draft of DSL for Groovy Commands
Users can declare or Command, OptionHandler classes in an init script
or they can use a DSL, e.g.
command("foo") { args -> println "Do stuff with ${args} array" }
or
command("foo") {
options { option "bar", "Help text for bar option" ithOptionArg() ofType Integer }
run { options -> println "Do stuff with ${options.valueOf('bar')}" }
}
This commit is contained in:
@@ -71,10 +71,37 @@ public class InitCommandTests {
|
||||
|
||||
@Test
|
||||
public void initCommand() throws Exception {
|
||||
this.command.run("src/test/resources/command.groovy");
|
||||
this.command.run("src/test/resources/commands/command.groovy");
|
||||
verify(this.cli, times(this.defaultCount + 1)).register(any(Command.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void initHandler() throws Exception {
|
||||
this.command.run("src/test/resources/commands/handler.groovy");
|
||||
verify(this.cli, times(this.defaultCount + 1)).register(any(Command.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void initClosure() throws Exception {
|
||||
this.command.run("src/test/resources/commands/closure.groovy");
|
||||
verify(this.cli, times(this.defaultCount + 1)).register(any(Command.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void initOptions() throws Exception {
|
||||
this.command.run("src/test/resources/commands/options.groovy");
|
||||
verify(this.cli, times(this.defaultCount + 1)).register(any(Command.class));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void runOptions() throws Exception {
|
||||
SpringCli cli = new SpringCli();
|
||||
InitCommand command = cli.getInitCommand();
|
||||
command.run("src/test/resources/commands/options.groovy");
|
||||
cli.find("foo").run("--foo=bar", "--bar=123");
|
||||
assertTrue(this.output.toString().contains("Hello Foo: bar=123"));
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void initNonExistentScript() throws Exception {
|
||||
this.command.run("nonexistent.groovy");
|
||||
|
||||
@@ -18,7 +18,6 @@ package org.springframework.boot.cli.command;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.springframework.boot.OutputCapture;
|
||||
@@ -65,15 +64,14 @@ public class ScriptCommandTests {
|
||||
public void handler() throws Exception {
|
||||
this.init.run("src/test/resources/commands/handler.groovy");
|
||||
this.cli.find("foo").run("Foo", "--foo=bar");
|
||||
assertTrue(executed);
|
||||
assertTrue(this.output.toString().contains("Hello [Foo]"));
|
||||
}
|
||||
|
||||
@Test
|
||||
@Ignore
|
||||
public void options() throws Exception {
|
||||
this.init.run("src/test/resources/commands/options.groovy");
|
||||
this.cli.find("foo").run("Foo", "--foo=bar");
|
||||
assertTrue(executed);
|
||||
assertTrue(this.output.toString().contains("Hello Foo"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package cli.command;
|
||||
package org.springframework.boot.cli.command;
|
||||
|
||||
import groovy.lang.Closure;
|
||||
|
||||
@@ -29,8 +29,6 @@ import org.junit.Test;
|
||||
import org.springframework.boot.OutputCapture;
|
||||
import org.springframework.boot.cli.Command;
|
||||
import org.springframework.boot.cli.command.InitCommand.Commands;
|
||||
import org.springframework.boot.cli.command.OptionHandler;
|
||||
import org.springframework.boot.cli.command.ScriptCompilationCustomizer;
|
||||
import org.springframework.boot.cli.compiler.GroovyCompiler;
|
||||
import org.springframework.boot.cli.compiler.GroovyCompilerConfiguration;
|
||||
import org.springframework.boot.cli.compiler.GroovyCompilerScope;
|
||||
@@ -75,24 +73,55 @@ public class ScriptCompilationCustomizerTests {
|
||||
@Test
|
||||
public void addsCommands() throws Exception {
|
||||
Class<?>[] types = this.compiler.compile(new File(
|
||||
"src/test/resources/scripts/options.groovy"));
|
||||
"src/test/resources/scripts/commands.groovy"));
|
||||
Class<?> main = types[0];
|
||||
assertTrue(Commands.class.isAssignableFrom(main));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void commandsExecutable() throws Exception {
|
||||
public void closureWithStringArgs() throws Exception {
|
||||
Class<?>[] types = this.compiler.compile(new File(
|
||||
"src/test/resources/scripts/options.groovy"));
|
||||
"src/test/resources/scripts/commands.groovy"));
|
||||
Class<?> main = types[0];
|
||||
Map<String, Closure<?>> commands = ((Commands) main.newInstance()).getCommands();
|
||||
assertEquals(1, commands.size());
|
||||
assertEquals("foo", commands.keySet().iterator().next());
|
||||
Closure<?> closure = commands.values().iterator().next();
|
||||
closure.call(); // what about args?
|
||||
closure.call("foo", "bar");
|
||||
assertTrue(this.output.toString().contains("Hello Command"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void closureWithEmptyArgs() throws Exception {
|
||||
Class<?>[] types = this.compiler.compile(new File(
|
||||
"src/test/resources/scripts/commands.groovy"));
|
||||
Class<?> main = types[0];
|
||||
Map<String, Closure<?>> commands = ((Commands) main.newInstance()).getCommands();
|
||||
assertEquals(1, commands.size());
|
||||
assertEquals("foo", commands.keySet().iterator().next());
|
||||
Closure<?> closure = commands.values().iterator().next();
|
||||
closure.call();
|
||||
assertTrue(this.output.toString().contains("Hello Command"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void closureAndOptionsDefined() throws Exception {
|
||||
Class<?>[] types = this.compiler.compile(new File(
|
||||
"src/test/resources/scripts/options.groovy"));
|
||||
Class<?> main = types[0];
|
||||
Commands commands = (Commands) main.newInstance();
|
||||
Map<String, Closure<?>> closures = commands.getCommands();
|
||||
assertEquals(1, closures.size());
|
||||
assertEquals("foo", closures.keySet().iterator().next());
|
||||
final Closure<?> closure = closures.values().iterator().next();
|
||||
Map<String, OptionHandler> options = commands.getOptions();
|
||||
assertEquals(1, options.size());
|
||||
OptionHandler handler = options.get("foo");
|
||||
handler.setClosure(closure);
|
||||
handler.run("--foo=bar", "--bar=blah", "spam");
|
||||
assertTrue(this.output.toString().contains("Hello [spam]: true blah"));
|
||||
}
|
||||
|
||||
private static class TestGroovyCompilerConfiguration implements
|
||||
GroovyCompilerConfiguration {
|
||||
|
||||
Reference in New Issue
Block a user