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 {}
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 {}
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 {}
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
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
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
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 {}
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 {}, {}, {}