diff options
author | Amjith Ramanujam <amjith.r@gmail.com> | 2019-05-21 22:20:08 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-21 22:20:08 -0700 |
commit | 1d061a376ded6e2d37983d68f94bccea5289c250 (patch) | |
tree | 90b76d0b22a654a7d0ccffdb11ecf8df9b1af205 | |
parent | 61d408272db7f7229f05dcaa4c54d28978000ec3 (diff) | |
parent | a946fb05acdfe97e3c039dc0f424493913df189d (diff) |
Merge pull request #59 from dbcli/shif-tab
Add shift-tab to select the previous entry in the completion menu.
-rw-r--r-- | changelog.md | 7 | ||||
-rw-r--r-- | litecli/key_bindings.py | 10 | ||||
-rw-r--r-- | tests/test_main.py | 8 | ||||
-rw-r--r-- | tests/test_smart_completion_public_schema_only.py | 135 |
4 files changed, 85 insertions, 75 deletions
diff --git a/changelog.md b/changelog.md index 7909354..242cb87 100644 --- a/changelog.md +++ b/changelog.md @@ -10,10 +10,13 @@ Features: --------- * Added `.load` command for loading extension libraries. - -* +* Added shift-tab to select the previous entry in the completion menu. [Amjith] 1.0.0 ===== * To new beginnings. :tada: + + + +[Amjith]: https://blog.amjith.com diff --git a/litecli/key_bindings.py b/litecli/key_bindings.py index 3c93255..43394e5 100644 --- a/litecli/key_bindings.py +++ b/litecli/key_bindings.py @@ -38,6 +38,16 @@ def cli_bindings(cli): else: b.start_completion(select_first=True) + @kb.add("s-tab") + def _(event): + """Force autocompletion at cursor.""" + _logger.debug("Detected <Tab> key.") + b = event.app.current_buffer + if b.complete_state: + b.complete_previous() + else: + b.start_completion(select_first=True) + @kb.add("c-space") def _(event): """ diff --git a/tests/test_main.py b/tests/test_main.py index d8d01ed..0b926f4 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -27,14 +27,14 @@ def test_execute_arg(executor): result = runner.invoke(cli, args=CLI_ARGS + ["-e", sql]) assert result.exit_code == 0 - assert '"abc"' in result.output + assert "abc" in result.output result = runner.invoke(cli, args=CLI_ARGS + ["--execute", sql]) assert result.exit_code == 0 - assert '"abc"' in result.output + assert "abc" in result.output - expected = '"a"\n"abc"\n' + expected = "a\nabc\n" assert expected in result.output @@ -78,7 +78,7 @@ def test_batch_mode(executor): result = runner.invoke(cli, args=CLI_ARGS, input=sql) assert result.exit_code == 0 - assert '"count(*)"\n"3"\n"a"\n"abc"\n' in "".join(result.output) + assert "count(*)\n3\na\nabc\n" in "".join(result.output) @dbtest diff --git a/tests/test_smart_completion_public_schema_only.py b/tests/test_smart_completion_public_schema_only.py index 9cd888b..ea5c580 100644 --- a/tests/test_smart_completion_public_schema_only.py +++ b/tests/test_smart_completion_public_schema_only.py @@ -44,12 +44,12 @@ def complete_event(): def test_empty_string_completion(completer, complete_event): text = "" position = 0 - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(map(Completion, completer.keywords)) == result + assert list(map(Completion, sorted(completer.keywords))) == result def test_select_keyword_completion(completer, complete_event): @@ -58,7 +58,7 @@ def test_select_keyword_completion(completer, complete_event): result = completer.get_completions( Document(text=text, cursor_position=position), complete_event ) - assert set(result) == set([Completion(text="SELECT", start_position=-3)]) + assert list(result) == list([Completion(text="SELECT", start_position=-3)]) def test_table_completion(completer, complete_event): @@ -67,12 +67,12 @@ def test_table_completion(completer, complete_event): result = completer.get_completions( Document(text=text, cursor_position=position), complete_event ) - assert set(result) == set( + assert list(result) == list( [ - Completion(text="users", start_position=0), - Completion(text="`select`", start_position=0), Completion(text="`réveillé`", start_position=0), + Completion(text="`select`", start_position=0), Completion(text="orders", start_position=0), + Completion(text="users", start_position=0), ] ) @@ -83,7 +83,7 @@ def test_function_name_completion(completer, complete_event): result = completer.get_completions( Document(text=text, cursor_position=position), complete_event ) - assert set(result) == set( + assert list(result) == list( [ Completion(text="MAX", start_position=-2), Completion(text="MATCH", start_position=-2), @@ -101,26 +101,24 @@ def test_suggested_column_names(completer, complete_event): """ text = "SELECT from users" position = len("SELECT ") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - expected = set( + assert result == list( [ - Completion(text="users", start_position=0), Completion(text="*", start_position=0), - Completion(text="id", start_position=0), Completion(text="email", start_position=0), Completion(text="first_name", start_position=0), + Completion(text="id", start_position=0), Completion(text="last_name", start_position=0), ] + list(map(Completion, completer.functions)) - + list(map(Completion, completer.keywords)) + + [Completion(text="users", start_position=0)] + + list(map(Completion, sorted(completer.keywords))) ) - assert set(result) == expected - def test_suggested_column_names_in_function(completer, complete_event): """Suggest column and function names when selecting multiple columns from @@ -136,12 +134,12 @@ def test_suggested_column_names_in_function(completer, complete_event): result = completer.get_completions( Document(text=text, cursor_position=position), complete_event ) - assert set(result) == set( + assert list(result) == list( [ Completion(text="*", start_position=0), - Completion(text="id", start_position=0), Completion(text="email", start_position=0), Completion(text="first_name", start_position=0), + Completion(text="id", start_position=0), Completion(text="last_name", start_position=0), ] ) @@ -157,17 +155,17 @@ def test_suggested_column_names_with_table_dot(completer, complete_event): """ text = "SELECT users. from users" position = len("SELECT users.") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( + assert result == list( [ Completion(text="*", start_position=0), - Completion(text="id", start_position=0), Completion(text="email", start_position=0), Completion(text="first_name", start_position=0), + Completion(text="id", start_position=0), Completion(text="last_name", start_position=0), ] ) @@ -183,17 +181,17 @@ def test_suggested_column_names_with_alias(completer, complete_event): """ text = "SELECT u. from users u" position = len("SELECT u.") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( + assert result == list( [ Completion(text="*", start_position=0), - Completion(text="id", start_position=0), Completion(text="email", start_position=0), Completion(text="first_name", start_position=0), + Completion(text="id", start_position=0), Completion(text="last_name", start_position=0), ] ) @@ -210,22 +208,22 @@ def test_suggested_multiple_column_names(completer, complete_event): """ text = "SELECT id, from users u" position = len("SELECT id, ") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( + assert result == list( [ - Completion(text="u", start_position=0), Completion(text="*", start_position=0), - Completion(text="id", start_position=0), Completion(text="email", start_position=0), Completion(text="first_name", start_position=0), + Completion(text="id", start_position=0), Completion(text="last_name", start_position=0), ] + list(map(Completion, completer.functions)) - + list(map(Completion, completer.keywords)) + + [Completion(text="u", start_position=0)] + + list(map(Completion, sorted(completer.keywords))) ) @@ -240,17 +238,17 @@ def test_suggested_multiple_column_names_with_alias(completer, complete_event): """ text = "SELECT u.id, u. from users u" position = len("SELECT u.id, u.") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( + assert result == list( [ Completion(text="*", start_position=0), - Completion(text="id", start_position=0), Completion(text="email", start_position=0), Completion(text="first_name", start_position=0), + Completion(text="id", start_position=0), Completion(text="last_name", start_position=0), ] ) @@ -267,17 +265,17 @@ def test_suggested_multiple_column_names_with_dot(completer, complete_event): """ text = "SELECT users.id, users. from users u" position = len("SELECT users.id, users.") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( + assert result == list( [ Completion(text="*", start_position=0), - Completion(text="id", start_position=0), Completion(text="email", start_position=0), Completion(text="first_name", start_position=0), + Completion(text="id", start_position=0), Completion(text="last_name", start_position=0), ] ) @@ -286,41 +284,41 @@ def test_suggested_multiple_column_names_with_dot(completer, complete_event): def test_suggested_aliases_after_on(completer, complete_event): text = "SELECT u.name, o.id FROM users u JOIN orders o ON " position = len("SELECT u.name, o.id FROM users u JOIN orders o ON ") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( - [Completion(text="u", start_position=0), Completion(text="o", start_position=0)] + assert result == list( + [Completion(text="o", start_position=0), Completion(text="u", start_position=0)] ) def test_suggested_aliases_after_on_right_side(completer, complete_event): text = "SELECT u.name, o.id FROM users u JOIN orders o ON o.user_id = " position = len("SELECT u.name, o.id FROM users u JOIN orders o ON o.user_id = ") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( - [Completion(text="u", start_position=0), Completion(text="o", start_position=0)] + assert result == list( + [Completion(text="o", start_position=0), Completion(text="u", start_position=0)] ) def test_suggested_tables_after_on(completer, complete_event): text = "SELECT users.name, orders.id FROM users JOIN orders ON " position = len("SELECT users.name, orders.id FROM users JOIN orders ON ") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( + assert result == list( [ - Completion(text="users", start_position=0), Completion(text="orders", start_position=0), + Completion(text="users", start_position=0), ] ) @@ -330,15 +328,15 @@ def test_suggested_tables_after_on_right_side(completer, complete_event): position = len( "SELECT users.name, orders.id FROM users JOIN orders ON orders.user_id = " ) - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( + assert list(result) == list( [ - Completion(text="users", start_position=0), Completion(text="orders", start_position=0), + Completion(text="users", start_position=0), ] ) @@ -346,17 +344,17 @@ def test_suggested_tables_after_on_right_side(completer, complete_event): def test_table_names_after_from(completer, complete_event): text = "SELECT * FROM " position = len("SELECT * FROM ") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( + assert list(result) == list( [ - Completion(text="users", start_position=0), - Completion(text="orders", start_position=0), Completion(text="`réveillé`", start_position=0), Completion(text="`select`", start_position=0), + Completion(text="orders", start_position=0), + Completion(text="users", start_position=0), ] ) @@ -364,42 +362,41 @@ def test_table_names_after_from(completer, complete_event): def test_auto_escaped_col_names(completer, complete_event): text = "SELECT from `select`" position = len("SELECT ") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( - [ - Completion(text="`select`", start_position=0), - Completion(text="*", start_position=0), - Completion(text="id", start_position=0), - Completion(text="`insert`", start_position=0), - Completion(text="`ABC`", start_position=0), - ] - + list(map(Completion, completer.functions)) - + list(map(Completion, completer.keywords)) + assert result == [ + Completion(text="*", start_position=0), + Completion(text="`ABC`", start_position=0), + Completion(text="`insert`", start_position=0), + Completion(text="id", start_position=0), + ] + list(map(Completion, completer.functions)) + [ + Completion(text="`select`", start_position=0) + ] + list( + map(Completion, sorted(completer.keywords)) ) def test_un_escaped_table_names(completer, complete_event): text = "SELECT from réveillé" position = len("SELECT ") - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - assert set(result) == set( + assert result == list( [ - Completion(text="réveillé", start_position=0), Completion(text="*", start_position=0), - Completion(text="id", start_position=0), - Completion(text="`insert`", start_position=0), Completion(text="`ABC`", start_position=0), + Completion(text="`insert`", start_position=0), + Completion(text="id", start_position=0), ] + list(map(Completion, completer.functions)) - + list(map(Completion, completer.keywords)) + + [Completion(text="réveillé", start_position=0)] + + list(map(Completion, sorted(completer.keywords))) ) @@ -416,7 +413,7 @@ def dummy_list_path(dir_name): @pytest.mark.parametrize( "text,expected", [ - ("source ", [("~", 0), ("/", 0), (".", 0), ("..", 0)]), + ("source ", [(".", 0), ("..", 0), ("/", 0), ("~", 0)]), ("source /", [("dir1", 0), ("file1.sql", 0), ("file2.sql", 0)]), ("source /dir1/", [("subdir1", 0), ("subfile1.sql", 0), ("subfile2.sql", 0)]), ("source /dir1/subdir1/", [("lastfile.sql", 0)]), @@ -424,10 +421,10 @@ def dummy_list_path(dir_name): ) def test_file_name_completion(completer, complete_event, text, expected): position = len(text) - result = set( + result = list( completer.get_completions( Document(text=text, cursor_position=position), complete_event ) ) - expected = set([Completion(txt, pos) for txt, pos in expected]) + expected = list([Completion(txt, pos) for txt, pos in expected]) assert result == expected |