def _formatargspec(self, args, varargs=None, varkw=None, defaults=None, formatarg=str, formatvarargs=lambda name: '*' + name, formatvarkw=lambda name: '**' + name, formatvalue=lambda value: '=' + repr(value), join=inspect.joinseq): """Format an argument spec from the 4 values returned by getargspec. The first four arguments are (args, varargs, varkw, defaults). The other four arguments are the corresponding optional formatting functions that are called to turn names and values into strings. The ninth argument is an optional function to format the sequence of arguments.""" specs = [] if defaults: firstdefault = len(args) - len(defaults) for i in range(len(args)): spec = inspect.strseq(args[i], formatarg, join) if defaults and i >= firstdefault: d = defaults[i - firstdefault] # this is the difference from the original formatargspec() function # to use nicer names then the default repr() output if hasattr(d, '__name__'): d = d.__name__ spec = spec + formatvalue(d) specs.append(spec) if varargs is not None: specs.append(formatvarargs(varargs)) if varkw is not None: specs.append(formatvarkw(varkw)) return ', '.join(specs)
def formatargspec(args, varargs=None, varkw=None, defaults=None): formatarg=str formatvarargs=lambda name: '*' + name formatvarkw=lambda name: '**' + name formatvalue=_formatval specs = [] if defaults: firstdefault = len(args) - len(defaults) for i in range(len(args)): spec = strseq(args[i], formatarg, joinseq) if defaults and i >= firstdefault: spec = spec + formatvalue(defaults[i - firstdefault]) specs.append(spec) if varargs is not None: specs.append(formatvarargs(varargs)) if varkw is not None: specs.append(formatvarkw(varkw)) return specs
def formatted_argspec(funcprops, arg_pos, columns, config): # Pretty directly taken from bpython.cli func = funcprops.func args = funcprops.argspec.args kwargs = funcprops.argspec.defaults _args = funcprops.argspec.varargs _kwargs = funcprops.argspec.varkwargs is_bound_method = funcprops.is_bound_method if py3: kwonly = funcprops.argspec.kwonly kwonly_defaults = funcprops.argspec.kwonly_defaults or dict() arg_color = func_for_letter(config.color_scheme['name']) func_color = func_for_letter(config.color_scheme['name'].swapcase()) punctuation_color = func_for_letter(config.color_scheme['punctuation']) token_color = func_for_letter(config.color_scheme['token']) bolds = { token_color: lambda x: bold(token_color(x)), arg_color: lambda x: bold(arg_color(x)) } s = func_color(func) + arg_color(': (') if is_bound_method and isinstance(arg_pos, int): # TODO what values could this have? arg_pos += 1 for i, arg in enumerate(args): kw = None if kwargs and i >= len(args) - len(kwargs): kw = str(kwargs[i - (len(args) - len(kwargs))]) color = token_color if arg_pos in (i, arg) else arg_color if i == arg_pos or arg == arg_pos: color = bolds[color] if not py3: s += color(inspect.strseq(arg, unicode)) else: s += color(arg) if kw is not None: s += punctuation_color('=') if not py3: kw = kw.decode('ascii', 'replace') s += token_color(kw) if i != len(args) - 1: s += punctuation_color(', ') if _args: if args: s += punctuation_color(', ') s += token_color('*%s' % (_args, )) if py3 and kwonly: if not _args: if args: s += punctuation_color(', ') s += punctuation_color('*') marker = object() for arg in kwonly: s += punctuation_color(', ') color = token_color if arg_pos: color = bolds[color] s += color(arg) default = kwonly_defaults.get(arg, marker) if default is not marker: s += punctuation_color('=') s += token_color(repr(default)) if _kwargs: if args or _args or (py3 and kwonly): s += punctuation_color(', ') s += token_color('**%s' % (_kwargs, )) s += punctuation_color(')') return linesplit(s, columns)
def formatted_argspec(funcprops, arg_pos, columns, config): # Pretty directly taken from bpython.cli func = funcprops.func args = funcprops.argspec.args kwargs = funcprops.argspec.defaults _args = funcprops.argspec.varargs _kwargs = funcprops.argspec.varkwargs is_bound_method = funcprops.is_bound_method if py3: kwonly = funcprops.argspec.kwonly kwonly_defaults = funcprops.argspec.kwonly_defaults or dict() arg_color = func_for_letter(config.color_scheme['name']) func_color = func_for_letter(config.color_scheme['name'].swapcase()) punctuation_color = func_for_letter(config.color_scheme['punctuation']) token_color = func_for_letter(config.color_scheme['token']) bolds = {token_color: lambda x: bold(token_color(x)), arg_color: lambda x: bold(arg_color(x))} s = func_color(func) + arg_color(': (') if is_bound_method and isinstance(arg_pos, int): # TODO what values could this have? arg_pos += 1 for i, arg in enumerate(args): kw = None if kwargs and i >= len(args) - len(kwargs): kw = str(kwargs[i - (len(args) - len(kwargs))]) color = token_color if arg_pos in (i, arg) else arg_color if i == arg_pos or arg == arg_pos: color = bolds[color] if not py3: s += color(inspect.strseq(arg, unicode)) else: s += color(arg) if kw is not None: s += punctuation_color('=') if not py3: kw = kw.decode('ascii', 'replace') s += token_color(kw) if i != len(args) - 1: s += punctuation_color(', ') if _args: if args: s += punctuation_color(', ') s += token_color('*%s' % (_args,)) if py3 and kwonly: if not _args: if args: s += punctuation_color(', ') s += punctuation_color('*') marker = object() for arg in kwonly: s += punctuation_color(', ') color = token_color if arg_pos: color = bolds[color] s += color(arg) default = kwonly_defaults.get(arg, marker) if default is not marker: s += punctuation_color('=') s += token_color(repr(default)) if _kwargs: if args or _args or (py3 and kwonly): s += punctuation_color(', ') s += token_color('**%s' % (_kwargs,)) s += punctuation_color(')') return linesplit(s, columns)
def _populate_completion(self): widget_list = self.tooltip.body while widget_list: widget_list.pop() # This is just me flailing around wildly. TODO: actually write. if self.complete(): if self.argspec: # This is mostly just stolen from the cli module. func_name, args, is_bound, in_arg = self.argspec args, varargs, varkw, defaults = args[:4] if py3: kwonly = self.argspec[1][4] kwonly_defaults = self.argspec[1][5] or {} else: kwonly, kwonly_defaults = [], {} markup = [('bold name', func_name), ('name', ': (')] # the isinstance checks if we're in a positional arg # (instead of a keyword arg), I think if is_bound and isinstance(in_arg, int): in_arg += 1 # bpython.cli checks if this goes off the edge and # does clever wrapping. I do not (yet). for k, i in enumerate(args): if defaults and k + 1 > len(args) - len(defaults): kw = repr(defaults[k - (len(args) - len(defaults))]) else: kw = None if not k and str(i) == 'self': color = 'name' else: color = 'token' if k == in_arg or i == in_arg: color = 'bold ' + color if not py3: # See issue #138: We need to format tuple unpacking correctly # We use the undocumented function inspection.strseq() for # that. Fortunately, that madness is gone in Python 3. markup.append((color, inspect.strseq(i, str))) else: markup.append((color, str(i))) if kw is not None: markup.extend([('punctuation', '='), ('token', kw)]) if k != len(args) - 1: markup.append(('punctuation', ', ')) if varargs: if args: markup.append(('punctuation', ', ')) markup.append(('token', '*' + varargs)) if kwonly: if not varargs: if args: markup.append(('punctuation', ', ')) markup.append(('punctuation', '*')) for arg in kwonly: if arg == in_arg: color = 'bold token' else: color = 'token' markup.extend([('punctuation', ', '), (color, arg)]) if arg in kwonly_defaults: markup.extend([('punctuation', '='), ('token', kwonly_defaults[arg])]) if varkw: if args or varargs or kwonly: markup.append(('punctuation', ', ')) markup.append(('token', '**' + varkw)) markup.append(('punctuation', ')')) widget_list.append(urwid.Text(markup)) if self.matches_iter.matches: attr_map = {} focus_map = {'main': 'operator'} texts = [urwid.AttrMap(urwid.Text(('main', match)), attr_map, focus_map) for match in self.matches_iter.matches] width = max(text.original_widget.pack()[0] for text in texts) gridflow = urwid.GridFlow(texts, width, 1, 0, 'left') widget_list.append(gridflow) self.tooltip.grid = gridflow self.overlay.tooltip_focus = False else: self.tooltip.grid = None self.frame.body = self.overlay else: self.frame.body = self.listbox self.tooltip.grid = None if self.docstring: # TODO: use self.format_docstring? needs a width/height... docstring = self.docstring widget_list.append(urwid.Text(('comment', docstring)))
def _populate_completion(self): widget_list = self.tooltip.body while widget_list: widget_list.pop() # This is just me flailing around wildly. TODO: actually write. if self.complete(): if self.argspec: # This is mostly just stolen from the cli module. func_name, args, is_bound, in_arg = self.argspec args, varargs, varkw, defaults = args[:4] if py3: kwonly, kwonly_defaults = args[4:] else: kwonly, kwonly_defaults = [], {} markup = [('bold name', func_name), ('name', ': (')] # the isinstance checks if we're in a positional arg # (instead of a keyword arg), I think if is_bound and isinstance(in_arg, int): in_arg += 1 # bpython.cli checks if this goes off the edge and # does clever wrapping. I do not (yet). for k, i in enumerate(args): if defaults and k + 1 > len(args) - len(defaults): kw = repr(defaults[k - (len(args) - len(defaults))]) else: kw = None if not k and str(i) == 'self': color = 'name' else: color = 'token' if k == in_arg or i == in_arg: color = 'bold ' + color if not py3: # See issue #138: We need to format tuple unpacking correctly # We use the undocumented function inspection.strseq() for # that. Fortunately, that madness is gone in Python 3. markup.append((color, inspect.strseq(i, str))) else: markup.append((color, str(i))) if kw is not None: markup.extend([('punctuation', '='), ('token', kw)]) if k != len(args) - 1: markup.append(('punctuation', ', ')) if varargs: if args: markup.append(('punctuation', ', ')) markup.append(('token', '*' + varargs)) if kwonly: if not varargs: if args: markup.append(('punctuation', ', ')) markup.append(('punctuation', '*')) for arg in kwonly: if arg == in_arg: color = 'bold token' else: color = 'token' markup.extend([('punctuation', ', '), (color, arg)]) if arg in kwonly_defaults: markup.extend([('punctuation', '='), ('token', kwonly_defaults[arg])]) if varkw: if args or varargs or kwonly: markup.append(('punctuation', ', ')) markup.append(('token', '**' + varkw)) markup.append(('punctuation', ')')) widget_list.append(urwid.Text(markup)) if self.matches: attr_map = {} focus_map = {'main': 'operator'} texts = [ urwid.AttrMap(urwid.Text(('main', match)), attr_map, focus_map) for match in self.matches ] width = max(text.original_widget.pack()[0] for text in texts) gridflow = urwid.GridFlow(texts, width, 1, 0, 'left') widget_list.append(gridflow) self.tooltip.grid = gridflow self.overlay.tooltip_focus = False else: self.tooltip.grid = None self.frame.body = self.overlay else: self.frame.body = self.listbox self.tooltip.grid = None if self.docstring: # TODO: use self.format_docstring? needs a width/height... docstring = self.docstring widget_list.append(urwid.Text(('comment', docstring)))
def formatted_argspec(argspec, columns, config): # Pretty directly taken from bpython.cli is_bound_method = argspec[2] func = argspec[0] args = argspec[1][0] kwargs = argspec[1][3] _args = argspec[1][1] #*args _kwargs = argspec[1][2] #**kwargs is_bound_method = argspec[2] in_arg = argspec[3] if py3: kwonly = argspec[1][4] kwonly_defaults = argspec[1][5] or dict() arg_color = func_for_letter(config.color_scheme['name']) func_color = func_for_letter(config.color_scheme['name'].swapcase()) punctuation_color = func_for_letter(config.color_scheme['punctuation']) token_color = func_for_letter(config.color_scheme['token']) bolds = {token_color: lambda x: bold(token_color(x)), arg_color: lambda x: bold(arg_color(x))} s = func_color(func) + arg_color(': (') if is_bound_method and isinstance(in_arg, int): #TODO what values could this have? in_arg += 1 for i, arg in enumerate(args): kw = None if kwargs and i >= len(args) - len(kwargs): kw = str(kwargs[i - (len(args) - len(kwargs))]) color = token_color if in_arg in (i, arg) else arg_color if i == in_arg or arg == in_arg: color = bolds[color] if not py3: s += color(inspect.strseq(arg, str)) else: s += color(arg) if kw is not None: s += punctuation_color('=') s += token_color(kw) if i != len(args) - 1: s += punctuation_color(', ') if _args: if args: s += punctuation_color(', ') s += token_color('*%s' % (_args,)) if py3 and kwonly: if not _args: if args: s += punctuation_color(', ') s += punctuation_color('*') marker = object() for arg in kwonly: s += punctuation_color(', ') color = token_color if in_arg: color = bolds[color] s += color(arg) default = kwonly_defaults.get(arg, marker) if default is not marker: s += punctuation_color('=') s += token_color(repr(default)) if _kwargs: if args or _args or (py3 and kwonly): s += punctuation_color(', ') s += token_color('**%s' % (_kwargs,)) s += punctuation_color(')') return linesplit(s, columns)
def formatted_argspec(argspec, columns, config): # Pretty directly taken from bpython.cli is_bound_method = argspec[2] func = argspec[0] args = argspec[1][0] kwargs = argspec[1][3] _args = argspec[1][1] #*args _kwargs = argspec[1][2] #**kwargs is_bound_method = argspec[2] in_arg = argspec[3] if py3: kwonly = argspec[1][4] kwonly_defaults = argspec[1][5] or dict() arg_color = func_for_letter(config.color_scheme['name']) func_color = func_for_letter(config.color_scheme['name'].swapcase()) punctuation_color = func_for_letter(config.color_scheme['punctuation']) token_color = func_for_letter(config.color_scheme['token']) bolds = { token_color: lambda x: bold(token_color(x)), arg_color: lambda x: bold(arg_color(x)) } s = func_color(func) + arg_color(': (') if is_bound_method and isinstance(in_arg, int): #TODO what values could this have? in_arg += 1 for i, arg in enumerate(args): kw = None if kwargs and i >= len(args) - len(kwargs): kw = str(kwargs[i - (len(args) - len(kwargs))]) color = token_color if in_arg in (i, arg) else arg_color if i == in_arg or arg == in_arg: color = bolds[color] if not py3: s += color(inspect.strseq(arg, str)) else: s += color(arg) if kw is not None: s += punctuation_color('=') s += token_color(kw) if i != len(args) - 1: s += punctuation_color(', ') if _args: if args: s += punctuation_color(', ') s += token_color('*%s' % (_args, )) if py3 and kwonly: if not _args: if args: s += punctuation_color(', ') s += punctuation_color('*') marker = object() for arg in kwonly: s += punctuation_color(', ') color = token_color if in_arg: color = bolds[color] s += color(arg) default = kwonly_defaults.get(arg, marker) if default is not marker: s += punctuation_color('=') s += token_color(repr(default)) if _kwargs: if args or _args or (py3 and kwonly): s += punctuation_color(', ') s += token_color('**%s' % (_kwargs, )) s += punctuation_color(')') return linesplit(s, columns)