Limit the public interface of Completer.

Only schedule_completion_update and selection_changed are used
externally, so mark the rest of the API as private.
This commit is contained in:
Ryan Roden-Corrent 2016-07-11 21:01:23 -04:00
parent aedf5b930a
commit e5da179ebf
2 changed files with 25 additions and 24 deletions

View File

@ -61,25 +61,25 @@ class Completer(QObject):
self._timer = QTimer()
self._timer.setSingleShot(True)
self._timer.setInterval(0)
self._timer.timeout.connect(self.update_completion)
self._timer.timeout.connect(self._update_completion)
self._cursor_part = None
self._last_cursor_pos = None
self._last_text = None
objreg.get('config').changed.connect(self.on_auto_open_changed)
self.handle_signal_connections()
objreg.get('config').changed.connect(self._on_auto_open_changed)
self._handle_signal_connections()
self._cmd.clear_completion_selection.connect(
self.handle_signal_connections)
self._handle_signal_connections)
def __repr__(self):
return utils.get_repr(self)
@config.change_filter('completion', 'auto-open')
def on_auto_open_changed(self):
self.handle_signal_connections()
def _on_auto_open_changed(self):
self._handle_signal_connections()
@pyqtSlot()
def handle_signal_connections(self):
def _handle_signal_connections(self):
self._connect_signals(config.get('completion', 'auto-open'))
def _connect_signals(self, connect=True):
@ -95,7 +95,7 @@ class Completer(QObject):
"""
connections = [
(self._cmd.update_completion, self.schedule_completion_update),
(self._cmd.textChanged, self.on_text_edited),
(self._cmd.textChanged, self._on_text_edited),
]
if connect and not self._signals_connected:
@ -121,7 +121,7 @@ class Completer(QObject):
if not config.get('completion', 'auto-open'):
connected = self._connect_signals(True)
if connected:
self.update_completion()
self._update_completion()
def _model(self):
"""Convenience method to get the current completion model."""
@ -265,7 +265,7 @@ class Completer(QObject):
data = model.data(indexes[0])
if data is None:
return
parts = self.split()
parts = self._split()
try:
needs_quoting = cmdutils.cmd_dict[parts[0]].maxsplit is None
except KeyError:
@ -275,11 +275,11 @@ class Completer(QObject):
if model.count() == 1 and config.get('completion', 'quick-complete'):
# If we only have one item, we want to apply it immediately
# and go on to the next part.
self.change_completed_part(data, immediate=True)
self._change_completed_part(data, immediate=True)
else:
log.completion.debug("Will ignore next completion update.")
self._ignore_change = True
self.change_completed_part(data)
self._change_completed_part(data)
@pyqtSlot()
def schedule_completion_update(self):
@ -299,10 +299,10 @@ class Completer(QObject):
self._last_text = self._cmd.text()
@pyqtSlot()
def update_completion(self):
def _update_completion(self):
"""Check if completions are available and activate them."""
self.update_cursor_part()
parts = self.split()
self._update_cursor_part()
parts = self._split()
log.completion.debug(
"Updating completion - prefix {}, parts {}, cursor_part {}".format(
@ -354,8 +354,8 @@ class Completer(QObject):
if completion.enabled:
completion.show()
def split(self, keep=False):
"""Get the text split up in parts.
def _split(self, keep=False):
"""Get the text _split up in parts.
Args:
keep: Whether to keep special chars and whitespace.
@ -381,13 +381,13 @@ class Completer(QObject):
return parts
@pyqtSlot()
def update_cursor_part(self):
def _update_cursor_part(self):
"""Get the part index of the commandline where the cursor is over."""
cursor_pos = self._cmd.cursorPosition()
snippet = slice(cursor_pos - 1, cursor_pos + 1)
spaces = self._cmd.text()[snippet] == ' '
cursor_pos -= len(self._cmd.prefix())
parts = self.split(keep=True)
parts = self._split(keep=True)
log.completion.vdebug(
"text: {}, parts: {}, cursor_pos after removing prefix '{}': "
"{}".format(self._cmd.text(), parts, self._cmd.prefix(),
@ -429,7 +429,7 @@ class Completer(QObject):
self._cursor_part, spaces))
return
def change_completed_part(self, newtext, immediate=False):
def _change_completed_part(self, newtext, immediate=False):
"""Change the part we're currently completing in the commandline.
Args:
@ -438,7 +438,7 @@ class Completer(QObject):
including a trailing space and we shouldn't continue
completing the current item.
"""
parts = self.split()
parts = self._split()
log.completion.debug("changing part {} to '{}'".format(
self._cursor_part, newtext))
try:
@ -465,10 +465,10 @@ class Completer(QObject):
self._cmd.show_cmd.emit()
@pyqtSlot()
def on_text_edited(self):
def _on_text_edited(self):
"""Reset _empty_item_idx if text was edited."""
self._empty_item_idx = None
# We also want to update the cursor part and emit update_completion
# We also want to update the cursor part and emit _update_completion
# here, but that's already done for us by cursorPositionChanged
# anyways, so we don't need to do it twice.

View File

@ -219,7 +219,8 @@ def test_selection_changed(before, newtxt, count, quick_complete, after,
selection.indexes = unittest.mock.Mock(return_value=indexes)
completion_widget_stub.model = unittest.mock.Mock(return_value=model)
_set_cmd_prompt(cmd, before)
completer_obj.update_cursor_part()
# schedule_completion_update is needed to pick up the cursor position
completer_obj.schedule_completion_update()
completer_obj.selection_changed(selection, None)
model.data.assert_called_with(indexes[0])
_validate_cmd_prompt(cmd, after)