diff --git a/cliglue/autocomplete/completers.py b/cliglue/autocomplete/completers.py new file mode 100644 index 0000000..e79fe8b --- /dev/null +++ b/cliglue/autocomplete/completers.py @@ -0,0 +1,6 @@ +import os + + +def file_completer(): + files = [f for f in os.listdir('.')] + return sorted(files) diff --git a/tests/autocomplete/test_autocomplete.py b/tests/autocomplete/test_autocomplete.py index 64b8030..490b4d0 100644 --- a/tests/autocomplete/test_autocomplete.py +++ b/tests/autocomplete/test_autocomplete.py @@ -1,4 +1,5 @@ from cliglue import * +from cliglue.autocomplete.completers import file_completer from tests.asserts import MockIO @@ -223,3 +224,27 @@ def test_completing_word_in_the_middle(): subcommand('run'), ).run() assert mockio.stripped() == 'run' + + +def test_complete_with_completer_function(): + def complete(): + return ['42', '47', '53'] + + with MockIO('--autocomplete', '"app 4"') as mockio: + CliBuilder(reraise_error=True).has( + arguments('a', choices=complete), + ).run() + assert mockio.stripped() == '42\n47' + + +def test_file_completer(): + with MockIO('--autocomplete', '"app "') as mockio: + CliBuilder(reraise_error=True).has( + arguments('f', choices=file_completer), + ).run() + proposals = mockio.stripped().splitlines() + assert '.gitignore' in proposals + assert 'tests' in proposals + assert 'tests/builder' not in proposals + assert '.' not in proposals + assert '..' not in proposals