def attr_complete(self, prefix, ctx): """Complete attributes of an object.""" attrs = set() m = RE_ATTR.match(prefix) if m is None: return attrs expr, attr = m.group(1, 3) expr = subexpr_from_unbalanced(expr, '(', ')') expr = subexpr_from_unbalanced(expr, '[', ']') expr = subexpr_from_unbalanced(expr, '{', '}') try: val = builtins.evalx(expr, glbs=ctx) except: # pylint:disable=bare-except try: val = builtins.evalx(expr, glbs=builtins.__dict__) except: # pylint:disable=bare-except return attrs # anything could have gone wrong! opts = dir(val) if len(attr) == 0: opts = [o for o in opts if not o.startswith('_')] else: opts = [o for o in opts if o.startswith(attr)] prelen = len(prefix) for opt in opts: a = getattr(val, opt) rpl = opt + '(' if callable(a) else opt # note that prefix[:prelen-len(attr)] != prefix[:-len(attr)] # when len(attr) == 0. comp = prefix[:prelen-len(attr)] + rpl attrs.add(comp) return attrs
def attr_complete(self, prefix, ctx): """Complete attributes of an object.""" attrs = set() m = RE_ATTR.match(prefix) if m is None: return attrs expr, attr = m.group(1, 3) expr = subexpr_from_unbalanced(expr, '(', ')') expr = subexpr_from_unbalanced(expr, '[', ']') expr = subexpr_from_unbalanced(expr, '{', '}') try: val = builtins.evalx(expr, glbs=ctx) except: # pylint:disable=bare-except try: val = builtins.evalx(expr, glbs=builtins.__dict__) except: # pylint:disable=bare-except return attrs # anything could have gone wrong! opts = dir(val) if len(attr) == 0: opts = [o for o in opts if not o.startswith('_')] else: csc = builtins.__xonsh_env__.get('CASE_SENSITIVE_COMPLETIONS') startswither = startswithnorm if csc else startswithlow attrlow = attr.lower() opts = [o for o in opts if startswither(o, attr, attrlow)] prelen = len(prefix) for opt in opts: a = getattr(val, opt) rpl = opt + '(' if callable(a) else opt # note that prefix[:prelen-len(attr)] != prefix[:-len(attr)] # when len(attr) == 0. comp = prefix[:prelen - len(attr)] + rpl attrs.add(comp) return attrs
def attr_complete(prefix, ctx, filter_func): """Complete attributes of an object.""" attrs = set() m = RE_ATTR.match(prefix) if m is None: return attrs expr, attr = m.group(1, 3) expr = xt.subexpr_from_unbalanced(expr, '(', ')') expr = xt.subexpr_from_unbalanced(expr, '[', ']') expr = xt.subexpr_from_unbalanced(expr, '{', '}') _ctx = None xonsh_safe_eval = builtins.__xonsh_execer__.eval try: val = xonsh_safe_eval(expr, ctx, transform=False) _ctx = ctx except: # pylint:disable=bare-except try: val = xonsh_safe_eval(expr, builtins.__dict__, transform=False) _ctx = builtins.__dict__ except: # pylint:disable=bare-except return attrs # anything could have gone wrong! if len(attr) == 0: opts = [o for o in dir(val) if not o.startswith('_')] else: opts = [o for o in dir(val) if filter_func(o, attr)] prelen = len(prefix) for opt in opts: # check whether these options actually work (e.g., disallow 7.imag) try: _val = '{0}.{1}'.format(expr, opt) xonsh_safe_eval(_val, _ctx, transform=False) except: # pylint:disable=bare-except continue a = getattr(val, opt) if builtins.__xonsh_env__['COMPLETIONS_BRACKETS']: if callable(a): rpl = opt + '(' elif isinstance(a, (cabc.Sequence, cabc.Mapping)): rpl = opt + '[' else: rpl = opt else: rpl = opt # note that prefix[:prelen-len(attr)] != prefix[:-len(attr)] # when len(attr) == 0. comp = prefix[:prelen - len(attr)] + rpl attrs.add(comp) return attrs
def attr_complete(self, prefix, ctx): """Complete attributes of an object.""" attrs = set() m = RE_ATTR.match(prefix) if m is None: return attrs expr, attr = m.group(1, 3) expr = subexpr_from_unbalanced(expr, '(', ')') expr = subexpr_from_unbalanced(expr, '[', ']') expr = subexpr_from_unbalanced(expr, '{', '}') _ctx = None try: val = eval(expr, ctx) _ctx = ctx except: # pylint:disable=bare-except try: val = eval(expr, builtins.__dict__) _ctx = builtins.__dict__ except: # pylint:disable=bare-except return attrs # anything could have gone wrong! _opts = dir(val) # check whether these options actually work (e.g., disallow 7.imag) opts = [] for i in _opts: try: eval('{0}.{1}'.format(expr, i), _ctx) except: # pylint:disable=bare-except continue else: opts.append(i) if len(attr) == 0: opts = [o for o in opts if not o.startswith('_')] else: csc = builtins.__xonsh_env__.get('CASE_SENSITIVE_COMPLETIONS') startswither = startswithnorm if csc else startswithlow attrlow = attr.lower() opts = [o for o in opts if startswither(o, attr, attrlow)] prelen = len(prefix) for opt in opts: a = getattr(val, opt) rpl = opt + '(' if callable(a) else opt # note that prefix[:prelen-len(attr)] != prefix[:-len(attr)] # when len(attr) == 0. comp = prefix[:prelen - len(attr)] + rpl attrs.add(comp) return attrs
def test_subexpr_from_unbalanced_parens(): cases = [ ('f(x.', 'x.'), ('f(1,x.', 'x.'), ('f((1,10),x.y', 'x.y'), ] for expr, exp in cases: obs = subexpr_from_unbalanced(expr, '(', ')') yield assert_equal, exp, obs
def attr_complete(prefix, ctx, filter_func): """Complete attributes of an object.""" attrs = set() m = RE_ATTR.match(prefix) if m is None: return attrs expr, attr = m.group(1, 3) expr = xt.subexpr_from_unbalanced(expr, '(', ')') expr = xt.subexpr_from_unbalanced(expr, '[', ']') expr = xt.subexpr_from_unbalanced(expr, '{', '}') val, _ctx = _safe_eval(expr, ctx) if val is None and _ctx is None: return attrs if len(attr) == 0: opts = [o for o in dir(val) if not o.startswith('_')] else: opts = [o for o in dir(val) if filter_func(o, attr)] prelen = len(prefix) for opt in opts: # check whether these options actually work (e.g., disallow 7.imag) _expr = '{0}.{1}'.format(expr, opt) _val_, _ctx_ = _safe_eval(_expr, _ctx) if _val_ is None and _ctx_ is None: continue a = getattr(val, opt) if builtins.__xonsh_env__['COMPLETIONS_BRACKETS']: if callable(a): rpl = opt + '(' elif isinstance(a, (cabc.Sequence, cabc.Mapping)): rpl = opt + '[' else: rpl = opt else: rpl = opt # note that prefix[:prelen-len(attr)] != prefix[:-len(attr)] # when len(attr) == 0. comp = prefix[:prelen - len(attr)] + rpl attrs.add(comp) return attrs
def attr_complete(prefix, ctx, filter_func): """Complete attributes of an object.""" attrs = set() m = RE_ATTR.match(prefix) if m is None: return attrs expr, attr = m.group(1, 3) expr = xt.subexpr_from_unbalanced(expr, "(", ")") expr = xt.subexpr_from_unbalanced(expr, "[", "]") expr = xt.subexpr_from_unbalanced(expr, "{", "}") val, _ctx = _safe_eval(expr, ctx) if val is None and _ctx is None: return attrs if len(attr) == 0: opts = [o for o in dir(val) if not o.startswith("_")] else: opts = [o for o in dir(val) if filter_func(o, attr)] prelen = len(prefix) for opt in opts: # check whether these options actually work (e.g., disallow 7.imag) _expr = f"{expr}.{opt}" _val_, _ctx_ = _safe_eval(_expr, _ctx) if _val_ is None and _ctx_ is None: continue a = getattr(val, opt) if XSH.env["COMPLETIONS_BRACKETS"]: if callable(a): rpl = opt + "(" elif isinstance(a, (cabc.Sequence, cabc.Mapping)): rpl = opt + "[" else: rpl = opt else: rpl = opt # note that prefix[:prelen-len(attr)] != prefix[:-len(attr)] # when len(attr) == 0. comp = prefix[: prelen - len(attr)] + rpl attrs.add(comp) return attrs
def test_subexpr_from_unbalanced_parens(inp, exp): obs = subexpr_from_unbalanced(inp, "(", ")") assert exp == obs
def test_subexpr_from_unbalanced_parens(inp, exp): obs = subexpr_from_unbalanced(inp, '(', ')') assert exp == obs