def flush_bundles(): """ Having collected bundles in |bundle_infos|, flush them into |blocks|, potentially as a single table depending on the mode. """ if len(bundle_infos) == 0: return def raise_genpath_usage_error(): raise UsageError('Expected \'% display ' + mode + ' (genpath)\', but got \'% display ' + ' '.join([mode] + args) + '\'') # Print out the curent bundles somehow mode = current_display[0] args = current_display[1:] if mode == 'hidden': pass elif mode == 'contents' or mode == 'image': for item_index, bundle_info in bundle_infos: if is_missing(bundle_info): blocks.append(MarkupBlockSchema().load({ 'text': 'ERROR: cannot access bundle', 'error': True }).data) continue # Parse arguments if len(args) == 0: raise_genpath_usage_error() # these two are required for the target (bundle_uuid, target_genpath) = genpath_to_target(bundle_info, args[0]) properties = parse_properties(args[1:]) block_object = { 'target_genpath': target_genpath, 'bundles_spec': BundleUUIDSpecSchema().load( BundleUUIDSpecSchema.create_json([bundle_info])).data, 'status': FetchStatusSchema.get_unknown_status(), } if mode == 'contents': try: block_object['max_lines'] = int( properties.get('maxlines', DEFAULT_CONTENTS_MAX_LINES)) except ValueError: raise UsageError("maxlines must be integer") blocks.append( BundleContentsBlockSchema().load(block_object).data) elif mode == 'image': block_object['width'] = properties.get('width', None) block_object['height'] = properties.get('height', None) blocks.append( BundleImageBlockSchema().load(block_object).data) elif mode == 'record': # display record schema => # key1: value1 # key2: value2 # ... schema = get_schema(args) for item_index, bundle_info in bundle_infos: header = ('key', 'value') rows = [] for (name, genpath, post) in schema: rows.append(RecordsRowSchema().load({ 'key': name + ':', 'value': apply_func(post, interpret_genpath(bundle_info, genpath)), }).data) blocks.append(RecordsBlockSchema().load({ 'bundles_spec': BundleUUIDSpecSchema().load( BundleUUIDSpecSchema.create_json([bundle_info])).data, 'status': FetchStatusSchema.get_unknown_status(), 'header': header, 'rows': rows, }).data) elif mode == 'table': # display table schema => # key1 key2 # b1_value1 b1_value2 # b2_value1 b2_value2 schema = get_schema(args) header = tuple(name for (name, genpath, post) in schema) rows = [] processed_bundle_infos = [] # Cache the mapping between owner_id to owner on current worksheet owner_cache = {} for item_index, bundle_info in bundle_infos: if 'metadata' in bundle_info: rows.append({ name: apply_func( post, interpret_genpath(bundle_info, genpath, db_model=db_model, owner_cache=owner_cache), ) for (name, genpath, post) in schema }) processed_bundle_infos.append(copy.deepcopy(bundle_info)) else: # The front-end relies on the name metadata field existing processed_bundle_info = copy.deepcopy(bundle_info) processed_bundle_info['metadata'] = {'name': '<invalid>'} rows.append({ name: apply_func( post, interpret_genpath(processed_bundle_info, genpath)) for (name, genpath, post) in schema }) processed_bundle_infos.append(processed_bundle_info) blocks.append(TableBlockSchema().load({ 'bundles_spec': BundleUUIDSpecSchema().load( BundleUUIDSpecSchema.create_json( processed_bundle_infos)).data, 'status': FetchStatusSchema.get_unknown_status(), 'header': header, 'rows': rows, }).data) elif mode == 'graph': # display graph <genpath> <properties> if len(args) == 0: raise_genpath_usage_error() # trajectories is list of { # 'uuid': ..., # 'display_name': ..., # What to show as the description of a bundle # 'target': (bundle_uuid, subpath) # } properties = parse_properties(args[1:]) trajectories = [{ 'bundle_uuid': bundle_info['uuid'], 'display_name': interpret_genpath(bundle_info, properties.get('display_name', 'name')), 'target_genpath': genpath_to_target(bundle_info, args[0])[1], } for item_index, bundle_info in bundle_infos] try: max_lines = int( properties.get('maxlines', DEFAULT_CONTENTS_MAX_LINES)) except ValueError: raise UsageError("maxlines must be integer") blocks.append(GraphBlockSchema().load({ 'trajectories': trajectories, 'bundles_spec': BundleUUIDSpecSchema().load( BundleUUIDSpecSchema.create_json([ bundle_infos[0][1] ])).data, # Only show the first one for now # 'bundles_spec': BundleUUIDSpecSchema().load(BundleUUIDSpecSchema.create_json( # [copy.deepcopy(bundle_info) for item_index, bundle_info in bundle_infos]).data, 'max_lines': max_lines, 'xlabel': properties.get('xlabel', None), 'ylabel': properties.get('ylabel', None), }).data) else: raise UsageError('Unknown display mode: %s' % mode) bundle_infos[:] = [] # Clear
def flush_bundles(): """ Having collected bundles in |bundle_infos|, flush them into |blocks|, potentially as a single table depending on the mode. """ if len(bundle_infos) == 0: return def raise_genpath_usage_error(): raise UsageError( 'Expected \'% display ' + mode + ' (genpath)\', but got \'% display ' + ' '.join([mode] + args) + '\'' ) # Print out the curent bundles somehow mode = current_display[0] args = current_display[1:] if mode == 'hidden': pass elif mode == 'contents' or mode == 'image': for item_index, bundle_info in bundle_infos: if is_missing(bundle_info): blocks.append( MarkupBlockSchema().load({'text': 'ERROR: cannot access bundle'}).data ) continue # Parse arguments if len(args) == 0: raise_genpath_usage_error() # these two are required for the target (bundle_uuid, target_genpath) = genpath_to_target(bundle_info, args[0]) properties = parse_properties(args[1:]) block_object = { 'target_genpath': target_genpath, 'bundles_spec': BundleUUIDSpecSchema() .load(BundleUUIDSpecSchema.create_json([bundle_info])) .data, 'status': FetchStatusSchema.get_unknown_status(), } if mode == 'contents': try: block_object['max_lines'] = int( properties.get('maxlines', DEFAULT_CONTENTS_MAX_LINES) ) except ValueError: raise UsageError("maxlines must be integer") blocks.append(BundleContentsBlockSchema().load(block_object).data) elif mode == 'image': block_object['width'] = properties.get('width', None) block_object['height'] = properties.get('height', None) blocks.append(BundleImageBlockSchema().load(block_object).data) elif mode == 'record': # display record schema => # key1: value1 # key2: value2 # ... schema = get_schema(args) for item_index, bundle_info in bundle_infos: header = ('key', 'value') rows = [] for (name, genpath, post) in schema: rows.append( RecordsRowSchema() .load( { 'key': name + ':', 'value': apply_func(post, interpret_genpath(bundle_info, genpath)), } ) .data ) blocks.append( RecordsBlockSchema() .load( { 'bundles_spec': BundleUUIDSpecSchema() .load(BundleUUIDSpecSchema.create_json([bundle_info])) .data, 'status': FetchStatusSchema.get_unknown_status(), 'header': header, 'rows': rows, } ) .data ) elif mode == 'table': # display table schema => # key1 key2 # b1_value1 b1_value2 # b2_value1 b2_value2 schema = get_schema(args) header = tuple(name for (name, genpath, post) in schema) rows = [] processed_bundle_infos = [] for item_index, bundle_info in bundle_infos: if 'metadata' in bundle_info: rows.append( { name: apply_func(post, interpret_genpath(bundle_info, genpath)) for (name, genpath, post) in schema } ) processed_bundle_infos.append(copy.deepcopy(bundle_info)) else: # The front-end relies on the name metadata field existing processed_bundle_info = copy.deepcopy(bundle_info) processed_bundle_info['metadata'] = {'name': '<invalid>'} rows.append( { name: apply_func( post, interpret_genpath(processed_bundle_info, genpath) ) for (name, genpath, post) in schema } ) processed_bundle_infos.append(processed_bundle_info) blocks.append( TableBlockSchema() .load( { 'bundles_spec': BundleUUIDSpecSchema() .load(BundleUUIDSpecSchema.create_json(processed_bundle_infos)) .data, 'status': FetchStatusSchema.get_unknown_status(), 'header': header, 'rows': rows, } ) .data ) elif mode == 'graph': # display graph <genpath> <properties> if len(args) == 0: raise_genpath_usage_error() # trajectories is list of { # 'uuid': ..., # 'display_name': ..., # What to show as the description of a bundle # 'target': (bundle_uuid, subpath) # } properties = parse_properties(args[1:]) trajectories = [ { 'bundle_uuid': bundle_info['uuid'], 'display_name': interpret_genpath( bundle_info, properties.get('display_name', 'name') ), 'target_genpath': genpath_to_target(bundle_info, args[0])[1], } for item_index, bundle_info in bundle_infos ] try: max_lines = int(properties.get('maxlines', DEFAULT_CONTENTS_MAX_LINES)) except ValueError: raise UsageError("maxlines must be integer") blocks.append( GraphBlockSchema() .load( { 'trajectories': trajectories, 'bundles_spec': BundleUUIDSpecSchema() .load(BundleUUIDSpecSchema.create_json([bundle_infos[0][1]])) .data, # Only show the first one for now # 'bundles_spec': BundleUUIDSpecSchema().load(BundleUUIDSpecSchema.create_json( # [copy.deepcopy(bundle_info) for item_index, bundle_info in bundle_infos]).data, 'max_lines': max_lines, 'xlabel': properties.get('xlabel', None), 'ylabel': properties.get('ylabel', None), } ) .data ) else: raise UsageError('Unknown display mode: %s' % mode) bundle_infos[:] = [] # Clear