def upgrade_cell_to_output(module_remap, module_id, pipeline, old_name, new_module, end_version, input_port_name, start_version=None, output_version=None): """This function upgrades a *Cell module to a *Output module. The upgrade only happens if the original module doesn't have any connection on the cell input ports that can't be translated. This is to ease the transition to *Output modules, but we don't want (or need) to break anything; the *Cell modules still exist, so they can stay. """ if not isinstance(module_remap, UpgradePackageRemap): module_remap = UpgradePackageRemap.from_dict(module_remap) old_module = pipeline.modules[module_id] old_module_name = create_descriptor_string(old_module.package, old_module.name, old_module.namespace, False) if old_module_name != old_name: return module_remap used_input_ports = set(old_module.connected_input_ports.keys()) for func in old_module.functions: used_input_ports.add(func.name) if used_input_ports != set([input_port_name]): return module_remap _old_remap = module_remap module_remap = copy.copy(module_remap) assert _old_remap.remaps is not module_remap.remaps remap = UpgradeModuleRemap(start_version, end_version, output_version, module_name=old_name, new_module=new_module) remap.add_remap('dst_port_remap', input_port_name, 'value') remap.add_remap('function_remap', input_port_name, 'value') module_remap.add_module_remap(remap) return module_remap
def handle_module_upgrade_request(controller, module_id, pipeline): from vistrails.core.modules.module_descriptor import ModuleDescriptor from vistrails.core.upgradeworkflow import UpgradeWorkflowHandler, \ UpgradePackageRemap, UpgradeModuleRemap from vistrails.core.modules.basic_modules import identifier as basic_pkg def remap_functions(old_module, new_module, function_remap): # FIXME need use_registry flag passed through! use_registry = True function_ops = [] for function in old_module.functions: if function.name in function_remap: remap = function_remap[function.name] if remap is None: # don't add the function back in continue elif not isinstance(remap, basestring): function_ops.extend(remap(function, new_module)) continue else: function_name = remap if len(function.parameters) > 0: new_param_vals, aliases = zip( *[(p.strValue, p.alias) for p in function.parameters]) else: new_param_vals = [] aliases = [] if use_registry: function_port_spec = function_name else: def mk_psi(pos): psi = PortSpecItem(module="Module", package=basic_pkg, namespace="", pos=pos) return psi n_items = len(new_param_vals) function_port_spec = PortSpec( name=function_name, items=[mk_psi(i) for i in xrange(n_items)]) new_function = controller.create_function( new_module, function_port_spec, new_param_vals, aliases) new_module.add_function(new_function) if None in function_remap: # used to add new functions remap = function_remap[None] function_ops.extend(remap(None, new_module)) return function_ops def remap_dst_connections(old_module, new_module, port_remap): # FIXME need use_registry flag passed through! use_registry = True create_new_connection = UpgradeWorkflowHandler.create_new_connection ops = [] for _, conn_id in pipeline.graph.edges_to(old_module.id): old_conn = pipeline.connections[conn_id] if old_conn.destination.name in port_remap: remap = port_remap[old_conn.destination.name] if remap is None: # don't add this connection back in continue elif not isinstance(remap, basestring): ops.extend(remap(old_conn, new_module)) continue else: destination_name = remap old_src_module = pipeline.modules[old_conn.source.moduleId] if use_registry: destination_port = destination_name else: destination_port = Port(name=destination_name, type='destination', signature=create_port_spec_string([ (basic_pkg, 'Variant', '') ])) new_conn = create_new_connection(controller, old_src_module, old_conn.source, new_module, destination_port) ops.append(('add', new_conn)) return ops def insert_vis(vis_name, vis_port_remap): def remap_vis(old_conn, new_cell_module): ops = [] old_src_module = pipeline.modules[old_conn.source.moduleId] old_cell_module = pipeline.modules[old_conn.destination.moduleId] new_x = (old_src_module.location.x + new_cell_module.location.x) / 2.0 new_y = (old_src_module.location.y + new_cell_module.location.y) / 2.0 new_vis_desc = ModuleDescriptor(package=identifier, name=vis_name, version='0.3.0') new_vis_module = \ controller.create_module_from_descriptor(new_vis_desc, new_x, new_y) function_ops = remap_functions(old_cell_module, new_vis_module, vis_port_remap) ops.append(('add', new_vis_module)) ops.extend(function_ops) ops.extend( remap_dst_connections(old_cell_module, new_vis_module, vis_port_remap)) create_new_connection = UpgradeWorkflowHandler.create_new_connection new_conn_1 = create_new_connection(controller, old_src_module, old_conn.source, new_vis_module, "table") ops.append(('add', new_conn_1)) new_conn_2 = create_new_connection(controller, new_vis_module, "self", new_cell_module, "layers") ops.append(('add', new_conn_2)) return ops # returns the actual remap function return remap_vis # zoom gets moved for free from old cell to new cell remap = UpgradePackageRemap() def add_legacy(fname, module): new_function = controller.create_function(module, "allowLegacy", ["True"]) return [('add', new_function, 'module', module.id)] remap.add_module_remap( UpgradeModuleRemap('0.1.0', '0.3.0', '0.3.0', new_module="GMapCell", module_name="GMapCell", dst_port_remap={ 'table': insert_vis("GMapSymbols", {None: add_legacy}), 'colormapName': None })) remap.add_module_remap( UpgradeModuleRemap('0.1.0', '0.3.0', '0.3.0', new_module="GMapCell", module_name="GMapHeatmapCell", dst_port_remap={ 'table': insert_vis( "GMapHeatmap", { 'dissipating': 'dissipating', 'maxIntensity': 'maxIntensity', 'opacity': 'opacity', 'radius': 'radius' }), 'dissipating': None, 'maxIntensity': None, 'opacity': None, 'radius': None, })) remap.add_module_remap( UpgradeModuleRemap('0.1.0', '0.3.0', '0.3.0', new_module="GMapCell", module_name="GMapCircleCell", dst_port_remap={ 'table': insert_vis( "GMapCircles", { 'strokeColor': 'strokeColor', 'strokeWeight': 'strokeWeight', 'strokeOpacity': 'strokeOpacity', 'fillColor': 'fillColor', 'fillOpacity': 'fillOpacity' }), 'strokeColor': None, 'strokeWeight': None, 'strokeOpacity': None, 'fillColor': None, 'fillOpacity': None, })) remap.add_module_remap( UpgradeModuleRemap('0.1.0', '0.3.0', '0.3.0', new_module="GMapCell", module_name="GMapSymbolCell", dst_port_remap={ 'table': insert_vis( "GMapSymbols", { 'strokeColor': 'strokeColor', 'strokeWeight': 'strokeWeight', 'strokeOpacity': 'strokeOpacity', 'fillStartColor': 'fillStartColor', 'fillEndColor': 'fillEndColor', 'fillOpacity': 'fillOpacity', 'scale': 'scale' }), 'strokeColor': None, 'strokeWeight': None, 'strokeOpacity': None, 'fillStartColor': None, 'fillEndColor': None, 'fillOpacity': None, 'scale': None, })) return UpgradeWorkflowHandler.remap_module(controller, module_id, pipeline, remap)
from vistrails.core.modules.module_descriptor import ModuleDescriptor from vistrails.core.modules.vistrails_module import Module from vistrails.core.upgradeworkflow import UpgradeModuleRemap class X(Module): _output_ports = [('result', 'basic:String')] def compute(self): self.set_output('result', 'X') _modules = [X] _upgrades = { 'X': [ UpgradeModuleRemap( # Upgrade for looping_fix.x 0.1 -> 0.2 # replaces module X with module Y from looping_fix.y 0.1 '0.1', '0.2', '0.2', new_module=ModuleDescriptor( package='org.vistrails.vistrails.tests.looping_fix.y', name='Y', namespace='', package_version='0.1')) ] }
from vistrails.core.modules.module_descriptor import ModuleDescriptor from vistrails.core.modules.vistrails_module import Module from vistrails.core.upgradeworkflow import UpgradeModuleRemap class B(Module): _output_ports = [('result', 'basic:String')] def compute(self): self.set_output('result', 'B') _modules = [B] _upgrades = { 'B': [ UpgradeModuleRemap( # Upgrade for looping_fix.b 0.1 -> 0.2 # replaces module B with module C from looping_fix.c 1.0 '0.1', '0.2', '0.2', new_module=ModuleDescriptor( package='org.vistrails.vistrails.tests.looping_fix.c', name='C', namespace='', package_version='1.0')) ] }
def handle_module_upgrade_request(controller, module_id, pipeline): global _remap, _controller, _pipeline if _remap is None: _remap = UpgradePackageRemap() remap = UpgradeModuleRemap(None, '1.0.0', '1.0.0', module_name='vtkInteractionHandler') remap.add_remap('src_port_remap', 'self', 'Instance') _remap.add_module_remap(remap) remap = UpgradeModuleRemap(None, '1.0.0', '1.0.0', module_name='VTKCell') _remap.add_module_remap(remap) remap = UpgradeModuleRemap(None, '1.0.0', '1.0.0', module_name='VTKViewCell', new_module='VTKCell') _remap.add_module_remap(remap) _controller = controller _pipeline = pipeline module_name = pipeline.modules[module_id].name module_name = module_name_remap.get(module_name, module_name) if not _remap.has_module_remaps(module_name): build_remap(module_name) try: from vistrails.packages.spreadsheet.init import upgrade_cell_to_output except ImportError: # Manually upgrade to 1.0.1 if _remap.get_module_remaps(module_name): module_remap = copy.copy(_remap) module_remap.add_module_remap( UpgradeModuleRemap('1.0.0', '1.0.1', '1.0.1', module_name=module_name)) else: module_remap = _remap else: module_remap = upgrade_cell_to_output(_remap, module_id, pipeline, 'VTKCell', 'vtkRendererOutput', '1.0.1', 'AddRenderer', start_version='1.0.0') if _remap.get_module_remaps(module_name): remap = module_remap.get_module_upgrade(module_name, '1.0.0') if remap is None: # Manually upgrade to 1.0.1 module_remap.add_module_remap( UpgradeModuleRemap('1.0.0', '1.0.1', '1.0.1', module_name=module_name)) return UpgradeWorkflowHandler.remap_module(controller, module_id, pipeline, module_remap)
def process_module(desc): # 0.9.3 upgrades if not desc.name in klasses: return remap = UpgradeModuleRemap(None, '0.9.3', '0.9.3', module_name=desc.name) process_ports(desc, remap, 'input') process_ports(desc, remap, 'output') _remap.add_module_remap(remap) for old, new in module_name_remap.iteritems(): if desc.name == new: # Remap using old name remap.new_module = old _remap.add_module_remap(remap, old) # 0.9.5 upgrades remap = UpgradeModuleRemap('0.9.3', '0.9.5', '0.9.5', module_name=desc.name) remap.add_remap('src_port_remap', 'self', 'Instance') _remap.add_module_remap(remap) for old, new in module_name_remap.iteritems(): if desc.name == new: # Remap using old name remap.new_module = old _remap.add_module_remap(remap, old) # 1.0.0 upgrades input_mappings = {} function_mappings = {} input_specs = [ desc.module._get_input_spec(s) for s in get_port_specs(desc, 'input') ] input_names = [s.name for s in input_specs] for spec in input_specs: if spec is None: continue elif spec.name == 'TextScaleMode': function_mappings['ScaledTextOn'] = \ change_func('TextScaleMode', 'Prop') elif spec.method_type == 'OnOff': # Convert On/Off to single port input_mappings[spec.name + 'On'] = spec.name input_mappings[spec.name + 'Off'] = spec.name function_mappings[spec.name + 'On'] = \ change_func(spec.name, True) function_mappings[spec.name + 'Off'] = \ change_func(spec.name, False) elif spec.method_type == 'nullary': # Add True to execute empty functions function_mappings[spec.name] = change_func(spec.name, True) elif spec.method_type == 'SetXToY': # Add one mapping for each default for enum in spec.values[0]: input_mappings[spec.method_name + enum] = spec.name # Add enum value to function function_mappings[spec.method_name + enum] = \ change_func(spec.name, enum) # Convert SetX(int) methods old_name = spec.method_name[:-2] function_mappings[spec.method_name[:-2]] = change_SetXint(spec) elif spec.port_type == 'basic:Color': # Remove 'Widget' suffix on Color input_mappings[spec.method_name + 'Widget'] = spec.name # Remove 'Set prefix' input_mappings[spec.method_name] = spec.name # Change old type (float, float, float) -> (,)*3 function_mappings[spec.method_name] = color_func(spec.name) elif spec.port_type == 'basic:File': input_mappings[spec.method_name] = to_file_func( spec.name) # Set*FileName -> (->File->*File) input_mappings['Set' + spec.name] = spec.name # Set*File -> *File function_mappings[spec.method_name] = file_func(spec.name) elif base_name(spec.name) == 'AddDataSetInput': # SetInput* does not exist in VTK 6 if spec.name[15:] == '_1': # Upgrade from version without overload input_mappings['AddInput'] = spec.name input_mappings['AddInput' + spec.name[15:]] = spec.name elif base_name(spec.name) == 'InputData': # SetInput* does not exist in VTK 6 if spec.name[9:] == '_1': # Upgrade from version without overload input_mappings['SetInput'] = spec.name input_mappings['SetInput' + spec.name[9:]] = spec.name elif base_name(spec.name) == 'AddInputData': # AddInput* does not exist in VTK 6 if spec.name[12:] == '_1': # Upgrade from version without overload input_mappings['AddInput'] = spec.name input_mappings['AddInput' + spec.name[12:]] = spec.name elif base_name(spec.name) == 'SourceData': # SetSource* does not exist in VTK 6 if spec.name[10:] == '_1': # Upgrade from version without overload input_mappings['SetSource'] = spec.name input_mappings['SetSource' + spec.name[10:]] = spec.name elif spec.method_name == 'Set' + base_name(spec.name): if spec.name[-2:] == '_1': # Upgrade from versions without overload input_mappings[spec.name[:-2]] = spec.name input_mappings['Set' + spec.name[:-2]] = spec.name # Remove 'Set' prefixes input_mappings['Set' + spec.name] = spec.name elif spec.name == 'AddInput_1': # FIXME what causes this? # New version does not have AddInput input_mappings['AddInput'] = 'AddInput_1' elif spec.name == 'vtkRenderer': # Classes having SetRendererWindow also used to have VTKCell input_mappings['SetVTKCell'] = fix_vtkcell_func() output_mappings = {} for spec_name in get_port_specs(desc, 'output'): spec = desc.module._get_output_spec(spec_name) if spec is None: continue if spec.method_name == 'Get' + spec.name: # Remove 'Get' prefixes output_mappings[spec.method_name] = spec.name if desc.name == 'vtkMultiBlockPLOT3DReader': # Move GetOutput to custom FirstBlock output_mappings['GetOutput'] = wrap_block_func() # what!? # Move GetOutputPort0 to custom FirstBlock # and change destination port to AddInputData_1 or similar output_mappings['GetOutputPort0'] = wrap_block_func() remap = UpgradeModuleRemap('0.9.5', '1.0.0', '1.0.0', module_name=desc.name) for k, v in input_mappings.iteritems(): remap.add_remap('dst_port_remap', k, v) for k, v in output_mappings.iteritems(): remap.add_remap('src_port_remap', k, v) for k, v in function_mappings.iteritems(): remap.add_remap('function_remap', k, v) _remap.add_module_remap(remap) for old, new in module_name_remap.iteritems(): if desc.name == new: # Remap to new name remap.new_module = new _remap.add_module_remap(remap, old)
from vistrails.core.modules.vistrails_module import Module from vistrails.core.modules.config import IPort, OPort from vistrails.core.upgradeworkflow import UpgradeModuleRemap class TestUpgradeA(Module): _input_ports = [IPort("aaa", "basic:String")] _output_ports = [OPort("zzz", "basic:Integer")] class TestUpgradeB(Module): _input_ports = [IPort("b", "basic:Integer")] _modules = [TestUpgradeA, TestUpgradeB] _upgrades = {"TestUpgradeA": [UpgradeModuleRemap('0.8', '0.9', '0.9', None, function_remap={'a': 'aa'}, src_port_remap={'z': 'zz'}), UpgradeModuleRemap('0.9', '1.0', '1.0', None, function_remap={'aa': 'aaa'}, src_port_remap={'zz': 'zzz'})]}