예제 #1
0
def test_has_command(config):
    config1 = CommandConfig("command1")
    config.add_command_config(config1)

    app = ConsoleApplication(config)

    assert app.has_command(config1.name)
예제 #2
0
def test_has_no_default_commands(config):
    config1 = CommandConfig("command1")
    config.add_command_config(config1)

    app = ConsoleApplication(config)

    assert not app.has_default_commands()
예제 #3
0
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()
예제 #4
0
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()
예제 #5
0
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()
예제 #6
0
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()
예제 #7
0
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
예제 #8
0
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()
예제 #9
0
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()
예제 #10
0
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()
예제 #11
0
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()
예제 #12
0
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()
예제 #13
0
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()
예제 #14
0
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
예제 #15
0
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()
예제 #16
0
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
예제 #17
0
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()
예제 #18
0
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
예제 #19
0
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"
예제 #20
0
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()
예제 #21
0
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()
예제 #22
0
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()
예제 #23
0
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()
예제 #24
0
def test_has_no_commands(config):
    app = ConsoleApplication(config)

    assert not app.has_commands()
예제 #25
0
def test_get_command_fails_if_command_not_found(config):
    app = ConsoleApplication(config)

    with pytest.raises(NoSuchCommandException):
        app.get_command("foobar")
예제 #26
0
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)