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 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 check_port_spec(module, port_name, port_type, descriptor=None, sigstring=None): basic_pkg = get_vistrails_basic_pkg_id() reg = get_module_registry() found = False try: if descriptor is not None: s = reg.get_port_spec_from_descriptor(descriptor, port_name, port_type) found = True spec_tuples = parse_port_spec_string(sigstring, basic_pkg) for i in xrange(len(spec_tuples)): spec_tuple = spec_tuples[i] port_pkg = reg.get_package_by_name(spec_tuple[0]) if port_pkg.identifier != spec_tuple[0]: # we have an old identifier spec_tuples[i] = (port_pkg.identifier,) + spec_tuple[1:] sigstring = create_port_spec_string(spec_tuples) # sigstring = expand_port_spec_string(sigstring, basic_pkg) if s.sigstring != sigstring: msg = ('%s port "%s" of module "%s" exists, but ' 'signatures differ "%s" != "%s"') % \ (port_type.capitalize(), port_name, module.name, s.sigstring, sigstring) raise UpgradeWorkflowError(msg, module, port_name, port_type) except MissingPort: pass if not found and \ not module.has_portSpec_with_name((port_name, port_type)): msg = '%s port "%s" of module "%s" does not exist.' % \ (port_type.capitalize(), port_name, module.name) raise UpgradeWorkflowError(msg, module, port_name, port_type)
def update_module(self, module): """ update_module(module: Module) -> None Setup this tree widget to show functions of module """ self.setColumnHidden(0, True) self.setColumnHidden(1, not self.ports_visible) # this is strange but if you try to clear the widget when the focus is # in one of the items (after setting a parameter for example), # VisTrails crashes on a Mac (Emanuele) This is probably a Qt bug w = QtGui.QApplication.focusWidget() if self.isAncestorOf(w): w.clearFocus() self.clear() self.module = module self.port_spec_items = {} self.function_map = {} if module and module.is_valid: reg = get_module_registry() descriptor = module.module_descriptor if self.port_type == 'input': self.setColumnHidden(0,not get_vistrails_configuration( ).check('showInlineParameterWidgets')) port_specs = module.destinationPorts() connected_ports = module.connected_input_ports visible_ports = module.visible_input_ports elif self.port_type == 'output': port_specs = module.sourcePorts() connected_ports = module.connected_output_ports visible_ports = module.visible_output_ports else: raise TypeError("Unknown port type: '%s'" % self.port_type) for port_spec in sorted(port_specs, key=lambda x: x.name): connected = port_spec.name in connected_ports and \ connected_ports[port_spec.name] > 0 item = PortItem(port_spec, connected, port_spec.optional, port_spec.name in visible_ports, port_spec.name in module.editable_input_ports) self.addTopLevelItem(item) self.port_spec_items[port_spec.name] = (port_spec, item) if self.port_type == 'input': for function in module.functions: if not function.is_valid: continue port_spec, item = self.port_spec_items[function.name] subitem = self.entry_klass(port_spec, function, self.types_visible) self.function_map[function.real_id] = subitem item.addChild(subitem) subitem.setFirstColumnSpanned(True) self.setItemWidget(subitem, 2, subitem.get_widget()) item.setExpanded(True) # self.setItemWidget(item, 0, item.get_visible()) # self.setItemWidget(item, 1, item.get_connected()) # i = QTreeWidgetItem(self) # self.addTopLevelItem(i) # i.setText(2, port_spec.name) # visible_checkbox = QtGui.QCheckBox() # self.setItemWidget(i, 0, visible_checkbox) # connceted_checkbox = QtGui.QCheckBox() # connected_checkbox.setEnabled(False) # self.setItemWidget(i, 1, connected_checkbox) # Highlight unset ports for _, item in self.port_spec_items.itervalues(): item.calcUnset() self.sortItems(0, QtCore.Qt.AscendingOrder) # base_items = {} # # Create the base widget item for each descriptor # for descriptor in moduleHierarchy: # baseName = descriptor.name # base_package = descriptor.identifier # baseItem = QMethodTreeWidgetItem(None, # None, # self, # ([] # << baseName # << '')) # base_items[descriptor] = baseItem # method_specs = {} # # do this in reverse to ensure proper overloading # # !!! NOTE: we have to use ***all*** input ports !!! # # because a subclass can overload a port with a # # type that isn't a method # for descriptor in reversed(moduleHierarchy): # method_specs.update((name, (descriptor, spec)) # for name, spec in \ # registry.module_ports('input', # descriptor)) # # add local registry last so that it takes precedence # method_specs.update((spec.name, (descriptor, spec)) # for spec in module.port_spec_list # if spec.type == 'input') # for _, (desc, method_spec) in sorted(method_specs.iteritems()): # if registry.is_method(method_spec): # baseItem = base_items[desc] # sig = method_spec.short_sigstring # QMethodTreeWidgetItem(module, # method_spec, # baseItem, # ([] # << method_spec.name # << sig)) # self.expandAll() # self.resizeColumnToContents(2) # show invalid module attributes if module and not module.is_valid and self.port_type == 'input': for function in module.functions: if function.name in self.port_spec_items: port_spec, item = self.port_spec_items[function.name] else: sigstring = create_port_spec_string( [(basic_identifier, "String") for i in xrange(len(function.parameters))]) port_spec = PortSpec(name=function.name, type='input', sigstring=sigstring) item = PortItem(port_spec, False, False, False) self.addTopLevelItem(item) self.port_spec_items[port_spec.name] = (port_spec, item) subitem = self.entry_klass(port_spec, function) self.function_map[function.real_id] = subitem item.addChild(subitem) subitem.setFirstColumnSpanned(True) self.setItemWidget(subitem, 2, subitem.get_widget()) item.setExpanded(True)
def _update_func(self, port_spec, *args, **kwargs): # print 'running _update_func', port_spec.name # print args if port_spec.type != 'input': if self._module.has_port_spec(port_spec.name, 'input'): port_spec = \ self._module.get_port_spec(port_spec.name, 'input') else: raise TypeError("cannot update an output port spec") # FIXME deal with kwargs num_ports = 0 num_params = 0 for value in args: # print 'processing', type(value), value if isinstance(value, vistrails_port): # make connection to specified output port # print 'updating port' num_ports += 1 elif isinstance(value, vistrails_module): # make connection to 'self' output port of value # print 'updating module' num_ports += 1 else: # print 'update literal', type(value), value num_params += 1 if num_ports > 1 or (num_ports == 1 and num_params > 0): reg = vistrails.core.modules.module_registry.get_module_registry() tuple_desc = reg.get_descriptor_by_name( vistrails.core.system.get_vistrails_basic_pkg_id(), 'Tuple') d = {'_module_desc': tuple_desc, '_package': self._package,} tuple = type('module', (vistrails_module,), d)() output_port_spec = PortSpec(id=-1, name='value', type='output', sigstring=port_spec.sigstring) vistrails.api.add_port_spec(tuple._module.id, output_port_spec) self._update_func(port_spec, *[tuple.value()]) assert len(port_spec.descriptors()) == len(args) for i, descriptor in enumerate(port_spec.descriptors()): arg_name = 'arg%d' % i sigstring = create_port_spec_string([descriptor.spec_tuple]) tuple_port_spec = PortSpec(id=-1, name=arg_name, type='input', sigstring=sigstring) vistrails.api.add_port_spec(tuple._module.id, tuple_port_spec) tuple._process_attr_value(arg_name, args[i]) # create tuple object pass elif num_ports == 1: other = args[0] if isinstance(other, vistrails_port): if other._port_spec.type != 'output': other_module = other._vistrails_module._module if other_module.has_port_spec(port_spec.name, 'output'): other_port_spec = \ other_module.get_port_spec(port_spec.name, 'output') else: raise TypeError("cannot update an input " "port spec") else: other_port_spec = other._port_spec vistrails.api.add_connection(other._vistrails_module._module.id, other_port_spec, self._module.id, port_spec) elif isinstance(other, vistrails_module): other_port_spec = \ other._module.get_port_spec('self', 'output') vistrails.api.add_connection(other._module.id, other_port_spec, self._module.id, port_spec) else: vistrails.api.change_parameter(self._module.id, port_spec.name, [str(x) for x in args])
def _get_sigstring(self): return create_port_spec_string([i.spec_tuple for i in self.port_spec_items])
def _get_sigstring(self): return create_port_spec_string([p.spec_tuple for p in self.params])
def replace_generic(controller, pipeline, old_module, new_module, function_remap=None, src_port_remap=None, dst_port_remap=None, annotation_remap=None, control_param_remap=None, use_registry=True): if function_remap is None: function_remap = {} if src_port_remap is None: src_port_remap = {} if dst_port_remap is None: dst_port_remap = {} if annotation_remap is None: annotation_remap = {} if control_param_remap is None: control_param_remap = {} basic_pkg = get_vistrails_basic_pkg_id() ops = [] ops.extend(controller.delete_module_list_ops(pipeline, [old_module.id])) for annotation in old_module.annotations: if annotation.key not in annotation_remap: annotation_key = annotation.key else: remap = annotation_remap[annotation.key] if remap is None: # don't add the annotation back in continue elif not isinstance(remap, basestring): ops.extend(remap(annotation)) continue else: annotation_key = remap new_annotation = \ Annotation(id=controller.id_scope.getNewId(Annotation.vtType), key=annotation_key, value=annotation.value) new_module.add_annotation(new_annotation) for control_param in old_module.control_parameters: if control_param.name not in control_param_remap: control_param_name = control_param.name else: remap = control_param_remap[control_param.name] if remap is None: # don't add the control param back in continue elif not isinstance(remap, basestring): ops.extend(remap(control_param)) continue else: control_param_name = remap new_control_param = \ ModuleControlParam(id=controller.id_scope.getNewId( ModuleControlParam.vtType), name=control_param_name, value=control_param.value) new_module.add_control_parameter(new_control_param) if not old_module.is_group() and not old_module.is_abstraction(): for port_spec in old_module.port_spec_list: if port_spec.type == 'input': if port_spec.name not in dst_port_remap: spec_name = port_spec.name else: remap = dst_port_remap[port_spec.name] if remap is None: continue elif not isinstance(remap, basestring): ops.extend(remap(port_spec)) continue else: spec_name = remap elif port_spec.type == 'output': if port_spec.name not in src_port_remap: spec_name = port_spec.name else: remap = src_port_remap[port_spec.name] if remap is None: continue elif not isinstance(remap, basestring): ops.extend(remap(port_spec)) continue else: spec_name = remap new_spec = port_spec.do_copy(True, controller.id_scope, {}) new_spec.name = spec_name new_module.add_port_spec(new_spec) function_ops = [] for function in old_module.functions: if function.name not in function_remap: function_name = function.name else: 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)) # add the new module ops.append(('add', new_module)) ops.extend(function_ops) create_new_connection = UpgradeWorkflowHandler.create_new_connection for _, conn_id in pipeline.graph.edges_from(old_module.id): old_conn = pipeline.connections[conn_id] if old_conn.source.name not in src_port_remap: source_name = old_conn.source.name else: remap = src_port_remap[old_conn.source.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: source_name = remap old_dst_module = pipeline.modules[old_conn.destination.moduleId] if use_registry: source_port = source_name else: source_port = Port(name=source_name, type='source', signature=create_port_spec_string( [(basic_pkg, 'Variant', '')])) new_conn = create_new_connection(controller, new_module, source_port, old_dst_module, old_conn.destination) ops.append(('add', new_conn)) for _, conn_id in pipeline.graph.edges_to(old_module.id): old_conn = pipeline.connections[conn_id] if old_conn.destination.name not in dst_port_remap: destination_name = old_conn.destination.name else: remap = dst_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 [vistrails.core.db.action.create_action(ops)]
def replace_generic(controller, pipeline, old_module, new_module, function_remap=None, src_port_remap=None, dst_port_remap=None, annotation_remap=None, control_param_remap=None, use_registry=True): if function_remap is None: function_remap = {} if src_port_remap is None: src_port_remap = {} if dst_port_remap is None: dst_port_remap = {} if annotation_remap is None: annotation_remap = {} if control_param_remap is None: control_param_remap = {} basic_pkg = get_vistrails_basic_pkg_id() ops = [] ops.extend(controller.delete_module_list_ops(pipeline, [old_module.id])) for annotation in old_module.annotations: if annotation.key not in annotation_remap: annotation_key = annotation.key else: remap = annotation_remap[annotation.key] if remap is None: # don't add the annotation back in continue elif not isinstance(remap, basestring): ops.extend(remap(annotation)) continue else: annotation_key = remap new_annotation = \ Annotation(id=controller.id_scope.getNewId(Annotation.vtType), key=annotation_key, value=annotation.value) new_module.add_annotation(new_annotation) for control_param in old_module.control_parameters: if control_param.name not in control_param_remap: control_param_name = control_param.name else: remap = control_param_remap[control_param.name] if remap is None: # don't add the control param back in continue elif not isinstance(remap, basestring): ops.extend(remap(control_param)) continue else: control_param_name = remap new_control_param = \ ModuleControlParam(id=controller.id_scope.getNewId( ModuleControlParam.vtType), name=control_param_name, value=control_param.value) new_module.add_control_parameter(new_control_param) if not old_module.is_group() and not old_module.is_abstraction(): for port_spec in old_module.port_spec_list: if port_spec.type == 'input': if port_spec.name not in dst_port_remap: spec_name = port_spec.name else: remap = dst_port_remap[port_spec.name] if remap is None: continue elif not isinstance(remap, basestring): ops.extend(remap(port_spec)) continue else: spec_name = remap elif port_spec.type == 'output': if port_spec.name not in src_port_remap: spec_name = port_spec.name else: remap = src_port_remap[port_spec.name] if remap is None: continue elif not isinstance(remap, basestring): ops.extend(remap(port_spec)) continue else: spec_name = remap new_spec = port_spec.do_copy(True, controller.id_scope, {}) new_spec.name = spec_name new_module.add_port_spec(new_spec) function_ops = [] for function in old_module.functions: if function.name not in function_remap: function_name = function.name else: 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)) # add the new module ops.append(('add', new_module)) ops.extend(function_ops) create_new_connection = UpgradeWorkflowHandler.create_new_connection for _, conn_id in pipeline.graph.edges_from(old_module.id): old_conn = pipeline.connections[conn_id] if old_conn.source.name not in src_port_remap: source_name = old_conn.source.name else: remap = src_port_remap[old_conn.source.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: source_name = remap old_dst_module = pipeline.modules[old_conn.destination.moduleId] if use_registry: source_port = source_name else: source_port = Port(name=source_name, type='source', signature=create_port_spec_string([ (basic_pkg, 'Variant', '') ])) new_conn = create_new_connection(controller, new_module, source_port, old_dst_module, old_conn.destination) ops.append(('add', new_conn)) for _, conn_id in pipeline.graph.edges_to(old_module.id): old_conn = pipeline.connections[conn_id] if old_conn.destination.name not in dst_port_remap: destination_name = old_conn.destination.name else: remap = dst_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 [vistrails.core.db.action.create_action(ops)]
def _get_sigstring(self): return create_port_spec_string( [i.spec_tuple for i in self.port_spec_items])
def update_module(self, module): """ update_module(module: Module) -> None Setup this tree widget to show functions of module """ self.setColumnHidden(0, True) self.setColumnHidden(1, not self.ports_visible) # this is strange but if you try to clear the widget when the focus is # in one of the items (after setting a parameter for example), # VisTrails crashes on a Mac (Emanuele) This is probably a Qt bug w = QtGui.QApplication.focusWidget() if self.isAncestorOf(w): w.clearFocus() self.clear() self.module = module self.port_spec_items = {} self.function_map = {} if module and module.is_valid: reg = get_module_registry() descriptor = module.module_descriptor if self.port_type == 'input': self.setColumnHidden( 0, not get_vistrails_configuration().check( 'showInlineParameterWidgets')) port_specs = module.destinationPorts() connected_ports = module.connected_input_ports visible_ports = module.visible_input_ports elif self.port_type == 'output': port_specs = module.sourcePorts() connected_ports = module.connected_output_ports visible_ports = module.visible_output_ports else: raise TypeError("Unknown port type: '%s'" % self.port_type) for port_spec in sorted(port_specs, key=lambda x: x.name): connected = port_spec.name in connected_ports and \ connected_ports[port_spec.name] > 0 item = PortItem(port_spec, connected, port_spec.optional, port_spec.name in visible_ports, port_spec.name in module.editable_input_ports) self.addTopLevelItem(item) self.port_spec_items[port_spec.name] = (port_spec, item) if self.port_type == 'input': for function in module.functions: if not function.is_valid: continue port_spec, item = self.port_spec_items[function.name] subitem = self.entry_klass(port_spec, function, self.types_visible) self.function_map[function.real_id] = subitem item.addChild(subitem) subitem.setFirstColumnSpanned(True) self.setItemWidget(subitem, 2, subitem.get_widget()) item.setExpanded(True) # self.setItemWidget(item, 0, item.get_visible()) # self.setItemWidget(item, 1, item.get_connected()) # i = QTreeWidgetItem(self) # self.addTopLevelItem(i) # i.setText(2, port_spec.name) # visible_checkbox = QtGui.QCheckBox() # self.setItemWidget(i, 0, visible_checkbox) # connceted_checkbox = QtGui.QCheckBox() # connected_checkbox.setEnabled(False) # self.setItemWidget(i, 1, connected_checkbox) # Highlight unset ports for _, item in self.port_spec_items.itervalues(): item.calcUnset() self.sortItems(0, QtCore.Qt.AscendingOrder) # base_items = {} # # Create the base widget item for each descriptor # for descriptor in moduleHierarchy: # baseName = descriptor.name # base_package = descriptor.identifier # baseItem = QMethodTreeWidgetItem(None, # None, # self, # ([] # << baseName # << '')) # base_items[descriptor] = baseItem # method_specs = {} # # do this in reverse to ensure proper overloading # # !!! NOTE: we have to use ***all*** input ports !!! # # because a subclass can overload a port with a # # type that isn't a method # for descriptor in reversed(moduleHierarchy): # method_specs.update((name, (descriptor, spec)) # for name, spec in \ # registry.module_ports('input', # descriptor)) # # add local registry last so that it takes precedence # method_specs.update((spec.name, (descriptor, spec)) # for spec in module.port_spec_list # if spec.type == 'input') # for _, (desc, method_spec) in sorted(method_specs.iteritems()): # if registry.is_method(method_spec): # baseItem = base_items[desc] # sig = method_spec.short_sigstring # QMethodTreeWidgetItem(module, # method_spec, # baseItem, # ([] # << method_spec.name # << sig)) # self.expandAll() # self.resizeColumnToContents(2) # show invalid module attributes if module and not module.is_valid and self.port_type == 'input': for function in module.functions: if function.name in self.port_spec_items: port_spec, item = self.port_spec_items[function.name] else: sigstring = create_port_spec_string([ (basic_identifier, "String") for i in xrange(len(function.parameters)) ]) port_spec = PortSpec(name=function.name, type='input', sigstring=sigstring) item = PortItem(port_spec, False, False, False) self.addTopLevelItem(item) self.port_spec_items[port_spec.name] = (port_spec, item) subitem = self.entry_klass(port_spec, function) self.function_map[function.real_id] = subitem item.addChild(subitem) subitem.setFirstColumnSpanned(True) self.setItemWidget(subitem, 2, subitem.get_widget()) item.setExpanded(True)
def _update_func(self, port_spec, *args, **kwargs): # print 'running _update_func', port_spec.name # print args vt_api = get_api() if port_spec.type != 'input': if self._module.has_port_spec(port_spec.name, 'input'): port_spec = \ self._module.get_port_spec(port_spec.name, 'input') else: raise TypeError("cannot update an output port spec") # FIXME deal with kwargs num_ports = 0 num_params = 0 for value in args: # print 'processing', type(value), value if isinstance(value, Port): # make connection to specified output port # print 'updating port' num_ports += 1 elif isinstance(value, Module): # make connection to 'self' output port of value # print 'updating module' num_ports += 1 else: # print 'update literal', type(value), value num_params += 1 if num_ports > 1 or (num_ports == 1 and num_params > 0): reg = get_module_registry() tuple_desc = reg.get_descriptor_by_name(basic_pkg, 'Tuple') tuple_module = vt_api.add_module_from_descriptor(tuple_desc) output_port_spec = PortSpec(id=-1, name='value', type='output', sigstring=port_spec.sigstring) vt_api.add_port_spec(tuple_module, output_port_spec) self._update_func(port_spec, tuple_module.value()) assert len(port_spec.descriptors()) == len(args) for i, descriptor in enumerate(port_spec.descriptors()): arg_name = 'arg%d' % i sigstring = create_port_spec_string([descriptor.spec_tuple]) tuple_port_spec = PortSpec(id=-1, name=arg_name, type='input', sigstring=sigstring) vt_api.add_port_spec(tuple_module, tuple_port_spec) tuple_module._process_attr_value(arg_name, args[i]) elif num_ports == 1: other = args[0] if isinstance(other, Port): if other._port_spec.type != 'output': other_module = other._vistrails_module._module if other_module.has_port_spec(port_spec.name, 'output'): other_port_spec = \ other_module.get_port_spec(port_spec.name, 'output') else: raise TypeError("cannot update an input " "port spec") else: other_port_spec = other._port_spec vt_api.add_connection(other._vistrails_module, other_port_spec, self, port_spec) elif isinstance(other, Module): other_port_spec = \ other._module.get_port_spec('self', 'output') vt_api.add_connection(other, other_port_spec, self, port_spec) else: vt_api.change_parameter(self, port_spec.name, [str(x) for x in args])