summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Rocco <drocco@gmail.com>2015-02-24 14:02:45 -0500
committerDaniel Rocco <drocco@gmail.com>2015-02-25 16:58:01 -0500
commit2f34fbafd6da5ac5dca8c0695af8999ff4563be3 (patch)
treeca81e6020338728d9d76646944a8d92f5b6c2987
parent840f3bd3a805a4cf3f824e37eb2e423756d52379 (diff)
Only include special command completions at the start of a statement
Closes #159
-rw-r--r--pgcli/packages/sqlcompletion.py11
-rw-r--r--pgcli/pgcompleter.py9
-rw-r--r--tests/test_sqlcompletion.py15
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'}])