276 lines
7.7 KiB
Python
276 lines
7.7 KiB
Python
import pytest
|
|
|
|
import click.types
|
|
|
|
# Common (obj, expect) pairs used to construct multiple tests.
|
|
STRING_PARAM_TYPE = (click.STRING, {"param_type": "String", "name": "text"})
|
|
INT_PARAM_TYPE = (click.INT, {"param_type": "Int", "name": "integer"})
|
|
BOOL_PARAM_TYPE = (click.BOOL, {"param_type": "Bool", "name": "boolean"})
|
|
HELP_OPTION = (
|
|
None,
|
|
{
|
|
"name": "help",
|
|
"param_type_name": "option",
|
|
"opts": ["--help"],
|
|
"secondary_opts": [],
|
|
"type": BOOL_PARAM_TYPE[1],
|
|
"required": False,
|
|
"nargs": 1,
|
|
"multiple": False,
|
|
"default": False,
|
|
"envvar": None,
|
|
"help": "Show this message and exit.",
|
|
"prompt": None,
|
|
"is_flag": True,
|
|
"flag_value": True,
|
|
"count": False,
|
|
"hidden": False,
|
|
},
|
|
)
|
|
NAME_ARGUMENT = (
|
|
click.Argument(["name"]),
|
|
{
|
|
"name": "name",
|
|
"param_type_name": "argument",
|
|
"opts": ["name"],
|
|
"secondary_opts": [],
|
|
"type": STRING_PARAM_TYPE[1],
|
|
"required": True,
|
|
"nargs": 1,
|
|
"multiple": False,
|
|
"default": None,
|
|
"envvar": None,
|
|
},
|
|
)
|
|
NUMBER_OPTION = (
|
|
click.Option(["-c", "--count", "number"], default=1),
|
|
{
|
|
"name": "number",
|
|
"param_type_name": "option",
|
|
"opts": ["-c", "--count"],
|
|
"secondary_opts": [],
|
|
"type": INT_PARAM_TYPE[1],
|
|
"required": False,
|
|
"nargs": 1,
|
|
"multiple": False,
|
|
"default": 1,
|
|
"envvar": None,
|
|
"help": None,
|
|
"prompt": None,
|
|
"is_flag": False,
|
|
"flag_value": False,
|
|
"count": False,
|
|
"hidden": False,
|
|
},
|
|
)
|
|
HELLO_COMMAND = (
|
|
click.Command("hello", params=[NUMBER_OPTION[0]]),
|
|
{
|
|
"name": "hello",
|
|
"params": [NUMBER_OPTION[1], HELP_OPTION[1]],
|
|
"help": None,
|
|
"epilog": None,
|
|
"short_help": None,
|
|
"hidden": False,
|
|
"deprecated": False,
|
|
},
|
|
)
|
|
HELLO_GROUP = (
|
|
click.Group("cli", [HELLO_COMMAND[0]]),
|
|
{
|
|
"name": "cli",
|
|
"params": [HELP_OPTION[1]],
|
|
"help": None,
|
|
"epilog": None,
|
|
"short_help": None,
|
|
"hidden": False,
|
|
"deprecated": False,
|
|
"commands": {"hello": HELLO_COMMAND[1]},
|
|
"chain": False,
|
|
},
|
|
)
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("obj", "expect"),
|
|
[
|
|
pytest.param(
|
|
click.types.FuncParamType(range),
|
|
{"param_type": "Func", "name": "range", "func": range},
|
|
id="Func ParamType",
|
|
),
|
|
pytest.param(
|
|
click.UNPROCESSED,
|
|
{"param_type": "Unprocessed", "name": "text"},
|
|
id="UNPROCESSED ParamType",
|
|
),
|
|
pytest.param(*STRING_PARAM_TYPE, id="STRING ParamType"),
|
|
pytest.param(
|
|
click.Choice(["a", "b"]),
|
|
{
|
|
"param_type": "Choice",
|
|
"name": "choice",
|
|
"choices": ["a", "b"],
|
|
"case_sensitive": True,
|
|
},
|
|
id="Choice ParamType",
|
|
),
|
|
pytest.param(
|
|
click.DateTime(["%Y-%m-%d"]),
|
|
{"param_type": "DateTime", "name": "datetime", "formats": ["%Y-%m-%d"]},
|
|
id="DateTime ParamType",
|
|
),
|
|
pytest.param(*INT_PARAM_TYPE, id="INT ParamType"),
|
|
pytest.param(
|
|
click.IntRange(0, 10, clamp=True),
|
|
{
|
|
"param_type": "IntRange",
|
|
"name": "integer range",
|
|
"min": 0,
|
|
"max": 10,
|
|
"min_open": False,
|
|
"max_open": False,
|
|
"clamp": True,
|
|
},
|
|
id="IntRange ParamType",
|
|
),
|
|
pytest.param(
|
|
click.FLOAT, {"param_type": "Float", "name": "float"}, id="FLOAT ParamType"
|
|
),
|
|
pytest.param(
|
|
click.FloatRange(-0.5, 0.5),
|
|
{
|
|
"param_type": "FloatRange",
|
|
"name": "float range",
|
|
"min": -0.5,
|
|
"max": 0.5,
|
|
"min_open": False,
|
|
"max_open": False,
|
|
"clamp": False,
|
|
},
|
|
id="FloatRange ParamType",
|
|
),
|
|
pytest.param(*BOOL_PARAM_TYPE, id="Bool ParamType"),
|
|
pytest.param(
|
|
click.UUID, {"param_type": "UUID", "name": "uuid"}, id="UUID ParamType"
|
|
),
|
|
pytest.param(
|
|
click.File(),
|
|
{"param_type": "File", "name": "filename", "mode": "r", "encoding": None},
|
|
id="File ParamType",
|
|
),
|
|
pytest.param(
|
|
click.Path(),
|
|
{
|
|
"param_type": "Path",
|
|
"name": "path",
|
|
"exists": False,
|
|
"file_okay": True,
|
|
"dir_okay": True,
|
|
"writable": False,
|
|
"readable": True,
|
|
"allow_dash": False,
|
|
},
|
|
id="Path ParamType",
|
|
),
|
|
pytest.param(
|
|
click.Tuple((click.STRING, click.INT)),
|
|
{
|
|
"param_type": "Tuple",
|
|
"name": "<text integer>",
|
|
"types": [STRING_PARAM_TYPE[1], INT_PARAM_TYPE[1]],
|
|
},
|
|
id="Tuple ParamType",
|
|
),
|
|
pytest.param(*NUMBER_OPTION, id="Option"),
|
|
pytest.param(
|
|
click.Option(["--cache/--no-cache", "-c/-u"]),
|
|
{
|
|
"name": "cache",
|
|
"param_type_name": "option",
|
|
"opts": ["--cache", "-c"],
|
|
"secondary_opts": ["--no-cache", "-u"],
|
|
"type": BOOL_PARAM_TYPE[1],
|
|
"required": False,
|
|
"nargs": 1,
|
|
"multiple": False,
|
|
"default": False,
|
|
"envvar": None,
|
|
"help": None,
|
|
"prompt": None,
|
|
"is_flag": True,
|
|
"flag_value": True,
|
|
"count": False,
|
|
"hidden": False,
|
|
},
|
|
id="Flag Option",
|
|
),
|
|
pytest.param(*NAME_ARGUMENT, id="Argument"),
|
|
],
|
|
)
|
|
def test_parameter(obj, expect):
|
|
out = obj.to_info_dict()
|
|
assert out == expect
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
("obj", "expect"),
|
|
[
|
|
pytest.param(*HELLO_COMMAND, id="Command"),
|
|
pytest.param(*HELLO_GROUP, id="Group"),
|
|
pytest.param(
|
|
click.Group(
|
|
"base",
|
|
[click.Command("test", params=[NAME_ARGUMENT[0]]), HELLO_GROUP[0]],
|
|
),
|
|
{
|
|
"name": "base",
|
|
"params": [HELP_OPTION[1]],
|
|
"help": None,
|
|
"epilog": None,
|
|
"short_help": None,
|
|
"hidden": False,
|
|
"deprecated": False,
|
|
"commands": {
|
|
"cli": HELLO_GROUP[1],
|
|
"test": {
|
|
"name": "test",
|
|
"params": [NAME_ARGUMENT[1], HELP_OPTION[1]],
|
|
"help": None,
|
|
"epilog": None,
|
|
"short_help": None,
|
|
"hidden": False,
|
|
"deprecated": False,
|
|
},
|
|
},
|
|
"chain": False,
|
|
},
|
|
id="Nested Group",
|
|
),
|
|
],
|
|
)
|
|
def test_command(obj, expect):
|
|
ctx = click.Context(obj)
|
|
out = obj.to_info_dict(ctx)
|
|
assert out == expect
|
|
|
|
|
|
def test_context():
|
|
ctx = click.Context(HELLO_COMMAND[0])
|
|
out = ctx.to_info_dict()
|
|
assert out == {
|
|
"command": HELLO_COMMAND[1],
|
|
"info_name": None,
|
|
"allow_extra_args": False,
|
|
"allow_interspersed_args": True,
|
|
"ignore_unknown_options": False,
|
|
"auto_envvar_prefix": None,
|
|
}
|
|
|
|
|
|
def test_paramtype_no_name():
|
|
class TestType(click.ParamType):
|
|
pass
|
|
|
|
assert TestType().to_info_dict()["name"] == "TestType"
|