Ejemplo n.º 1
0
 def load_from_element(self, elem, tool_path):
     assert (
         elem.tag == "data_manager"
     ), 'A data manager configuration must have a "data_manager" tag as the root. "%s" is present' % (elem.tag)
     self.declared_id = elem.get("id", None)
     self.guid = elem.get("guid", None)
     path = elem.get("tool_file", None)
     self.version = elem.get("version", self.version)
     tool_shed_repository_id = None
     tool_guid = None
     if path is None:
         tool_elem = elem.find("tool")
         assert tool_elem is not None, (
             "Error loading tool for data manager. Make sure that a tool_file attribute or a tool tag set has been defined:\n%s"
             % (util.xml_to_string(elem))
         )
         path = tool_elem.get("file", None)
         tool_guid = tool_elem.get("guid", None)
         # need to determine repository info so that dependencies will work correctly
         tool_shed = tool_elem.find("tool_shed").text
         repository_name = tool_elem.find("repository_name").text
         repository_owner = tool_elem.find("repository_owner").text
         installed_changeset_revision = tool_elem.find("installed_changeset_revision").text
         # save repository info here
         self.tool_shed_repository_info_dict = dict(
             tool_shed=tool_shed,
             name=repository_name,
             owner=repository_owner,
             installed_changeset_revision=installed_changeset_revision,
         )
         # get tool_shed repo id
         tool_shed_repository = suc.get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision(
             self.data_managers.app, tool_shed, repository_name, repository_owner, installed_changeset_revision
         )
         if tool_shed_repository is None:
             log.warning(
                 "Could not determine tool shed repository from database. This should only ever happen when running tests."
             )
             # we'll set tool_path manually here from shed_conf_file
             tool_shed_repository_id = None
             try:
                 tool_path = util.parse_xml(elem.get("shed_conf_file")).getroot().get("tool_path", tool_path)
             except Exception, e:
                 log.error("Error determining tool_path for Data Manager during testing: %s", e)
         else:
             tool_shed_repository_id = self.data_managers.app.security.encode_id(tool_shed_repository.id)
         # use shed_conf_file to determine tool_path
         shed_conf_file = elem.get("shed_conf_file", None)
         if shed_conf_file:
             shed_conf = self.data_managers.app.toolbox.get_shed_config_dict_by_filename(shed_conf_file, None)
             if shed_conf:
                 tool_path = shed_conf.get("tool_path", tool_path)
Ejemplo n.º 2
0
 def load_from_element( self, elem, tool_path ):
     assert elem.tag == 'data_manager', 'A data manager configuration must have a "data_manager" tag as the root. "%s" is present' % ( elem.tag )
     self.declared_id = elem.get( 'id', None )
     self.guid = elem.get( 'guid', None )
     path = elem.get( 'tool_file', None )
     self.version = elem.get( 'version', self.version )
     tool_shed_repository_id = None
     tool_guid = None
     if path is None:
         tool_elem = elem.find( 'tool' )
         assert tool_elem is not None, "Error loading tool for data manager. Make sure that a tool_file attribute or a tool tag set has been defined:\n%s" % ( util.xml_to_string( elem ) )
         path = tool_elem.get( "file", None )
         tool_guid = tool_elem.get( "guid", None )
         #need to determine repository info so that dependencies will work correctly
         tool_shed_url = tool_elem.find( 'tool_shed' ).text
         # Handle protocol changes.
         tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry( self.data_managers.app, tool_shed_url )
         # The protocol is not stored in the database.
         tool_shed = common_util.remove_protocol_from_tool_shed_url( tool_shed_url )
         repository_name = tool_elem.find( 'repository_name' ).text
         repository_owner = tool_elem.find( 'repository_owner' ).text
         installed_changeset_revision = tool_elem.find( 'installed_changeset_revision' ).text
         self.tool_shed_repository_info_dict = dict( tool_shed=tool_shed,
                                                     name=repository_name,
                                                     owner=repository_owner,
                                                     installed_changeset_revision=installed_changeset_revision )
         tool_shed_repository = \
             suc.get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( self.data_managers.app,
                                                                                           tool_shed,
                                                                                           repository_name,
                                                                                           repository_owner,
                                                                                           installed_changeset_revision )
         if tool_shed_repository is None:
             log.warning( 'Could not determine tool shed repository from database. This should only ever happen when running tests.' )
             #we'll set tool_path manually here from shed_conf_file
             tool_shed_repository_id = None
             try:
                 tool_path = util.parse_xml( elem.get( 'shed_conf_file' ) ).getroot().get( 'tool_path', tool_path )
             except Exception, e:
                 log.error( 'Error determining tool_path for Data Manager during testing: %s', e )
         else:
             tool_shed_repository_id = self.data_managers.app.security.encode_id( tool_shed_repository.id )
         #use shed_conf_file to determine tool_path
         shed_conf_file = elem.get( "shed_conf_file", None )
         if shed_conf_file:
             shed_conf = self.data_managers.app.toolbox.get_shed_config_dict_by_filename( shed_conf_file, None )
             if shed_conf:
                 tool_path = shed_conf.get( "tool_path", tool_path )
Ejemplo n.º 3
0
 def load_from_element(self, elem, tool_path):
     assert elem.tag == 'data_manager', 'A data manager configuration must have a "data_manager" tag as the root. "%s" is present' % (
         elem.tag)
     self.declared_id = elem.get('id', None)
     self.guid = elem.get('guid', None)
     path = elem.get('tool_file', None)
     self.version = elem.get('version', self.version)
     tool_shed_repository_id = None
     tool_guid = None
     if path is None:
         tool_elem = elem.find('tool')
         assert tool_elem is not None, "Error loading tool for data manager. Make sure that a tool_file attribute or a tool tag set has been defined:\n%s" % (
             util.xml_to_string(elem))
         path = tool_elem.get("file", None)
         tool_guid = tool_elem.get("guid", None)
         #need to determine repository info so that dependencies will work correctly
         tool_shed_url = tool_elem.find('tool_shed').text
         # Handle protocol changes.
         tool_shed_url = common_util.get_tool_shed_url_from_tool_shed_registry(
             self.data_managers.app, tool_shed_url)
         # The protocol is not stored in the database.
         tool_shed = common_util.remove_protocol_from_tool_shed_url(
             tool_shed_url)
         repository_name = tool_elem.find('repository_name').text
         repository_owner = tool_elem.find('repository_owner').text
         installed_changeset_revision = tool_elem.find(
             'installed_changeset_revision').text
         self.tool_shed_repository_info_dict = dict(
             tool_shed=tool_shed,
             name=repository_name,
             owner=repository_owner,
             installed_changeset_revision=installed_changeset_revision)
         tool_shed_repository = \
             suc.get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( self.data_managers.app,
                                                                                           tool_shed,
                                                                                           repository_name,
                                                                                           repository_owner,
                                                                                           installed_changeset_revision )
         if tool_shed_repository is None:
             log.warning(
                 'Could not determine tool shed repository from database. This should only ever happen when running tests.'
             )
             #we'll set tool_path manually here from shed_conf_file
             tool_shed_repository_id = None
             try:
                 tool_path = util.parse_xml(
                     elem.get('shed_conf_file')).getroot().get(
                         'tool_path', tool_path)
             except Exception, e:
                 log.error(
                     'Error determining tool_path for Data Manager during testing: %s',
                     e)
         else:
             tool_shed_repository_id = self.data_managers.app.security.encode_id(
                 tool_shed_repository.id)
         #use shed_conf_file to determine tool_path
         shed_conf_file = elem.get("shed_conf_file", None)
         if shed_conf_file:
             shed_conf = self.data_managers.app.toolbox.get_shed_config_dict_by_filename(
                 shed_conf_file, None)
             if shed_conf:
                 tool_path = shed_conf.get("tool_path", tool_path)
Ejemplo n.º 4
0
    def load_from_element(self, elem, tool_path):
        assert elem.tag == 'data_manager', 'A data manager configuration must have a "data_manager" tag as the root. "%s" is present' % (
            root.tag)
        self.declared_id = elem.get('id', None)
        self.guid = elem.get('guid', None)
        path = elem.get('tool_file', None)
        self.version = elem.get('version', self.version)
        tool_shed_repository_id = None
        tool_guid = None
        if path is None:
            tool_elem = elem.find('tool')
            assert tool_elem is not None, "Error loading tool for data manager. Make sure that a tool_file attribute or a tool tag set has been defined:\n%s" % (
                util.xml_to_string(elem))
            path = tool_elem.get("file", None)
            tool_guid = tool_elem.get("guid", None)
            #need to determine repository info so that dependencies will work correctly
            tool_shed = tool_elem.find('tool_shed').text
            repository_name = tool_elem.find('repository_name').text
            repository_owner = tool_elem.find('repository_owner').text
            installed_changeset_revision = tool_elem.find(
                'installed_changeset_revision').text
            #save repository info here
            self.tool_shed_repository_info_dict = dict(
                tool_shed=tool_shed,
                name=repository_name,
                owner=repository_owner,
                installed_changeset_revision=installed_changeset_revision)
            #get tool_shed repo id
            tool_shed_repository = suc.get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision(
                self.data_managers.app, tool_shed, repository_name,
                repository_owner, installed_changeset_revision)
            tool_shed_repository_id = self.data_managers.app.security.encode_id(
                tool_shed_repository.id)
            #use shed_conf_file to determine tool_path
            shed_conf_file = elem.get("shed_conf_file", None)
            if shed_conf_file:
                shed_conf = self.data_managers.app.toolbox.get_shed_config_dict_by_filename(
                    shed_conf_file, None)
                if shed_conf:
                    tool_path = shed_conf.get("tool_path", tool_path)
        assert path is not None, "A tool file path could not be determined:\n%s" % (
            util.xml_to_string(elem))
        self.load_tool(os.path.join(tool_path, path),
                       guid=tool_guid,
                       data_manager_id=self.id,
                       tool_shed_repository_id=tool_shed_repository_id)
        self.name = elem.get('name', self.tool.name)
        self.description = elem.get('description', self.tool.description)

        for data_table_elem in elem.findall('data_table'):
            data_table_name = data_table_elem.get("name")
            assert data_table_name is not None, "A name is required for a data table entry"
            if data_table_name not in self.data_tables:
                self.data_tables[data_table_name] = odict()  #{}
            output_elem = data_table_elem.find('output')
            if output_elem is not None:
                for column_elem in output_elem.findall('column'):
                    column_name = column_elem.get('name', None)
                    assert column_name is not None, "Name is required for column entry"
                    data_table_coumn_name = column_elem.get(
                        'data_table_name', column_name)
                    self.data_tables[data_table_name][
                        data_table_coumn_name] = column_name
                    output_ref = column_elem.get('output_ref', None)
                    if output_ref is not None:
                        if data_table_name not in self.output_ref_by_data_table:
                            self.output_ref_by_data_table[data_table_name] = {}
                        self.output_ref_by_data_table[data_table_name][
                            data_table_coumn_name] = output_ref
                    value_translation_elems = column_elem.findall(
                        'value_translation')
                    if value_translation_elems is not None:
                        for value_translation_elem in value_translation_elems:
                            value_translation = value_translation_elem.text
                            if value_translation is not None:
                                value_translation_type = value_translation_elem.get(
                                    'type', DEFAULT_VALUE_TRANSLATION_TYPE)
                                if data_table_name not in self.value_translation_by_data_table_column:
                                    self.value_translation_by_data_table_column[
                                        data_table_name] = {}
                                if data_table_coumn_name not in self.value_translation_by_data_table_column[
                                        data_table_name]:
                                    self.value_translation_by_data_table_column[
                                        data_table_name][
                                            data_table_coumn_name] = []
                                if value_translation_type == 'function':
                                    if value_translation in VALUE_TRANSLATION_FUNCTIONS:
                                        value_translation = VALUE_TRANSLATION_FUNCTIONS[
                                            value_translation]
                                    else:
                                        raise ValueError(
                                            "Unsupported value translation function: '%s'"
                                            % (value_translation))
                                else:
                                    assert value_translation_type == DEFAULT_VALUE_TRANSLATION_TYPE, ValueError(
                                        "Unsupported value translation type: '%s'"
                                        % (value_translation_type))
                                self.value_translation_by_data_table_column[
                                    data_table_name][
                                        data_table_coumn_name].append(
                                            value_translation)

                    for move_elem in column_elem.findall('move'):
                        move_type = move_elem.get('type', 'directory')
                        relativize_symlinks = move_elem.get(
                            'relativize_symlinks', False
                        )  #TODO: should we instead always relativize links?
                        source_elem = move_elem.find('source')
                        if source_elem is None:
                            source_base = None
                            source_value = ''
                        else:
                            source_base = source_elem.get('base', None)
                            source_value = source_elem.text
                        target_elem = move_elem.find('target')
                        if target_elem is None:
                            target_base = None
                            target_value = ''
                        else:
                            target_base = target_elem.get('base', None)
                            target_value = target_elem.text
                        if data_table_name not in self.move_by_data_table_column:
                            self.move_by_data_table_column[
                                data_table_name] = {}
                        self.move_by_data_table_column[data_table_name][
                            data_table_coumn_name] = dict(
                                type=move_type,
                                source_base=source_base,
                                source_value=source_value,
                                target_base=target_base,
                                target_value=target_value,
                                relativize_symlinks=relativize_symlinks)
Ejemplo n.º 5
0
    def load_from_element(self, elem, tool_path):
        assert (
            elem.tag == "data_manager"
        ), 'A data manager configuration must have a "data_manager" tag as the root. "%s" is present' % (root.tag)
        self.declared_id = elem.get("id", None)
        self.guid = elem.get("guid", None)
        path = elem.get("tool_file", None)
        self.version = elem.get("version", self.version)
        tool_shed_repository_id = None
        tool_guid = None
        if path is None:
            tool_elem = elem.find("tool")
            assert tool_elem is not None, (
                "Error loading tool for data manager. Make sure that a tool_file attribute or a tool tag set has been defined:\n%s"
                % (util.xml_to_string(elem))
            )
            path = tool_elem.get("file", None)
            tool_guid = tool_elem.get("guid", None)
            # need to determine repository info so that dependencies will work correctly
            tool_shed = tool_elem.find("tool_shed").text
            repository_name = tool_elem.find("repository_name").text
            repository_owner = tool_elem.find("repository_owner").text
            installed_changeset_revision = tool_elem.find("installed_changeset_revision").text
            # save repository info here
            self.tool_shed_repository_info_dict = dict(
                tool_shed=tool_shed,
                name=repository_name,
                owner=repository_owner,
                installed_changeset_revision=installed_changeset_revision,
            )
            # get tool_shed repo id
            tool_shed_repository = suc.get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision(
                self.data_managers.app, tool_shed, repository_name, repository_owner, installed_changeset_revision
            )
            tool_shed_repository_id = self.data_managers.app.security.encode_id(tool_shed_repository.id)
            # use shed_conf_file to determine tool_path
            shed_conf_file = elem.get("shed_conf_file", None)
            if shed_conf_file:
                shed_conf = self.data_managers.app.toolbox.get_shed_config_dict_by_filename(shed_conf_file, None)
                if shed_conf:
                    tool_path = shed_conf.get("tool_path", tool_path)
        assert path is not None, "A tool file path could not be determined:\n%s" % (util.xml_to_string(elem))
        self.load_tool(
            os.path.join(tool_path, path),
            guid=tool_guid,
            data_manager_id=self.id,
            tool_shed_repository_id=tool_shed_repository_id,
        )
        self.name = elem.get("name", self.tool.name)
        self.description = elem.get("description", self.tool.description)

        for data_table_elem in elem.findall("data_table"):
            data_table_name = data_table_elem.get("name")
            assert data_table_name is not None, "A name is required for a data table entry"
            if data_table_name not in self.data_tables:
                self.data_tables[data_table_name] = odict()  # {}
            output_elem = data_table_elem.find("output")
            if output_elem is not None:
                for column_elem in output_elem.findall("column"):
                    column_name = column_elem.get("name", None)
                    assert column_name is not None, "Name is required for column entry"
                    data_table_coumn_name = column_elem.get("data_table_name", column_name)
                    self.data_tables[data_table_name][data_table_coumn_name] = column_name
                    output_ref = column_elem.get("output_ref", None)
                    if output_ref is not None:
                        if data_table_name not in self.output_ref_by_data_table:
                            self.output_ref_by_data_table[data_table_name] = {}
                        self.output_ref_by_data_table[data_table_name][data_table_coumn_name] = output_ref
                    value_translation_elems = column_elem.findall("value_translation")
                    if value_translation_elems is not None:
                        for value_translation_elem in value_translation_elems:
                            value_translation = value_translation_elem.text
                            if value_translation is not None:
                                value_translation_type = value_translation_elem.get(
                                    "type", DEFAULT_VALUE_TRANSLATION_TYPE
                                )
                                if data_table_name not in self.value_translation_by_data_table_column:
                                    self.value_translation_by_data_table_column[data_table_name] = {}
                                if (
                                    data_table_coumn_name
                                    not in self.value_translation_by_data_table_column[data_table_name]
                                ):
                                    self.value_translation_by_data_table_column[data_table_name][
                                        data_table_coumn_name
                                    ] = []
                                if value_translation_type == "function":
                                    if value_translation in VALUE_TRANSLATION_FUNCTIONS:
                                        value_translation = VALUE_TRANSLATION_FUNCTIONS[value_translation]
                                    else:
                                        raise ValueError(
                                            "Unsupported value translation function: '%s'" % (value_translation)
                                        )
                                else:
                                    assert value_translation_type == DEFAULT_VALUE_TRANSLATION_TYPE, ValueError(
                                        "Unsupported value translation type: '%s'" % (value_translation_type)
                                    )
                                self.value_translation_by_data_table_column[data_table_name][
                                    data_table_coumn_name
                                ].append(value_translation)

                    for move_elem in column_elem.findall("move"):
                        move_type = move_elem.get("type", "directory")
                        relativize_symlinks = move_elem.get(
                            "relativize_symlinks", False
                        )  # TODO: should we instead always relativize links?
                        source_elem = move_elem.find("source")
                        if source_elem is None:
                            source_base = None
                            source_value = ""
                        else:
                            source_base = source_elem.get("base", None)
                            source_value = source_elem.text
                        target_elem = move_elem.find("target")
                        if target_elem is None:
                            target_base = None
                            target_value = ""
                        else:
                            target_base = target_elem.get("base", None)
                            target_value = target_elem.text
                        if data_table_name not in self.move_by_data_table_column:
                            self.move_by_data_table_column[data_table_name] = {}
                        self.move_by_data_table_column[data_table_name][data_table_coumn_name] = dict(
                            type=move_type,
                            source_base=source_base,
                            source_value=source_value,
                            target_base=target_base,
                            target_value=target_value,
                            relativize_symlinks=relativize_symlinks,
                        )