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
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
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
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
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