def show_help(command_name: str = None, raw_args: str = '') -> Response: """ Prints the basic command help to the console """ response = Response() cmds = fetch() if command_name and command_name in cmds: parser, result = parse.get_parser(cmds[command_name], parse.explode_line(raw_args), dict()) if parser is not None: out = parser.format_help() return response.notify( kind='INFO', code='COMMAND_DESCRIPTION').kernel(commands=out).console( out, whitespace=1).response environ.log_header('Available Commands') response.consume(print_module_help()) return response.fail(code='NO_SUCH_COMMAND', message='Failed to show command help for "{}"'.format( command_name)).console( """ For more information on the various commands, enter help on the specific command: help [COMMAND] """, whitespace_bottom=1).response
def execute(name: str, raw_args: str, response: Response = None, remote_connection: 'environ.RemoteConnection' = None) -> Response: """ :return: """ if not response: response = Response(identifier=name) command_module = fetch().get(name) if command_module is None: return response.fail( code='NO_SUCH_COMMAND', message='There is no command "{}"'.format(name)).kernel( name=name).console(""" "{name}" is not a recognized command. For a list of available commands enter help or ?. """.format(name=name)).response args = parse.args(command_module, raw_args) response.consume(args.response) if args.parser is None: # The parse failed and the execution should be aborted return response if args.args is None or args.args['show_help']: # Overrides standard execution and instead displays the help for the # command args.parser.print_help() return response del args.args['show_help'] context = cli.make_command_context(name=name, args=args.args, raw_args=raw_args, parser=args.parser, response=response, remote_connection=remote_connection) response.update(remote_connection=remote_connection) if not context.remote_connection.active and name == 'run': preload() t = CauldronThread() t.command = get_command_from_module( command_module=command_module, remote_connection=context.remote_connection) t.context = context t.parser = args.parser t.kwargs = args.args t.response = response response.thread = t t.start() return response
def test_end_parented(self): """Should end the parent""" child = Response() parent = Response() parent.consume(child) child.end() self.assertTrue(parent.ended)
def test_update_parented(self): """Should update through parent""" child = Response() parent = Response() parent.consume(child) child.update(banana='orange') self.assertEqual(parent.data['banana'], 'orange')
def test_grandparent(self): """Should parent correctly if parented""" child = Response() parent = Response() grandparent = Response() grandparent.consume(parent) parent.consume(child) self.assertEqual(child.parent, grandparent)
def test_notify_parented(self): """Should notify through parent""" child = Response() parent = Response() parent.consume(child) child.notify('SUCCESS', 'Good Stuff', 'GO-CAULDRON') self.assertEqual(len(parent.messages), 1) m = parent.messages[0] self.assertEqual(m.code, 'GO-CAULDRON') self.assertEqual(m.kind, 'SUCCESS') self.assertEqual(m.message, 'Good Stuff')
def sync_create_project(): """ """ r = Response() args = arguments.from_request() name = args.get('name') remote_source_directory = args.get('source_directory') optional_args = args.get('args', {}) if None in [name, remote_source_directory]: return r.fail( code='INVALID_ARGS', message='Invalid arguments. Unable to create project' ).response.flask_serialize() container_folder = tempfile.mkdtemp(prefix='cd-remote-project-') os.makedirs(os.path.join(container_folder, '__cauldron_shared_libs')) os.makedirs(os.path.join(container_folder, '__cauldron_downloads')) r.consume(create_command.execute( cli.make_command_context('create'), project_name=name, directory=container_folder, forget=True, **optional_args )) if r.failed: return r.flask_serialize() sync_status.update({}, time=-1, project=None) project = cd.project.get_internal_project() project.remote_source_directory = remote_source_directory with open(project.source_path, 'r') as f: definition = json.load(f) sync_status.update({}, time=-1, project=project) return r.update( source_directory=project.source_directory, remote_source_directory=remote_source_directory, definition=definition, project=project.kernel_serialize() ).notify( kind='SUCCESS', code='PROJECT_CREATED', message='Project created' ).response.flask_serialize()
def sync_create_project(): """ """ r = Response() args = arguments.from_request() name = args.get('name') remote_source_directory = args.get('source_directory') optional_args = args.get('args', {}) if None in [name, remote_source_directory]: return r.fail(code='INVALID_ARGS', message='Invalid arguments. Unable to create project' ).response.flask_serialize() container_folder = tempfile.mkdtemp(prefix='cd-remote-project-') os.makedirs(os.path.join(container_folder, '__cauldron_shared_libs')) os.makedirs(os.path.join(container_folder, '__cauldron_downloads')) r.consume( create_command.execute(cli.make_command_context('create'), project_name=name, directory=container_folder, forget=True, **optional_args)) if r.failed: return r.flask_serialize() sync_status.update({}, time=-1, project=None) project = cd.project.get_internal_project() project.remote_source_directory = remote_source_directory with open(project.source_path, 'r') as f: definition = json.load(f) sync_status.update({}, time=-1, project=project) return r.update(source_directory=project.source_directory, remote_source_directory=remote_source_directory, definition=definition, project=project.kernel_serialize()).notify( kind='SUCCESS', code='PROJECT_CREATED', message='Project created').response.flask_serialize()
def sync_open_project(): """ """ r = Response() args = arguments.from_request() definition = args.get('definition') source_directory = args.get('source_directory') if None in [definition, source_directory]: return r.fail( code='INVALID_ARGS', message='Invalid arguments. Unable to open project' ).response.flask_serialize() # Remove any shared library folders from the library list. These will be # stored using the single shared library folder instead definition['library_folders'] = [ lf for lf in definition.get('library_folders', ['libs']) if lf and not lf.startswith('..') ] definition['library_folders'] += ['../__cauldron_shared_libs'] container_folder = tempfile.mkdtemp(prefix='cd-remote-project-') os.makedirs(os.path.join(container_folder, '__cauldron_shared_libs')) os.makedirs(os.path.join(container_folder, '__cauldron_downloads')) project_folder = os.path.join(container_folder, definition['name']) os.makedirs(project_folder) definition_path = os.path.join(project_folder, 'cauldron.json') writer.write_json_file(definition_path, definition) sync_status.update({}, time=-1, project=None) open_response = project_opener.open_project(project_folder, forget=True) open_response.join() project = cd.project.get_internal_project() project.remote_source_directory = source_directory sync_status.update({}, time=-1, project=project) return r.consume(open_response).update( source_directory=project.source_directory, project=project.kernel_serialize() ).notify( kind='OPENED', code='PROJECT_OPENED', message='Project opened' ).response.flask_serialize()
def sync_open_project(): """ """ r = Response() args = arguments.from_request() definition = args.get('definition') source_directory = args.get('source_directory') if None in [definition, source_directory]: return r.fail(code='INVALID_ARGS', message='Invalid arguments. Unable to open project' ).response.flask_serialize() # Remove any shared library folders from the library list. These will be # stored using the single shared library folder instead definition['library_folders'] = [ lf for lf in definition.get('library_folders', ['libs']) if lf and not lf.startswith('..') ] definition['library_folders'] += ['../__cauldron_shared_libs'] container_folder = tempfile.mkdtemp(prefix='cd-remote-project-') os.makedirs(os.path.join(container_folder, '__cauldron_shared_libs')) os.makedirs(os.path.join(container_folder, '__cauldron_downloads')) project_folder = os.path.join(container_folder, definition['name']) os.makedirs(project_folder) definition_path = os.path.join(project_folder, 'cauldron.json') writer.write_json_file(definition_path, definition) sync_status.update({}, time=-1, project=None) open_response = project_opener.open_project(project_folder, forget=True) open_response.join() project = cd.project.get_internal_project() project.remote_source_directory = source_directory sync_status.update({}, time=-1, project=project) return r.consume(open_response).update( source_directory=project.source_directory, project=project.kernel_serialize()).notify( kind='SUCCESS', code='PROJECT_OPENED', message='Project opened').response.flask_serialize()
def test_consume_nothing(self): """ should abort consuming if there is nothing to consume """ r = Response() r.consume(None)
def test_self_consumption(self): """ should not consume itself and cause regression error """ r = Response() r.consume(r)
def test_self_consumption(self): """Should not consume itself and cause regression error""" r = Response() r.consume(r)
def test_consume_nothing(self): """Should abort consuming if there is nothing to consume""" r = Response() r.consume(None)