Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions tests/test_others.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from typer.main import solve_typer_info_defaults, solve_typer_info_help
from typer.models import ParameterInfo, TyperInfo
from typer.testing import CliRunner
from typing_extensions import Annotated

from .utils import requires_completion_permission

Expand Down Expand Up @@ -170,6 +171,22 @@ def main(
assert "Hello World" in result.stdout


def test_empty_list_default_generator():
def empty_list() -> typing.List[str]:
return []

app = typer.Typer()

@app.command()
def main(
names: Annotated[typing.List[str], typer.Option(default_factory=empty_list)],
):
print(names)

result = runner.invoke(app)
assert "[]" in result.output


def test_completion_argument():
file_path = Path(__file__).parent / "assets/completion_argument.py"
result = subprocess.run(
Expand Down
4 changes: 2 additions & 2 deletions typer/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -629,8 +629,8 @@ def generate_list_convertor(
convertor: Optional[Callable[[Any], Any]], default_value: Optional[Any]
) -> Callable[[Optional[Sequence[Any]]], Optional[List[Any]]]:
def internal_convertor(value: Optional[Sequence[Any]]) -> Optional[List[Any]]:
if value is None or len(value) == 0:
return default_value
if (value is None) or (default_value is None and len(value) == 0):
return None
return [convertor(v) if convertor else v for v in value]

return internal_convertor
Expand Down
Loading