From 5f8126c1799974f0bebad9390c025329c2343b36 Mon Sep 17 00:00:00 2001 From: Jonathan Slenders Date: Sat, 2 May 2015 17:01:57 +0200 Subject: Upgrade to prompt-toolkit 0.34 --- pgcli/key_bindings.py | 13 +++++++++++-- pgcli/main.py | 44 +++++++++++++++++++++++++++----------------- pgcli/pgbuffer.py | 10 ++++++++-- pgcli/pgclirc | 2 +- pgcli/pgcompleter.py | 2 +- pgcli/pgstyle.py | 30 +++++++++++++++++------------- pgcli/pgtoolbar.py | 35 +++++++++++++++++------------------ setup.py | 2 +- 8 files changed, 83 insertions(+), 55 deletions(-) diff --git a/pgcli/key_bindings.py b/pgcli/key_bindings.py index 9955d149..c75c6349 100644 --- a/pgcli/key_bindings.py +++ b/pgcli/key_bindings.py @@ -42,7 +42,11 @@ def pgcli_bindings(vi_mode=False): Force autocompletion at cursor. """ _logger.debug('Detected key.') - event.cli.current_buffer.complete_next() + b = event.cli.current_buffer + if b.complete_state: + b.complete_next() + else: + event.cli.start_completion(select_first=True) @key_binding_manager.registry.add_binding(Keys.ControlSpace) def _(event): @@ -55,6 +59,11 @@ def pgcli_bindings(vi_mode=False): If the menu is showing, select the next completion. """ _logger.debug('Detected key.') - event.cli.current_buffer.complete_next(start_at_first=False) + + b = event.cli.current_buffer + if b.complete_state: + b.complete_next() + else: + event.cli.start_completion(select_first=False) return key_binding_manager diff --git a/pgcli/main.py b/pgcli/main.py index 77a3fa08..44eca2f7 100755 --- a/pgcli/main.py +++ b/pgcli/main.py @@ -10,13 +10,15 @@ from time import time import click import sqlparse -from prompt_toolkit import CommandLineInterface, AbortAction, Exit +from prompt_toolkit import CommandLineInterface, AbortAction +from prompt_toolkit.shortcuts import create_default_layout, create_eventloop from prompt_toolkit.document import Document -from prompt_toolkit.layout import Layout +from prompt_toolkit.filters import Always +from prompt_toolkit.layout.processors import HighlightMatchingBracketProcessor from prompt_toolkit.layout.prompt import DefaultPrompt -from prompt_toolkit.layout.menus import CompletionsMenu from prompt_toolkit.history import FileHistory from pygments.lexers.sql import PostgresLexer +from pygments.token import Token from .packages.tabulate import tabulate from .packages.expanded import expanded_table @@ -25,7 +27,7 @@ from .packages.pgspecial import (CASE_SENSITIVE_COMMANDS, import pgcli.packages.pgspecial as pgspecial import pgcli.packages.iospecial as iospecial from .pgcompleter import PGCompleter -from .pgtoolbar import PGToolbar +from .pgtoolbar import create_toolbar_tokens_func from .pgstyle import style_factory from .pgexecute import PGExecute from .pgbuffer import PGBuffer @@ -183,13 +185,12 @@ class PGCli(object): raise RuntimeError(message) document = cli.read_input( initial_document=Document(sql, cursor_position=len(sql)), - on_exit=AbortAction.RAISE_EXCEPTION) + ) continue return document def run_cli(self): pgexecute = self.pgexecute - prompt = '%s> ' % pgexecute.dbname logger = self.logger original_less_opts = self.adjust_less_opts() @@ -201,27 +202,36 @@ class PGCli(object): print('Mail: https://groups.google.com/forum/#!forum/pgcli') print('Home: http://pgcli.com') - layout = Layout(before_input=DefaultPrompt(prompt), - menus=[CompletionsMenu(max_height=10)], - lexer=PostgresLexer, - bottom_toolbars=[PGToolbar(key_binding_manager)]) + def prompt_tokens(cli): + return [(Token.Prompt, '%s> ' % pgexecute.dbname)] + + get_toolbar_tokens = create_toolbar_tokens_func(key_binding_manager) + layout = create_default_layout(lexer=PostgresLexer, + reserve_space_for_menu=True, + get_prompt_tokens=prompt_tokens, + get_bottom_toolbar_tokens=get_toolbar_tokens, + extra_input_processors=[ + HighlightMatchingBracketProcessor(), + ]) buf = PGBuffer(always_multiline=self.multi_line, completer=completer, - history=FileHistory(os.path.expanduser('~/.pgcli-history'))) - cli = CommandLineInterface(style=style_factory(self.syntax_style), + history=FileHistory(os.path.expanduser('~/.pgcli-history')), + complete_while_typing=Always()) + cli = CommandLineInterface(create_eventloop(), + style=style_factory(self.syntax_style), layout=layout, buffer=buf, - key_bindings_registry=key_binding_manager.registry) + key_bindings_registry=key_binding_manager.registry, + on_exit=AbortAction.RAISE_EXCEPTION) try: while True: - cli.layout.before_input = DefaultPrompt(prompt) - document = cli.read_input(on_exit=AbortAction.RAISE_EXCEPTION) + document = cli.read_input() # The reason we check here instead of inside the pgexecute is # because we want to raise the Exit exception which will be # caught by the try/except block that wraps the pgexecute.run() # statement. if quit_command(document.text): - raise Exit + raise EOFError try: document = self.handle_editor_command(cli, document) @@ -319,7 +329,7 @@ class PGCli(object): query = Query(document.text, successful, mutating) self.query_history.append(query) - except Exit: + except EOFError: print ('Goodbye!') finally: # Reset the less opts back to original. logger.debug('Restoring env var LESS to %r.', original_less_opts) diff --git a/pgcli/pgbuffer.py b/pgcli/pgbuffer.py index 0dbf43d3..2687a5f6 100644 --- a/pgcli/pgbuffer.py +++ b/pgcli/pgbuffer.py @@ -1,10 +1,16 @@ from prompt_toolkit.buffer import Buffer +from prompt_toolkit.filters import Condition class PGBuffer(Buffer): def __init__(self, always_multiline, *args, **kwargs): self.always_multiline = always_multiline - is_multiline = lambda doc: self.always_multiline and not _multiline_exception(doc.text) - super(PGBuffer, self).__init__(*args, is_multiline=is_multiline, **kwargs) + + @Condition + def is_multiline(): + doc = self.document + return self.always_multiline and not _multiline_exception(doc.text) + + super(self.__class__, self).__init__(*args, is_multiline=is_multiline, **kwargs) def _multiline_exception(text): text = text.strip() diff --git a/pgcli/pgclirc b/pgcli/pgclirc index c6e15cc0..932356e5 100644 --- a/pgcli/pgclirc +++ b/pgcli/pgclirc @@ -29,7 +29,7 @@ table_format = psql # Syntax Style. Possible values: manni, igor, xcode, vim, autumn, vs, rrt, # native, perldoc, borland, tango, emacs, friendly, monokai, paraiso-dark, # colorful, murphy, bw, pastie, paraiso-light, trac, default, fruity -syntax_style = native +syntax_style = default # Enables vi-mode vi = False diff --git a/pgcli/pgcompleter.py b/pgcli/pgcompleter.py index 6ddad72f..c17e2b4d 100644 --- a/pgcli/pgcompleter.py +++ b/pgcli/pgcompleter.py @@ -1,4 +1,4 @@ -from __future__ import print_function +from __future__ import print_function, unicode_literals import logging from prompt_toolkit.completion import Completer, Completion from .packages.sqlcompletion import suggest_type diff --git a/pgcli/pgstyle.py b/pgcli/pgstyle.py index 6816a67b..33ceb2ee 100644 --- a/pgcli/pgstyle.py +++ b/pgcli/pgstyle.py @@ -1,6 +1,7 @@ from pygments.token import Token from pygments.style import Style from pygments.util import ClassNotFound +from prompt_toolkit.styles import default_style_extensions import pygments.styles @@ -11,19 +12,22 @@ def style_factory(name): style = pygments.styles.get_style_by_name('native') class PGStyle(Style): - styles = { - Token.Menu.Completions.Completion.Current: 'bg:#00aaaa #000000', - Token.Menu.Completions.Completion: 'bg:#008888 #ffffff', - Token.Menu.Completions.ProgressButton: 'bg:#003333', - Token.Menu.Completions.ProgressBar: 'bg:#00aaaa', - Token.SelectedText: '#ffffff bg:#6666aa', - Token.IncrementalSearchMatch: '#ffffff bg:#4444aa', - Token.IncrementalSearchMatch.Current: '#ffffff bg:#44aa44', - Token.Toolbar: 'bg:#440044 #ffffff', - Token.Toolbar.Status: 'bg:#222222 #aaaaaa', - Token.Toolbar.Status.Off: 'bg:#222222 #888888', - Token.Toolbar.Status.On: 'bg:#222222 #ffffff', - } + styles = {} + styles.update(style.styles) + styles.update(default_style_extensions) + styles.update({ + Token.Menu.Completions.Completion.Current: 'bg:#00aaaa #000000', + Token.Menu.Completions.Completion: 'bg:#008888 #ffffff', + Token.Menu.Completions.ProgressButton: 'bg:#003333', + Token.Menu.Completions.ProgressBar: 'bg:#00aaaa', + Token.SelectedText: '#ffffff bg:#6666aa', + Token.IncrementalSearchMatch: '#ffffff bg:#4444aa', + Token.IncrementalSearchMatch.Current: '#ffffff bg:#44aa44', + Token.Toolbar: 'bg:#440044 #ffffff', + Token.Toolbar: 'bg:#222222 #aaaaaa', + Token.Toolbar.Off: 'bg:#222222 #888888', + Token.Toolbar.On: 'bg:#222222 #ffffff', + }) return PGStyle diff --git a/pgcli/pgtoolbar.py b/pgcli/pgtoolbar.py index 3a35be4d..0b8846e1 100644 --- a/pgcli/pgtoolbar.py +++ b/pgcli/pgtoolbar.py @@ -1,34 +1,33 @@ -from prompt_toolkit.layout.toolbars import Toolbar -from prompt_toolkit.layout.utils import TokenList from pygments.token import Token -class PGToolbar(Toolbar): - def __init__(self, key_binding_manager, token=None): - self.key_binding_manager = key_binding_manager - token = token or Token.Toolbar.Status - super(PGToolbar, self).__init__(token=token) +def create_toolbar_tokens_func(key_binding_manager, token=None): + """ + Return a function that generates the toolbar tokens. + """ + token = token or Token.Toolbar - def get_tokens(self, cli, width): - result = TokenList() - result.append((self.token, ' ')) + def get_toolbar_tokens(cli): + result = [] + result.append((token, ' ')) if cli.buffers['default'].completer.smart_completion: - result.append((self.token.On, '[F2] Smart Completion: ON ')) + result.append((token.On, '[F2] Smart Completion: ON ')) else: - result.append((self.token.Off, '[F2] Smart Completion: OFF ')) + result.append((token.Off, '[F2] Smart Completion: OFF ')) if cli.buffers['default'].always_multiline: - result.append((self.token.On, '[F3] Multiline: ON ')) + result.append((token.On, '[F3] Multiline: ON ')) else: - result.append((self.token.Off, '[F3] Multiline: OFF ')) + result.append((token.Off, '[F3] Multiline: OFF ')) if cli.buffers['default'].always_multiline: - result.append((self.token, + result.append((token, ' (Semi-colon [;] will end the line)')) - if self.key_binding_manager.enable_vi_mode: - result.append((self.token.On, '[F4] Vi-mode')) + if key_binding_manager.enable_vi_mode: + result.append((token.On, '[F4] Vi-mode')) else: - result.append((self.token.On, '[F4] Emacs-mode')) + result.append((token.On, '[F4] Emacs-mode')) return result + return get_toolbar_tokens diff --git a/setup.py b/setup.py index 800b91a2..2397610b 100644 --- a/setup.py +++ b/setup.py @@ -25,7 +25,7 @@ setup( install_requires=[ 'click >= 3.2', 'Pygments >= 2.0', # Pygments has to be Capitalcased. WTF? - 'prompt_toolkit==0.26', + 'prompt_toolkit==0.36', 'psycopg2 >= 2.5.4', 'sqlparse == 0.1.14' ], -- cgit v1.2.3