summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Rocco <drocco@gmail.com>2015-02-24 12:44:32 -0500
committerDaniel Rocco <drocco@gmail.com>2015-02-24 12:44:32 -0500
commit840f3bd3a805a4cf3f824e37eb2e423756d52379 (patch)
tree2a37146ec6fddd7cc0980843fe7f91ebd0448926
parent4d60c92184f78e91bed729db0adb2a0272a9c6b5 (diff)
Add completion for CREATE WITH TEMPLATE
Closes #156
-rw-r--r--pgcli/packages/sqlcompletion.py4
-rw-r--r--pgcli/pgcompleter.py40
-rw-r--r--tests/test_sqlcompletion.py10
3 files changed, 32 insertions, 22 deletions
diff --git a/pgcli/packages/sqlcompletion.py b/pgcli/packages/sqlcompletion.py
index c01277ed..f5d24147 100644
--- a/pgcli/packages/sqlcompletion.py
+++ b/pgcli/packages/sqlcompletion.py
@@ -124,7 +124,9 @@ def suggest_based_on_last_token(token, text_before_cursor, full_text):
return [{'type': 'table', 'schema': identifiers[0]}]
else:
return [{'type': 'schema'}, {'type': 'table', 'schema': []}]
- elif token_v.lower() in ('c', 'use'): # \c
+ elif token_v.lower() in ('c', 'use', 'database', 'template'):
+ # "\c <db", "use <db>", "DROP DATABASE <db>",
+ # "CREATE DATABASE <newdb> WITH TEMPLATE <db>"
return [{'type': 'database'}]
elif token_v.endswith(',') or token_v == '=':
prev_keyword = find_prev_keyword(text_before_cursor)
diff --git a/pgcli/pgcompleter.py b/pgcli/pgcompleter.py
index 35054cd1..1cab631b 100644
--- a/pgcli/pgcompleter.py
+++ b/pgcli/pgcompleter.py
@@ -10,24 +10,26 @@ _logger = logging.getLogger(__name__)
class PGCompleter(Completer):
keywords = ['ACCESS', 'ADD', 'ALL', 'ALTER TABLE', 'AND', 'ANY', 'AS',
- 'ASC', 'AUDIT', 'BETWEEN', 'BY', 'CASE', 'CHAR', 'CHECK',
- 'CLUSTER', 'COLUMN', 'COMMENT', 'COMPRESS', 'CONNECT', 'COPY',
- 'CREATE', 'CURRENT', 'DATE', 'DECIMAL', 'DEFAULT', 'DELETE FROM',
- 'DESC', 'DESCRIBE', 'DISTINCT', 'DROP', 'ELSE', 'EXCLUSIVE',
- 'EXISTS', 'FILE', 'FLOAT', 'FOR', 'FROM', 'FULL', 'GRANT',
- 'GROUP BY', 'HAVING', 'IDENTIFIED', 'IMMEDIATE', 'IN', 'INCREMENT',
- 'INDEX', 'INITIAL', 'INSERT INTO', 'INTEGER', 'INTERSECT', 'INTO',
- 'IS', 'JOIN', 'LEFT', 'LEVEL', 'LIKE', 'LIMIT', 'LOCK', 'LONG',
- 'MAXEXTENTS', 'MINUS', 'MLSLABEL', 'MODE', 'MODIFY', 'NOAUDIT',
- 'NOCOMPRESS', 'NOT', 'NOWAIT', 'NULL', 'NUMBER', 'OF', 'OFFLINE',
- 'ON', 'ONLINE', 'OPTION', 'OR', 'ORDER BY', 'OUTER', 'PCTFREE',
- 'PRIMARY', 'PRIOR', 'PRIVILEGES', 'RAW', 'RENAME', 'RESOURCE',
- 'REVOKE', 'RIGHT', 'ROW', 'ROWID', 'ROWNUM', 'ROWS', 'SELECT',
- 'SESSION', 'SET', 'SHARE', 'SIZE', 'SMALLINT', 'START',
- 'SUCCESSFUL', 'SYNONYM', 'SYSDATE', 'TABLE', 'THEN', 'TO',
- 'TRIGGER', 'UID', 'UNION', 'UNIQUE', 'UPDATE', 'USE', 'USER',
- 'VALIDATE', 'VALUES', 'VARCHAR', 'VARCHAR2', 'VIEW', 'WHEN',
- 'WHENEVER', 'WHERE', 'WITH', ]
+ 'ASC', 'AUDIT', 'BETWEEN', 'BY', 'CASE', 'CHAR', 'CHECK',
+ 'CLUSTER', 'COLUMN', 'COMMENT', 'COMPRESS', 'CONNECT',
+ 'COPY', 'CREATE', 'CURRENT', 'DATABASE', 'DATE', 'DECIMAL',
+ 'DEFAULT', 'DELETE FROM', 'DESC', 'DESCRIBE', 'DISTINCT',
+ 'DROP', 'ELSE', 'EXCLUSIVE', 'EXISTS', 'FILE', 'FLOAT',
+ 'FOR', 'FROM', 'FULL', 'GRANT', 'GROUP BY', 'HAVING',
+ 'IDENTIFIED', 'IMMEDIATE', 'IN', 'INCREMENT', 'INDEX',
+ 'INITIAL', 'INSERT INTO', 'INTEGER', 'INTERSECT', 'INTO',
+ 'IS', 'JOIN', 'LEFT', 'LEVEL', 'LIKE', 'LIMIT', 'LOCK',
+ 'LONG', 'MAXEXTENTS', 'MINUS', 'MLSLABEL', 'MODE', 'MODIFY',
+ 'NOAUDIT', 'NOCOMPRESS', 'NOT', 'NOWAIT', 'NULL', 'NUMBER',
+ 'OF', 'OFFLINE', 'ON', 'ONLINE', 'OPTION', 'OR', 'ORDER BY',
+ 'OUTER', 'PCTFREE', 'PRIMARY', 'PRIOR', 'PRIVILEGES', 'RAW',
+ 'RENAME', 'RESOURCE', 'REVOKE', 'RIGHT', 'ROW', 'ROWID',
+ 'ROWNUM', 'ROWS', 'SELECT', 'SESSION', 'SET', 'SHARE',
+ 'SIZE', 'SMALLINT', 'START', 'SUCCESSFUL', 'SYNONYM',
+ 'SYSDATE', 'TABLE', 'TEMPLATE', 'THEN', 'TO', 'TRIGGER',
+ 'UID', 'UNION', 'UNIQUE', 'UPDATE', 'USE', 'USER',
+ 'VALIDATE', 'VALUES', 'VARCHAR', 'VARCHAR2', 'VIEW', 'WHEN',
+ 'WHENEVER', 'WHERE', 'WITH', ]
functions = ['AVG', 'COUNT', 'DISTINCT', 'FIRST', 'FORMAT', 'LAST',
'LCASE', 'LEN', 'MAX', 'MIN', 'MID', 'NOW', 'ROUND', 'SUM', 'TOP',
@@ -129,7 +131,7 @@ class PGCompleter(Completer):
# function metadata -- right now we're not storing any further metadata
# so just default to None as a placeholder
metadata = self.dbmetadata['functions']
-
+
for f in func_data:
schema, func = self.escaped_names(f)
metadata[schema][func] = None
diff --git a/tests/test_sqlcompletion.py b/tests/test_sqlcompletion.py
index 4c28d9d4..f24b669e 100644
--- a/tests/test_sqlcompletion.py
+++ b/tests/test_sqlcompletion.py
@@ -177,13 +177,13 @@ def test_on_suggests_tables():
'select abc.x, bcd.y from abc join bcd on ',
'select abc.x, bcd.y from abc join bcd on ')
assert suggestions == [{'type': 'alias', 'aliases': ['abc', 'bcd']}]
-
+
def test_on_suggests_aliases_right_side():
suggestions = suggest_type(
'select a.x, b.y from abc a join bcd b on a.id = ',
'select a.x, b.y from abc a join bcd b on a.id = ')
assert suggestions == [{'type': 'alias', 'aliases': ['a', 'b']}]
-
+
def test_on_suggests_tables_right_side():
suggestions = suggest_type(
'select abc.x, bcd.y from abc join bcd on ',
@@ -232,3 +232,9 @@ def test_3_statements_2nd_current():
{'type': 'column', 'tables': [(None, 'b', None)]},
{'type': 'function', 'schema': []}])
+
+def test_create_db_with_template():
+ suggestions = suggest_type('create database foo with template ',
+ 'create database foo with template ')
+
+ assert sorted_dicts(suggestions) == sorted_dicts([{'type': 'database'}])