diff options
author | Daniel Rocco <drocco@gmail.com> | 2015-02-24 14:02:45 -0500 |
---|---|---|
committer | Daniel Rocco <drocco@gmail.com> | 2015-02-25 16:58:01 -0500 |
commit | 2f34fbafd6da5ac5dca8c0695af8999ff4563be3 (patch) | |
tree | ca81e6020338728d9d76646944a8d92f5b6c2987 | |
parent | 840f3bd3a805a4cf3f824e37eb2e423756d52379 (diff) |
Only include special command completions at the start of a statement
Closes #159
-rw-r--r-- | pgcli/packages/sqlcompletion.py | 11 | ||||
-rw-r--r-- | pgcli/pgcompleter.py | 9 | ||||
-rw-r--r-- | tests/test_sqlcompletion.py | 15 |
3 files changed, 28 insertions, 7 deletions
diff --git a/pgcli/packages/sqlcompletion.py b/pgcli/packages/sqlcompletion.py index f5d24147..885cbd63 100644 --- a/pgcli/packages/sqlcompletion.py +++ b/pgcli/packages/sqlcompletion.py @@ -80,7 +80,9 @@ def suggest_based_on_last_token(token, text_before_cursor, full_text): else: token_v = token.value - if token_v.lower().endswith('('): + if not token: + return [{'type': 'keyword'}, {'type': 'special'}] + elif token_v.lower().endswith('('): p = sqlparse.parse(text_before_cursor)[0] if p.token_first().value.lower() == 'select': # If the lparen is preceeded by a space chances are we're about to @@ -90,8 +92,7 @@ def suggest_based_on_last_token(token, text_before_cursor, full_text): return [{'type': 'keyword'}] return [{'type': 'column', 'tables': extract_tables(full_text)}] - - if token_v.lower() in ('set', 'by', 'distinct'): + elif token_v.lower() in ('set', 'by', 'distinct'): return [{'type': 'column', 'tables': extract_tables(full_text)}] elif token_v.lower() in ('select', 'where', 'having'): return [{'type': 'column', 'tables': extract_tables(full_text)}, @@ -149,8 +150,8 @@ def suggest_based_on_last_token(token, text_before_cursor, full_text): {'type': 'function', 'schema': identifier}]) return suggestions - - return [{'type': 'keyword'}] + else: + return [{'type': 'keyword'}] def identifies(id, schema, table, alias): diff --git a/pgcli/pgcompleter.py b/pgcli/pgcompleter.py index 1cab631b..c9e98f86 100644 --- a/pgcli/pgcompleter.py +++ b/pgcli/pgcompleter.py @@ -204,15 +204,20 @@ class PGCompleter(Completer): aliases = suggestion['aliases'] aliases = self.find_matches(word_before_cursor, aliases) completions.extend(aliases) + elif suggestion['type'] == 'database': dbs = self.find_matches(word_before_cursor, self.databases) completions.extend(dbs) elif suggestion['type'] == 'keyword': - keywords = self.keywords + self.special_commands - keywords = self.find_matches(word_before_cursor, keywords) + keywords = self.find_matches(word_before_cursor, self.keywords) completions.extend(keywords) + elif suggestion['type'] == 'special': + special = self.find_matches(word_before_cursor, + self.special_commands) + completions.extend(special) + return completions def populate_scoped_cols(self, scoped_tbls): diff --git a/tests/test_sqlcompletion.py b/tests/test_sqlcompletion.py index f24b669e..1e3ae66b 100644 --- a/tests/test_sqlcompletion.py +++ b/tests/test_sqlcompletion.py @@ -238,3 +238,18 @@ def test_create_db_with_template(): 'create database foo with template ') assert sorted_dicts(suggestions) == sorted_dicts([{'type': 'database'}]) + + +@pytest.mark.parametrize('initial_text', ['', ' ', '\t \t']) +def test_specials_included_for_initial_completion(initial_text): + suggestions = suggest_type(initial_text, initial_text) + + assert sorted_dicts(suggestions) == \ + sorted_dicts([{'type': 'keyword'}, {'type': 'special'}]) + + +def test_specials_not_included_after_initial_token(): + suggestions = suggest_type('create table foo (dt d', + 'create table foo (dt d') + + assert sorted_dicts(suggestions) == sorted_dicts([{'type': 'keyword'}]) |