From 84e59b05ff0a17178da9ecdb6c5d084e48b42763 Mon Sep 17 00:00:00 2001 From: mathieui Date: Sun, 21 Aug 2016 15:27:53 +0200 Subject: =?UTF-8?q?Don=E2=80=99t=20call=20input=20completion()=20functions?= =?UTF-8?q?=20inside=20completion=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use a placeholder object that can run it afterwards, so that we don’t have side effects inside those functions. --- poezio/core/completions.py | 76 ++++++++++++++++++++++------------------------ poezio/core/structs.py | 16 +++++++++- poezio/plugin_manager.py | 6 ++-- poezio/tabs/basetabs.py | 9 ++++-- poezio/tabs/muctab.py | 31 ++++++++++--------- poezio/tabs/rostertab.py | 31 ++++++++++--------- 6 files changed, 93 insertions(+), 76 deletions(-) (limited to 'poezio') diff --git a/poezio/core/completions.py b/poezio/core/completions.py index 7dd2c970..25c23dd6 100644 --- a/poezio/core/completions.py +++ b/poezio/core/completions.py @@ -15,8 +15,7 @@ from poezio.common import safeJID from poezio.config import config from poezio.roster import roster -from poezio.core.structs import POSSIBLE_SHOW - +from poezio.core.structs import POSSIBLE_SHOW, Completion class CompletionCore: def __init__(self, core): @@ -25,15 +24,14 @@ class CompletionCore: def help(self, the_input): """Completion for /help.""" commands = sorted(self.core.commands.keys()) + sorted(self.core.current_tab().commands.keys()) - return the_input.new_completion(commands, 1, quotify=False) - + return Completion(the_input.new_completion, commands, 1, quotify=False) def status(self, the_input): """ Completion of /status """ if the_input.get_argument_position() == 1: - return the_input.new_completion([status for status in POSSIBLE_SHOW], 1, ' ', quotify=False) + return Completion(the_input.new_completion, [status for status in POSSIBLE_SHOW], 1, ' ', quotify=False) def presence(self, the_input): @@ -42,9 +40,9 @@ class CompletionCore: """ arg = the_input.get_argument_position() if arg == 1: - return the_input.auto_completion([jid for jid in roster.jids()], '', quotify=True) + return Completion(the_input.auto_completion, [jid for jid in roster.jids()], '', quotify=True) elif arg == 2: - return the_input.auto_completion([status for status in POSSIBLE_SHOW], '', quotify=True) + return Completion(the_input.auto_completion, [status for status in POSSIBLE_SHOW], '', quotify=True) def theme(self, the_input): @@ -63,7 +61,7 @@ class CompletionCore: theme_files = [name[:-3] for name in names if name.endswith('.py') and name != '__init__.py'] if 'default' not in theme_files: theme_files.append('default') - return the_input.new_completion(theme_files, 1, '', quotify=False) + return Completion(the_input.new_completion, theme_files, 1, '', quotify=False) def win(self, the_input): @@ -72,7 +70,7 @@ class CompletionCore: for tab in self.core.tabs: l.extend(tab.matching_names()) l = [i[1] for i in l] - return the_input.new_completion(l, 1, '', quotify=False) + return Completion(the_input.new_completion, l, 1, '', quotify=False) def join(self, the_input): @@ -107,7 +105,7 @@ class CompletionCore: relevant_rooms.extend(sorted(room[0] for room in bookmarks.items() if room[1])) if the_input.last_completion: - return the_input.new_completion([], 1, quotify=True) + return Completion(the_input.new_completion, [], 1, quotify=True) if jid.user: # we are writing the server: complete the server @@ -116,18 +114,18 @@ class CompletionCore: if tab.joined: serv_list.append('%s@%s' % (jid.user, safeJID(tab.name).host)) serv_list.extend(relevant_rooms) - return the_input.new_completion(serv_list, 1, quotify=True) + return Completion(the_input.new_completion, serv_list, 1, quotify=True) elif args[1].startswith('/'): # we completing only a resource - return the_input.new_completion(['/%s' % self.core.own_nick], 1, quotify=True) + return Completion(the_input.new_completion, ['/%s' % self.core.own_nick], 1, quotify=True) else: - return the_input.new_completion(relevant_rooms, 1, quotify=True) + return Completion(the_input.new_completion, relevant_rooms, 1, quotify=True) def version(self, the_input): """Completion for /version""" comp = reduce(lambda x, y: x + [i.jid for i in y], (roster[jid].resources for jid in roster.jids() if len(roster[jid])), []) - return the_input.new_completion(sorted(comp), 1, quotify=False) + return Completion(the_input.new_completion, sorted(comp), 1, quotify=False) def list(self, the_input): @@ -137,7 +135,7 @@ class CompletionCore: if tab.name not in muc_serv_list: muc_serv_list.append(safeJID(tab.name).server) if muc_serv_list: - return the_input.new_completion(muc_serv_list, 1, quotify=False) + return Completion(the_input.new_completion, muc_serv_list, 1, quotify=False) def move_tab(self, the_input): @@ -146,7 +144,7 @@ class CompletionCore: if n == 1: nodes = [tab.name for tab in self.core.tabs if tab] nodes.remove('Roster') - return the_input.new_completion(nodes, 1, ' ', quotify=True) + return Completion(the_input.new_completion, nodes, 1, ' ', quotify=True) def runkey(self, the_input): @@ -156,7 +154,7 @@ class CompletionCore: list_ = [] list_.extend(self.core.key_func.keys()) list_.extend(self.core.current_tab().key_func.keys()) - return the_input.new_completion(list_, 1, quotify=False) + return Completion(the_input.new_completion, list_, 1, quotify=False) def bookmark(self, the_input): @@ -165,7 +163,7 @@ class CompletionCore: n = the_input.get_argument_position(quoted=True) if n == 2: - return the_input.new_completion(['true', 'false'], 2, quotify=True) + return Completion(the_input.new_completion, ['true', 'false'], 2, quotify=True) if n >= 3: return False @@ -185,23 +183,23 @@ class CompletionCore: if nick not in nicks: nicks.append(nick) jids_list = ['%s/%s' % (jid.bare, nick) for nick in nicks] - return the_input.new_completion(jids_list, 1, quotify=True) + return Completion(the_input.new_completion, jids_list, 1, quotify=True) muc_list = [tab.name for tab in self.core.get_tabs(tabs.MucTab)] muc_list.sort() muc_list.append('*') - return the_input.new_completion(muc_list, 1, quotify=True) + return Completion(the_input.new_completion, muc_list, 1, quotify=True) def remove_bookmark(self, the_input): """Completion for /remove_bookmark""" - return the_input.new_completion([bm.jid for bm in self.core.bookmarks], 1, quotify=False) + return Completion(the_input.new_completion, [bm.jid for bm in self.core.bookmarks], 1, quotify=False) def decline(self, the_input): """Completion for /decline""" n = the_input.get_argument_position(quoted=True) if n == 1: - return the_input.auto_completion(sorted(self.core.pending_invites.keys()), 1, '', quotify=True) + return Completion(the_input.auto_completion, sorted(self.core.pending_invites.keys()), 1, '', quotify=True) def bind(self, the_input): @@ -213,7 +211,7 @@ class CompletionCore: else: return False - return the_input.new_completion(args, n, '', quotify=False) + return Completion(the_input.new_completion, args, n, '', quotify=False) def message(self, the_input): @@ -230,7 +228,7 @@ class CompletionCore: for jid in roster.jids(): if not len(roster[jid]): l.append(jid) - return the_input.new_completion(l, 1, '', quotify=True) + return Completion(the_input.new_completion, l, 1, '', quotify=True) def invite(self, the_input): @@ -242,14 +240,14 @@ class CompletionCore: bares = sorted(roster[contact].bare_jid for contact in roster.jids() if len(roster[contact])) off = sorted(jid for jid in roster.jids() if jid not in bares) comp = comp + bares + off - return the_input.new_completion(comp, n, quotify=True) + return Completion(the_input.new_completion, comp, n, quotify=True) elif n == 2: rooms = [] for tab in self.core.get_tabs(tabs.MucTab): if tab.joined: rooms.append(tab.name) rooms.sort() - return the_input.new_completion(rooms, n, '', quotify=True) + return Completion(the_input.new_completion, rooms, n, '', quotify=True) def activity(self, the_input): @@ -257,20 +255,20 @@ class CompletionCore: n = the_input.get_argument_position(quoted=True) args = common.shell_split(the_input.text) if n == 1: - return the_input.new_completion(sorted(pep.ACTIVITIES.keys()), n, quotify=True) + return Completion(the_input.new_completion, sorted(pep.ACTIVITIES.keys()), n, quotify=True) elif n == 2: if args[1] in pep.ACTIVITIES: l = list(pep.ACTIVITIES[args[1]]) l.remove('category') l.sort() - return the_input.new_completion(l, n, quotify=True) + return Completion(the_input.new_completion, l, n, quotify=True) def mood(self, the_input): """Completion for /mood""" n = the_input.get_argument_position(quoted=True) if n == 1: - return the_input.new_completion(sorted(pep.MOODS.keys()), 1, quotify=True) + return Completion(the_input.new_completion, sorted(pep.MOODS.keys()), 1, quotify=True) def last_activity(self, the_input): @@ -281,7 +279,7 @@ class CompletionCore: if n >= 2: return False comp = reduce(lambda x, y: x + [i.jid for i in y], (roster[jid].resources for jid in roster.jids() if len(roster[jid])), []) - return the_input.new_completion(sorted(comp), 1, '', quotify=False) + return Completion(the_input.new_completion, sorted(comp), 1, '', quotify=False) def server_cycle(self, the_input): @@ -290,7 +288,7 @@ class CompletionCore: for tab in self.core.get_tabs(tabs.MucTab): serv = safeJID(tab.name).server serv_list.add(serv) - return the_input.new_completion(sorted(serv_list), 1, ' ') + return Completion(the_input.new_completion, sorted(serv_list), 1, ' ') def set(self, the_input): @@ -303,7 +301,7 @@ class CompletionCore: if '|' in args[1]: plugin_name, section = args[1].split('|')[:2] if plugin_name not in self.core.plugin_manager.plugins: - return the_input.new_completion([], n, quotify=True) + return Completion(the_input.new_completion, [], n, quotify=True) plugin = self.core.plugin_manager.plugins[plugin_name] end_list = ['%s|%s' % (plugin_name, section) for section in plugin.config.sections()] else: @@ -315,7 +313,7 @@ class CompletionCore: if '|' in args[1]: plugin_name, section = args[1].split('|')[:2] if plugin_name not in self.core.plugin_manager.plugins: - return the_input.new_completion([''], n, quotify=True) + return Completion(the_input.new_completion, [''], n, quotify=True) plugin = self.core.plugin_manager.plugins[plugin_name] end_list = set(plugin.config.options(section or plugin_name)) if plugin.config.default: @@ -334,7 +332,7 @@ class CompletionCore: if '|' in args[1]: plugin_name, section = args[1].split('|')[:2] if plugin_name not in self.core.plugin_manager.plugins: - return the_input.new_completion([''], n, quotify=True) + return Completion(the_input.new_completion, [''], n, quotify=True) plugin = self.core.plugin_manager.plugins[plugin_name] end_list = [str(plugin.config.get(args[2], '', section or plugin_name)), ''] else: @@ -344,7 +342,7 @@ class CompletionCore: end_list = [str(config.get(args[2], '', args[1])), ''] else: return False - return the_input.new_completion(end_list, n, quotify=True) + return Completion(the_input.new_completion, end_list, n, quotify=True) def set_default(self, the_input): @@ -355,13 +353,13 @@ class CompletionCore: if n >= len(args): args.append('') if n == 1 or (n == 2 and config.has_section(args[1])): - return self.set(the_input) + return Completion(self.set, the_input) return False def toggle(self, the_input): "Completion for /toggle" - return the_input.new_completion(config.options('Poezio'), 1, quotify=False) + return Completion(the_input.new_completion, config.options('Poezio'), 1, quotify=False) def bookmark_local(self, the_input): @@ -387,8 +385,8 @@ class CompletionCore: if nick not in nicks: nicks.append(nick) jids_list = ['%s/%s' % (jid.bare, nick) for nick in nicks] - return the_input.new_completion(jids_list, 1, quotify=True) + return Completion(the_input.new_completion, jids_list, 1, quotify=True) muc_list = [tab.name for tab in self.core.get_tabs(tabs.MucTab)] muc_list.append('*') - return the_input.new_completion(muc_list, 1, quotify=True) + return Completion(the_input.new_completion, muc_list, 1, quotify=True) diff --git a/poezio/core/structs.py b/poezio/core/structs.py index 82effd48..7d568f04 100644 --- a/poezio/core/structs.py +++ b/poezio/core/structs.py @@ -3,7 +3,7 @@ Module defining structures useful to the core class and related methods """ __all__ = ['ERROR_AND_STATUS_CODES', 'DEPRECATED_ERRORS', 'POSSIBLE_SHOW', - 'Status', 'Command'] + 'Status', 'Command', 'Completion'] # http://xmpp.org/extensions/xep-0045.html#errorstatus ERROR_AND_STATUS_CODES = { @@ -62,3 +62,17 @@ class Command: self.comp = comp self.short_desc = short_desc self.usage = usage + +class Completion: + """ + A completion result essentially currying the input completion call. + """ + __slots__ = ['func', 'args', 'kwargs', 'comp_list'] + def __init__(self, func, comp_list, *args, **kwargs): + self.func = func + self.comp_list = comp_list + self.args = args + self.kwargs = kwargs + + def run(self): + return self.func(self.comp_list, *self.args, **self.kwargs) diff --git a/poezio/plugin_manager.py b/poezio/plugin_manager.py index 8e08432b..11584b23 100644 --- a/poezio/plugin_manager.py +++ b/poezio/plugin_manager.py @@ -10,7 +10,7 @@ from os import path import logging from poezio import tabs -from poezio.core.structs import Command +from poezio.core.structs import Command, Completion from poezio.plugin import PluginAPI from poezio.config import config @@ -284,7 +284,7 @@ class PluginManager(object): and name != '__init__.py' and not name.startswith('.')] plugins_files.sort() position = the_input.get_argument_position(quoted=False) - return the_input.new_completion(plugins_files, position, '', + return Completion(the_input.new_completion, plugins_files, position, '', quotify=False) def completion_unload(self, the_input): @@ -292,7 +292,7 @@ class PluginManager(object): completion function that completes the name of loaded plugins """ position = the_input.get_argument_position(quoted=False) - return the_input.new_completion(sorted(self.plugins.keys()), position, + return Completion(the_input.new_completion, sorted(self.plugins.keys()), position, '', quotify=False) def on_plugins_dir_change(self, new_value): diff --git a/poezio/tabs/basetabs.py b/poezio/tabs/basetabs.py index dbd57aa4..5e753643 100644 --- a/poezio/tabs/basetabs.py +++ b/poezio/tabs/basetabs.py @@ -20,7 +20,7 @@ import string import time from xml.etree import cElementTree as ET -from poezio.core.structs import Command +from poezio.core.structs import Command, Completion from poezio import timed_events from poezio import windows from poezio import xhtml @@ -230,7 +230,10 @@ class Tab(object): if command.comp is None: return False # There's no completion function else: - return command.comp(the_input) + comp = command.comp(the_input) + if comp: + return comp.run() + return comp return False def execute_command(self, provided_text): @@ -633,7 +636,7 @@ class ChatTab(Tab): def completion_correct(self, the_input): if self.last_sent_message and the_input.get_argument_position() == 1: - return the_input.auto_completion([self.last_sent_message['body']], '', quotify=False) + return Completion(the_input.auto_completion, [self.last_sent_message['body']], '', quotify=False) @property def inactive(self): diff --git a/poezio/tabs/muctab.py b/poezio/tabs/muctab.py index 281237ad..e17ab18b 100644 --- a/poezio/tabs/muctab.py +++ b/poezio/tabs/muctab.py @@ -32,6 +32,7 @@ from poezio.logger import logger from poezio.roster import roster from poezio.theming import get_theme, dump_tuple from poezio.user import User +from poezio.core.structs import Completion SHOW_NAME = { @@ -243,7 +244,7 @@ class MucTab(ChatTab): comp.sort() userlist.extend(comp) - return the_input.auto_completion(userlist, quotify=False) + return Completion(the_input.auto_completion, userlist, quotify=False) def completion_info(self, the_input): """Completion for /info""" @@ -251,7 +252,7 @@ class MucTab(ChatTab): userlist = [] for user in sorted(self.users, key=compare_users, reverse=True): userlist.append(user.nick) - return the_input.auto_completion(userlist, quotify=False) + return Completion(the_input.auto_completion, userlist, quotify=False) def completion_nick(self, the_input): """Completion for /nick""" @@ -259,11 +260,11 @@ class MucTab(ChatTab): config.get('default_nick'), self.core.get_bookmark_nickname(self.name)] nicks = [i for i in nicks if i] - return the_input.auto_completion(nicks, '', quotify=False) + return Completion(the_input.auto_completion, nicks, '', quotify=False) def completion_recolor(self, the_input): if the_input.get_argument_position() == 1: - return the_input.new_completion(['random'], 1, '', quotify=False) + return Completion(the_input.new_completion, ['random'], 1, '', quotify=False) return True def completion_color(self, the_input): @@ -273,13 +274,13 @@ class MucTab(ChatTab): userlist = [user.nick for user in self.users] if self.own_nick in userlist: userlist.remove(self.own_nick) - return the_input.new_completion(userlist, 1, '', quotify=True) + return Completion(the_input.new_completion, userlist, 1, '', quotify=True) elif n == 2: colors = [i for i in xhtml.colors if i] colors.sort() colors.append('unset') colors.append('random') - return the_input.new_completion(colors, 2, '', quotify=False) + return Completion(the_input.new_completion, colors, 2, '', quotify=False) def completion_ignore(self, the_input): """Completion for /ignore""" @@ -287,7 +288,7 @@ class MucTab(ChatTab): if self.own_nick in userlist: userlist.remove(self.own_nick) userlist.sort() - return the_input.auto_completion(userlist, quotify=False) + return Completion(the_input.auto_completion, userlist, quotify=False) def completion_role(self, the_input): """Completion for /role""" @@ -296,10 +297,10 @@ class MucTab(ChatTab): userlist = [user.nick for user in self.users] if self.own_nick in userlist: userlist.remove(self.own_nick) - return the_input.new_completion(userlist, 1, '', quotify=True) + return Completion(the_input.new_completion, userlist, 1, '', quotify=True) elif n == 2: possible_roles = ['none', 'visitor', 'participant', 'moderator'] - return the_input.new_completion(possible_roles, 2, '', + return Completion(the_input.new_completion, possible_roles, 2, '', quotify=True) def completion_affiliation(self, the_input): @@ -313,11 +314,11 @@ class MucTab(ChatTab): if self.core.xmpp.boundjid.bare in jidlist: jidlist.remove(self.core.xmpp.boundjid.bare) userlist.extend(jidlist) - return the_input.new_completion(userlist, 1, '', quotify=True) + return Completion(the_input.new_completion, userlist, 1, '', quotify=True) elif n == 2: possible_affiliations = ['none', 'member', 'admin', 'owner', 'outcast'] - return the_input.new_completion(possible_affiliations, 2, '', + return Completion(the_input.new_completion, possible_affiliations, 2, '', quotify=True) @command_args_parser.quoted(1, 1, ['']) @@ -332,7 +333,7 @@ class MucTab(ChatTab): """Completion for /invite""" n = the_input.get_argument_position(quoted=True) if n == 1: - return the_input.new_completion(roster.jids(), 1, quotify=True) + return Completion(the_input.new_completion, roster.jids(), 1, quotify=True) def scroll_user_list_up(self): self.user_win.scroll_up() @@ -714,7 +715,7 @@ class MucTab(ChatTab): def completion_topic(self, the_input): if the_input.get_argument_position() == 1: - return the_input.auto_completion([self.topic], '', quotify=False) + return Completion(the_input.auto_completion, [self.topic], '', quotify=False) def completion_quoted(self, the_input): """Nick completion, but with quotes""" @@ -725,7 +726,7 @@ class MucTab(ChatTab): if user.nick != self.own_nick: word_list.append(user.nick) - return the_input.new_completion(word_list, 1, quotify=True) + return Completion(the_input.new_completion, word_list, 1, quotify=True) @command_args_parser.quoted(1, 1) def command_kick(self, args): @@ -914,7 +915,7 @@ class MucTab(ChatTab): def completion_unignore(self, the_input): if the_input.get_argument_position() == 1: users = [user.nick for user in self.ignores] - return the_input.auto_completion(users, quotify=False) + return Completion(the_input.auto_completion, users, quotify=False) def resize(self): """ diff --git a/poezio/tabs/rostertab.py b/poezio/tabs/rostertab.py index f8b3e906..64aae731 100644 --- a/poezio/tabs/rostertab.py +++ b/poezio/tabs/rostertab.py @@ -25,6 +25,7 @@ from poezio.decorators import refresh_wrapper from poezio.roster import RosterGroup, roster from poezio.theming import get_theme, dump_tuple from poezio.decorators import command_args_parser +from poezio.core.structs import Completion from poezio.tabs import Tab @@ -277,7 +278,7 @@ class RosterInfoTab(Tab): elif n == 2: return self.completion_file(2, the_input) elif n == 3: - return the_input.new_completion(['true', 'false'], n) + return Completion(the_input.new_completion, ['true', 'false'], n) @command_args_parser.quoted(1) def command_cert_disable(self, args): @@ -399,7 +400,7 @@ class RosterInfoTab(Tab): """ if the_input.get_argument_position() == 1: jids = roster.jids() - return the_input.new_completion(jids, 1, '', quotify=False) + return Completion(the_input.new_completion, jids, 1, '', quotify=False) @command_args_parser.quoted(0, 1) def command_unblock(self, args): @@ -429,7 +430,7 @@ class RosterInfoTab(Tab): if iq['type'] == 'error': return l = sorted(str(item) for item in iq['blocklist']['items']) - return the_input.new_completion(l, 1, quotify=False) + return Completion(the_input.new_completion, l, 1, quotify=False) if the_input.get_argument_position(): self.core.xmpp.plugin['xep_0191'].get_blocked(callback=on_result) @@ -544,7 +545,7 @@ class RosterInfoTab(Tab): if n == complete_number: if args[n-1] == '' or len(args) < n+1: home = os.getenv('HOME') or '/' - return the_input.new_completion([home, '/tmp'], n, quotify=True) + return Completion(the_input.new_completion, [home, '/tmp'], n, quotify=True) path_ = args[n] if path.isdir(path_): dir_ = path_ @@ -567,7 +568,7 @@ class RosterInfoTab(Tab): if not name.startswith('.'): end_list.append(value) - return the_input.new_completion(end_list, n, quotify=True) + return Completion(the_input.new_completion, end_list, n, quotify=True) @command_args_parser.ignored def command_clear(self): @@ -872,24 +873,24 @@ class RosterInfoTab(Tab): Completion for /remove """ jids = [jid for jid in roster.jids()] - return the_input.auto_completion(jids, '', quotify=False) + return Completion(the_input.auto_completion, jids, '', quotify=False) def completion_name(self, the_input): """Completion for /name""" n = the_input.get_argument_position() if n == 1: jids = [jid for jid in roster.jids()] - return the_input.new_completion(jids, n, quotify=True) + return Completion(the_input.new_completion, jids, n, quotify=True) return False def completion_groupadd(self, the_input): n = the_input.get_argument_position() if n == 1: jids = sorted(jid for jid in roster.jids()) - return the_input.new_completion(jids, n, '', quotify=True) + return Completion(the_input.new_completion, jids, n, '', quotify=True) elif n == 2: groups = sorted(group for group in roster.groups if group != 'none') - return the_input.new_completion(groups, n, '', quotify=True) + return Completion(the_input.new_completion, groups, n, '', quotify=True) return False def completion_groupmove(self, the_input): @@ -897,7 +898,7 @@ class RosterInfoTab(Tab): n = the_input.get_argument_position() if n == 1: jids = sorted(jid for jid in roster.jids()) - return the_input.new_completion(jids, n, '', quotify=True) + return Completion(the_input.new_completion, jids, n, '', quotify=True) elif n == 2: contact = roster[args[1]] if not contact: @@ -905,10 +906,10 @@ class RosterInfoTab(Tab): groups = list(contact.groups) if 'none' in groups: groups.remove('none') - return the_input.new_completion(groups, n, '', quotify=True) + return Completion(the_input.new_completion, groups, n, '', quotify=True) elif n == 3: groups = sorted(group for group in roster.groups) - return the_input.new_completion(groups, n, '', quotify=True) + return Completion(the_input.new_completion, groups, n, '', quotify=True) return False def completion_groupremove(self, the_input): @@ -916,7 +917,7 @@ class RosterInfoTab(Tab): n = the_input.get_argument_position() if n == 1: jids = sorted(jid for jid in roster.jids()) - return the_input.new_completion(jids, n, '', quotify=True) + return Completion(the_input.new_completion, jids, n, '', quotify=True) elif n == 2: contact = roster[args[1]] if contact is None: @@ -926,7 +927,7 @@ class RosterInfoTab(Tab): groups.remove('none') except ValueError: pass - return the_input.new_completion(groups, n, '', quotify=True) + return Completion(the_input.new_completion, groups, n, '', quotify=True) return False def completion_deny(self, the_input): @@ -936,7 +937,7 @@ class RosterInfoTab(Tab): """ jids = sorted(str(contact.bare_jid) for contact in roster.contacts.values() if contact.pending_in) - return the_input.new_completion(jids, 1, '', quotify=False) + return Completion(the_input.new_completion, jids, 1, '', quotify=False) @command_args_parser.quoted(0, 1) def command_accept(self, args): -- cgit v1.2.3