Esempio n. 1
0
 def get_tool_dependencies( self, app, changeset_revision ):
     repo = hg.repository( ui.ui(), self.repo_path( app ) )
     changeset_revision = metadata_util.get_next_downloadable_changeset_revision( self, repo, changeset_revision )
     for downloadable_revision in self.downloadable_revisions:
         if downloadable_revision.changeset_revision == changeset_revision:
             return downloadable_revision.metadata.get( 'tool_dependencies', {} )
     return {}
Esempio n. 2
0
 def get_tool_dependencies(self, app, changeset_revision):
     repo = hg.repository(ui.ui(), self.repo_path(app))
     changeset_revision = metadata_util.get_next_downloadable_changeset_revision(self, repo, changeset_revision)
     for downloadable_revision in self.downloadable_revisions:
         if downloadable_revision.changeset_revision == changeset_revision:
             return downloadable_revision.metadata.get('tool_dependencies', {})
     return {}
Esempio n. 3
0
 def get_tool_dependencies(self, app, changeset_revision):
     changeset_revision = metadata_util.get_next_downloadable_changeset_revision(
         app, self, changeset_revision)
     for downloadable_revision in self.downloadable_revisions:
         if downloadable_revision.changeset_revision == changeset_revision:
             return downloadable_revision.metadata.get(
                 'tool_dependencies', {})
     return {}
Esempio n. 4
0
def get_repo_info_dict(app, user, repository_id, changeset_revision):
    repository = get_repository_in_tool_shed(app, repository_id)
    repository_clone_url = common_util.generate_clone_url_for_repository_in_tool_shed(
        user, repository)
    repository_metadata = get_repository_metadata_by_changeset_revision(
        app, repository_id, changeset_revision)
    if not repository_metadata:
        # The received changeset_revision is no longer installable, so get the next changeset_revision
        # in the repository's changelog.  This generally occurs only with repositories of type
        # repository_suite_definition or tool_dependency_definition.
        next_downloadable_changeset_revision = \
            get_next_downloadable_changeset_revision(app, repository, changeset_revision)
        if next_downloadable_changeset_revision and next_downloadable_changeset_revision != changeset_revision:
            repository_metadata = get_repository_metadata_by_changeset_revision(
                app, repository_id, next_downloadable_changeset_revision)
    if repository_metadata:
        # For now, we'll always assume that we'll get repository_metadata, but if we discover our assumption
        # is not valid we'll have to enhance the callers to handle repository_metadata values of None in the
        # returned repo_info_dict.
        metadata = repository_metadata.metadata
        if 'tools' in metadata:
            includes_tools = True
        else:
            includes_tools = False
        includes_tools_for_display_in_tool_panel = repository_metadata.includes_tools_for_display_in_tool_panel
        repository_dependencies_dict = metadata.get('repository_dependencies',
                                                    {})
        repository_dependencies = repository_dependencies_dict.get(
            'repository_dependencies', [])
        has_repository_dependencies, has_repository_dependencies_only_if_compiling_contained_td = \
            get_repository_dependency_types(repository_dependencies)
        if 'tool_dependencies' in metadata:
            includes_tool_dependencies = True
        else:
            includes_tool_dependencies = False
    else:
        # Here's where we may have to handle enhancements to the callers. See above comment.
        includes_tools = False
        has_repository_dependencies = False
        has_repository_dependencies_only_if_compiling_contained_td = False
        includes_tool_dependencies = False
        includes_tools_for_display_in_tool_panel = False
    repo_path = repository.repo_path(app)
    ctx_rev = str(changeset2rev(repo_path, changeset_revision))
    repo_info_dict = create_repo_info_dict(
        app=app,
        repository_clone_url=repository_clone_url,
        changeset_revision=changeset_revision,
        ctx_rev=ctx_rev,
        repository_owner=repository.user.username,
        repository_name=repository.name,
        repository=repository,
        repository_metadata=repository_metadata,
        tool_dependencies=None,
        repository_dependencies=None)
    return repo_info_dict, includes_tools, includes_tool_dependencies, includes_tools_for_display_in_tool_panel, \
        has_repository_dependencies, has_repository_dependencies_only_if_compiling_contained_td
    def repository_dependencies(self, trans, id, **kwd):
        """
        GET /api/repository_revisions/{encoded repository_metadata id}/repository_dependencies

        Returns a list of dictionaries that each define a specific downloadable revision of a
        repository in the Tool Shed.  This method returns dictionaries with more information in
        them than other methods in this controller.  The information about repository_metdata is
        enhanced to include information about the repository (e.g., name, owner, etc) associated
        with the repository_metadata record.

        :param id: the encoded id of the `RepositoryMetadata` object
        """
        # Example URL: http://localhost:9009/api/repository_revisions/repository_dependencies/bb125606ff9ea620
        repository_dependencies_dicts = []
        repository_metadata = metadata_util.get_repository_metadata_by_id(trans.app, id)
        if repository_metadata is None:
            log.debug('Invalid repository_metadata id received: %s' % str(id))
            return repository_dependencies_dicts
        metadata = repository_metadata.metadata
        if metadata is None:
            log.debug('The repository_metadata record with id %s has no metadata.' % str(id))
            return repository_dependencies_dicts
        if 'repository_dependencies' in metadata:
            rd_tups = metadata['repository_dependencies']['repository_dependencies']
            for rd_tup in rd_tups:
                tool_shed, name, owner, changeset_revision = rd_tup[0:4]
                repository_dependency = repository_util.get_repository_by_name_and_owner(trans.app, name, owner)
                if repository_dependency is None:
                    log.dbug('Cannot locate repository dependency %s owned by %s.' % (name, owner))
                    continue
                repository_dependency_id = trans.security.encode_id(repository_dependency.id)
                repository_dependency_repository_metadata = \
                    metadata_util.get_repository_metadata_by_changeset_revision(trans.app, repository_dependency_id, changeset_revision)
                if repository_dependency_repository_metadata is None:
                    # The changeset_revision column in the repository_metadata table has been updated with a new
                    # value value, so find the changeset_revision to which we need to update.
                    repo = hg_util.get_repo_for_repository(trans.app,
                                                           repository=repository_dependency,
                                                           repo_path=None,
                                                           create=False)
                    new_changeset_revision = metadata_util.get_next_downloadable_changeset_revision(repository_dependency,
                                                                                                    repo,
                                                                                                    changeset_revision)
                    if new_changeset_revision != changeset_revision:
                        repository_dependency_repository_metadata = \
                            metadata_util.get_repository_metadata_by_changeset_revision(trans.app,
                                                                                        repository_dependency_id,
                                                                                        new_changeset_revision)
                        changeset_revision = new_changeset_revision
                    else:
                        decoded_repository_dependency_id = trans.security.decode_id(repository_dependency_id)
                        debug_msg = 'Cannot locate repository_metadata with id %d for repository dependency %s owned by %s ' % \
                            (decoded_repository_dependency_id, str(name), str(owner))
                        debug_msg += 'using either of these changeset_revisions: %s, %s.' % \
                            (str(changeset_revision), str(new_changeset_revision))
                        log.debug(debug_msg)
                        continue
                repository_dependency_metadata_dict = \
                    repository_dependency_repository_metadata.to_dict(view='element',
                                                                      value_mapper=self.__get_value_mapper(trans))
                repository_dependency_dict = repository_dependency.to_dict(view='element',
                                                                           value_mapper=self.__get_value_mapper(trans))
                # We need to be careful with the entries in our repository_dependency_dict here since this Tool Shed API
                # controller is working with repository_metadata records.  The above to_dict() method returns a dictionary
                # with an id entry for the repository record.  However, all of the other methods in this controller have
                # the id entry associated with a repository_metadata record id.  To avoid confusion, we'll update the
                # repository_dependency_metadata_dict with entries from the repository_dependency_dict without using the
                # Python dictionary update() method because we do not want to overwrite existing entries.
                for k, v in repository_dependency_dict.items():
                    if k not in repository_dependency_metadata_dict:
                        repository_dependency_metadata_dict[k] = v
                repository_dependency_metadata_dict['url'] = web.url_for(controller='repositories',
                                                                         action='show',
                                                                         id=repository_dependency_id)
                repository_dependencies_dicts.append(repository_dependency_metadata_dict)
        return repository_dependencies_dicts
    def repository_dependencies(self, trans, id, **kwd):
        """
        GET /api/repository_revisions/{encoded repository_metadata id}/repository_dependencies

        Returns a list of dictionaries that each define a specific downloadable revision of a
        repository in the Tool Shed.  This method returns dictionaries with more information in
        them than other methods in this controller.  The information about repository_metdata is
        enhanced to include information about the repository (e.g., name, owner, etc) associated
        with the repository_metadata record.

        :param id: the encoded id of the `RepositoryMetadata` object
        """
        # Example URL: http://localhost:9009/api/repository_revisions/repository_dependencies/bb125606ff9ea620
        repository_dependencies_dicts = []
        repository_metadata = metadata_util.get_repository_metadata_by_id(
            trans.app, id)
        if repository_metadata is None:
            log.debug('Invalid repository_metadata id received: %s' % str(id))
            return repository_dependencies_dicts
        metadata = repository_metadata.metadata
        if metadata is None:
            log.debug(
                'The repository_metadata record with id %s has no metadata.' %
                str(id))
            return repository_dependencies_dicts
        if 'repository_dependencies' in metadata:
            rd_tups = metadata['repository_dependencies'][
                'repository_dependencies']
            for rd_tup in rd_tups:
                tool_shed, name, owner, changeset_revision = rd_tup[0:4]
                repository_dependency = repository_util.get_repository_by_name_and_owner(
                    trans.app, name, owner)
                if repository_dependency is None:
                    log.dbug(
                        'Cannot locate repository dependency %s owned by %s.' %
                        (name, owner))
                    continue
                repository_dependency_id = trans.security.encode_id(
                    repository_dependency.id)
                repository_dependency_repository_metadata = \
                    metadata_util.get_repository_metadata_by_changeset_revision(trans.app, repository_dependency_id, changeset_revision)
                if repository_dependency_repository_metadata is None:
                    # The changeset_revision column in the repository_metadata table has been updated with a new
                    # value value, so find the changeset_revision to which we need to update.
                    new_changeset_revision = metadata_util.get_next_downloadable_changeset_revision(
                        trans.app, repository_dependency, changeset_revision)
                    if new_changeset_revision != changeset_revision:
                        repository_dependency_repository_metadata = \
                            metadata_util.get_repository_metadata_by_changeset_revision(trans.app,
                                                                                        repository_dependency_id,
                                                                                        new_changeset_revision)
                        changeset_revision = new_changeset_revision
                    else:
                        decoded_repository_dependency_id = trans.security.decode_id(
                            repository_dependency_id)
                        debug_msg = 'Cannot locate repository_metadata with id %d for repository dependency %s owned by %s ' % \
                            (decoded_repository_dependency_id, str(name), str(owner))
                        debug_msg += 'using either of these changeset_revisions: %s, %s.' % \
                            (str(changeset_revision), str(new_changeset_revision))
                        log.debug(debug_msg)
                        continue
                repository_dependency_metadata_dict = \
                    repository_dependency_repository_metadata.to_dict(view='element',
                                                                      value_mapper=self.__get_value_mapper(trans))
                repository_dependency_dict = repository_dependency.to_dict(
                    view='element',
                    value_mapper=self.__get_value_mapper(trans))
                # We need to be careful with the entries in our repository_dependency_dict here since this Tool Shed API
                # controller is working with repository_metadata records.  The above to_dict() method returns a dictionary
                # with an id entry for the repository record.  However, all of the other methods in this controller have
                # the id entry associated with a repository_metadata record id.  To avoid confusion, we'll update the
                # repository_dependency_metadata_dict with entries from the repository_dependency_dict without using the
                # Python dictionary update() method because we do not want to overwrite existing entries.
                for k, v in repository_dependency_dict.items():
                    if k not in repository_dependency_metadata_dict:
                        repository_dependency_metadata_dict[k] = v
                repository_dependency_metadata_dict['url'] = web.url_for(
                    controller='repositories',
                    action='show',
                    id=repository_dependency_id)
                repository_dependencies_dicts.append(
                    repository_dependency_metadata_dict)
        return repository_dependencies_dicts
Esempio n. 7
0
 def get_updated_changeset_revisions_for_repository_dependencies(self, key_rd_dicts):
     updated_key_rd_dicts = []
     for key_rd_dict in key_rd_dicts:
         key = next(iter(key_rd_dict))
         repository_dependency = key_rd_dict[key]
         rd_toolshed, rd_name, rd_owner, rd_changeset_revision, \
             rd_prior_installation_required, \
             rd_only_if_compiling_contained_td = \
             common_util.parse_repository_dependency_tuple(repository_dependency)
         if suc.tool_shed_is_this_tool_shed(rd_toolshed):
             repository = tool_shed.util.repository_util.get_repository_by_name_and_owner(self.app, rd_name, rd_owner)
             if repository:
                 repository_id = self.app.security.encode_id(repository.id)
                 repository_metadata = \
                     metadata_util.get_repository_metadata_by_repository_id_changeset_revision(self.app,
                                                                                               repository_id,
                                                                                               rd_changeset_revision)
                 if repository_metadata:
                     # The repository changeset_revision is installable, so no updates are available.
                     new_key_rd_dict = {}
                     new_key_rd_dict[key] = repository_dependency
                     updated_key_rd_dicts.append(key_rd_dict)
                 else:
                     # The repository changeset_revision is no longer installable, so see if there's been an update.
                     changeset_revision = metadata_util.get_next_downloadable_changeset_revision(self.app, repository, rd_changeset_revision)
                     if changeset_revision != rd_changeset_revision:
                         repository_metadata = \
                             metadata_util.get_repository_metadata_by_repository_id_changeset_revision(self.app,
                                                                                                       repository_id,
                                                                                                       changeset_revision)
                     if repository_metadata:
                         new_key_rd_dict = {}
                         new_key_rd_dict[key] = \
                             [rd_toolshed,
                              rd_name,
                              rd_owner,
                              repository_metadata.changeset_revision,
                              rd_prior_installation_required,
                              rd_only_if_compiling_contained_td]
                         # We have the updated changeset revision.
                         updated_key_rd_dicts.append(new_key_rd_dict)
                     else:
                         repository_components_tuple = container_util.get_components_from_key(key)
                         components_list = tool_shed.util.repository_util.extract_components_from_tuple(repository_components_tuple)
                         toolshed, repository_name, repository_owner, repository_changeset_revision = components_list[0:4]
                         # For backward compatibility to the 12/20/12 Galaxy release.
                         if len(components_list) in (4, 5):
                             rd_only_if_compiling_contained_td = 'False'
                         message = "The revision %s defined for repository %s owned by %s is invalid, so repository " % \
                             (str(rd_changeset_revision), str(rd_name), str(rd_owner))
                         message += "dependencies defined for repository %s will be ignored." % str(repository_name)
                         log.debug(message)
             else:
                 repository_components_tuple = container_util.get_components_from_key(key)
                 components_list = tool_shed.util.repository_util.extract_components_from_tuple(repository_components_tuple)
                 toolshed, repository_name, repository_owner, repository_changeset_revision = components_list[0:4]
                 message = "The revision %s defined for repository %s owned by %s is invalid, so repository " % \
                     (str(rd_changeset_revision), str(rd_name), str(rd_owner))
                 message += "dependencies defined for repository %s will be ignored." % str(repository_name)
                 log.debug(message)
     return updated_key_rd_dicts
Esempio n. 8
0
 def get_updated_changeset_revisions_for_repository_dependencies( self, key_rd_dicts ):
     updated_key_rd_dicts = []
     for key_rd_dict in key_rd_dicts:
         key = next(iter(key_rd_dict))
         repository_dependency = key_rd_dict[ key ]
         rd_toolshed, rd_name, rd_owner, rd_changeset_revision, \
             rd_prior_installation_required, \
             rd_only_if_compiling_contained_td = \
             common_util.parse_repository_dependency_tuple( repository_dependency )
         if suc.tool_shed_is_this_tool_shed( rd_toolshed ):
             repository = tool_shed.util.repository_util.get_repository_by_name_and_owner( self.app, rd_name, rd_owner )
             if repository:
                 repository_id = self.app.security.encode_id( repository.id )
                 repository_metadata = \
                     metadata_util.get_repository_metadata_by_repository_id_changeset_revision( self.app,
                                                                                                repository_id,
                                                                                                rd_changeset_revision )
                 if repository_metadata:
                     # The repository changeset_revision is installable, so no updates are available.
                     new_key_rd_dict = {}
                     new_key_rd_dict[ key ] = repository_dependency
                     updated_key_rd_dicts.append( key_rd_dict )
                 else:
                     # The repository changeset_revision is no longer installable, so see if there's been an update.
                     repo = hg_util.get_repo_for_repository( self.app, repository=repository, repo_path=None, create=False )
                     changeset_revision = metadata_util.get_next_downloadable_changeset_revision( repository, repo, rd_changeset_revision )
                     if changeset_revision != rd_changeset_revision:
                         repository_metadata = \
                             metadata_util.get_repository_metadata_by_repository_id_changeset_revision( self.app,
                                                                                                        repository_id,
                                                                                                        changeset_revision )
                     if repository_metadata:
                         new_key_rd_dict = {}
                         new_key_rd_dict[ key ] = \
                             [ rd_toolshed,
                               rd_name,
                               rd_owner,
                               repository_metadata.changeset_revision,
                               rd_prior_installation_required,
                               rd_only_if_compiling_contained_td ]
                         # We have the updated changeset revision.
                         updated_key_rd_dicts.append( new_key_rd_dict )
                     else:
                         repository_components_tuple = container_util.get_components_from_key( key )
                         components_list = tool_shed.util.repository_util.extract_components_from_tuple( repository_components_tuple )
                         toolshed, repository_name, repository_owner, repository_changeset_revision = components_list[ 0:4 ]
                         # For backward compatibility to the 12/20/12 Galaxy release.
                         if len( components_list ) in (4, 5):
                             rd_only_if_compiling_contained_td = 'False'
                         message = "The revision %s defined for repository %s owned by %s is invalid, so repository " % \
                             ( str( rd_changeset_revision ), str( rd_name ), str( rd_owner ) )
                         message += "dependencies defined for repository %s will be ignored." % str( repository_name )
                         log.debug( message )
             else:
                 repository_components_tuple = container_util.get_components_from_key( key )
                 components_list = tool_shed.util.repository_util.extract_components_from_tuple( repository_components_tuple )
                 toolshed, repository_name, repository_owner, repository_changeset_revision = components_list[ 0:4 ]
                 message = "The revision %s defined for repository %s owned by %s is invalid, so repository " % \
                     ( str( rd_changeset_revision ), str( rd_name ), str( rd_owner ) )
                 message += "dependencies defined for repository %s will be ignored." % str( repository_name )
                 log.debug( message )
     return updated_key_rd_dicts
Esempio n. 9
0
 def get_tool_dependencies(self, app, changeset_revision):
     changeset_revision = metadata_util.get_next_downloadable_changeset_revision(app, self, changeset_revision)
     for downloadable_revision in self.downloadable_revisions:
         if downloadable_revision.changeset_revision == changeset_revision:
             return downloadable_revision.metadata.get('tool_dependencies', {})
     return {}
Esempio n. 10
0
    def get_repository_revision_install_info(self, trans, name, owner, changeset_revision, **kwd):
        """
        GET /api/repositories/get_repository_revision_install_info

        :param name: the name of the Repository
        :param owner: the owner of the Repository
        :param changeset_revision: the changeset_revision of the RepositoryMetadata object associated with the Repository

        Returns a list of the following dictionaries::
        - a dictionary defining the Repository.  For example:
        {
            "deleted": false,
            "deprecated": false,
            "description": "add_column hello",
            "id": "f9cad7b01a472135",
            "long_description": "add_column hello",
            "name": "add_column",
            "owner": "test",
            "private": false,
            "times_downloaded": 6,
            "url": "/api/repositories/f9cad7b01a472135",
            "user_id": "f9cad7b01a472135"
        }
        - a dictionary defining the Repository revision (RepositoryMetadata).  For example:
        {
            "changeset_revision": "3a08cc21466f",
            "downloadable": true,
            "has_repository_dependencies": false,
            "has_repository_dependencies_only_if_compiling_contained_td": false,
            "id": "f9cad7b01a472135",
            "includes_datatypes": false,
            "includes_tool_dependencies": false,
            "includes_tools": true,
            "includes_tools_for_display_in_tool_panel": true,
            "includes_workflows": false,
            "malicious": false,
            "repository_id": "f9cad7b01a472135",
            "url": "/api/repository_revisions/f9cad7b01a472135",
            "valid_tools": [{u'add_to_tool_panel': True,
                u'description': u'data on any column using simple expressions',
                u'guid': u'localhost:9009/repos/enis/sample_repo_1/Filter1/2.2.0',
                u'id': u'Filter1',
                u'name': u'Filter',
                u'requirements': [],
                u'tests': [{u'inputs': [[u'input', u'1.bed'], [u'cond', u"c1=='chr22'"]],
                  u'name': u'Test-1',
                  u'outputs': [[u'out_file1', u'filter1_test1.bed']],
                  u'required_files': [u'1.bed', u'filter1_test1.bed']}],
                u'tool_config': u'database/community_files/000/repo_1/filtering.xml',
                u'tool_type': u'default',
                u'version': u'2.2.0',
                u'version_string_cmd': None}]
        }
        - a dictionary including the additional information required to install the repository.  For example:
        {
            "add_column": [
                "add_column hello",
                "http://test@localhost:9009/repos/test/add_column",
                "3a08cc21466f",
                "1",
                "test",
                {},
                {}
            ]
        }
        """
        # Example URL:
        # http://<xyz>/api/repositories/get_repository_revision_install_info?name=<n>&owner=<o>&changeset_revision=<cr>
        if name and owner and changeset_revision:
            # Get the repository information.
            repository = repository_util.get_repository_by_name_and_owner(self.app, name, owner)
            if repository is None:
                log.debug("Cannot locate repository %s owned by %s" % (str(name), str(owner)))
                return {}, {}, {}
            encoded_repository_id = trans.security.encode_id(repository.id)
            repository_dict = repository.to_dict(view="element", value_mapper=self.__get_value_mapper(trans))
            repository_dict["url"] = web.url_for(controller="repositories", action="show", id=encoded_repository_id)
            # Get the repository_metadata information.
            repository_metadata = metadata_util.get_repository_metadata_by_changeset_revision(
                self.app, encoded_repository_id, changeset_revision
            )
            if repository_metadata is None:
                # The changeset_revision column in the repository_metadata table has been updated with a new
                # value value, so find the changeset_revision to which we need to update.
                repo = hg_util.get_repo_for_repository(self.app, repository=repository, repo_path=None, create=False)
                new_changeset_revision = metadata_util.get_next_downloadable_changeset_revision(
                    repository, repo, changeset_revision
                )
                repository_metadata = metadata_util.get_repository_metadata_by_changeset_revision(
                    self.app, encoded_repository_id, new_changeset_revision
                )
                changeset_revision = new_changeset_revision
            if repository_metadata is not None:
                encoded_repository_metadata_id = trans.security.encode_id(repository_metadata.id)
                repository_metadata_dict = repository_metadata.to_dict(
                    view="collection", value_mapper=self.__get_value_mapper(trans)
                )
                repository_metadata_dict["url"] = web.url_for(
                    controller="repository_revisions", action="show", id=encoded_repository_metadata_id
                )
                if "tools" in repository_metadata.metadata:
                    repository_metadata_dict["valid_tools"] = repository_metadata.metadata["tools"]
                # Get the repo_info_dict for installing the repository.
                repo_info_dict, includes_tools, includes_tool_dependencies, includes_tools_for_display_in_tool_panel, has_repository_dependencies, has_repository_dependencies_only_if_compiling_contained_td = repository_util.get_repo_info_dict(
                    self.app, trans.user, encoded_repository_id, changeset_revision
                )
                return repository_dict, repository_metadata_dict, repo_info_dict
            else:
                log.debug(
                    "Unable to locate repository_metadata record for repository id %s and changeset_revision %s"
                    % (str(repository.id), str(changeset_revision))
                )
                return repository_dict, {}, {}
        else:
            debug_msg = "Error in the Tool Shed repositories API in get_repository_revision_install_info: "
            debug_msg += "Invalid name %s or owner %s or changeset_revision %s received." % (
                str(name),
                str(owner),
                str(changeset_revision),
            )
            log.debug(debug_msg)
            return {}, {}, {}