Skip to content

Commit

Permalink
Merge pull request dbcli#576 from dbcli/darikg/keyword-casing
Browse files Browse the repository at this point in the history
Support configuring keyword casing preferences
  • Loading branch information
koljonen authored Sep 4, 2016
2 parents 36734f3 + f506dfb commit 8f4dad1
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 6 deletions.
15 changes: 10 additions & 5 deletions pgcli/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -143,11 +143,16 @@ def __init__(self, force_passwd_prompt=False, never_passwd_prompt=False,

# Initialize completer
smart_completion = c['main'].as_bool('smart_completion')
self.settings = {'casing_file': get_casing_file(c),
'generate_casing_file': c['main'].as_bool('generate_casing_file'),
'generate_aliases': c['main'].as_bool('generate_aliases'),
'asterisk_column_order': c['main']['asterisk_column_order'],
'single_connection': single_connection}
keyword_casing = c['main']['keyword_casing']
self.settings = {
'casing_file': get_casing_file(c),
'generate_casing_file': c['main'].as_bool('generate_casing_file'),
'generate_aliases': c['main'].as_bool('generate_aliases'),
'asterisk_column_order': c['main']['asterisk_column_order'],
'single_connection': single_connection,
'keyword_casing': keyword_casing,
}

completer = PGCompleter(smart_completion, pgspecial=self.pgspecial,
settings=self.settings)
self.completer = completer
Expand Down
3 changes: 3 additions & 0 deletions pgcli/pgclirc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ generate_aliases = False
# %USERPROFILE% is typically C:\Users\{username}
log_file = default

# keyword casing preference. Possible values "lower", "upper", "auto"
keyword_casing = upper

# casing_file location.
# In Unix/Linux: ~/.config/pgcli/casing
# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\casing
Expand Down
19 changes: 18 additions & 1 deletion pgcli/pgcompleter.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ def __init__(self, smart_completion=True, pgspecial=None, settings=None):
self.asterisk_column_order = settings.get(
'asterisk_column_order', 'table_order')

keyword_casing = settings.get('keyword_casing', 'upper').lower()
if keyword_casing not in ('upper', 'lower', 'auto'):
keyword_casing = 'upper'
self.keyword_casing = keyword_casing

self.reserved_words = set()
for x in self.keywords:
self.reserved_words.update(x.split())
Expand Down Expand Up @@ -612,7 +617,19 @@ def get_database_matches(self, _, word_before_cursor):
meta='database')

def get_keyword_matches(self, _, word_before_cursor):
return self.find_matches(word_before_cursor, self.keywords,
casing = self.keyword_casing
if casing == 'auto':
if word_before_cursor and word_before_cursor[-1].islower():
casing = 'lower'
else:
casing = 'upper'

if casing == 'upper':
keywords = [k.upper() for k in self.keywords]
else:
keywords = [k.lower() for k in self.keywords]

return self.find_matches(word_before_cursor, keywords,
mode='strict', meta='keyword')

def get_path_matches(self, _, word_before_cursor):
Expand Down
15 changes: 15 additions & 0 deletions tests/test_smart_completion_public_schema_only.py
Original file line number Diff line number Diff line change
Expand Up @@ -914,3 +914,18 @@ def test_cte_qualified_columns(completer, complete_event, text):
complete_event)
expected = [Completion('foo', 0, display_meta='column')]
assert set(expected) == set(result)


@pytest.mark.parametrize('keyword_casing,expected,texts', [
('upper', 'SELECT', ('', 's', 'S', 'Sel')),
('lower', 'select', ('', 's', 'S', 'Sel')),
('auto', 'SELECT', ('', 'S', 'SEL', 'seL')),
('auto', 'select', ('s', 'sel', 'SEl')),
])
def test_keyword_casing_upper(keyword_casing, expected, texts):
for text in texts:
completer_ = testdata.get_completer({'keyword_casing': keyword_casing})
completions = completer_.get_completions(
Document(text=text, cursor_position=len(text)), complete_event)
assert expected in [cpl.text for cpl in completions]

0 comments on commit 8f4dad1

Please sign in to comment.