1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/efe376544e22/
Changeset: efe376544e22
User: greg
Date: 2013-03-25 22:05:14
Summary: Add baseline cupport for installing tool shed repositories from a specified
tool shed into Galaxy via a combination of the tool shed API and the now enhanced Galaxy
API. There are 3 new example scripts in ~/scripts/api that demonstrate how this works.
The are named like: install_repository...
In this implementation, all tools contained in repositories will be loaded into the Galaxy
tool panel.
The user can specify the following when sending a POST to the new Galaxy API URL:
/api/tool_shed_repositories/new/install_repository_revision
1) an existing tool panel section id for loading tools or a new tool panel section label
in which case a new ToolPanelSection will be created for containing the tools.
2) if they want tool dependencies installed along with the repository.
3) if they want repository dependencies installed along with the repository
4) which defined shed-related tool panel config file to use for installed tools
Affected #: 10 files
diff -r e741400c6578993c3bfe5faf184dd56518a2360a -r
efe376544e2263ec8f9788d71d25dd2b4b49a39d
lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py
--- /dev/null
+++ b/lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py
@@ -0,0 +1,324 @@
+import logging
+import urllib2
+from galaxy.util import json
+from galaxy import util
+from galaxy import web
+from galaxy.web.base.controller import BaseAPIController
+from tool_shed.galaxy_install import repository_util
+import tool_shed.util.shed_util_common as suc
+
+log = logging.getLogger( __name__ )
+
+def default_tool_shed_repository_value_mapper( trans, tool_shed_repository ):
+ value_mapper={ 'id' : trans.security.encode_id( tool_shed_repository.id ),
+ 'error_message' : tool_shed_repository.error_message or
'' }
+ return value_mapper
+
+def get_message_for_no_shed_tool_config():
+ # This Galaxy instance is not configured with a shed-related tool panel configuration
file.
+ message = 'The tool_config_file setting in universe_wsgi.ini must include at
least one shed tool configuration file name with a <toolbox> '
+ message += 'tag that includes a tool_path attribute value which is a directory
relative to the Galaxy installation directory in order to '
+ message += 'automatically install tools from a tool shed into Galaxy (e.g., the
file name shed_tool_conf.xml whose <toolbox> tag is '
+ message += '<toolbox tool_path="../shed_tools">). For details,
see the "Installation of Galaxy tool shed repository tools into a local '
+ message += 'Galaxy instance" section of the Galaxy tool shed wiki at
http://wiki.galaxyproject.org/InstallingRepositoriesToGalaxy#'
+ message +=
'Installing_Galaxy_tool_shed_repository_tools_into_a_local_Galaxy_instance.'
+ return message
+
+class ToolShedRepositoriesController( BaseAPIController ):
+ """RESTful controller for interactions with tool shed
repositories."""
+
+ @web.expose_api
+ def index( self, trans, **kwd ):
+ """
+ GET /api/tool_shed_repositories
+ Display a list of dictionaries containing information about installed tool shed
repositories.
+ """
+ # Example URL:
http://localhost:8763/api/tool_shed_repositories
+ tool_shed_repository_dicts = []
+ try:
+ query = trans.sa_session.query( trans.app.model.ToolShedRepository ) \
+ .order_by(
trans.app.model.ToolShedRepository.table.c.name ) \
+ .all()
+ for tool_shed_repository in query:
+ tool_shed_repository_dict = tool_shed_repository.get_api_value(
value_mapper=default_tool_shed_repository_value_mapper( trans, tool_shed_repository ) )
+ tool_shed_repository_dict[ 'url' ] = web.url_for(
controller='tool_shed_repositories',
+ action='show',
+
id=trans.security.encode_id( tool_shed_repository.id ) )
+ tool_shed_repository_dicts.append( tool_shed_repository_dict )
+ return tool_shed_repository_dicts
+ except Exception, e:
+ message = "Error in the tool_shed_repositories API in index: %s" %
str( e )
+ log.error( message, exc_info=True )
+ trans.response.status = 500
+ return message
+
+ @web.expose_api
+ def show( self, trans, id, **kwd ):
+ """
+ GET /api/tool_shed_repositories/{encoded_tool_shed_repsository_id}
+ Display a dictionary containing information about a specified
tool_shed_repository.
+
+ :param tool_shed_repository_id: the encoded id of the `ToolShedRepository`
object
+ """
+ # Example URL:
http://localhost:8763/api/tool_shed_repositories/df7a1f0c02a5b08e
+ try:
+ tool_shed_repository = suc.get_tool_shed_repository_by_id( trans, id )
+ tool_shed_repository_dict = tool_shed_repository.as_dict(
value_mapper=default_tool_shed_repository_value_mapper( trans, tool_shed_repository ) )
+ tool_shed_repository_dict[ 'url' ] = web.url_for(
controller='tool_shed_repositories',
+ action='show',
+
id=trans.security.encode_id( tool_shed_repository.id ) )
+ return tool_shed_repository_dict
+ except Exception, e:
+ message = "Error in tool_shed_repositories API in index: " + str( e
)
+ log.error( message, exc_info=True )
+ trans.response.status = 500
+ return message
+
+ @web.expose_api
+ def install_repository_revision( self, trans, payload, **kwd ):
+ """
+ POST /api/tool_shed_repositories/install_repository_revision
+ Install a specified repository revision from a specified tool shed into Galaxy.
+
+ :param tool_shed_url: the base URL of the Tool Shed from which to install the
Repository
+ :param name: the name of the Repository
+ :param owner: the owner of the Repository
+ :param changset_revision: the changset_revision of the RepositoryMetadata object
associated with the Repository
+ :param key: the current Galaxy admin user's API key
+ :param new_tool_panel_section_label: optional label of a new section to be added
to the Galaxy tool panel in which to load
+ tools contained in the Repository. Either
this parameter must be an empty string or
+ the tool_panel_section_id parameter must be
an empty string, as both cannot be used.
+ :param tool_panel_section_id: optional id of the Galaxy tool panel section in
which to load tools contained in the Repository.
+ If not set, tools will be loaded outside of any
sections in the tool panel. Either this
+ parameter must be an empty string or the
tool_panel_section_id parameter must be an empty string,
+ as both cannot be used.
+ """
+ # Get the information about the repository to be installed from the payload.
+ tool_shed_url = payload.get( 'tool_shed_url', '' )
+ if not tool_shed_url:
+ raise HTTPBadRequest( detail="Missing required parameter
'tool_shed_url'." )
+ name = payload.get( 'name', '' )
+ if not name:
+ raise HTTPBadRequest( detail="Missing required parameter
'name'." )
+ owner = payload.get( 'owner', '' )
+ if not owner:
+ raise HTTPBadRequest( detail="Missing required parameter
'owner'." )
+ changeset_revision = payload.get( 'changeset_revision', '' )
+ if not changeset_revision:
+ raise HTTPBadRequest( detail="Missing required parameter
'changeset_revision'." )
+ # Make sure this Galaxy instance is configured with a shed-related tool panel
configuration file.
+ if not suc.have_shed_tool_conf_for_install( trans ):
+ message = get_message_for_no_shed_tool_config()
+ log.error( message, exc_info=True )
+ trans.response.status = 500
+ return dict( status='error', error=message )
+ # Make sure the current user's API key proves he is an admin user in this
Galaxy instance.
+ if not trans.user_is_admin():
+ raise HTTPForbidden( detail='You are not authorized to install a tool
shed repository into this Galaxy instance.' )
+ # Keep track of all repositories that are installed - there may be more than one
if repository dependencies are installed.
+ installed_tool_shed_repositories = []
+ # Get all of the information necessary for installing the repository from the
specified tool shed.
+ url = suc.url_join( tool_shed_url,
+
'api/repositories/get_repository_revision_install_info?name=%s&owner=%s&changeset_revision=%s'
% \
+ ( name, owner, changeset_revision ) )
+ try:
+ response = urllib2.urlopen( url )
+ raw_text = response.read()
+ response.close()
+ except Exception, e:
+ message = "Error attempting to retrieve installation information from
tool shed %s for revision %s of repository %s owned by %s: %s" % \
+ ( str( tool_shed_url ), str( name ), str( owner ), str(
changeset_revision ), str( e ) )
+ log.error( message, exc_info=True )
+ trans.response.status = 500
+ return dict( status='error', error=message )
+ if raw_text:
+ items = json.from_json_string( raw_text )
+ repository_dict = items[ 0 ]
+ repository_revision_dict = items[ 1 ]
+ repo_info_dict = items[ 2 ]
+ else:
+ message = "Unable to retrieve installation information from tool shed %s
for revision %s of repository %s owned by %s: %s" % \
+ ( str( tool_shed_url ), str( name ), str( owner ), str(
changeset_revision ) )
+ log.error( message, exc_info=True )
+ trans.response.status = 500
+ return dict( status='error', error=message )
+ repo_info_dicts = [ repo_info_dict ]
+ # Make sure the tool shed returned everything we need for installing the
repository.
+ try:
+ has_repository_dependencies = repository_revision_dict[
'has_repository_dependencies' ]
+ except:
+ raise HTTPBadRequest( detail="Missing required parameter
'has_repository_dependencies'." )
+ try:
+ includes_tools = repository_revision_dict[ 'includes_tools' ]
+ except:
+ raise HTTPBadRequest( detail="Missing required parameter
'includes_tools'." )
+ try:
+ includes_tool_dependencies = repository_revision_dict[
'includes_tool_dependencies' ]
+ except:
+ raise HTTPBadRequest( detail="Missing required parameter
'includes_tool_dependencies'." )
+ try:
+ includes_tools_for_display_in_tool_panel = repository_revision_dict[
'includes_tools_for_display_in_tool_panel' ]
+ except:
+ raise HTTPBadRequest( detail="Missing required parameter
'includes_tools_for_display_in_tool_panel'." )
+ # Get the information about the Galaxy components (e.g., tool pane section, tool
config file, etc) that will contain the repository
+ # information.
+ install_repository_dependencies = payload.get(
'install_repository_dependencies', False )
+ install_tool_dependencies = payload.get( 'install_tool_dependencies',
False )
+ new_tool_panel_section = payload.get( 'new_tool_panel_section_label',
'' )
+ shed_tool_conf = payload.get( 'shed_tool_conf', None )
+ tool_path = payload.get( 'tool_path', None )
+ tool_panel_section_id = payload.get( 'tool_panel_section_id', ''
)
+ if tool_panel_section_id is not None:
+ tool_panel_section = trans.app.toolbox.tool_panel[ tool_panel_section_id ]
+ else:
+ tool_panel_section = ''
+ if not shed_tool_conf or not tool_path:
+ # Pick a semi-random shed-related tool panel configuration file.
+ for shed_config_dict in trans.app.toolbox.shed_tool_confs:
+ if shed_config_dict[ 'config_filename' ] !=
trans.app.config.migrated_tools_config:
+ break
+ shed_tool_conf = shed_config_dict[ 'config_filename' ]
+ tool_path = shed_config_dict[ 'tool_path' ]
+ if not shed_tool_conf:
+ raise HTTPBadRequest( detail="Missing required parameter
'shed_tool_conf'." )
+ if not tool_path:
+ raise HTTPBadRequest( detail="Missing required parameter
'tool_path'." )
+ # Build the dictionary of information necessary for creating tool_shed_repository
database records for each repository being installed.
+ installation_dict = dict(
install_repository_dependencies=install_repository_dependencies,
+ new_tool_panel_section=new_tool_panel_section,
+ no_changes_checked=False,
+ reinstalling=False,
+ repo_info_dicts=repo_info_dicts,
+ tool_panel_section=tool_panel_section,
+ tool_path=tool_path,
+ tool_shed_url=tool_shed_url )
+ # Create the tool_shed_repository database records and gather additional
information for repository installation.
+ created_or_updated_tool_shed_repositories, tool_panel_section_keys,
repo_info_dicts, filtered_repo_info_dicts, message = \
+ repository_util.handle_tool_shed_repositories( trans, installation_dict,
using_api=True )
+ if message and len( repo_info_dicts ) == 1:
+ # We're attempting to install a single repository that has already been
installed into this Galaxy instance.
+ log.error( message, exc_info=True )
+ trans.response.status = 500
+ return dict( status='error', error=message )
+ if created_or_updated_tool_shed_repositories:
+ # Build the dictionary of information necessary for installing the
repositories.
+ installation_dict = dict(
created_or_updated_tool_shed_repositories=created_or_updated_tool_shed_repositories,
+ filtered_repo_info_dicts=filtered_repo_info_dicts,
+
has_repository_dependencies=has_repository_dependencies,
+
includes_tool_dependencies=includes_tool_dependencies,
+ includes_tools=includes_tools,
+
includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
+
install_repository_dependencies=install_repository_dependencies,
+
install_tool_dependencies=install_tool_dependencies,
+ message='',
+ new_tool_panel_section=new_tool_panel_section,
+ shed_tool_conf=shed_tool_conf,
+ status='done',
+ tool_panel_section=tool_panel_section,
+ tool_panel_section_keys=tool_panel_section_keys,
+ tool_path=tool_path,
+ tool_shed_url=tool_shed_url )
+ # Prepare the repositories for installation. Even though this method
receives a single combination of tool_shed_url, name, owner and
+ # changeset_revision, there may be multiple repositories for installation at
this point because repository dependencies may have added
+ # additional repositories for installation along with the single specified
repository.
+ encoded_kwd, query, tool_shed_repositories, encoded_repository_ids =
repository_util.initiate_repository_installation( trans, installation_dict )
+ # Install the repositories, keeping track of each one for later display.
+ for index, tool_shed_repository in enumerate( tool_shed_repositories ):
+ repo_info_dict = repo_info_dicts[ index ]
+ tool_panel_section_key = tool_panel_section_keys[ index ]
+ repository_util.install_tool_shed_repository( trans,
+ tool_shed_repository,
+ repo_info_dict,
+ tool_panel_section_key,
+ shed_tool_conf,
+ tool_path,
+ install_tool_dependencies,
+ reinstalling=False )
+ tool_shed_repository_dict = tool_shed_repository.as_dict(
value_mapper=default_tool_shed_repository_value_mapper( trans, tool_shed_repository ) )
+ tool_shed_repository_dict[ 'url' ] = web.url_for(
controller='tool_shed_repositories',
+ action='show',
+
id=trans.security.encode_id( tool_shed_repository.id ) )
+ installed_tool_shed_repositories.append( tool_shed_repository_dict )
+ else:
+ log.error( message, exc_info=True )
+ trans.response.status = 500
+ return dict( status='error', error=message )
+ # Display the list of installed repositories.
+ return installed_tool_shed_repositories
+
+ @web.expose_api
+ def install_repository_revisions( self, trans, payload, **kwd ):
+ """
+ POST /api/tool_shed_repositories/install_repository_revisions
+ Install one or more specified repository revisions from one or more specified
tool sheds into Galaxy. The received parameters
+ must be ordered lists so that positional values in tool_shed_urls, names, owners
and changeset_revisions are associated.
+
+ It's questionable whether this method is needed as the above method for
installing a single repository can probably cover all
+ desired scenarios. We'll keep this one around just in case...
+
+ :param tool_shed_urls: the base URLs of the Tool Sheds from which to install a
specified Repository
+ :param names: the names of the Repositories to be installed
+ :param owners: the owners of the Repositories to be installed
+ :param changset_revisions: the changset_revisions of each RepositoryMetadata
object associated with each Repository to be installed
+ :param key: the current Galaxy admin user's API key
+ :param new_tool_panel_section_label: optional label of a new section to be added
to the Galaxy tool panel in which to load
+ tools contained in the Repository. Either
this parameter must be an empty string or
+ the tool_panel_section_id parameter must be
an empty string, as both cannot be used.
+ :param tool_panel_section_id: optional id of the Galaxy tool panel section in
which to load tools contained in the Repository.
+ If not set, tools will be loaded outside of any
sections in the tool panel. Either this
+ parameter must be an empty string or the
tool_panel_section_id parameter must be an empty string,
+ as both cannot be used.
+ """
+ if not suc.have_shed_tool_conf_for_install( trans ):
+ # This Galaxy instance is not configured with a shed-related tool panel
configuration file.
+ message = get_message_for_no_shed_tool_config()
+ log.error( message, exc_info=True )
+ trans.response.status = 500
+ return dict( status='error', error=message )
+ if not trans.user_is_admin():
+ raise HTTPForbidden( detail='You are not authorized to install a tool
shed repository into this Galaxy instance.' )
+ # Get the information about all of the repositories to be installed.
+ tool_shed_urls = util.listify( payload.get( 'tool_shed_urls', ''
) )
+ names = util.listify( payload.get( 'names', '' ) )
+ owners = util.listify( payload.get( 'owners', '' ) )
+ changeset_revisions = util.listify( payload.get( 'changeset_revisions',
'' ) )
+ num_specified_repositories = len( tool_shed_urls )
+ if len( names ) != num_specified_repositories or \
+ len( owners ) != num_specified_repositories or \
+ len( changeset_revisions ) != num_specified_repositories:
+ message = 'Error in tool_shed_repositories API in
install_repository_revisions: the received parameters must be ordered '
+ message += 'lists so that positional values in tool_shed_urls, names,
owners and changeset_revisions are associated.'
+ log.error( message, exc_info=True )
+ trans.response.status = 500
+ return dict( status='error', error=message )
+ # Get the information about the Galaxy components (e.g., tool pane section, tool
config file, etc) that will contain information
+ # about each of the repositories being installed.
+ # TODO: we may want to enhance this method to allow for each of the following to
be associated with each repository instead of
+ # forcing all repositories to use the same settings.
+ install_repository_dependencies = payload.get(
'install_repository_dependencies', False )
+ install_tool_dependencies = payload.get( 'install_tool_dependencies',
False )
+ new_tool_panel_section = payload.get( 'new_tool_panel_section_label',
'' )
+ shed_tool_conf = payload.get( 'shed_tool_conf', None )
+ tool_path = payload.get( 'tool_path', None )
+ tool_panel_section_id = payload.get( 'tool_panel_section_id', ''
)
+ all_installed_tool_shed_repositories = []
+ for index, tool_shed_url in enumerate( tool_shed_urls ):
+ current_payload = {}
+ current_payload[ 'tool_shed_url' ] = tool_shed_url
+ current_payload[ 'name' ] = names[ index ]
+ current_payload[ 'owner' ] = owners[ index ]
+ current_payload[ 'changeset_revision' ] = changeset_revisions[ index
]
+ current_payload[ 'install_repository_dependencies' ] =
install_repository_dependencies
+ current_payload[ 'install_tool_dependencies' ] =
install_tool_dependencies
+ current_payload[ 'new_tool_panel_section' ] = new_tool_panel_section
+ current_payload[ 'shed_tool_conf' ] = shed_tool_conf
+ current_payload[ 'tool_path' ] = tool_path
+ current_payload[ 'tool_panel_section_id' ] = tool_panel_section_id
+ installed_tool_shed_repositories = self.install_repository_revision( trans,
**current_payload )
+ if isinstance( installed_tool_shed_repositories, dict ):
+ # We encountered an error.
+ return installed_tool_shed_repositories
+ elif isinstance( installed_tool_shed_repositories, list ):
+ all_installed_tool_shed_repositories.extend(
installed_tool_shed_repositories )
+ return all_installed_tool_shed_repositories
+
\ No newline at end of file
diff -r e741400c6578993c3bfe5faf184dd56518a2360a -r
efe376544e2263ec8f9788d71d25dd2b4b49a39d lib/galaxy/webapps/galaxy/buildapp.py
--- a/lib/galaxy/webapps/galaxy/buildapp.py
+++ b/lib/galaxy/webapps/galaxy/buildapp.py
@@ -104,12 +104,6 @@
name_prefix='group_',
path_prefix='/api/groups/:group_id',
parent_resources=dict( member_name='group',
collection_name='groups' ) )
- webapp.api_mapper.resource( 'content',
- 'contents',
- controller='tool_shed_repository_contents',
- name_prefix='tool_shed_repository_',
-
path_prefix='/api/tool_shed_repositories/:tool_shed_repository_id',
- parent_resources=dict(
member_name='tool_shed_repository',
collection_name='tool_shed_repositories' ) )
_add_item_tags_controller( webapp,
name_prefix="history_content_",
path_prefix='/api/histories/:history_id/contents/:history_content_id' )
@@ -142,7 +136,6 @@
webapp.api_mapper.resource( 'tool', 'tools',
path_prefix='/api' )
webapp.api_mapper.resource_with_deleted( 'user', 'users',
path_prefix='/api' )
webapp.api_mapper.resource( 'genome', 'genomes',
path_prefix='/api' )
- webapp.api_mapper.resource( 'tool_shed_repository',
'tool_shed_repositories', path_prefix='/api' )
webapp.api_mapper.resource( 'visualization', 'visualizations',
path_prefix='/api' )
webapp.api_mapper.resource( 'workflow', 'workflows',
path_prefix='/api' )
webapp.api_mapper.resource_with_deleted( 'history', 'histories',
path_prefix='/api' )
@@ -155,7 +148,14 @@
webapp.api_mapper.connect("workflow_dict",
'/api/workflows/{workflow_id}/download', controller='workflows',
action='workflow_dict', conditions=dict(method=['GET']))
# Preserve the following download route for now for dependent applications --
deprecate at some point
webapp.api_mapper.connect("workflow_dict",
'/api/workflows/download/{workflow_id}', controller='workflows',
action='workflow_dict', conditions=dict(method=['GET']))
-
+ # Galaxy API for tool shed features.
+ webapp.api_mapper.resource( 'tool_shed_repository',
+ 'tool_shed_repositories',
+ controller='tool_shed_repositories',
+ name_prefix='tool_shed_repository_',
+ path_prefix='/api',
+ new={ 'install_repository_revision' :
'POST' },
+ parent_resources=dict(
member_name='tool_shed_repository',
collection_name='tool_shed_repositories' ) )
# Connect logger from app
if app.trace_logger:
webapp.trace_logger = app.trace_logger
diff -r e741400c6578993c3bfe5faf184dd56518a2360a -r
efe376544e2263ec8f9788d71d25dd2b4b49a39d
lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -846,7 +846,7 @@
tool_path=tool_path,
tool_shed_url=tool_shed_url )
created_or_updated_tool_shed_repositories, tool_panel_section_keys,
repo_info_dicts, filtered_repo_info_dicts, message = \
- repository_util.handle_tool_shed_repositories( trans, installation_dict
)
+ repository_util.handle_tool_shed_repositories( trans, installation_dict,
using_api=False )
if message and len( repo_info_dicts ) == 1:
return trans.response.send_redirect( web.url_for(
controller='admin_toolshed',
action='browse_repositories',
diff -r e741400c6578993c3bfe5faf184dd56518a2360a -r
efe376544e2263ec8f9788d71d25dd2b4b49a39d lib/galaxy/webapps/tool_shed/api/repositories.py
--- a/lib/galaxy/webapps/tool_shed/api/repositories.py
+++ b/lib/galaxy/webapps/tool_shed/api/repositories.py
@@ -1,9 +1,10 @@
import logging
from galaxy.web.framework.helpers import time_ago
-import tool_shed.util.shed_util_common as suc
from galaxy import web
from galaxy import util
from galaxy.web.base.controller import BaseAPIController
+import tool_shed.util.shed_util_common as suc
+from tool_shed.galaxy_install import repository_util
from galaxy import eggs
import pkg_resources
@@ -29,7 +30,7 @@
class RepositoriesController( BaseAPIController ):
"""RESTful controller for interactions with repositories in the Tool
Shed."""
- @web.expose_api
+ @web.expose_api_anonymous
def index( self, trans, deleted=False, **kwd ):
"""
GET /api/repositories
@@ -56,7 +57,7 @@
trans.response.status = 500
return message
- @web.expose_api
+ @web.expose_api_anonymous
def show( self, trans, id, **kwd ):
"""
GET /api/repositories/{encoded_repository_id}
@@ -78,17 +79,59 @@
trans.response.status = 500
return message
- @web.expose_api
- def get_repository_and_revision( self, trans, name, owner, changeset_revision, **kwd
):
+ @web.expose_api_anonymous
+ def get_repository_revision_install_info( self, trans, name, owner,
changeset_revision, **kwd ):
"""
- GET /api/repository/get_repository_and_revision
- Returns information about a repository revision in the Tool Shed.
+ GET /api/repository/get_repository_revision_install_info
- :param name: the name of the Repository object
- :param owner: the owner of the Repository object
- :param changset_revision: the changset_revision of the RepositoryMetadata object
associated with the Repository object
+ :param name: the name of the Repository
+ :param owner: the owner of the Repository
+ :param changset_revision: the changset_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 Repsoitory revision (RepositoryMetadata). For
example:
+ {
+ "changeset_revision": "3a08cc21466f",
+ "downloadable": true,
+ "has_repository_dependencies": 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"
+ }
+ - 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://localhost:9009/api/repositories/get_repository_and_revision?name=a...
+ # Example URL:
http://localhost:9009/api/repositories/get_repository_revision_install_in...
try:
# Get the repository information.
repository = suc.get_repository_by_name_and_owner( trans.app, name, owner )
@@ -106,6 +149,7 @@
repo = hg.repository( suc.get_configured_ui(), repo_dir )
new_changeset_revision = suc.get_next_downloadable_changeset_revision(
repository, repo, changeset_revision )
repository_metadata = suc.get_repository_metadata_by_changeset_revision(
trans, encoded_repository_id, new_changeset_revision )
+ changeset_revision = new_changeset_revision
if repository_metadata:
encoded_repository_metadata_id = trans.security.encode_id(
repository_metadata.id )
repository_metadata_dict = repository_metadata.get_api_value(
view='collection',
@@ -113,14 +157,17 @@
repository_metadata_dict[ 'url' ] = web.url_for(
controller='repository_revisions',
action='show',
id=encoded_repository_metadata_id )
- return repository_dict, repository_metadata_dict
+ # 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 = \
+ repository_util.get_repo_info_dict( trans, encoded_repository_id,
changeset_revision )
+ return repository_dict, repository_metadata_dict, repo_info_dict
else:
message = "Unable to locate repository_metadata record for
repository id %d and changeset_revision %s" % ( repository.id, changeset_revision )
log.error( message, exc_info=True )
trans.response.status = 500
- return repository_dict, {}
+ return repository_dict, {}, {}
except Exception, e:
- message = "Error in the Tool Shed repositories API in
get_repository_and_revision: %s" % str( e )
+ message = "Error in the Tool Shed repositories API in
get_repository_revision_install_info: %s" % str( e )
log.error( message, exc_info=True )
trans.response.status = 500
return message
diff -r e741400c6578993c3bfe5faf184dd56518a2360a -r
efe376544e2263ec8f9788d71d25dd2b4b49a39d lib/galaxy/webapps/tool_shed/buildapp.py
--- a/lib/galaxy/webapps/tool_shed/buildapp.py
+++ b/lib/galaxy/webapps/tool_shed/buildapp.py
@@ -77,7 +77,7 @@
webapp.api_mapper.resource( 'repository',
'repositories',
controller='repositories',
- collection={ 'get_repository_and_revision' :
'GET' },
+ collection={
'get_repository_revision_install_info' : 'GET' },
name_prefix='repository_',
path_prefix='/api',
parent_resources=dict( member_name='repository',
collection_name='repositories' ) )
diff -r e741400c6578993c3bfe5faf184dd56518a2360a -r
efe376544e2263ec8f9788d71d25dd2b4b49a39d lib/tool_shed/galaxy_install/repository_util.py
--- a/lib/tool_shed/galaxy_install/repository_util.py
+++ b/lib/tool_shed/galaxy_install/repository_util.py
@@ -252,7 +252,7 @@
# Load proprietary datatype display applications
trans.app.datatypes_registry.load_display_applications(
installed_repository_dict=repository_dict )
-def handle_tool_shed_repositories( trans, installation_dict ):
+def handle_tool_shed_repositories( trans, installation_dict, using_api=False ):
# The following installation_dict entries are all required.
install_repository_dependencies = installation_dict[
'install_repository_dependencies' ]
new_tool_panel_section = installation_dict[ 'new_tool_panel_section' ]
@@ -272,7 +272,7 @@
no_changes_checked=no_changes_checked,
tool_panel_section=tool_panel_section,
new_tool_panel_section=new_tool_panel_section )
- if message and len( repo_info_dicts ) == 1:
+ if message and len( repo_info_dicts ) == 1 and not using_api:
installed_tool_shed_repository = created_or_updated_tool_shed_repositories[ 0 ]
message += 'Click <a href="%s">here</a> to manage the
repository. ' % \
( web.url_for( controller='admin_toolshed',
action='manage_repository', id=trans.security.encode_id(
installed_tool_shed_repository.id ) ) )
diff -r e741400c6578993c3bfe5faf184dd56518a2360a -r
efe376544e2263ec8f9788d71d25dd2b4b49a39d scripts/api/common.py
--- a/scripts/api/common.py
+++ b/scripts/api/common.py
@@ -1,4 +1,7 @@
-import os, sys, urllib, urllib2
+import logging
+import os
+import sys
+import urllib2
new_path = [ os.path.join( os.path.dirname( __file__ ), '..', '..',
'lib' ) ]
new_path.extend( sys.path[1:] )
@@ -15,6 +18,8 @@
from Crypto.Util.randpool import RandomPool
from Crypto.Util import number
+log = logging.getLogger( __name__ )
+
def make_url( api_key, url, args=None ):
# Adds the API Key to the URL if it's not already there.
if args is None:
diff -r e741400c6578993c3bfe5faf184dd56518a2360a -r
efe376544e2263ec8f9788d71d25dd2b4b49a39d
scripts/api/install_repository_tools_into_existing_tool_panel_section.py
--- /dev/null
+++ b/scripts/api/install_repository_tools_into_existing_tool_panel_section.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+"""
+Install a specified repository revision from a specified tool shed into Galaxy. This
example demonstrates installation of a repository that contains
+valid tools, loading them into an existing section of the Galaxy tool panel. The
repository has no tool dependencies or repository dependencies, so only
+a single repository will be installed.
+
+This example requires a tool panel config file (e.g., tool_conf.xml, shed_tool_conf.xml,
etc) to contain a tool panel section like the following:
+
+<section id="from_test_tool_shed" name="From Test Tool Shed"
version="">
+</section>
+
+usage: ./install_repository_tools_into_existing_tool_panel_section <api_key <galaxy
base url> tool_shed_url name owner changeset_revision tool_panel_section_id
+
+Here is a working example of how to use this script to install a repository from the test
tool shed.
+./install_repository_tools_into_existing_tool_panel_section.py <api key><galaxy
base url>/api/tool_shed_repositories/new/install_repository_revision
http://testtoolshed.g2.bx.psu.edu gregs_filter greg f28d5018f9cb from_test_tool_shed
+"""
+
+import os
+import sys
+sys.path.insert( 0, os.path.dirname( __file__ ) )
+from common import submit
+
+try:
+ assert sys.argv[ 7 ]
+except IndexError:
+ print 'usage: %s key url tool_shed_url name owner changeset_revision
tool_panel_section_id' % os.path.basename( sys.argv[ 0 ] )
+ sys.exit( 1 )
+
+try:
+ data = {}
+ data[ 'tool_shed_url' ] = sys.argv[ 3 ]
+ data[ 'name' ] = sys.argv[ 4 ]
+ data[ 'owner' ] = sys.argv[ 5 ]
+ data[ 'changeset_revision' ] = sys.argv[ 6 ]
+ data[ 'tool_panel_section_id' ] = sys.argv[ 7 ]
+except IndexError:
+ print 'usage: %s key url tool_shed_url name owner changeset_revision
tool_panel_section_id' % os.path.basename( sys.argv[ 0 ] )
+ sys.exit( 1 )
+
+submit( sys.argv[ 1 ], sys.argv[ 2 ], data )
diff -r e741400c6578993c3bfe5faf184dd56518a2360a -r
efe376544e2263ec8f9788d71d25dd2b4b49a39d
scripts/api/install_repository_tools_into_new_tool_panel_section.py
--- /dev/null
+++ b/scripts/api/install_repository_tools_into_new_tool_panel_section.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+"""
+Install a specified repository revision from a specified tool shed into Galaxy. This
example demonstrates installation of a repository that contains
+valid tools, loading them into a new section of the Galaxy tool panel. The repository
has no tool dependencies or repository dependencies, so only
+a single repository will be installed.
+
+usage: ./install_repository_tools_into_existing_tool_panel_section <api_key <galaxy
base url> tool_shed_url name owner changeset_revision new_tool_panel_section_label
+
+Here is a working example of how to use this script to install a repository from the test
tool shed.
+./install_repository_tools_into_existing_tool_panel_section.py <api key><galaxy
base url>/api/tool_shed_repositories/new/install_repository_revision
http://testtoolshed.g2.bx.psu.edu gregs_filter greg f28d5018f9cb
From%20Test%20Tool%20Shed
+"""
+
+import os
+import sys
+sys.path.insert( 0, os.path.dirname( __file__ ) )
+from common import submit
+
+try:
+ assert sys.argv[ 7 ]
+except IndexError:
+ print 'usage: %s key url tool_shed_url name owner changeset_revision
tool_panel_section_id' % os.path.basename( sys.argv[ 0 ] )
+ sys.exit( 1 )
+
+try:
+ data = {}
+ data[ 'tool_shed_url' ] = sys.argv[ 3 ]
+ data[ 'name' ] = sys.argv[ 4 ]
+ data[ 'owner' ] = sys.argv[ 5 ]
+ data[ 'changeset_revision' ] = sys.argv[ 6 ]
+ data[ 'new_tool_panel_section_label' ] = sys.argv[ 7 ]
+except IndexError:
+ print 'usage: %s key url tool_shed_url name owner changeset_revision
new_tool_panel_section_label' % os.path.basename( sys.argv[ 0 ] )
+ sys.exit( 1 )
+
+submit( sys.argv[ 1 ], sys.argv[ 2 ], data )
diff -r e741400c6578993c3bfe5faf184dd56518a2360a -r
efe376544e2263ec8f9788d71d25dd2b4b49a39d
scripts/api/install_repository_with_repository_dependencies.py
--- /dev/null
+++ b/scripts/api/install_repository_with_repository_dependencies.py
@@ -0,0 +1,35 @@
+#!/usr/bin/env python
+"""
+Install a specified repository revision from a specified tool shed into Galaxy. This
example demonstrates installation of a repository that has
+repository dependencies, so multiple repositories will ultimately be installed. Since no
Galaxy tool panel section information is used, all tools
+contained in the installed repositories will be loaded into the Galaxy tool panel outside
of any sections.
+
+usage: ./install_repository_tools_into_existing_tool_panel_section <api_key <galaxy
base url> tool_shed_url name owner changeset_revision True
+
+Here is a working example of how to use this script to install a repository from the test
tool shed.
+./install_repository_tools_into_existing_tool_panel_section.py <api key><galaxy
base url>/api/tool_shed_repositories/new/install_repository_revision
http://testtoolshed.g2.bx.psu.edu emboss_5 devteam 8ddad0c9a75a True
+"""
+
+import os
+import sys
+sys.path.insert( 0, os.path.dirname( __file__ ) )
+from common import submit
+
+try:
+ assert sys.argv[ 7 ]
+except IndexError:
+ print 'usage: %s key url tool_shed_url name owner changeset_revision
install_repository_dependencies' % os.path.basename( sys.argv[ 0 ] )
+ sys.exit( 1 )
+
+try:
+ data = {}
+ data[ 'tool_shed_url' ] = sys.argv[ 3 ]
+ data[ 'name' ] = sys.argv[ 4 ]
+ data[ 'owner' ] = sys.argv[ 5 ]
+ data[ 'changeset_revision' ] = sys.argv[ 6 ]
+ data[ 'install_repository_dependencies' ] = sys.argv[ 7 ]
+except IndexError:
+ print 'usage: %s key url tool_shed_url name owner changeset_revision
install_repository_dependencies' % os.path.basename( sys.argv[ 0 ] )
+ sys.exit( 1 )
+
+submit( sys.argv[ 1 ], sys.argv[ 2 ], data )
\ No newline at end of file
Repository URL:
https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from
bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.