def test_argument_default(): cli = Command( "cli", add_help_option=False, params=[ Argument(["a"], type=Choice(["a"]), default="a"), Argument(["b"], type=Choice(["b"]), default="b"), ], ) assert _get_words(cli, [], "") == ["a"] assert _get_words(cli, ["a"], "b") == ["b"] # ignore type validation assert _get_words(cli, ["x"], "b") == ["b"]
def test_option_custom(): def custom(ctx, param, incomplete): return [incomplete.upper()] cli = Command( "cli", params=[ Argument(["x"]), Argument(["y"]), Argument(["z"], shell_complete=custom), ], ) assert _get_words(cli, ["a", "b"], "") == [""] assert _get_words(cli, ["a", "b"], "c") == ["C"]
def test_argument_order(): cli = Command( "cli", params=[ Argument(["plain"]), Argument(["c1"], type=Choice(["a1", "a2", "b"])), Argument(["c2"], type=Choice(["c1", "c2", "d"])), ], ) # first argument has no completions assert _get_words(cli, [], "") == [] assert _get_words(cli, [], "a") == [] # first argument filled, now completion can happen assert _get_words(cli, ["x"], "a") == ["a1", "a2"] assert _get_words(cli, ["x", "b"], "d") == ["d"]
def test_argument_nargs(): cli = Command( "cli", params=[ Argument(["x"], type=Choice(["a", "b"]), nargs=2), Argument(["y"], type=Choice(["c", "d"]), nargs=-1), Option(["-z"]), ], ) assert _get_words(cli, [], "") == ["a", "b"] assert _get_words(cli, ["a"], "") == ["a", "b"] assert _get_words(cli, ["a", "b"], "") == ["c", "d"] assert _get_words(cli, ["a", "b", "c"], "") == ["c", "d"] assert _get_words(cli, ["a", "b", "c", "d"], "") == ["c", "d"] assert _get_words(cli, ["a", "-z", "1"], "") == ["a", "b"] assert _get_words(cli, ["a", "-z", "1", "b"], "") == ["c", "d"]
def value_optionally_from_text_file(value, param, ctx, as_file=False, **file_kwargs): """ Given a string, interprets it either as: * a filename prefixed with '@', and returns the contents of the file * just a string, and returns the string itself. By default, returns the value as a string. If as_file=True, returns a StringIO or a file object. Use this when dealing with large files to save memory. """ if isinstance(param, str): # Not a real param, just a "param_hint". Make an equivalent param. param = Argument(param_decls=[param]) if value == "-" or value.startswith("@"): filetype = click.File(**file_kwargs) filename = _resolve_file(value[1:]) if value.startswith("@") else value fp = filetype.convert(filename, param, ctx) if as_file: return fp else: return fp.read() if as_file: return io.StringIO(value) else: return value
def test_context_settings(runner): def complete(ctx, param, incomplete): return ctx.obj["choices"] cli = Command("cli", params=[Argument("x", shell_complete=complete)]) result = runner.invoke( cli, obj={"choices": ["a", "b"]}, env={"COMP_WORDS": "", "COMP_CWORD": "0", "_CLI_COMPLETE": "bash_complete"}, ) assert result.output == "plain,a\nplain,b\n"
def test_autocompletion_deprecated(): # old function takes args and not param, returns all values, can mix # strings and tuples def custom(ctx, args, incomplete): assert isinstance(args, list) return [("art", "x"), "bat", "cat"] with pytest.deprecated_call(): cli = Command("cli", params=[Argument(["x"], autocompletion=custom)]) assert _get_words(cli, [], "") == ["art", "bat", "cat"] assert _get_words(cli, [], "c") == ["cat"]
def test_option_flag(): cli = Command( "cli", add_help_option=False, params=[ Option(["--on/--off"]), Argument(["a"], type=Choice(["a1", "a2", "b"])), ], ) assert _get_words(cli, ["type"], "--") == ["--on", "--off"] # flag option doesn't take value, use choice argument assert _get_words(cli, ["x", "--on"], "a") == ["a1", "a2"]
def test_double_dash(): cli = Command( "cli", add_help_option=False, params=[ Option(["--opt"]), Argument(["name"], type=Choice(["name", "--", "-o", "--opt"])), ], ) assert _get_words(cli, [], "-") == ["--opt"] assert _get_words(cli, ["value"], "-") == ["--opt"] assert _get_words(cli, [], "") == ["name", "--", "-o", "--opt"] assert _get_words(cli, ["--"], "") == ["name", "--", "-o", "--opt"]
def value_optionally_from_binary_file(value, param, ctx, encoding="utf-8", **file_kwargs): if isinstance(param, str): # Not a real param, just a "param_hint". Make an equivalent param. param = Argument(param_decls=[param]) if value == "-" or value.startswith("@"): filetype = click.File(mode="rb", **file_kwargs) filename = _resolve_file(value[1:]) if value.startswith("@") else value fp = filetype.convert(filename, param, ctx) return fp.read() return value.encode(encoding)