summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmjith Ramanujam <amjith.r@gmail.com>2019-05-21 22:20:08 -0700
committerGitHub <noreply@github.com>2019-05-21 22:20:08 -0700
commit1d061a376ded6e2d37983d68f94bccea5289c250 (patch)
tree90b76d0b22a654a7d0ccffdb11ecf8df9b1af205
parent61d408272db7f7229f05dcaa4c54d28978000ec3 (diff)
parenta946fb05acdfe97e3c039dc0f424493913df189d (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.md7
-rw-r--r--litecli/key_bindings.py10
-rw-r--r--tests/test_main.py8
-rw-r--r--tests/test_smart_completion_public_schema_only.py135
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