def run(commands, shell='/bin/bash', prompt_template='default', speed=1, quiet=False, test_mode=False, commentecho=False): if not quiet: secho("We'll do it live!", fg='red', bold=True) secho('STARTING SESSION: Press Ctrl-C at any time to exit.', fg='yellow', bold=True) click.pause() click.clear() state = SessionState(shell=shell, prompt_template=prompt_template, speed=speed, test_mode=test_mode, commentecho=commentecho) i = 0 while i < len(commands): command = commands[i].strip() i += 1 if not command: continue shell_match = SHELL_RE.match(command) if command.startswith('#'): # Parse comment magic match = OPTION_RE.match(command) if match: option, arg = match.group('option'), match.group('arg') func = OPTION_MAP[option] func(state, arg) elif state.commentecho(): comment = command.lstrip("#") secho(comment, fg='yellow', bold=True) continue elif shell_match: shell_name = shell_match.groups()[0].strip() py_commands = [] more = True while more: # slurp up all the python code try: py_command = commands[i].rstrip() except IndexError: raise SessionError('Unmatched {0} code block in ' 'session file.'.format(shell_name)) i += 1 if py_command.startswith('```'): i += 1 more = False else: py_commands.append(py_command) # Run the player console magictype(shell_name, prompt_template=state['prompt_template'], speed=state['speed']) if shell_name == 'ipython': try: from doitlive.ipython import start_ipython_player except ImportError: raise RuntimeError( '```ipython blocks require IPython to be installed') start_ipython_player(py_commands, speed=state['speed']) else: start_python_player(py_commands, speed=state['speed']) else: magicrun(command, **state) echo_prompt(state['prompt_template']) wait_for(RETURNS) secho("FINISHED SESSION", fg='yellow', bold=True)
def run( commands, shell=None, prompt_template="default", speed=1, quiet=False, test_mode=False, commentecho=False, ): """Main function for "magic-running" a list of commands.""" if not quiet: secho("We'll do it live!", fg="red", bold=True) secho( "STARTING SESSION: Press Ctrl-C at any time to exit.", fg="yellow", bold=True, ) click.pause() click.clear() state = SessionState( shell=shell, prompt_template=prompt_template, speed=speed, test_mode=test_mode, commentecho=commentecho, ) i = 0 while i < len(commands): command = commands[i].strip() i += 1 if not command: continue is_comment = command.startswith("#") if not is_comment: command_as_list = shlex.split(command) else: command_as_list = None shell_match = SHELL_RE.match(command) if is_comment: # Parse comment magic match = OPTION_RE.match(command) if match: option, arg = match.group("option"), match.group("arg") func = OPTION_MAP[option] func(state, arg) elif state.commentecho(): comment = command.lstrip("#") secho(comment, fg="yellow", bold=True) continue # Handle 'export' and 'alias' commands by storing them in SessionState elif command_as_list and command_as_list[0] in ["alias", "export"]: magictype(command, prompt_template=state["prompt_template"], speed=state["speed"]) # Store the raw commands instead of using add_envvar and add_alias # to avoid having to parse the command ourselves state.add_command(command) # Handle ```python and ```ipython by running "player" consoles elif shell_match: shell_name = shell_match.groups()[0].strip() py_commands = [] more = True while more: # slurp up all the python code try: py_command = commands[i].rstrip() except IndexError: raise SessionError("Unmatched {} code block in " "session file.".format(shell_name)) i += 1 if py_command.startswith("```"): i += 1 more = False else: py_commands.append(py_command) # Run the player console magictype( shell_name, prompt_template=state["prompt_template"], speed=state["speed"], ) if shell_name == "ipython": from doitlive.ipython import start_ipython_player # dedent all the commands to account for IPython's autoindentation ipy_commands = [textwrap.dedent(cmd) for cmd in py_commands] start_ipython_player(ipy_commands, speed=state["speed"]) else: start_python_player(py_commands, speed=state["speed"]) else: # goto_stealthmode determines when to switch to stealthmode goto_stealthmode = magicrun(command, **state) # stealthmode allows user to type live commands outside of automated script i -= stealthmode(state, goto_stealthmode) echo_prompt(state["prompt_template"]) wait_for(RETURNS) if not quiet: secho("FINISHED SESSION", fg="yellow", bold=True)