示例#1
0
    def _handle_runtime_values(self, input_data_port_runtime_values, use_runtime_value_input_data_ports,
                               output_data_port_runtime_values, use_runtime_value_output_data_ports):
        # handle input runtime values
        self.input_data_port_runtime_values = input_data_port_runtime_values
        self.use_runtime_value_input_data_ports = use_runtime_value_input_data_ports
        for data_port_id, data_port in self.input_data_ports.items():
            # Ensure that all input data ports have a runtime value
            if data_port_id not in self.input_data_port_runtime_values.keys():
                self.input_data_port_runtime_values[data_port_id] = data_port.default_value
                self.use_runtime_value_input_data_ports[data_port_id] = True
            # Ensure that str and unicode is correctly differentiated
            elif isinstance(self.input_data_port_runtime_values[data_port_id], str):
                try:
                    self.input_data_port_runtime_values[data_port_id] = type_helpers.convert_string_value_to_type_value(
                        self.input_data_port_runtime_values[data_port_id], data_port.data_type)
                except AttributeError:
                    # the parameter cannot be converted
                    # this can be the case when the data type of port of the library state changed
                    self.input_data_port_runtime_values[data_port_id] = data_port.default_value
                    self.use_runtime_value_input_data_ports[data_port_id] = True
                    self.marked_dirty = True

        # if there is a key existing in the runtime values but not in the input_data_ports we delete it
        for key in list(self.use_runtime_value_input_data_ports.keys()):
            if key not in self.input_data_ports:
                del self.use_runtime_value_input_data_ports[key]
                del self.input_data_port_runtime_values[key]
                # state machine cannot be marked dirty directly, as it does not exist yet
                self.marked_dirty = True

        # handle output runtime values
        self.output_data_port_runtime_values = output_data_port_runtime_values
        self.use_runtime_value_output_data_ports = use_runtime_value_output_data_ports
        for data_port_id, data_port in self.output_data_ports.items():
            # Ensure that all output data ports have a runtime value
            if data_port_id not in self.output_data_port_runtime_values.keys():
                self.output_data_port_runtime_values[data_port_id] = data_port.default_value
                self.use_runtime_value_output_data_ports[data_port_id] = True
            # Ensure that str and unicode is correctly differentiated
            elif isinstance(self.output_data_port_runtime_values[data_port_id], str):
                try:
                    self.output_data_port_runtime_values[data_port_id] = \
                        type_helpers.convert_string_value_to_type_value(
                            self.output_data_port_runtime_values[data_port_id], data_port.data_type)
                except AttributeError:
                    # the parameter cannot be converted
                    # this can be the case when the data type of port of the library state changed
                    self.output_data_port_runtime_values[data_port_id] = data_port.default_value
                    self.use_runtime_value_output_data_ports[data_port_id] = True
                    self.marked_dirty = True

        # if there is a key existing in the runtime values but not in the output_data_ports we delete it
        for key in list(self.use_runtime_value_output_data_ports.keys()):
            if key not in self.output_data_ports:
                del self.use_runtime_value_output_data_ports[key]
                del self.output_data_port_runtime_values[key]
                # state machine cannot be marked dirty directly, as it does not exist yet
                self.marked_dirty = True
示例#2
0
    def apply_new_global_variable_value(self, path, new_value_as_string):
        """Change global variable value according handed string

        Updates the global variable value only if new value string is different to old representation.

        :param path: The path identifying the edited global variable tree view row, can be str, int or tuple.
        :param str new_value_as_string: New global variable value as string
        """
        if self.list_store[path][
                self.DATA_TYPE_AS_STRING_STORAGE_ID] == new_value_as_string:
            return
        gv_name = self.list_store[path][self.NAME_STORAGE_ID]
        if not self.global_variable_is_editable(gv_name, 'Change of value'):
            return
        data_type = self.model.global_variable_manager.get_data_type(gv_name)
        old_value = self.model.global_variable_manager.get_representation(
            gv_name)

        # preserve type especially if type=NoneType
        if issubclass(data_type, (type(old_value), type(None))):
            old_type = data_type
            if issubclass(data_type, type(None)):
                old_type = type(old_value)
                logger.debug(
                    "Trying to parse '{}' to type '{}' of old global variable value '{}'"
                    .format(new_value_as_string, old_type.__name__, old_value))
            try:
                new_value = type_helpers.convert_string_value_to_type_value(
                    new_value_as_string, old_type)
            except (AttributeError, ValueError) as e:
                if issubclass(data_type, type(None)):
                    new_value = new_value_as_string
                    logger.warning(
                        "New value '{}' stored as string, previous value '{}' of global variable '{}' was "
                        "of type '{}'".format(new_value, old_value, gv_name,
                                              type(old_value).__name__))
                else:
                    logger.warning(
                        "Restoring old value of global variable '{}': {}".
                        format(gv_name, e))
                    return
        else:
            logger.error(
                "Global variable '{}' with inconsistent value data type '{}' and data type '{}'"
                .format(gv_name,
                        [type(old_value).__name__,
                         type(None).__name__], data_type.__name__))
            return

        try:
            self.model.global_variable_manager.set_variable(
                gv_name, new_value, data_type=data_type)
        except (RuntimeError, AttributeError, TypeError) as e:
            logger.error(
                "Error while setting global variable '{0}' to value '{1}' -> Exception: {2}"
                .format(gv_name, new_value, e))
示例#3
0
 def _unsafe_init(self, name, data_type, default_value, parent):
     self._name = name
     if data_type is not None:
         self._data_type = data_type
     if isinstance(default_value, string_types):
         self._default_value = type_helpers.convert_string_value_to_type_value(
             default_value, data_type)
     else:
         self._default_value = default_value
     if parent:
         self._parent = ref(parent)
示例#4
0
    def check_default_value(self, default_value, data_type=None):
        """Check whether the passed default value suits to the passed data type. If no data type is passed, the
        data type of the data port is used. If the default value does not fit, an exception is thrown. If the default
        value is of type string, it is tried to convert that value to the data type.

        :param default_value: The default value to check
        :param data_type: The data type to use
        :raises exceptions.AttributeError: if check fails
        :return: The converted default value
        """
        if data_type is None:
            data_type = self.data_type

        if default_value is not None:
            # If the default value is passed as string, we have to convert it to the data type
            if isinstance(default_value, string_types):
                if len(default_value) > 1 and default_value[0] == '$':
                    return default_value
                if default_value == "None":
                    return None

                default_value = type_helpers.convert_string_value_to_type_value(
                    default_value, data_type)
                if default_value is None:
                    raise AttributeError(
                        "Could not convert default value '{0}' to data type '{1}'."
                        .format(default_value, data_type))
            else:
                if not isinstance(default_value, self.data_type):
                    if self._no_type_error_exceptions:
                        logger.warning(
                            "Handed default value '{0}' is of type '{1}' but data port data type is {2} {3}."
                            "".format(default_value, type(default_value),
                                      data_type, self))
                    else:
                        raise TypeError(
                            "Handed default value '{0}' is of type '{1}' but data port data type is {2}"
                            "{3} of {4}.".format(
                                default_value, type(default_value), data_type,
                                self,
                                self.parent.get_path()
                                if self.parent is not None else ""))

        return default_value
示例#5
0
    def __init__(
            self,
            library_path=None,
            library_name=None,
            version=None,  # library state specific attributes
            # the following are the container state specific attributes
        name=None,
            state_id=None,
            outcomes=None,
            input_data_port_runtime_values=None,
            use_runtime_value_input_data_ports=None,
            output_data_port_runtime_values=None,
            use_runtime_value_output_data_ports=None,
            allow_user_interaction=True):

        # this variable is set to true if the state initialization is finished! after initialization no change to the
        # library state is allowed any more
        self.initialized = False
        State.__init__(self, name, state_id, None, None, outcomes)

        self.library_path = library_path
        self.library_name = library_name
        self.version = version

        lib_os_path, new_library_path, new_library_name = \
            library_manager.get_os_path_to_library(library_path, library_name, allow_user_interaction)
        self.lib_os_path = lib_os_path

        if library_path != new_library_path or library_name != new_library_name:
            self.library_name = new_library_name
            self.library_path = new_library_path
            # TODO this should trigger the marked_dirty of the state machine to become true
            logger.info("Changing information about location of library")
            logger.info("Old library name '{0}' was located at {1}".format(
                library_name, library_path))
            logger.info("New library name '{0}' is located at {1}".format(
                new_library_name, new_library_path))

        # key = load_library_root_state_timer.start()
        lib_version, state_copy = library_manager.get_library_state_copy_instance(
            self.lib_os_path)
        self.state_copy = state_copy
        # load_library_root_state_timer.stop(key)
        self.state_copy.parent = self
        if not str(lib_version) == version and not str(lib_version) == "None":
            raise AttributeError("Library does not have the correct version!")

        if name is None:
            self.name = self.state_copy.name

        # copy all ports and outcomes of self.state_copy to let the library state appear like the container state
        # this will also set the parent of all outcomes and data ports to self
        self.outcomes = self.state_copy.outcomes
        self.input_data_ports = self.state_copy.input_data_ports
        self.output_data_ports = self.state_copy.output_data_ports

        # handle input runtime values
        self.input_data_port_runtime_values = input_data_port_runtime_values
        self.use_runtime_value_input_data_ports = use_runtime_value_input_data_ports
        for data_port_id, data_port in self.input_data_ports.iteritems():
            # Ensure that all input data ports have a runtime value
            if data_port_id not in self.input_data_port_runtime_values.iterkeys(
            ):
                self.input_data_port_runtime_values[
                    data_port_id] = data_port.default_value
                self.use_runtime_value_input_data_ports[data_port_id] = True
            # Ensure that str and unicode is correctly differentiated
            elif isinstance(self.input_data_port_runtime_values[data_port_id],
                            basestring):
                try:
                    self.input_data_port_runtime_values[
                        data_port_id] = type_helpers.convert_string_value_to_type_value(
                            self.input_data_port_runtime_values[data_port_id],
                            data_port.data_type)
                except AttributeError:
                    # the parameter cannot be converted
                    # this can be the case when the data type of port of the library state changed
                    self.input_data_port_runtime_values[
                        data_port_id] = data_port.default_value
                    self.use_runtime_value_input_data_ports[
                        data_port_id] = True
                    self.marked_dirty = True

        # if there is a key existing in the runtime values but not in the input_data_ports we delete it
        for key in self.use_runtime_value_input_data_ports.keys():
            if key not in self.input_data_ports.keys():
                del self.use_runtime_value_input_data_ports[key]
                del self.input_data_port_runtime_values[key]
                # state machine cannot be marked dirty directly, as it does not exist yet
                self.marked_dirty = True

        # handle output runtime values
        self.output_data_port_runtime_values = output_data_port_runtime_values
        self.use_runtime_value_output_data_ports = use_runtime_value_output_data_ports
        for data_port_id, data_port in self.output_data_ports.iteritems():
            # Ensure that all output data ports have a runtime value
            if data_port_id not in self.output_data_port_runtime_values.iterkeys(
            ):
                self.output_data_port_runtime_values[
                    data_port_id] = data_port.default_value
                self.use_runtime_value_output_data_ports[data_port_id] = True
            # Ensure that str and unicode is correctly differentiated
            elif isinstance(self.output_data_port_runtime_values[data_port_id],
                            basestring):
                try:
                    self.output_data_port_runtime_values[data_port_id] = \
                        type_helpers.convert_string_value_to_type_value(
                            self.output_data_port_runtime_values[data_port_id], data_port.data_type)
                except AttributeError:
                    # the parameter cannot be converted
                    # this can be the case when the data type of port of the library state changed
                    self.output_data_port_runtime_values[
                        data_port_id] = data_port.default_value
                    self.use_runtime_value_output_data_ports[
                        data_port_id] = True
                    self.marked_dirty = True

        # if there is a key existing in the runtime values but not in the output_data_ports we delete it
        for key in self.use_runtime_value_output_data_ports.keys():
            if key not in self.output_data_ports.keys():
                del self.use_runtime_value_output_data_ports[key]
                del self.output_data_port_runtime_values[key]
                # state machine cannot be marked dirty directly, as it does not exist yet
                self.marked_dirty = True

        self.initialized = True