def test_render_option_with_optional_value_long_name_preferred(io): config = ApplicationConfig() config.set_name("test-bin") with config.command("command") as c: c.add_option( "option", "o", Option.OPTIONAL_VALUE | Option.PREFER_LONG_NAME, 'Description of "option"', ) app = ConsoleApplication(config) help = CommandHelp(app.get_command("command")) help.render(io) expected = """\ USAGE test-bin command [--option{}[<...>]] OPTIONS --option (-o) Description of "option" """.format(nbsp) assert expected == io.fetch_output()
def test_has_command(config): config1 = CommandConfig("command1") config.add_command_config(config1) app = ConsoleApplication(config) assert app.has_command(config1.name)
def test_render_global_options_with_preferred_long_name(io): config = ApplicationConfig() config.add_option("global-option", "g", Option.PREFER_LONG_NAME, 'Description of "global-option"') app = ConsoleApplication(config) help = ApplicationHelp(app) help.render(io) expected = """\ Console Tool USAGE console [--global-option] <command> [<arg1>] ... [<argN>] ARGUMENTS <command> The command to execute <arg> The arguments of the command GLOBAL OPTIONS --global-option (-g) Description of "global-option" """ assert expected == io.fetch_output()
def test_has_no_default_commands(config): config1 = CommandConfig("command1") config.add_command_config(config1) app = ConsoleApplication(config) assert not app.has_default_commands()
def test_render_command_with_anonymous_sub_command(io): config = ApplicationConfig() config.set_name("test-bin") with config.command("command") as c: with c.sub_command("add") as sc1: sc1.anonymous() sc1.set_description('Description of "add"') sc1.add_argument("argument", 0, 'Description of "argument"') with c.sub_command("delete") as sc2: sc2.set_description('Description of "delete"') app = ConsoleApplication(config) help = CommandHelp(app.get_command("command")) help.render(io) expected = """\ USAGE test-bin command [<argument>] or: test-bin command delete COMMANDS delete Description of "delete" """ assert expected == io.fetch_output()
def test_render_description(io): config = ApplicationConfig() config.set_help("The help for {script_name}\n\nSecond paragraph") app = ConsoleApplication(config) help = ApplicationHelp(app) help.render(io) expected = """\ Console Tool USAGE console <command> [<arg1>] ... [<argN>] ARGUMENTS <command> The command to execute <arg> The arguments of the command DESCRIPTION The help for console Second paragraph """ assert expected == io.fetch_output()
def test_sort_sub_commands(io): config = ApplicationConfig() config.set_name("test-bin") with config.command("command") as c: c.create_sub_command("sub3") c.create_sub_command("sub1") c.create_sub_command("sub2") app = ConsoleApplication(config) help = CommandHelp(app.get_command("command")) help.render(io) expected = """\ USAGE test-bin command or: test-bin command sub3 or: test-bin command sub1 or: test-bin command sub2 COMMANDS sub1 sub2 sub3 """ assert expected == io.fetch_output()
def test_sort_commands(io): config = ApplicationConfig("test-bin") config.set_display_name("The Application") config.create_command("command3") config.create_command("command1") config.create_command("command2") app = ConsoleApplication(config) help = ApplicationHelp(app) help.render(io) expected = """\ The Application USAGE test-bin <command> [<arg1>] ... [<argN>] ARGUMENTS <command> The command to execute <arg> The arguments of the command AVAILABLE COMMANDS command1 command2 command3 """ assert expected == io.fetch_output()
def test_render_option_with_named_value(io): config = ApplicationConfig() config.set_name("test-bin") with config.command("command") as c: c.add_option( "option", None, Option.OPTIONAL_VALUE, 'Description of "option"', value_name="value", ) app = ConsoleApplication(config) help = CommandHelp(app.get_command("command")) help.render(io) expected = """\ USAGE test-bin command [--option{}[<value>]] OPTIONS --option Description of "option" """.format(nbsp) assert expected == io.fetch_output()
def test_get_command(config): config1 = CommandConfig("command1") config.add_command_config(config1) app = ConsoleApplication(config) command = app.get_command("command1") assert command.name == config1.name
def test_has_no_named_commands(config): config1 = CommandConfig("command1") config1.anonymous() config.add_command_config(config1) app = ConsoleApplication(config) assert not app.has_named_commands()
def test_get_commands_excludes_disabled_commands(config): enabled = CommandConfig("command1").enable() disabled = CommandConfig("command2").disable() config.add_command_config(enabled) config.add_command_config(disabled) app = ConsoleApplication(config) assert len(app.commands) == 1 assert app.commands.get("command1").name == enabled.name
def test_get_commands(config): config1 = CommandConfig("command1") config2 = CommandConfig("command2") config.add_command_config(config1) config.add_command_config(config2) app = ConsoleApplication(config) assert len(app.commands) == 2 assert app.commands.get("command1").name == config1.name assert app.commands.get("command2").name == config2.name
def test_create(config): config.add_argument("argument") config.add_option("option", "o") app = ConsoleApplication(config) assert config == app.config fmt = app.global_args_format assert len(fmt.get_arguments()) == 1 arg = fmt.get_argument("argument") assert arg.name == "argument" opt = fmt.get_option("option") assert opt.long_name == "option" assert opt.short_name == "o"
def test_get_default_commands(config): config1 = CommandConfig("command1") config2 = CommandConfig("command2") config3 = CommandConfig("command3") config2.default() config3.default() config.add_command_config(config1) config.add_command_config(config2) config.add_command_config(config3) app = ConsoleApplication(config) assert len(app.default_commands) == 2
def test_run_with_keyboard_interrupt( config): # type: (ApplicationConfig) -> None def callback(_, io): raise KeyboardInterrupt() config.create_command("interrupted").set_handler(CallbackHandler(callback)) app = ConsoleApplication(config) output = BufferedOutputStream() error_output = BufferedOutputStream() assert 1 == app.run(StringArgs("interrupted"), StringInputStream(""), output, error_output) assert "" == output.fetch() assert "" == error_output.fetch()
def test_render(io): config = ApplicationConfig() config.set_name("test-bin") config.add_argument("global-argument", 0, 'Description of "global-argument"') config.add_option("global-option", None, 0, 'Description of "global-option"') with config.command("command") as c: c.set_description('Description of "command"') c.set_help( 'Help of "command {command_name} of {script_name}"\n\nSecond paragraph' ) c.add_alias("command-alias") c.add_argument("argument", 0, 'Description of "argument"') c.add_option("option", None, 0, 'Description of "option"') app = ConsoleApplication(config) help = CommandHelp(app.get_command("command")) help.render(io) expected = """\ USAGE test-bin command [--option] [<global-argument>] [<argument>] aliases: command-alias ARGUMENTS <global-argument> Description of "global-argument" <argument> Description of "argument" OPTIONS --option Description of "option" GLOBAL OPTIONS --global-option Description of "global-option" DESCRIPTION Help of "command command of test-bin" Second paragraph """ assert expected == io.fetch_output()
def test_run_command(config, arg_string, config_callback): def callback(_, io): io.write(io.read_line()) io.error(io.read_line()) return 123 config_callback(config, callback) args = StringArgs(arg_string) input = StringInputStream("line1\nline2") output = BufferedOutputStream() error_output = BufferedOutputStream() app = ConsoleApplication(config) assert 123 == app.run(args, input, output, error_output) assert "line1\n" == output.fetch() assert "line2" == error_output.fetch()
def test_render(io): config = ApplicationConfig("test-bin") config.set_display_name("The Application") config.add_argument("global-argument", description='Description of "global-argument"') config.add_option("global-option", description='Description of "global-option"') with config.command("command1") as c: c.set_description('Description of "command1"') with config.command("command2") as c: c.set_description('Description of "command2"') with config.command("longer-command3") as c: c.set_description('Description of "longer-command3"') app = ConsoleApplication(config) help = ApplicationHelp(app) help.render(io) expected = """\ The Application USAGE test-bin [--global-option] <command> [<arg1>] ... [<argN>] ARGUMENTS <command> The command to execute <arg> The arguments of the command GLOBAL OPTIONS --global-option Description of "global-option" AVAILABLE COMMANDS command1 Description of "command1" command2 Description of "command2" longer-command3 Description of "longer-command3" """ assert expected == io.fetch_output()
def test_render_default_no_name(io): config = ApplicationConfig() app = ConsoleApplication(config) help = ApplicationHelp(app) help.render(io) expected = """\ Console Tool USAGE console <command> [<arg1>] ... [<argN>] ARGUMENTS <command> The command to execute <arg> The arguments of the command """ assert expected == io.fetch_output()
def test_render_default_display_name(io): config = ApplicationConfig("test-bin") app = ConsoleApplication(config) help = ApplicationHelp(app) help.render(io) expected = """\ Test Bin USAGE test-bin <command> [<arg1>] ... [<argN>] ARGUMENTS <command> The command to execute <arg> The arguments of the command """ assert expected == io.fetch_output()
def test_render_required_argument(io): config = ApplicationConfig() config.set_name("test-bin") with config.command("command") as c: c.add_argument("argument", Argument.REQUIRED, 'Description of "argument"') app = ConsoleApplication(config) help = CommandHelp(app.get_command("command")) help.render(io) expected = """\ USAGE test-bin command <argument> ARGUMENTS <argument> Description of "argument" """ assert expected == io.fetch_output()
def test_render_command_with_sub_commands(io): config = ApplicationConfig() config.set_name("test-bin") config.add_option("global-option", "g", description='Description of "global-option"') with config.command("command") as c: c.add_argument("argument", 0, 'Description of "argument"') c.add_option("option", None, 0, 'Description of "option"') with c.sub_command("add") as sc1: sc1.set_description('Description of "add"') sc1.add_argument("sub-argument1", 0, 'Description of "sub-argument1"') sc1.add_argument("sub-argument2", 0, 'Description of "sub-argument2"') sc1.add_option("sub-option1", "o", 0, 'Description of "sub-option1"') sc1.add_option("sub-option2", None, 0, 'Description of "sub-option2"') with c.sub_command("delete") as sc2: sc2.set_description('Description of "delete"') app = ConsoleApplication(config) help = CommandHelp(app.get_command("command")) help.render(io) expected = """\ USAGE test-bin command [--option] [<argument>] or: test-bin command add [-o] [--sub-option2] [<argument>] [<sub-argument1>] [<sub-argument2>] or: test-bin command delete [<argument>] ARGUMENTS <argument> Description of "argument" COMMANDS add Description of "add" <sub-argument1> Description of "sub-argument1" <sub-argument2> Description of "sub-argument2" -o (--sub-option1) Description of "sub-option1" --sub-option2 Description of "sub-option2" delete Description of "delete" OPTIONS --option Description of "option" GLOBAL OPTIONS -g (--global-option) Description of "global-option" """ assert expected == io.fetch_output()
def test_has_no_commands(config): app = ConsoleApplication(config) assert not app.has_commands()
def test_fails_if_duplicate_command_name(config): config.add_command_config(CommandConfig("command")) config.add_command_config(CommandConfig("command")) with pytest.raises(CannotAddCommandException): ConsoleApplication(config)
def test_get_command_fails_if_command_not_found(config): app = ConsoleApplication(config) with pytest.raises(NoSuchCommandException): app.get_command("foobar")