Пример #1
0
def make_xonfig_wizard(default_file=None, confirm=False, no_wizard_file=None):
    """Makes a configuration wizard for xonsh config file.

    Parameters
    ----------
    default_file : str, optional
        Default filename to save and load to. User will still be prompted.
    confirm : bool, optional
        Confirm that the main part of the wizard should be run.
    no_wizard_file : str, optional
        Filename for that will flag to future runs that the wizard should not be
        run again. If None (default), this defaults to default_file.
    """
    w = wiz.Wizard(children=[
        wiz.Message(message=WIZARD_HEAD),
        make_exit_message(),
        wiz.Message(message=WIZARD_FS),
        make_fs_wiz(),
        wiz.Message(message=WIZARD_ENV),
        wiz.YesNo(
            question=WIZARD_ENV_QUESTION, yes=make_env_wiz(), no=wiz.Pass()),
        wiz.Message(message=WIZARD_XONTRIB),
        wiz.YesNo(question=WIZARD_XONTRIB_QUESTION,
                  yes=make_xontribs_wiz(),
                  no=wiz.Pass()),
        wiz.Message(message="\n" + HR + "\n"),
        wiz.FileInserter(
            prefix="# XONSH WIZARD START",
            suffix="# XONSH WIZARD END",
            dump_rules=XONFIG_DUMP_RULES,
            default_file=default_file,
            check=True,
        ),
        wiz.Message(message=WIZARD_TAIL),
    ])
    if confirm:
        q = ("Would you like to run the xonsh configuration wizard now?\n\n"
             "1. Yes (You can abort at any time)\n"
             "2. No, but ask me next time.\n"
             "3. No, and don't ask me again.\n\n"
             "1, 2, or 3 [default: 2]? ")
        no_wizard_file = default_file if no_wizard_file is None else no_wizard_file
        passer = wiz.Pass()
        saver = wiz.SaveJSON(check=False,
                             ask_filename=False,
                             default_file=no_wizard_file)
        w = wiz.Question(q, {
            1: w,
            2: passer,
            3: saver
        },
                         converter=lambda x: int(x) if x != "" else 2)
    return w
Пример #2
0
def make_fs_wiz():
    """Makes the foreign shell part of the wizard."""
    cond = wiz.create_truefalse_cond(prompt='Add a foreign shell, ' + wiz.YN)
    fs = wiz.While(
        cond=cond,
        body=[
            wiz.Input('shell name (e.g. bash): ',
                      path='/foreign_shells/{idx}/shell'),
            wiz.StoreNonEmpty('interactive shell [bool, default=True]: ',
                              converter=to_bool,
                              show_conversion=True,
                              path='/foreign_shells/{idx}/interactive'),
            wiz.StoreNonEmpty('login shell [bool, default=False]: ',
                              converter=to_bool,
                              show_conversion=True,
                              path='/foreign_shells/{idx}/login'),
            wiz.StoreNonEmpty("env command [str, default='env']: ",
                              path='/foreign_shells/{idx}/envcmd'),
            wiz.StoreNonEmpty("alias command [str, default='alias']: ",
                              path='/foreign_shells/{idx}/aliascmd'),
            wiz.StoreNonEmpty(("extra command line arguments [list of str, "
                               "default=[]]: "),
                              converter=ast.literal_eval,
                              show_conversion=True,
                              path='/foreign_shells/{idx}/extra_args'),
            wiz.StoreNonEmpty('current environment [dict, default=None]: ',
                              converter=ast.literal_eval,
                              show_conversion=True,
                              path='/foreign_shells/{idx}/currenv'),
            wiz.StoreNonEmpty(
                'safely handle exceptions [bool, default=True]: ',
                converter=to_bool,
                show_conversion=True,
                path='/foreign_shells/{idx}/safe'),
            wiz.StoreNonEmpty("pre-command [str, default='']: ",
                              path='/foreign_shells/{idx}/prevcmd'),
            wiz.StoreNonEmpty("post-command [str, default='']: ",
                              path='/foreign_shells/{idx}/postcmd'),
            wiz.StoreNonEmpty("foreign function command [str, default=None]: ",
                              path='/foreign_shells/{idx}/funcscmd'),
            wiz.StoreNonEmpty("source command [str, default=None]: ",
                              path='/foreign_shells/{idx}/sourcer'),
            wiz.Message(message='')  # inserts a newline
        ])
    return fs
Пример #3
0
def make_xontrib(xon_item: tp.Tuple[str, Xontrib]):
    """Makes a message and StoreNonEmpty node for a xontrib."""
    name, xontrib = xon_item
    name = name or "<unknown-xontrib-name>"
    msg = "\n{BOLD_CYAN}" + name + "{RESET}\n"

    if xontrib.url:
        msg += "{RED}url:{RESET} " + xontrib.url + "\n"
    if xontrib.distribution:
        msg += "{RED}package:{RESET} " + xontrib.distribution.name + "\n"
        if xontrib.license:
            msg += "{RED}license:{RESET} " + xontrib.license + "\n"
    msg += "{PURPLE}installed?{RESET} "
    msg += ("no" if find_xontrib(name) is None else "yes") + "\n"
    msg += _wrap_paragraphs(xontrib.get_description(), width=69)
    if msg.endswith("\n"):
        msg = msg[:-1]
    mnode = wiz.Message(message=msg)
    convert = lambda x: name if to_bool(x) else wiz.Unstorable
    pnode = wiz.StoreNonEmpty(XONTRIB_PROMPT,
                              converter=convert,
                              path=_xontrib_path)
    return mnode, pnode
Пример #4
0
def make_xonfig_wizard(default_file=None, confirm=False):
    """Makes a configuration wizard for xonsh config file.

    Parameters
    ----------
    default_file : str, optional
        Default filename to save and load to. User will still be prompted.
    confirm : bool, optional
        Confirm that the main part of the wizard should be run.
    """
    w = wiz.Wizard(children=[
        wiz.Message(message=WIZARD_HEAD),
        make_exit_message(),
        wiz.Load(default_file=default_file, check=True),
        wiz.Message(message=WIZARD_FS),
        make_fs_wiz(),
        wiz.Message(message=WIZARD_ENV),
        wiz.YesNo(
            question=WIZARD_ENV_QUESTION, yes=make_env_wiz(), no=wiz.Pass()),
        wiz.Message(message=WIZARD_XONTRIB),
        wiz.YesNo(question=WIZARD_XONTRIB_QUESTION,
                  yes=make_xontribs_wiz(),
                  no=wiz.Pass()),
        wiz.Message(message='\n' + HR + '\n'),
        wiz.Save(default_file=default_file, check=True),
        wiz.Message(message=WIZARD_TAIL),
    ])
    if confirm:
        q = ("Would you like to run the xonsh configuration wizard now?\n\n"
             "1. Yes (You can abort at any time)\n"
             "2. No, but ask me next time.\n"
             "3. No, and don't ask me again.\n\n"
             "1, 2, or 3 [default: 2]? ")
        passer = wiz.Pass()
        saver = wiz.Save(check=False,
                         ask_filename=False,
                         default_file=default_file)
        w = wiz.Question(q, {
            1: w,
            2: passer,
            3: saver
        },
                         converter=lambda x: int(x) if x != '' else 2)
    return w
Пример #5
0
def make_envvar(name):
    """Makes a StoreNonEmpty node for an environment variable."""
    env = builtins.__xonsh_env__
    vd = env.get_docs(name)
    if not vd.configurable:
        return
    default = vd.default
    if '\n' in default:
        default = '\n' + _wrap_paragraphs(default, width=69)
    curr = env.get(name)
    if is_string(curr) and is_template_string(curr):
        curr = curr.replace('{', '{{').replace('}', '}}')
    curr = pprint.pformat(curr, width=69)
    if '\n' in curr:
        curr = '\n' + curr
    msg = ENVVAR_MESSAGE.format(name=name, default=default, current=curr,
                                docstr=_wrap_paragraphs(vd.docstr, width=69))
    mnode = wiz.Message(message=msg)
    ens = env.get_ensurer(name)
    path = '/env/' + name
    pnode = wiz.StoreNonEmpty(ENVVAR_PROMPT, converter=ens.convert,
                              show_conversion=True, path=path, retry=True,
                              store_raw=vd.store_as_str)
    return mnode, pnode