def test_format_prompt_with_broken_template(xonsh_builtins): for p in ('{user', '{user}{hostname'): assert partial_format_prompt(p) == p # '{{user' will be parsed to '{user' for p in ('{{user}', '{{user'): assert 'user' in partial_format_prompt(p)
def prompt(self): """Obtains the current prompt string.""" global RL_LIB, RL_CAN_RESIZE if RL_CAN_RESIZE: # This is needed to support some system where line-wrapping doesn't # work. This is a bug in upstream Python, or possibly readline. RL_LIB.rl_reset_screen_size() if self.need_more_lines: if self.mlprompt is None: try: self.mlprompt = multiline_prompt(curr=self._current_prompt) except Exception: # pylint: disable=broad-except print_exception() self.mlprompt = '<multiline prompt error> ' return self.mlprompt env = builtins.__xonsh_env__ # pylint: disable=no-member p = env.get('PROMPT') try: p = partial_format_prompt(p) except Exception: # pylint: disable=broad-except print_exception() hide = True if self._force_hide is None else self._force_hide p = ansi_partial_color_format(p, style=env.get('XONSH_COLOR_STYLE'), hide=hide) self._current_prompt = p self.settitle() return p
def test_format_prompt_with_invalid_func(xonsh_builtins): xonsh_builtins.__xonsh_env__ = Env() def p(): foo = bar # raises exception return '{user}' assert isinstance(partial_format_prompt(p), str)
def test_format_prompt_with_broken_template_in_func(xonsh_builtins): for p in ( lambda: '{user', lambda: '{{user', lambda: '{{user}', lambda: '{user}{hostname', ): # '{{user' will be parsed to '{user' assert 'user' in partial_format_prompt(p)
def test_format_prompt_with_func_that_raises(capsys, xonsh_builtins): xonsh_builtins.__xonsh_env__ = Env() template = 'tt {zerodiv} tt' exp = 'tt (ERROR:zerodiv) tt' formatter_dict = {'zerodiv': lambda: 1 / 0} obs = partial_format_prompt(template, formatter_dict) assert exp == obs out, err = capsys.readouterr() assert 'prompt: error' in err
def test_format_prompt_with_func_that_raises(capsys, xonsh_builtins): xonsh_builtins.__xonsh_env__ = Env() template = 'tt {zerodiv} tt' exp = 'tt (ERROR:zerodiv) tt' formatter_dict = {'zerodiv': lambda : 1/0} obs = partial_format_prompt(template, formatter_dict) assert exp == obs out, err = capsys.readouterr() assert 'prompt: error' in err
def prompt_tokens(self, cli): """Returns a list of (token, str) tuples for the current prompt.""" p = builtins.__xonsh_env__.get('PROMPT') try: p = partial_format_prompt(p) except Exception: # pylint: disable=broad-except print_exception() toks = partial_color_tokenize(p) self.settitle() return toks
def bottom_toolbar_tokens(self, cli): """Returns a list of (token, str) tuples for the current bottom toolbar. """ p = builtins.__xonsh_env__.get('BOTTOM_TOOLBAR') # partial_format_prompt does handle empty strings properly, # but this avoids descending into it in the common case of # $TOOLBAR == ''. if isinstance(p, str) and len(p) == 0: return [] try: p = partial_format_prompt(p) except Exception: # pylint: disable=broad-except print_exception() toks = partial_color_tokenize(p) return toks
def prompt(self): """Obtains the current prompt string.""" if self.need_more_lines: if self.mlprompt is None: try: self.mlprompt = multiline_prompt() except Exception: # pylint: disable=broad-except print_exception() self.mlprompt = '<multiline prompt error> ' return self.mlprompt env = builtins.__xonsh_env__ # pylint: disable=no-member p = env.get('PROMPT') try: p = partial_format_prompt(p) except Exception: # pylint: disable=broad-except print_exception() self.settitle() return p
def settitle(self): """Sets terminal title.""" env = builtins.__xonsh_env__ # pylint: disable=no-member term = env.get('TERM', None) # Shells running in emacs sets TERM to "dumb" or "eterm-color". # Do not set title for these to avoid garbled prompt. if (term is None and not ON_WINDOWS) or term in ['dumb', 'eterm-color', 'linux']: return t = env.get('TITLE') if t is None: return t = partial_format_prompt(t) if ON_WINDOWS and 'ANSICON' not in env: kernel32.SetConsoleTitleW(t) else: with open(1, 'wb', closefd=False) as f: # prevent xonsh from answering interative questions # on the next command by writing the title f.write("\x1b]0;{0}\x07".format(t).encode()) f.flush()
def settitle(self): """Sets terminal title.""" env = builtins.__xonsh_env__ # pylint: disable=no-member term = env.get('TERM', None) # Shells running in emacs sets TERM to "dumb" or "eterm-color". # Do not set title for these to avoid garbled prompt. if (term is None and not ON_WINDOWS) or term in [ 'dumb', 'eterm-color', 'linux' ]: return t = env.get('TITLE') if t is None: return t = partial_format_prompt(t) if ON_WINDOWS and 'ANSICON' not in env: kernel32.SetConsoleTitleW(t) else: with open(1, 'wb', closefd=False) as f: # prevent xonsh from answering interative questions # on the next command by writing the title f.write("\x1b]0;{0}\x07".format(t).encode()) f.flush()
def test_format_prompt_with_format_spec(inp, exp, formatter_dict, xonsh_builtins): obs = partial_format_prompt(template=inp, formatter_dict=formatter_dict) assert exp == obs