mirror of
https://github.com/galaxyproject/galaxy.git
synced 2026-09-24 16:30:27 +08:00
Add support for installing and administering simple repository dependencies for tool shed repositories installed into a Galaxy instance.
This commit is contained in:
@@ -23,6 +23,7 @@ class UniverseApplication( object ):
|
||||
"""Encapsulates the state of a Universe application"""
|
||||
def __init__( self, **kwargs ):
|
||||
print >> sys.stderr, "python path is: " + ", ".join( sys.path )
|
||||
self.name = 'galaxy'
|
||||
self.new_installation = False
|
||||
# Read config file and check for errors
|
||||
self.config = config.Configuration( **kwargs )
|
||||
|
||||
@@ -3148,6 +3148,9 @@ class ToolShedRepository( object ):
|
||||
def can_reinstall_or_activate( self ):
|
||||
return self.deleted
|
||||
@property
|
||||
def has_repository_dependencies( self ):
|
||||
return self.metadata and 'repository_dependencies' in self.metadata
|
||||
@property
|
||||
def includes_tools( self ):
|
||||
return self.metadata and 'tools' in self.metadata
|
||||
@property
|
||||
@@ -3211,6 +3214,15 @@ class ToolShedRepository( object ):
|
||||
uninstalled_tool_dependencies.append( tool_dependency )
|
||||
return uninstalled_tool_dependencies
|
||||
|
||||
class RepositoryRepositoryDependencyAssociation( object ):
|
||||
def __init__( self, tool_shed_repository_id=None, repository_dependency_id=None ):
|
||||
self.tool_shed_repository_id = tool_shed_repository_id
|
||||
self.repository_dependency_id = repository_dependency_id
|
||||
|
||||
class RepositoryDependency( object ):
|
||||
def __init__( self, tool_shed_repository_id=None ):
|
||||
self.tool_shed_repository_id = tool_shed_repository_id
|
||||
|
||||
class ToolDependency( object ):
|
||||
installation_status = Bunch( NEVER_INSTALLED='Never installed',
|
||||
INSTALLING='Installing',
|
||||
|
||||
@@ -409,6 +409,19 @@ ToolShedRepository.table = Table( "tool_shed_repository", metadata,
|
||||
Column( "status", TrimmedString( 255 ) ),
|
||||
Column( "error_message", TEXT ) )
|
||||
|
||||
RepositoryRepositoryDependencyAssociation.table = Table( 'repository_repository_dependency_association', metadata,
|
||||
Column( "id", Integer, primary_key=True ),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "tool_shed_repository_id", Integer, ForeignKey( "tool_shed_repository.id" ), index=True ),
|
||||
Column( "repository_dependency_id", Integer, ForeignKey( "repository_dependency.id" ), index=True ) )
|
||||
|
||||
RepositoryDependency.table = Table( "repository_dependency", metadata,
|
||||
Column( "id", Integer, primary_key=True ),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "tool_shed_repository_id", Integer, ForeignKey( "tool_shed_repository.id" ), index=True, nullable=False ) )
|
||||
|
||||
ToolDependency.table = Table( "tool_dependency", metadata,
|
||||
Column( "id", Integer, primary_key=True ),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
@@ -1744,7 +1757,19 @@ assign_mapper( context, ToolShedRepository, ToolShedRepository.table,
|
||||
tool_dependencies=relation( ToolDependency,
|
||||
primaryjoin=( ToolShedRepository.table.c.id == ToolDependency.table.c.tool_shed_repository_id ),
|
||||
order_by=ToolDependency.table.c.name,
|
||||
backref='tool_shed_repository' ) ) )
|
||||
backref='tool_shed_repository' ),
|
||||
repository_dependencies=relation( RepositoryRepositoryDependencyAssociation,
|
||||
primaryjoin=( ToolShedRepository.table.c.id == RepositoryRepositoryDependencyAssociation.table.c.tool_shed_repository_id ) ) ) )
|
||||
|
||||
assign_mapper( context, RepositoryRepositoryDependencyAssociation, RepositoryRepositoryDependencyAssociation.table,
|
||||
properties=dict( repository=relation( ToolShedRepository,
|
||||
primaryjoin=( RepositoryRepositoryDependencyAssociation.table.c.tool_shed_repository_id == ToolShedRepository.table.c.id ) ),
|
||||
repository_dependency=relation( RepositoryDependency,
|
||||
primaryjoin=( RepositoryRepositoryDependencyAssociation.table.c.repository_dependency_id == RepositoryDependency.table.c.id ) ) ) )
|
||||
|
||||
assign_mapper( context, RepositoryDependency, RepositoryDependency.table,
|
||||
properties=dict( repository=relation( ToolShedRepository,
|
||||
primaryjoin=( RepositoryDependency.table.c.tool_shed_repository_id == ToolShedRepository.table.c.id ) ) ) )
|
||||
|
||||
assign_mapper( context, ToolDependency, ToolDependency.table )
|
||||
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
"""
|
||||
Migration script to add the repository_dependency and repository_repository_dependency_association tables.
|
||||
"""
|
||||
from sqlalchemy import *
|
||||
from sqlalchemy.orm import *
|
||||
from migrate import *
|
||||
from migrate.changeset import *
|
||||
import sys, logging
|
||||
from galaxy.model.custom_types import *
|
||||
from sqlalchemy.exc import *
|
||||
import datetime
|
||||
now = datetime.datetime.utcnow
|
||||
|
||||
log = logging.getLogger( __name__ )
|
||||
log.setLevel( logging.DEBUG )
|
||||
handler = logging.StreamHandler( sys.stdout )
|
||||
format = "%(name)s %(levelname)s %(asctime)s %(message)s"
|
||||
formatter = logging.Formatter( format )
|
||||
handler.setFormatter( formatter )
|
||||
log.addHandler( handler )
|
||||
|
||||
metadata = MetaData( migrate_engine )
|
||||
|
||||
RepositoryDependency_table = Table( "repository_dependency", metadata,
|
||||
Column( "id", Integer, primary_key=True ),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "tool_shed_repository_id", Integer, ForeignKey( "tool_shed_repository.id" ), index=True, nullable=False ) )
|
||||
|
||||
RepositoryRepositoryDependencyAssociation_table = Table( "repository_repository_dependency_association", metadata,
|
||||
Column( "id", Integer, primary_key=True ),
|
||||
Column( "create_time", DateTime, default=now ),
|
||||
Column( "update_time", DateTime, default=now, onupdate=now ),
|
||||
Column( "tool_shed_repository_id", Integer, ForeignKey( "tool_shed_repository.id" ), index=True ),
|
||||
Column( "repository_dependency_id", Integer, ForeignKey( "repository_dependency.id" ), index=True ) )
|
||||
|
||||
def upgrade():
|
||||
print __doc__
|
||||
metadata.reflect()
|
||||
try:
|
||||
RepositoryDependency_table.create()
|
||||
except Exception, e:
|
||||
log.debug( "Creating repository_dependency table failed: %s" % str( e ) )
|
||||
try:
|
||||
RepositoryRepositoryDependencyAssociation_table.create()
|
||||
except Exception, e:
|
||||
log.debug( "Creating repository_repository_dependency_association table failed: %s" % str( e ) )
|
||||
|
||||
def downgrade():
|
||||
metadata.reflect()
|
||||
try:
|
||||
RepositoryRepositoryDependencyAssociation_table.drop()
|
||||
except Exception, e:
|
||||
log.debug( "Dropping repository_repository_dependency_association table failed: %s" % str( e ) )
|
||||
try:
|
||||
RepositoryDependency_table.drop()
|
||||
except Exception, e:
|
||||
log.debug( "Dropping repository_dependency table failed: %s" % str( e ) )
|
||||
@@ -283,19 +283,19 @@ class InstallManager( object ):
|
||||
repository_clone_url = os.path.join( tool_shed_url, 'repos', self.repository_owner, name )
|
||||
relative_install_dir = os.path.join( relative_clone_dir, name )
|
||||
install_dir = os.path.join( clone_dir, name )
|
||||
ctx_rev = shed_util.get_ctx_rev( tool_shed_url, name, self.repository_owner, installed_changeset_revision )
|
||||
ctx_rev = suc.get_ctx_rev( tool_shed_url, name, self.repository_owner, installed_changeset_revision )
|
||||
print "Adding new row (or updating an existing row) for repository '%s' in the tool_shed_repository table." % name
|
||||
tool_shed_repository = shed_util.create_or_update_tool_shed_repository( app=self.app,
|
||||
name=name,
|
||||
description=description,
|
||||
installed_changeset_revision=installed_changeset_revision,
|
||||
ctx_rev=ctx_rev,
|
||||
repository_clone_url=repository_clone_url,
|
||||
metadata_dict={},
|
||||
status=self.app.model.ToolShedRepository.installation_status.NEW,
|
||||
current_changeset_revision=None,
|
||||
owner=self.repository_owner,
|
||||
dist_to_shed=True )
|
||||
tool_shed_repository = suc.create_or_update_tool_shed_repository( app=self.app,
|
||||
name=name,
|
||||
description=description,
|
||||
installed_changeset_revision=installed_changeset_revision,
|
||||
ctx_rev=ctx_rev,
|
||||
repository_clone_url=repository_clone_url,
|
||||
metadata_dict={},
|
||||
status=self.app.model.ToolShedRepository.installation_status.NEW,
|
||||
current_changeset_revision=None,
|
||||
owner=self.repository_owner,
|
||||
dist_to_shed=True )
|
||||
shed_util.update_tool_shed_repository_status( self.app, tool_shed_repository, self.app.model.ToolShedRepository.installation_status.CLONING )
|
||||
cloned_ok, error_message = suc.clone_repository( repository_clone_url, os.path.abspath( install_dir ), ctx_rev )
|
||||
if cloned_ok:
|
||||
|
||||
@@ -32,7 +32,7 @@ from galaxy.datatypes import sniff
|
||||
from cgi import FieldStorage
|
||||
from galaxy.util.hash_util import *
|
||||
from galaxy.util import listify
|
||||
import galaxy.util.shed_util
|
||||
import galaxy.util.shed_util_common
|
||||
from galaxy.web import url_for
|
||||
|
||||
from galaxy.visualization.genome.visual_analytics import TracksterConfig
|
||||
@@ -890,11 +890,11 @@ class Tool:
|
||||
def tool_shed_repository( self ):
|
||||
# If this tool is included in an installed tool shed repository, return it.
|
||||
if self.tool_shed:
|
||||
return galaxy.util.shed_util.get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( self.app,
|
||||
self.tool_shed,
|
||||
self.repository_name,
|
||||
self.repository_owner,
|
||||
self.installed_changeset_revision )
|
||||
return galaxy.util.shed_util_common.get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( self.app,
|
||||
self.tool_shed,
|
||||
self.repository_name,
|
||||
self.repository_owner,
|
||||
self.installed_changeset_revision )
|
||||
return None
|
||||
def __get_job_run_config( self, run_configs, key, job_params=None ):
|
||||
# Look through runners/handlers to find one with matching parameters.
|
||||
|
||||
+198
-85
@@ -1,6 +1,9 @@
|
||||
import os, tempfile, shutil, logging, urllib2
|
||||
from galaxy.datatypes import checkers
|
||||
from galaxy.web import url_for
|
||||
from galaxy import util
|
||||
from galaxy.util.json import from_json_string, to_json_string
|
||||
from galaxy.webapps.community.util import container_util
|
||||
import shed_util_common as suc
|
||||
from galaxy.tools.search import ToolBoxSearch
|
||||
from galaxy.tool_shed.tool_dependencies.install_util import create_or_update_tool_dependency, install_package, set_environment
|
||||
@@ -171,6 +174,79 @@ def copy_sample_files( app, sample_files, tool_path=None, sample_files_copied=No
|
||||
# Attempt to ensure we're copying an appropriate file.
|
||||
if is_data_index_sample_file( filename ):
|
||||
suc.copy_sample_file( app, filename, dest_path=dest_path )
|
||||
def create_repository_dependency_objects( trans, tool_path, tool_shed_url, repo_info_dicts, reinstalling=False ):
|
||||
"""
|
||||
Discover all repository dependencies and make sure all tool_shed_repository and associated repository_dependency records exist as well as
|
||||
the dependency relationships between installed repositories. This method is called when new repositories are being installed into a Galaxy
|
||||
instance and when uninstalled repositories are being reinstalled.
|
||||
"""
|
||||
message = ''
|
||||
created_or_updated_tool_shed_repositories = []
|
||||
# Repositories will be filtered (e.g., if already installed, etc), so filter the associated repo_info_dicts accordingly.
|
||||
filtered_repo_info_dicts = []
|
||||
# Discover all repository dependencies and retrieve information for installing them.
|
||||
all_repo_info_dicts = get_required_repo_info_dicts( tool_shed_url, repo_info_dicts )
|
||||
for repo_info_dict in all_repo_info_dicts:
|
||||
for name, repo_info_tuple in repo_info_dict.items():
|
||||
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
|
||||
suc.get_repo_info_tuple_contents( repo_info_tuple )
|
||||
clone_dir = os.path.join( tool_path, generate_tool_path( repository_clone_url, changeset_revision ) )
|
||||
relative_install_dir = os.path.join( clone_dir, name )
|
||||
# Make sure the repository was not already installed.
|
||||
installed_tool_shed_repository, installed_changeset_revision = \
|
||||
repository_was_previously_installed( trans, tool_shed_url, name, repo_info_tuple, clone_dir )
|
||||
if installed_tool_shed_repository:
|
||||
if reinstalling:
|
||||
if installed_tool_shed_repository.status in [ trans.model.ToolShedRepository.installation_status.ERROR,
|
||||
trans.model.ToolShedRepository.installation_status.UNINSTALLED ]:
|
||||
can_update = True
|
||||
name = installed_tool_shed_repository.name
|
||||
description = installed_tool_shed_repository.description
|
||||
installed_changeset_revision = installed_tool_shed_repository.installed_changeset_revision
|
||||
metadata_dict = installed_tool_shed_repository.metadata
|
||||
dist_to_shed = installed_tool_shed_repository.dist_to_shed
|
||||
else:
|
||||
# There is a repository already installed which is a dependency of the repository being reinstalled.
|
||||
can_update = False
|
||||
else:
|
||||
# An attempt is being made to install a tool shed repository into a Galaxy instance when the same repository was previously installed.
|
||||
message += "Revision <b>%s</b> of tool shed repository <b>%s</b> owned by <b>%s</b> " % ( changeset_revision, name, repository_owner )
|
||||
if installed_changeset_revision != changeset_revision:
|
||||
message += "was previously installed using changeset revision <b>%s</b>. " % installed_changeset_revision
|
||||
else:
|
||||
message += "was previously installed. "
|
||||
if installed_tool_shed_repository.uninstalled:
|
||||
message += "The repository has been uninstalled, however, so reinstall the original repository instead of installing it again. "
|
||||
elif installed_tool_shed_repository.deleted:
|
||||
message += "The repository has been deactivated, however, so activate the original repository instead of installing it again. "
|
||||
if installed_changeset_revision != changeset_revision:
|
||||
message += "You can get the latest updates for the repository using the <b>Get updates</b> option from the repository's "
|
||||
message += "<b>Repository Actions</b> pop-up menu. "
|
||||
if len( repo_info_dicts ) == 1:
|
||||
return created_or_updated_tool_shed_repositories, all_repo_info_dicts, filtered_repo_info_dicts, message
|
||||
else:
|
||||
# A tool shed repository is being installed into a Galaxy instance for the first time. We may have the case where a repository
|
||||
# is being reinstalled where because the repository being newly installed here may be a dependency of the repository being reinstalled.
|
||||
can_update = True
|
||||
installed_changeset_revision = changeset_revision
|
||||
metadata_dict={}
|
||||
dist_to_shed = False
|
||||
if can_update:
|
||||
log.debug( "Adding new row (or updating an existing row) for repository '%s' in the tool_shed_repository table." % name )
|
||||
tool_shed_repository = suc.create_or_update_tool_shed_repository( app=trans.app,
|
||||
name=name,
|
||||
description=description,
|
||||
installed_changeset_revision=changeset_revision,
|
||||
ctx_rev=ctx_rev,
|
||||
repository_clone_url=repository_clone_url,
|
||||
metadata_dict={},
|
||||
status=trans.model.ToolShedRepository.installation_status.NEW,
|
||||
current_changeset_revision=changeset_revision,
|
||||
owner=repository_owner,
|
||||
dist_to_shed=False )
|
||||
created_or_updated_tool_shed_repositories.append( tool_shed_repository )
|
||||
filtered_repo_info_dicts.append( encoding_util.tool_shed_encode( repo_info_dict ) )
|
||||
return created_or_updated_tool_shed_repositories, all_repo_info_dicts, filtered_repo_info_dicts, message
|
||||
def create_repository_dict_for_proprietary_datatypes( tool_shed, name, owner, installed_changeset_revision, tool_dicts, converter_path=None, display_path=None ):
|
||||
return dict( tool_shed=tool_shed,
|
||||
repository_name=name,
|
||||
@@ -179,62 +255,8 @@ def create_repository_dict_for_proprietary_datatypes( tool_shed, name, owner, in
|
||||
tool_dicts=tool_dicts,
|
||||
converter_path=converter_path,
|
||||
display_path=display_path )
|
||||
def create_or_update_tool_shed_repository( app, name, description, installed_changeset_revision, ctx_rev, repository_clone_url, metadata_dict,
|
||||
status, current_changeset_revision=None, owner='', dist_to_shed=False ):
|
||||
# The received value for dist_to_shed will be True if the InstallManager is installing a repository that contains tools or datatypes that used
|
||||
# to be in the Galaxy distribution, but have been moved to the main Galaxy tool shed.
|
||||
if current_changeset_revision is None:
|
||||
# The current_changeset_revision is not passed if a repository is being installed for the first time. If a previously installed repository
|
||||
# was later uninstalled, this value should be received as the value of that change set to which the repository had been updated just prior
|
||||
# to it being uninstalled.
|
||||
current_changeset_revision = installed_changeset_revision
|
||||
sa_session = app.model.context.current
|
||||
tool_shed = suc.get_tool_shed_from_clone_url( repository_clone_url )
|
||||
if not owner:
|
||||
owner = get_repository_owner_from_clone_url( repository_clone_url )
|
||||
includes_datatypes = 'datatypes' in metadata_dict
|
||||
if status in [ app.model.ToolShedRepository.installation_status.DEACTIVATED ]:
|
||||
deleted = True
|
||||
uninstalled = False
|
||||
elif status in [ app.model.ToolShedRepository.installation_status.UNINSTALLED ]:
|
||||
deleted = True
|
||||
uninstalled = True
|
||||
else:
|
||||
deleted = False
|
||||
uninstalled = False
|
||||
tool_shed_repository = get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( app,
|
||||
tool_shed,
|
||||
name,
|
||||
owner,
|
||||
installed_changeset_revision )
|
||||
if tool_shed_repository:
|
||||
tool_shed_repository.description = description
|
||||
tool_shed_repository.changeset_revision = current_changeset_revision
|
||||
tool_shed_repository.ctx_rev = ctx_rev
|
||||
tool_shed_repository.metadata = metadata_dict
|
||||
tool_shed_repository.includes_datatypes = includes_datatypes
|
||||
tool_shed_repository.deleted = deleted
|
||||
tool_shed_repository.uninstalled = uninstalled
|
||||
tool_shed_repository.status = status
|
||||
else:
|
||||
tool_shed_repository = app.model.ToolShedRepository( tool_shed=tool_shed,
|
||||
name=name,
|
||||
description=description,
|
||||
owner=owner,
|
||||
installed_changeset_revision=installed_changeset_revision,
|
||||
changeset_revision=current_changeset_revision,
|
||||
ctx_rev=ctx_rev,
|
||||
metadata=metadata_dict,
|
||||
includes_datatypes=includes_datatypes,
|
||||
dist_to_shed=dist_to_shed,
|
||||
deleted=deleted,
|
||||
uninstalled=uninstalled,
|
||||
status=status )
|
||||
sa_session.add( tool_shed_repository )
|
||||
sa_session.flush()
|
||||
return tool_shed_repository
|
||||
def create_tool_dependency_objects( app, tool_shed_repository, relative_install_dir, set_status=True ):
|
||||
# Create or update a ToolDependency for each entry in tool_dependencies_config. This method is called when installing a new tool_shed_repository.
|
||||
"""Create or update a ToolDependency for each entry in tool_dependencies_config. This method is called when installing a new tool_shed_repository."""
|
||||
tool_dependency_objects = []
|
||||
shed_config_dict = tool_shed_repository.get_shed_config_dict( app )
|
||||
if shed_config_dict.get( 'tool_path' ):
|
||||
@@ -355,6 +377,20 @@ def generate_tool_panel_dict_for_tool_config( guid, tool_config, tool_sections=N
|
||||
tool_section_dicts = generate_tool_section_dicts( tool_config=file_name, tool_sections=tool_sections )
|
||||
tool_panel_dict[ guid ] = tool_section_dicts
|
||||
return tool_panel_dict
|
||||
def generate_tool_path( repository_clone_url, changeset_revision ):
|
||||
"""
|
||||
Generate a tool path that guarantees repositories with the same name will always be installed
|
||||
in different directories. The tool path will be of the form:
|
||||
<tool shed url>/repos/<repository owner>/<repository name>/<installed changeset revision>
|
||||
http://test@bx.psu.edu:9009/repos/test/filter
|
||||
"""
|
||||
tmp_url = suc.clean_repository_clone_url( repository_clone_url )
|
||||
# Now tmp_url is something like: bx.psu.edu:9009/repos/some_username/column
|
||||
items = tmp_url.split( 'repos' )
|
||||
tool_shed_url = items[ 0 ]
|
||||
repo_path = items[ 1 ]
|
||||
tool_shed_url = suc.clean_tool_shed_url( tool_shed_url )
|
||||
return suc.url_join( tool_shed_url, 'repos', repo_path, changeset_revision )
|
||||
def generate_tool_section_dicts( tool_config=None, tool_sections=None ):
|
||||
tool_section_dicts = []
|
||||
if tool_config is None:
|
||||
@@ -438,12 +474,6 @@ def get_converter_and_display_paths( registration_elem, relative_install_dir ):
|
||||
if converter_path and display_path:
|
||||
break
|
||||
return converter_path, display_path
|
||||
def get_ctx_rev( tool_shed_url, name, owner, changeset_revision ):
|
||||
url = suc.url_join( tool_shed_url, 'repository/get_ctx_rev?name=%s&owner=%s&changeset_revision=%s' % ( name, owner, changeset_revision ) )
|
||||
response = urllib2.urlopen( url )
|
||||
ctx_rev = response.read()
|
||||
response.close()
|
||||
return ctx_rev
|
||||
def get_headers( fname, sep, count=60, is_multi_byte=False ):
|
||||
"""Returns a list with the first 'count' lines split by 'sep'."""
|
||||
headers = []
|
||||
@@ -456,6 +486,23 @@ def get_headers( fname, sep, count=60, is_multi_byte=False ):
|
||||
if idx == count:
|
||||
break
|
||||
return headers
|
||||
def get_installed_and_missing_tool_dependencies( trans, repository, all_tool_dependencies ):
|
||||
if all_tool_dependencies:
|
||||
tool_dependencies = {}
|
||||
missing_tool_dependencies = {}
|
||||
for td_key, td_info_dict in all_tool_dependencies.items():
|
||||
name = td_info_dict[ 'name' ]
|
||||
version = td_info_dict[ 'version' ]
|
||||
type = td_info_dict[ 'type' ]
|
||||
tool_dependency = get_tool_dependency_by_name_version_type_repository( trans, repository, name, version, type )
|
||||
if tool_dependency.status == trans.model.ToolDependency.installation_status.INSTALLED:
|
||||
tool_dependencies[ td_key ] = td_info_dict
|
||||
else:
|
||||
missing_tool_dependencies[ td_key ] = td_info_dict
|
||||
else:
|
||||
tool_dependencies = None
|
||||
missing_tool_dependencies = None
|
||||
return tool_dependencies, missing_tool_dependencies
|
||||
def get_repository_owner( cleaned_repository_url ):
|
||||
items = cleaned_repository_url.split( 'repos' )
|
||||
repo_path = items[ 1 ]
|
||||
@@ -466,6 +513,54 @@ def get_repository_owner_from_clone_url( repository_clone_url ):
|
||||
tmp_url = suc.clean_repository_clone_url( repository_clone_url )
|
||||
tool_shed = tmp_url.split( 'repos' )[ 0 ].rstrip( '/' )
|
||||
return get_repository_owner( tmp_url )
|
||||
def get_required_repo_info_dicts( tool_shed_url, repo_info_dicts ):
|
||||
"""
|
||||
Inspect the list of repo_info_dicts for repository dependencies and append a repo_info_dict for each of them to the list. All
|
||||
repository_dependencies entries in each of the received repo_info_dicts includes all required repositories, so only one pass through
|
||||
this methid is required to retrieve all repository dependencies.
|
||||
"""
|
||||
if repo_info_dicts:
|
||||
all_repo_info_dicts = [ rid for rid in repo_info_dicts ]
|
||||
# We'll send tuples of ( tool_shed, repository_name, repository_owner, changeset_revision ) to the tool shed to discover repository ids.
|
||||
required_repository_tups = []
|
||||
for repo_info_dict in repo_info_dicts:
|
||||
for repository_name, repo_info_tup in repo_info_dict.items():
|
||||
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
|
||||
suc.get_repo_info_tuple_contents( repo_info_tup )
|
||||
if repository_dependencies:
|
||||
for key, val in repository_dependencies.items():
|
||||
if key in [ 'root_key', 'description' ]:
|
||||
continue
|
||||
toolshed, name, owner, changeset_revision = container_util.get_components_from_key( key )
|
||||
components_list = [ toolshed, name, owner, changeset_revision ]
|
||||
if components_list not in required_repository_tups:
|
||||
required_repository_tups.append( components_list )
|
||||
for components_list in val:
|
||||
if components_list not in required_repository_tups:
|
||||
required_repository_tups.append( components_list )
|
||||
if required_repository_tups:
|
||||
# The value of required_repository_tups is a list of tuples, so we need to encode it.
|
||||
encoded_required_repository_tups = []
|
||||
for required_repository_tup in required_repository_tups:
|
||||
encoded_required_repository_tups.append( encoding_util.encoding_sep.join( required_repository_tup ) )
|
||||
encoded_required_repository_str = encoding_util.encoding_sep2.join( encoded_required_repository_tups )
|
||||
encoded_required_repository_str = encoding_util.tool_shed_encode( encoded_required_repository_str )
|
||||
url = suc.url_join( tool_shed_url, '/repository/get_required_repo_info_dict?encoded_str=%s' % encoded_required_repository_str )
|
||||
response = urllib2.urlopen( url )
|
||||
text = response.read()
|
||||
response.close()
|
||||
if text:
|
||||
required_repo_info_dict = from_json_string( text )
|
||||
required_repo_info_dicts = []
|
||||
encoded_dict_strings = required_repo_info_dict[ 'repo_info_dicts' ]
|
||||
for encoded_dict_str in encoded_dict_strings:
|
||||
decoded_dict = encoding_util.tool_shed_decode( encoded_dict_str )
|
||||
required_repo_info_dicts.append( decoded_dict )
|
||||
if required_repo_info_dicts:
|
||||
for required_repo_info_dict in required_repo_info_dicts:
|
||||
if required_repo_info_dict not in all_repo_info_dicts:
|
||||
all_repo_info_dicts.append( required_repo_info_dict )
|
||||
return all_repo_info_dicts
|
||||
def get_tool_index_sample_files( sample_files ):
|
||||
"""Try to return the list of all appropriate tool data sample files included in the repository."""
|
||||
tool_index_sample_files = []
|
||||
@@ -477,6 +572,19 @@ def get_tool_index_sample_files( sample_files ):
|
||||
def get_tool_dependency( trans, id ):
|
||||
"""Get a tool_dependency from the database via id"""
|
||||
return trans.sa_session.query( trans.model.ToolDependency ).get( trans.security.decode_id( id ) )
|
||||
def get_tool_dependency_by_name_type_repository( trans, repository, name, type ):
|
||||
return trans.sa_session.query( trans.model.ToolDependency ) \
|
||||
.filter( and_( trans.model.ToolDependency.table.c.tool_shed_repository_id == repository.id,
|
||||
trans.model.ToolDependency.table.c.name == name,
|
||||
trans.model.ToolDependency.table.c.type == type ) ) \
|
||||
.first()
|
||||
def get_tool_dependency_by_name_version_type_repository( trans, repository, name, version, type ):
|
||||
return trans.sa_session.query( trans.model.ToolDependency ) \
|
||||
.filter( and_( trans.model.ToolDependency.table.c.tool_shed_repository_id == repository.id,
|
||||
trans.model.ToolDependency.table.c.name == name,
|
||||
trans.model.ToolDependency.table.c.version == version,
|
||||
trans.model.ToolDependency.table.c.type == type ) ) \
|
||||
.first()
|
||||
def get_tool_dependency_ids( as_string=False, **kwd ):
|
||||
tool_dependency_id = kwd.get( 'tool_dependency_id', None )
|
||||
tool_dependency_ids = util.listify( kwd.get( 'tool_dependency_ids', None ) )
|
||||
@@ -502,30 +610,6 @@ def get_tool_path_install_dir( partial_install_dir, shed_tool_conf_dict, tool_di
|
||||
relative_install_dir = os.path.join( tool_path, partial_install_dir )
|
||||
return tool_path, relative_install_dir
|
||||
return None, None
|
||||
def get_tool_shed_repository_by_shed_name_owner_changeset_revision( app, tool_shed, name, owner, changeset_revision ):
|
||||
# This method is used only in Galaxy, not the tool shed.
|
||||
sa_session = app.model.context.current
|
||||
if tool_shed.find( '//' ) > 0:
|
||||
tool_shed = tool_shed.split( '//' )[1]
|
||||
tool_shed = tool_shed.rstrip( '/' )
|
||||
return sa_session.query( app.model.ToolShedRepository ) \
|
||||
.filter( and_( app.model.ToolShedRepository.table.c.tool_shed == tool_shed,
|
||||
app.model.ToolShedRepository.table.c.name == name,
|
||||
app.model.ToolShedRepository.table.c.owner == owner,
|
||||
app.model.ToolShedRepository.table.c.changeset_revision == changeset_revision ) ) \
|
||||
.first()
|
||||
def get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( app, tool_shed, name, owner, installed_changeset_revision ):
|
||||
# This method is used only in Galaxy, not the tool shed.
|
||||
sa_session = app.model.context.current
|
||||
if tool_shed.find( '//' ) > 0:
|
||||
tool_shed = tool_shed.split( '//' )[1]
|
||||
tool_shed = tool_shed.rstrip( '/' )
|
||||
return sa_session.query( app.model.ToolShedRepository ) \
|
||||
.filter( and_( app.model.ToolShedRepository.table.c.tool_shed == tool_shed,
|
||||
app.model.ToolShedRepository.table.c.name == name,
|
||||
app.model.ToolShedRepository.table.c.owner == owner,
|
||||
app.model.ToolShedRepository.table.c.installed_changeset_revision == installed_changeset_revision ) ) \
|
||||
.first()
|
||||
def get_tool_version( app, tool_id ):
|
||||
sa_session = app.model.context.current
|
||||
return sa_session.query( app.model.ToolVersion ) \
|
||||
@@ -908,6 +992,35 @@ def remove_tool_dependency( trans, tool_dependency ):
|
||||
trans.sa_session.add( tool_dependency )
|
||||
trans.sa_session.flush()
|
||||
return removed, error_message
|
||||
def repository_was_previously_installed( trans, tool_shed_url, repository_name, repo_info_tuple, clone_dir ):
|
||||
"""
|
||||
Handle the case where the repository was previously installed using an older changeset_revsion, but later the repository was updated
|
||||
in the tool shed and now we're trying to install the latest changeset revision of the same repository instead of updating the one
|
||||
that was previously installed. We'll look in the database instead of on disk since the repository may be uninstalled.
|
||||
"""
|
||||
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
|
||||
suc.get_repo_info_tuple_contents( repo_info_tuple )
|
||||
tool_shed = suc.get_tool_shed_from_clone_url( repository_clone_url )
|
||||
# Get all previous change set revisions from the tool shed for the repository back to, but excluding, the previous valid changeset
|
||||
# revision to see if it was previously installed using one of them.
|
||||
url = suc.url_join( tool_shed_url,
|
||||
'repository/previous_changeset_revisions?galaxy_url=%s&name=%s&owner=%s&changeset_revision=%s' % \
|
||||
( url_for( '/', qualified=True ), repository_name, repository_owner, changeset_revision ) )
|
||||
response = urllib2.urlopen( url )
|
||||
text = response.read()
|
||||
response.close()
|
||||
if text:
|
||||
#clone_path, clone_directory = os.path.split( clone_dir )
|
||||
changeset_revisions = util.listify( text )
|
||||
for previous_changeset_revision in changeset_revisions:
|
||||
tool_shed_repository = suc.get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( trans.app,
|
||||
tool_shed,
|
||||
repository_name,
|
||||
repository_owner,
|
||||
previous_changeset_revision )
|
||||
if tool_shed_repository and tool_shed_repository.status not in [ trans.model.ToolShedRepository.installation_status.NEW ]:
|
||||
return tool_shed_repository, previous_changeset_revision
|
||||
return None, None
|
||||
def update_tool_shed_repository_status( app, tool_shed_repository, status ):
|
||||
sa_session = app.model.context.current
|
||||
tool_shed_repository.status = status
|
||||
|
||||
@@ -57,26 +57,24 @@ def add_installation_directories_to_tool_dependencies( trans, repository_name, r
|
||||
requirements_dict[ 'install_dir' ] = install_dir
|
||||
tool_dependencies[ dependency_key ] = requirements_dict
|
||||
return tool_dependencies
|
||||
def build_readme_files_dict( repository_metadata ):
|
||||
def build_readme_files_dict( metadata ):
|
||||
"""Return a dictionary of valid readme file name <-> readme file content pairs for all readme files contained in the received repository_metadata."""
|
||||
readme_files_dict = {}
|
||||
if repository_metadata:
|
||||
metadata = repository_metadata.metadata
|
||||
if metadata and 'readme_files' in metadata:
|
||||
for relative_path_to_readme_file in metadata[ 'readme_files' ]:
|
||||
readme_file_name = os.path.split( relative_path_to_readme_file )[ 1 ]
|
||||
full_path_to_readme_file = os.path.abspath( relative_path_to_readme_file )
|
||||
try:
|
||||
f = open( full_path_to_readme_file, 'r' )
|
||||
text = f.read()
|
||||
f.close()
|
||||
readme_files_dict[ readme_file_name ] = translate_string( text, to_html=False )
|
||||
except Exception, e:
|
||||
log.debug( "Error reading README file '%s' defined in metadata for repository '%s', revision '%s': %s" % \
|
||||
( str( relative_path_to_readme_file ), str( repository_name ), str( changeset_revision ), str( e ) ) )
|
||||
if metadata and 'readme_files' in metadata:
|
||||
for relative_path_to_readme_file in metadata[ 'readme_files' ]:
|
||||
readme_file_name = os.path.split( relative_path_to_readme_file )[ 1 ]
|
||||
full_path_to_readme_file = os.path.abspath( relative_path_to_readme_file )
|
||||
try:
|
||||
f = open( full_path_to_readme_file, 'r' )
|
||||
text = f.read()
|
||||
f.close()
|
||||
readme_files_dict[ readme_file_name ] = translate_string( text, to_html=False )
|
||||
except Exception, e:
|
||||
log.debug( "Error reading README file '%s' defined in metadata: %s" % ( str( relative_path_to_readme_file ), str( e ) ) )
|
||||
return readme_files_dict
|
||||
def build_repository_containers_for_galaxy( trans, toolshed_base_url, repository_name, repository_owner, changeset_revision,
|
||||
readme_files_dict, repository_dependencies, tool_dependencies ):
|
||||
def build_repository_containers_for_galaxy( trans, toolshed_base_url, repository_name, repository_owner, changeset_revision, repository, datatypes,
|
||||
invalid_tools, missing_tool_dependencies, readme_files_dict, repository_dependencies, tool_dependencies,
|
||||
valid_tools, workflows ):
|
||||
"""Return a dictionary of containers for the received repository's dependencies and readme files for display during installation to Galaxy."""
|
||||
containers_dict = dict( readme_files=None, repository_dependencies=None, tool_dependencies=None )
|
||||
if readme_files_dict or repository_dependencies or tool_dependencies:
|
||||
@@ -91,9 +89,23 @@ def build_repository_containers_for_galaxy( trans, toolshed_base_url, repository
|
||||
tool_dependencies )
|
||||
try:
|
||||
folder_id = 0
|
||||
# Datatypes container.
|
||||
if datatypes:
|
||||
folder_id, datatypes_root_folder = container_util.build_datatypes_folder( folder_id, datatypes )
|
||||
containers_dict[ 'datatypes' ] = datatypes_root_folder
|
||||
# Invalid tools container.
|
||||
if invalid_tools:
|
||||
folder_id, invalid_tools_root_folder = container_util.build_invalid_tools_folder( folder_id,
|
||||
invalid_tools,
|
||||
changeset_revision,
|
||||
repository=repository,
|
||||
label='Invalid tools' )
|
||||
containers_dict[ 'invalid_tools' ] = invalid_tools_root_folder
|
||||
# Readme files container.
|
||||
if readme_files_dict:
|
||||
folder_id, readme_files_root_folder = build_readme_files_folder( folder_id, readme_files_dict )
|
||||
containers_dict[ 'readme_files' ] = readme_files_root_folder
|
||||
# Repository dependencies container.
|
||||
if repository_dependencies:
|
||||
folder_id, repository_dependencies_root_folder = container_util.build_repository_dependencies_folder( toolshed_base_url=toolshed_base_url,
|
||||
repository_name=repository_name,
|
||||
@@ -102,9 +114,28 @@ def build_repository_containers_for_galaxy( trans, toolshed_base_url, repository
|
||||
folder_id=folder_id,
|
||||
repository_dependencies=repository_dependencies )
|
||||
containers_dict[ 'repository_dependencies' ] = repository_dependencies_root_folder
|
||||
# Tool dependencies container.
|
||||
if tool_dependencies:
|
||||
folder_id, tool_dependencies_root_folder = container_util.build_tool_dependencies_folder( folder_id, tool_dependencies, for_galaxy=True )
|
||||
containers_dict[ 'tool_dependencies' ] = tool_dependencies_root_folder
|
||||
# Missing tool dependencies container.
|
||||
if missing_tool_dependencies:
|
||||
folder_id, missing_tool_dependencies_root_folder = \
|
||||
container_util.build_tool_dependencies_folder( folder_id, missing_tool_dependencies, label='Missing tool dependencies', for_galaxy=True )
|
||||
containers_dict[ 'missing_tool_dependencies' ] = missing_tool_dependencies_root_folder
|
||||
# Valid tools container.
|
||||
if valid_tools:
|
||||
folder_id, valid_tools_root_folder = container_util.build_tools_folder( folder_id,
|
||||
valid_tools,
|
||||
repository,
|
||||
changeset_revision,
|
||||
label='Valid tools',
|
||||
description='click the name to inspect the tool metadata' )
|
||||
containers_dict[ 'valid_tools' ] = valid_tools_root_folder
|
||||
# Workflows container.
|
||||
if workflows:
|
||||
folder_id, workflows_root_folder = container_util.build_workflows_folder( folder_id, workflows, repository_metadata, label='Workflows' )
|
||||
containers_dict[ 'workflows' ] = workflows_root_folder
|
||||
except Exception, e:
|
||||
log.debug( "Exception in build_repository_containers_for_galaxy: %s" % str( e ) )
|
||||
finally:
|
||||
@@ -140,9 +171,10 @@ def build_repository_containers_for_tool_shed( repository, changeset_revision, r
|
||||
label='Invalid tools' )
|
||||
containers_dict[ 'invalid_tools' ] = invalid_tools_root_folder
|
||||
# Readme files container.
|
||||
readme_files_dict = build_readme_files_dict( repository_metadata )
|
||||
folder_id, readme_files_root_folder = container_util.build_readme_files_folder( folder_id, readme_files_dict )
|
||||
containers_dict[ 'readme_files' ] = readme_files_root_folder
|
||||
if metadata and 'readme_files' in metadata:
|
||||
readme_files_dict = build_readme_files_dict( metadata )
|
||||
folder_id, readme_files_root_folder = container_util.build_readme_files_folder( folder_id, readme_files_dict )
|
||||
containers_dict[ 'readme_files' ] = readme_files_root_folder
|
||||
# Repository dependencies container.
|
||||
toolshed_base_url = str( url_for( '/', qualified=True ) ).rstrip( '/' )
|
||||
folder_id, repository_dependencies_root_folder = container_util.build_repository_dependencies_folder( toolshed_base_url=toolshed_base_url,
|
||||
@@ -177,6 +209,64 @@ def build_repository_containers_for_tool_shed( repository, changeset_revision, r
|
||||
finally:
|
||||
lock.release()
|
||||
return containers_dict
|
||||
def build_repository_dependency_relationships( trans, repo_info_dicts, tool_shed_repositories ):
|
||||
"""
|
||||
Build relationships between installed tool shed repositories and other installed tool shed repositories upon which they depend. These
|
||||
relationships are defined in the repository_dependencies entry for each dictionary in the received list of repo_info_dicts. Each of
|
||||
these dictionaries is associated with a repository in the received tool_shed_repositories list.
|
||||
"""
|
||||
for repo_info_dict in repo_info_dicts:
|
||||
for name, repo_info_tuple in repo_info_dict.items():
|
||||
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
|
||||
get_repo_info_tuple_contents( repo_info_tuple )
|
||||
if repository_dependencies:
|
||||
for key, val in repository_dependencies.items():
|
||||
if key in [ 'root_key', 'description' ]:
|
||||
continue
|
||||
dependent_repository = None
|
||||
dependent_toolshed, dependent_name, dependent_owner, dependent_changeset_revision = container_util.get_components_from_key( key )
|
||||
for tsr in tool_shed_repositories:
|
||||
# Get the the tool_shed_repository defined by name, owner and changeset_revision. This is the repository that will be
|
||||
# dependent upon each of the tool shed repositories contained in val.
|
||||
# TODO: Check tool_shed_repository.tool_shed as well when repository dependencies across tool sheds is supported.
|
||||
if tsr.name == dependent_name and tsr.owner == dependent_owner and tsr.changeset_revision == dependent_changeset_revision:
|
||||
dependent_repository = tsr
|
||||
break
|
||||
if dependent_repository is None:
|
||||
# The dependent repository is not in the received list so look in the database.
|
||||
dependent_repository = get_or_create_tool_shed_repository( trans, dependent_toolshed, dependent_name, dependent_owner, dependent_changeset_revision )
|
||||
# Process each repository_dependency defined for the current dependent repository.
|
||||
for repository_dependency_components_list in val:
|
||||
required_repository = None
|
||||
rd_toolshed, rd_name, rd_owner, rd_changeset_revision = repository_dependency_components_list
|
||||
# Get the the tool_shed_repository defined by rd_name, rd_owner and rd_changeset_revision. This is the repository that will be
|
||||
# required by the current dependent_repository.
|
||||
# TODO: Check tool_shed_repository.tool_shed as well when repository dependencies across tool sheds is supported.
|
||||
for tsr in tool_shed_repositories:
|
||||
if tsr.name == rd_name and tsr.owner == rd_owner and tsr.changeset_revision == rd_changeset_revision:
|
||||
required_repository = tsr
|
||||
break
|
||||
if required_repository is None:
|
||||
# The required repository is not in the received list so look in the database.
|
||||
required_repository = get_or_create_tool_shed_repository( trans, rd_toolshed, rd_name, rd_owner, rd_changeset_revision )
|
||||
# Ensure there is a repository_dependency relationship between dependent_repository and required_repository.
|
||||
rrda = None
|
||||
for rd in dependent_repository.repository_dependencies:
|
||||
if rd.repository_dependency.tool_shed_repository_id == required_repository.id:
|
||||
rrda = rd
|
||||
break
|
||||
if not rrda:
|
||||
# Make sure required_repository is in the repository_dependency table.
|
||||
repository_dependency = get_repository_dependency_by_repository_id( trans, required_repository.id )
|
||||
if not repository_dependency:
|
||||
repository_dependency = trans.model.RepositoryDependency( tool_shed_repository_id=required_repository.id )
|
||||
trans.sa_session.add( repository_dependency )
|
||||
trans.sa_session.flush()
|
||||
# Build the relationship between the dependent_repository and the required_repository.
|
||||
rrda = trans.model.RepositoryRepositoryDependencyAssociation( tool_shed_repository_id=dependent_repository.id,
|
||||
repository_dependency_id=repository_dependency.id )
|
||||
trans.sa_session.add( rrda )
|
||||
trans.sa_session.flush()
|
||||
def build_repository_ids_select_field( trans, cntrller, name='repository_ids', multiple=True, display='checkboxes' ):
|
||||
"""Method called from both Galaxy and the Tool Shed to generate the current list of repositories for resetting metadata."""
|
||||
repositories_select_field = SelectField( name=name, multiple=multiple, display=display )
|
||||
@@ -546,6 +636,60 @@ def create_or_update_repository_metadata( trans, id, repository, changeset_revis
|
||||
trans.sa_session.add( repository_metadata )
|
||||
trans.sa_session.flush()
|
||||
return repository_metadata
|
||||
def create_or_update_tool_shed_repository( app, name, description, installed_changeset_revision, ctx_rev, repository_clone_url, metadata_dict,
|
||||
status, current_changeset_revision=None, owner='', dist_to_shed=False ):
|
||||
# The received value for dist_to_shed will be True if the InstallManager is installing a repository that contains tools or datatypes that used
|
||||
# to be in the Galaxy distribution, but have been moved to the main Galaxy tool shed.
|
||||
if current_changeset_revision is None:
|
||||
# The current_changeset_revision is not passed if a repository is being installed for the first time. If a previously installed repository
|
||||
# was later uninstalled, this value should be received as the value of that change set to which the repository had been updated just prior
|
||||
# to it being uninstalled.
|
||||
current_changeset_revision = installed_changeset_revision
|
||||
sa_session = app.model.context.current
|
||||
tool_shed = get_tool_shed_from_clone_url( repository_clone_url )
|
||||
if not owner:
|
||||
owner = get_repository_owner_from_clone_url( repository_clone_url )
|
||||
includes_datatypes = 'datatypes' in metadata_dict
|
||||
if status in [ app.model.ToolShedRepository.installation_status.DEACTIVATED ]:
|
||||
deleted = True
|
||||
uninstalled = False
|
||||
elif status in [ app.model.ToolShedRepository.installation_status.UNINSTALLED ]:
|
||||
deleted = True
|
||||
uninstalled = True
|
||||
else:
|
||||
deleted = False
|
||||
uninstalled = False
|
||||
tool_shed_repository = get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( app,
|
||||
tool_shed,
|
||||
name,
|
||||
owner,
|
||||
installed_changeset_revision )
|
||||
if tool_shed_repository:
|
||||
tool_shed_repository.description = description
|
||||
tool_shed_repository.changeset_revision = current_changeset_revision
|
||||
tool_shed_repository.ctx_rev = ctx_rev
|
||||
tool_shed_repository.metadata = metadata_dict
|
||||
tool_shed_repository.includes_datatypes = includes_datatypes
|
||||
tool_shed_repository.deleted = deleted
|
||||
tool_shed_repository.uninstalled = uninstalled
|
||||
tool_shed_repository.status = status
|
||||
else:
|
||||
tool_shed_repository = app.model.ToolShedRepository( tool_shed=tool_shed,
|
||||
name=name,
|
||||
description=description,
|
||||
owner=owner,
|
||||
installed_changeset_revision=installed_changeset_revision,
|
||||
changeset_revision=current_changeset_revision,
|
||||
ctx_rev=ctx_rev,
|
||||
metadata=metadata_dict,
|
||||
includes_datatypes=includes_datatypes,
|
||||
dist_to_shed=dist_to_shed,
|
||||
deleted=deleted,
|
||||
uninstalled=uninstalled,
|
||||
status=status )
|
||||
sa_session.add( tool_shed_repository )
|
||||
sa_session.flush()
|
||||
return tool_shed_repository
|
||||
def create_repo_info_dict( trans, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_name=None, repository=None,
|
||||
repository_metadata=None, metadata=None, repository_dependencies=None ):
|
||||
"""
|
||||
@@ -585,6 +729,20 @@ def create_repo_info_dict( trans, repository_clone_url, changeset_revision, ctx_
|
||||
repository_dependencies,
|
||||
metadata.get( 'tool_dependencies', None ) )
|
||||
return repo_info_dict
|
||||
def ensure_required_repositories_exist_for_reinstall( trans, repository_dependencies ):
|
||||
"""
|
||||
Inspect the received repository_dependencies dictionary and make sure tool_shed_repository objects exist in the database for each entry. These
|
||||
tool_shed_repositories do not necessarily have to exist on disk, and if they do not, their status will be marked appropriately. They must exist
|
||||
in the database in order for repository dependency relationships to be properly built.
|
||||
"""
|
||||
for key, val in repository_dependencies.items():
|
||||
if key in [ 'root_key', 'description' ]:
|
||||
continue
|
||||
tool_shed, name, owner, changeset_revision = container_util.get_components_from_key( key )
|
||||
repository = get_or_create_tool_shed_repository( trans, tool_shed, name, owner, changeset_revision )
|
||||
for repository_components_list in val:
|
||||
tool_shed, name, owner, changeset_revision = repository_components_list
|
||||
repository = get_or_create_tool_shed_repository( trans, tool_shed, name, owner, changeset_revision )
|
||||
def generate_clone_url_for_installed_repository( app, repository ):
|
||||
"""Generate the URL for cloning a repository that has been installed into a Galaxy instance."""
|
||||
tool_shed_url = get_url_from_repository_tool_shed( app, repository )
|
||||
@@ -765,9 +923,18 @@ def generate_metadata_for_changeset_revision( app, repository, repository_clone_
|
||||
# See if we have a repository dependencies defined.
|
||||
if name == 'repository_dependencies.xml':
|
||||
path_to_repository_dependencies_config = os.path.join( root, name )
|
||||
metadata_dict, error_message = generate_repository_dependency_metadata( app, path_to_repository_dependencies_config, metadata_dict )
|
||||
if error_message:
|
||||
invalid_file_tups.append( ( name, error_message ) )
|
||||
if app.name == 'community':
|
||||
metadata_dict, error_message = generate_repository_dependency_metadata_for_tool_shed( app,
|
||||
path_to_repository_dependencies_config,
|
||||
metadata_dict )
|
||||
if error_message:
|
||||
invalid_file_tups.append( ( name, error_message ) )
|
||||
elif app.name == 'galaxy':
|
||||
metadata_dict, error_message = generate_repository_dependency_metadata_for_installed_repository( app,
|
||||
path_to_repository_dependencies_config,
|
||||
metadata_dict )
|
||||
if error_message:
|
||||
invalid_file_tups.append( ( name, error_message ) )
|
||||
# See if we have one or more READ_ME files.
|
||||
elif name.lower() in readme_file_names:
|
||||
relative_path_to_readme = get_relative_path_to_repository_file( root,
|
||||
@@ -860,8 +1027,42 @@ def generate_package_dependency_metadata( elem, tool_dependencies_dict ):
|
||||
if requirements_dict:
|
||||
tool_dependencies_dict[ dependency_key ] = requirements_dict
|
||||
return tool_dependencies_dict
|
||||
def generate_repository_dependency_metadata( app, repository_dependencies_config, metadata_dict ):
|
||||
"""Generate a repository dependencies dictionary based on valid information defined in the received repository_dependencies_config."""
|
||||
def generate_repository_dependency_metadata_for_installed_repository( app, repository_dependencies_config, metadata_dict ):
|
||||
"""
|
||||
Generate a repository dependencies dictionary based on valid information defined in the received repository_dependencies_config. This method
|
||||
is called only from Galaxy.
|
||||
"""
|
||||
repository_dependencies_tups = []
|
||||
error_message = ''
|
||||
try:
|
||||
# Make sure we're looking at a valid repository_dependencies.xml file.
|
||||
tree = util.parse_xml( repository_dependencies_config )
|
||||
root = tree.getroot()
|
||||
is_valid = root.tag == 'repositories'
|
||||
except Exception, e:
|
||||
error_message = "Error parsing %s, exception: %s" % ( repository_dependencies_config, str( e ) )
|
||||
log.debug( error_message )
|
||||
is_valid = False
|
||||
if is_valid:
|
||||
sa_session = app.model.context.current
|
||||
for repository_elem in root.findall( 'repository' ):
|
||||
toolshed = repository_elem.attrib[ 'toolshed' ]
|
||||
name = repository_elem.attrib[ 'name' ]
|
||||
owner = repository_elem.attrib[ 'owner']
|
||||
changeset_revision = repository_elem.attrib[ 'changeset_revision' ]
|
||||
repository_dependencies_tup = ( toolshed, name, owner, changeset_revision )
|
||||
if repository_dependencies_tup not in repository_dependencies_tups:
|
||||
repository_dependencies_tups.append( repository_dependencies_tup )
|
||||
if repository_dependencies_tups:
|
||||
repository_dependencies_dict = dict( description=root.get( 'description' ),
|
||||
repository_dependencies=repository_dependencies_tups )
|
||||
metadata_dict[ 'repository_dependencies' ] = repository_dependencies_dict
|
||||
return metadata_dict, error_message
|
||||
def generate_repository_dependency_metadata_for_tool_shed( app, repository_dependencies_config, metadata_dict ):
|
||||
"""
|
||||
Generate a repository dependencies dictionary based on valid information defined in the received repository_dependencies_config. This method
|
||||
is called only from the tool shed.
|
||||
"""
|
||||
repository_dependencies_tups = []
|
||||
error_message = ''
|
||||
try:
|
||||
@@ -1111,6 +1312,12 @@ def get_configured_ui():
|
||||
# quiet = True
|
||||
_ui.setconfig( 'ui', 'quiet', True )
|
||||
return _ui
|
||||
def get_ctx_rev( tool_shed_url, name, owner, changeset_revision ):
|
||||
url = url_join( tool_shed_url, 'repository/get_ctx_rev?name=%s&owner=%s&changeset_revision=%s' % ( name, owner, changeset_revision ) )
|
||||
response = urllib2.urlopen( url )
|
||||
ctx_rev = response.read()
|
||||
response.close()
|
||||
return ctx_rev
|
||||
def get_ctx_file_path_from_manifest( filename, repo, changeset_revision ):
|
||||
"""Get the ctx file path for the latest revision of filename from the repository manifest up to the value of changeset_revision."""
|
||||
stripped_filename = strip_path( filename )
|
||||
@@ -1223,6 +1430,25 @@ def get_next_downloadable_changeset_revision( repository, repo, after_changeset_
|
||||
# We've found the changeset in the changelog for which we need to get the next downloadable changset.
|
||||
found_after_changeset_revision = True
|
||||
return None
|
||||
def get_or_create_tool_shed_repository( trans, tool_shed, name, owner, changeset_revision ):
|
||||
repository = get_repository_for_dependency_relationship( trans.app, tool_shed, name, owner, changeset_revision )
|
||||
if not repository:
|
||||
tool_shed_url = get_url_from_tool_shed( trans.app, tool_shed )
|
||||
repository_clone_url = os.path.join( tool_shed_url, 'repos', owner, name )
|
||||
ctx_rev = get_ctx_rev( tool_shed_url, name, owner, installed_changeset_revision )
|
||||
print "Adding new row (or updating an existing row) for repository '%s' in the tool_shed_repository table." % name
|
||||
repository = create_or_update_tool_shed_repository( app=self.app,
|
||||
name=name,
|
||||
description=None,
|
||||
installed_changeset_revision=changeset_revision,
|
||||
ctx_rev=ctx_rev,
|
||||
repository_clone_url=repository_clone_url,
|
||||
metadata_dict={},
|
||||
status=self.app.model.ToolShedRepository.installation_status.NEW,
|
||||
current_changeset_revision=None,
|
||||
owner=sowner,
|
||||
dist_to_shed=False )
|
||||
return repository
|
||||
def get_ordered_downloadable_changeset_revisions( repository, repo ):
|
||||
"""Return an ordered list of changeset_revisions defined by a repository changelog."""
|
||||
changeset_tups = []
|
||||
@@ -1366,6 +1592,23 @@ def get_repository_dependency_as_key( repository_dependency ):
|
||||
repository_dependency[ 1 ],
|
||||
repository_dependency[ 2 ],
|
||||
repository_dependency[ 3] )
|
||||
def get_repository_dependency_by_repository_id( trans, decoded_repository_id ):
|
||||
return trans.sa_session.query( trans.model.RepositoryDependency ) \
|
||||
.filter( trans.model.RepositoryDependency.table.c.tool_shed_repository_id == decoded_repository_id ) \
|
||||
.first()
|
||||
def get_repository_for_dependency_relationship( app, tool_shed, name, owner, changeset_revision ):
|
||||
repository = get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( app=app,
|
||||
tool_shed=tool_shed,
|
||||
name=name,
|
||||
owner=owner,
|
||||
installed_changeset_revision=changeset_revision )
|
||||
if not repository:
|
||||
repository = get_tool_shed_repository_by_shed_name_owner_changeset_revision( app=app,
|
||||
tool_shed=tool_shed,
|
||||
name=name,
|
||||
owner=owner,
|
||||
changeset_revision=changeset_revision )
|
||||
return repository
|
||||
def get_repository_file_contents( file_path ):
|
||||
if checkers.is_gzip( file_path ):
|
||||
safe_str = to_safe_string( '\ngzip compressed file\n' )
|
||||
@@ -1512,6 +1755,30 @@ def get_tool_panel_config_tool_path_install_dir( app, repository ):
|
||||
tool_path = shed_config_dict[ 'tool_path' ]
|
||||
relative_install_dir = partial_install_dir
|
||||
return shed_tool_conf, tool_path, relative_install_dir
|
||||
def get_tool_shed_repository_by_shed_name_owner_changeset_revision( app, tool_shed, name, owner, changeset_revision ):
|
||||
# This method is used only in Galaxy, not the tool shed.
|
||||
sa_session = app.model.context.current
|
||||
if tool_shed.find( '//' ) > 0:
|
||||
tool_shed = tool_shed.split( '//' )[1]
|
||||
tool_shed = tool_shed.rstrip( '/' )
|
||||
return sa_session.query( app.model.ToolShedRepository ) \
|
||||
.filter( and_( app.model.ToolShedRepository.table.c.tool_shed == tool_shed,
|
||||
app.model.ToolShedRepository.table.c.name == name,
|
||||
app.model.ToolShedRepository.table.c.owner == owner,
|
||||
app.model.ToolShedRepository.table.c.changeset_revision == changeset_revision ) ) \
|
||||
.first()
|
||||
def get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( app, tool_shed, name, owner, installed_changeset_revision ):
|
||||
# This method is used only in Galaxy, not the tool shed.
|
||||
sa_session = app.model.context.current
|
||||
if tool_shed.find( '//' ) > 0:
|
||||
tool_shed = tool_shed.split( '//' )[1]
|
||||
tool_shed = tool_shed.rstrip( '/' )
|
||||
return sa_session.query( app.model.ToolShedRepository ) \
|
||||
.filter( and_( app.model.ToolShedRepository.table.c.tool_shed == tool_shed,
|
||||
app.model.ToolShedRepository.table.c.name == name,
|
||||
app.model.ToolShedRepository.table.c.owner == owner,
|
||||
app.model.ToolShedRepository.table.c.installed_changeset_revision == installed_changeset_revision ) ) \
|
||||
.first()
|
||||
def get_tool_shed_from_clone_url( repository_clone_url ):
|
||||
tmp_url = clean_repository_clone_url( repository_clone_url )
|
||||
return tmp_url.split( 'repos' )[ 0 ].rstrip( '/' )
|
||||
@@ -1557,6 +1824,16 @@ def get_url_from_repository_tool_shed( app, repository ):
|
||||
return shed_url
|
||||
# The tool shed from which the repository was originally installed must no longer be configured in tool_sheds_conf.xml.
|
||||
return None
|
||||
def get_url_from_tool_shed( app, tool_shed ):
|
||||
# The value of tool_shed is something like: toolshed.g2.bx.psu.edu. We need the URL to this tool shed, which is something like:
|
||||
# http://toolshed.g2.bx.psu.edu/
|
||||
for shed_name, shed_url in app.tool_shed_registry.tool_sheds.items():
|
||||
if shed_url.find( tool_shed ) >= 0:
|
||||
if shed_url.endswith( '/' ):
|
||||
shed_url = shed_url.rstrip( '/' )
|
||||
return shed_url
|
||||
# The tool shed from which the repository was originally installed must no longer be configured in tool_sheds_conf.xml.
|
||||
return None
|
||||
def get_user_by_username( trans, username ):
|
||||
"""Get a user from the database by username"""
|
||||
return trans.sa_session.query( trans.model.User ) \
|
||||
|
||||
@@ -12,6 +12,7 @@ class UniverseApplication( object ):
|
||||
"""Encapsulates the state of a Universe application"""
|
||||
def __init__( self, **kwargs ):
|
||||
print >> sys.stderr, "python path is: " + ", ".join( sys.path )
|
||||
self.name = "community"
|
||||
# Read config file and check for errors
|
||||
self.config = config.Configuration( **kwargs )
|
||||
self.config.check()
|
||||
|
||||
@@ -1338,7 +1338,7 @@ class RepositoryController( BaseUIController, common.ItemRatings ):
|
||||
changeset_revision = kwd[ 'changeset_revision' ]
|
||||
repository = suc.get_repository_by_name_and_owner( trans, repository_name, repository_owner )
|
||||
repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, trans.security.encode_id( repository.id ), changeset_revision )
|
||||
return suc.build_readme_files_dict( repository_metadata )
|
||||
return suc.build_readme_files_dict( repository_metadata.metadata )
|
||||
@web.json
|
||||
def get_repository_dependencies( self, trans, **kwd ):
|
||||
"""Return an encoded dictionary of all repositories upon which the contents of the received repository depends."""
|
||||
|
||||
@@ -218,7 +218,7 @@ def build_repository_dependencies_folder( toolshed_base_url, repository_name, re
|
||||
else:
|
||||
repository_dependencies_root_folder = None
|
||||
return folder_id, repository_dependencies_root_folder
|
||||
def build_tools_folder( folder_id, tool_dicts, repository, changeset_revision, valid=True, label='Valid tools' ):
|
||||
def build_tools_folder( folder_id, tool_dicts, repository, changeset_revision, valid=True, label='Valid tools', description=None ):
|
||||
"""Return a folder hierarchy containing valid tools."""
|
||||
if tool_dicts:
|
||||
tool_id = 0
|
||||
@@ -226,6 +226,8 @@ def build_tools_folder( folder_id, tool_dicts, repository, changeset_revision, v
|
||||
tools_root_folder = Folder( id=folder_id, key='root', label='root', parent=None )
|
||||
folder_id += 1
|
||||
folder = Folder( id=folder_id, key='tools', label=label, parent=tools_root_folder )
|
||||
if description:
|
||||
folder.description = description
|
||||
tools_root_folder.folders.append( folder )
|
||||
# Insert a header row.
|
||||
tool_id += 1
|
||||
@@ -239,6 +241,10 @@ def build_tools_folder( folder_id, tool_dicts, repository, changeset_revision, v
|
||||
repository_id='',
|
||||
changeset_revision='' )
|
||||
folder.valid_tools.append( tool )
|
||||
if repository:
|
||||
repository_id = repository.id
|
||||
else:
|
||||
repository_id = ''
|
||||
for tool_dict in tool_dicts:
|
||||
tool_id += 1
|
||||
if 'requirements' in tool_dict:
|
||||
@@ -256,7 +262,7 @@ def build_tools_folder( folder_id, tool_dicts, repository, changeset_revision, v
|
||||
description=tool_dict[ 'description' ],
|
||||
version=tool_dict[ 'version' ],
|
||||
requirements=requirements_str,
|
||||
repository_id=repository.id,
|
||||
repository_id=repository_id,
|
||||
changeset_revision=changeset_revision )
|
||||
folder.valid_tools.append( tool )
|
||||
else:
|
||||
|
||||
@@ -6,6 +6,7 @@ class UniverseApplication( object ):
|
||||
"""Encapsulates the state of a Universe application"""
|
||||
def __init__( self, **kwargs ):
|
||||
print >> sys.stderr, "python path is: " + ", ".join( sys.path )
|
||||
self.name = "demo_sequencer"
|
||||
# Read config file and check for errors
|
||||
self.config = config.Configuration( **kwargs )
|
||||
self.config.check()
|
||||
|
||||
@@ -55,7 +55,7 @@ def app_factory( global_conf, **kwargs ):
|
||||
sys.exit( 1 )
|
||||
atexit.register( app.shutdown )
|
||||
# Create the universe WSGI application
|
||||
webapp = galaxy.webapps.demo_sequencer.framework.WebApplication( app, session_cookie='galaxydemo_sequencersession' )
|
||||
webapp = galaxy.webapps.demo_sequencer.framework.WebApplication( app, session_cookie='galaxydemo_sequencersession', name="demo_sequencer" )
|
||||
add_ui_controllers( webapp, app )
|
||||
# These two routes handle our simple needs at the moment
|
||||
webapp.add_route( '/:controller/:action', action='index' )
|
||||
|
||||
@@ -547,20 +547,6 @@ class AdminToolshed( AdminGalaxy ):
|
||||
galaxy_url = url_for( '/', qualified=True )
|
||||
url = suc.url_join( tool_shed_url, 'repository/find_workflows?galaxy_url=%s' % galaxy_url )
|
||||
return trans.response.send_redirect( url )
|
||||
def generate_tool_path( self, repository_clone_url, changeset_revision ):
|
||||
"""
|
||||
Generate a tool path that guarantees repositories with the same name will always be installed
|
||||
in different directories. The tool path will be of the form:
|
||||
<tool shed url>/repos/<repository owner>/<repository name>/<installed changeset revision>
|
||||
http://test@bx.psu.edu:9009/repos/test/filter
|
||||
"""
|
||||
tmp_url = suc.clean_repository_clone_url( repository_clone_url )
|
||||
# Now tmp_url is something like: bx.psu.edu:9009/repos/some_username/column
|
||||
items = tmp_url.split( 'repos' )
|
||||
tool_shed_url = items[ 0 ]
|
||||
repo_path = items[ 1 ]
|
||||
tool_shed_url = suc.clean_tool_shed_url( tool_shed_url )
|
||||
return suc.url_join( tool_shed_url, 'repos', repo_path, changeset_revision )
|
||||
@web.json
|
||||
@web.require_admin
|
||||
def get_file_contents( self, trans, file_path ):
|
||||
@@ -585,59 +571,11 @@ class AdminToolshed( AdminGalaxy ):
|
||||
raw_text = response.read()
|
||||
response.close()
|
||||
if len( raw_text ) > 2:
|
||||
text = json.from_json_string( encoding_util.tool_shed_decode( raw_text ) )
|
||||
log.debug( text )
|
||||
encoded_text = from_json_string( raw_text )
|
||||
text = encoding_util.tool_shed_decode( encoded_text )
|
||||
else:
|
||||
text = ''
|
||||
return text
|
||||
def get_required_repo_info_dicts( self, tool_shed_url, repo_info_dicts ):
|
||||
"""
|
||||
Inspect the list of repo_info_dicts for repository dependencies and append a repo_info_dict for each of them to the list. All
|
||||
repository_dependencies entries in each of the received repo_info_dicts includes all required repositories, so only one pass through
|
||||
this methid is required to retrieve all repository dependencies.
|
||||
"""
|
||||
if repo_info_dicts:
|
||||
all_repo_info_dicts = [ rid for rid in repo_info_dicts ]
|
||||
# We'll send tuples of ( tool_shed, repository_name, repository_owner, changeset_revision ) to the tool shed to discover repository ids.
|
||||
required_repository_tups = []
|
||||
for repo_info_dict in repo_info_dicts:
|
||||
for repository_name, repo_info_tup in repo_info_dict.items():
|
||||
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
|
||||
suc.get_repo_info_tuple_contents( repo_info_tup )
|
||||
if repository_dependencies:
|
||||
for key, val in repository_dependencies.items():
|
||||
if key in [ 'root_key', 'description' ]:
|
||||
continue
|
||||
toolshed, name, owner, changeset_revision = container_util.get_components_from_key( key )
|
||||
components_list = [ toolshed, name, owner, changeset_revision ]
|
||||
if components_list not in required_repository_tups:
|
||||
required_repository_tups.append( components_list )
|
||||
for components_list in val:
|
||||
if components_list not in required_repository_tups:
|
||||
required_repository_tups.append( components_list )
|
||||
if required_repository_tups:
|
||||
# The value of required_repository_tups is a list of tuples, so we need to encode it.
|
||||
encoded_required_repository_tups = []
|
||||
for required_repository_tup in required_repository_tups:
|
||||
encoded_required_repository_tups.append( encoding_util.encoding_sep.join( required_repository_tup ) )
|
||||
encoded_required_repository_str = encoding_util.encoding_sep2.join( encoded_required_repository_tups )
|
||||
encoded_required_repository_str = encoding_util.tool_shed_encode( encoded_required_repository_str )
|
||||
url = suc.url_join( tool_shed_url, '/repository/get_required_repo_info_dict?encoded_str=%s' % encoded_required_repository_str )
|
||||
response = urllib2.urlopen( url )
|
||||
text = response.read()
|
||||
response.close()
|
||||
if text:
|
||||
required_repo_info_dict = from_json_string( text )
|
||||
required_repo_info_dicts = []
|
||||
encoded_dict_strings = required_repo_info_dict[ 'repo_info_dicts' ]
|
||||
for encoded_dict_str in encoded_dict_strings:
|
||||
decoded_dict = encoding_util.tool_shed_decode( encoded_dict_str )
|
||||
required_repo_info_dicts.append( decoded_dict )
|
||||
if required_repo_info_dicts:
|
||||
for required_repo_info_dict in required_repo_info_dicts:
|
||||
if required_repo_info_dict not in all_repo_info_dicts:
|
||||
all_repo_info_dicts.append( required_repo_info_dict )
|
||||
return all_repo_info_dicts
|
||||
def get_versions_of_tool( self, app, guid ):
|
||||
tool_version = shed_util.get_tool_version( app, guid )
|
||||
return tool_version.get_version_ids( app, reverse=True )
|
||||
@@ -748,7 +686,7 @@ class AdminToolshed( AdminGalaxy ):
|
||||
shed_util.update_tool_shed_repository_status( trans.app, tool_shed_repository, trans.model.ToolShedRepository.installation_status.CLONING )
|
||||
repo_info_tuple = repo_info_dict[ tool_shed_repository.name ]
|
||||
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = repo_info_tuple
|
||||
relative_clone_dir = self.generate_tool_path( repository_clone_url, tool_shed_repository.installed_changeset_revision )
|
||||
relative_clone_dir = shed_util.generate_tool_path( repository_clone_url, tool_shed_repository.installed_changeset_revision )
|
||||
clone_dir = os.path.join( tool_path, relative_clone_dir )
|
||||
relative_install_dir = os.path.join( relative_clone_dir, tool_shed_repository.name )
|
||||
install_dir = os.path.join( tool_path, relative_install_dir )
|
||||
@@ -908,13 +846,13 @@ class AdminToolshed( AdminGalaxy ):
|
||||
repository = suc.get_installed_tool_shed_repository( trans, repository_id )
|
||||
if not repository:
|
||||
return trans.show_error_message( 'Invalid repository specified.' )
|
||||
tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, repository )
|
||||
if repository.status in [ trans.model.ToolShedRepository.installation_status.CLONING ]:
|
||||
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
|
||||
action='monitor_repository_installation',
|
||||
**kwd ) )
|
||||
if repository.can_install and operation == 'install':
|
||||
# Send a request to the tool shed to install the repository.
|
||||
tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, repository )
|
||||
url = suc.url_join( tool_shed_url,
|
||||
'repository/install_repositories_by_revision?name=%s&owner=%s&changeset_revisions=%s&galaxy_url=%s' % \
|
||||
( repository.name, repository.owner, repository.installed_changeset_revision, ( url_for( '/', qualified=True ) ) ) )
|
||||
@@ -939,10 +877,50 @@ class AdminToolshed( AdminGalaxy ):
|
||||
trans.sa_session.add( repository )
|
||||
trans.sa_session.flush()
|
||||
message = "The repository information has been updated."
|
||||
metadata = repository.metadata
|
||||
datatypes = metadata.get( 'datatypes', None )
|
||||
invalid_tools = metadata.get( 'invalid_tools', None )
|
||||
if repository.has_readme_files:
|
||||
readme_files_dict = suc.build_readme_files_dict( repository.metadata )
|
||||
else:
|
||||
readme_files_dict = None
|
||||
repository_dependencies = metadata.get( 'repository_dependencies', None )
|
||||
repository_dependencies_dict_for_display = {}
|
||||
if repository_dependencies:
|
||||
# We need to add a root_key entry to the repository_dependencies dictionary since it will not be included in the installed tool
|
||||
# shed repository metadata.
|
||||
root_key = container_util.generate_repository_dependencies_key_for_repository( repository.tool_shed,
|
||||
repository.name,
|
||||
repository.owner,
|
||||
repository.installed_changeset_revision )
|
||||
rd_tups_for_display = []
|
||||
rd_tups = repository_dependencies[ 'repository_dependencies' ]
|
||||
repository_dependencies_dict_for_display[ 'root_key' ] = root_key
|
||||
repository_dependencies_dict_for_display[ root_key ] = rd_tups
|
||||
repository_dependencies_dict_for_display[ 'description' ] = repository_dependencies[ 'description' ]
|
||||
all_tool_dependencies = metadata.get( 'tool_dependencies', None )
|
||||
tool_dependencies, missing_tool_dependencies = shed_util.get_installed_and_missing_tool_dependencies( trans, repository, all_tool_dependencies )
|
||||
valid_tools = metadata.get( 'tools', None )
|
||||
workflows = metadata.get( 'workflows', None )
|
||||
containers_dict = suc.build_repository_containers_for_galaxy( trans=trans,
|
||||
toolshed_base_url=tool_shed_url,
|
||||
repository_name=repository.name,
|
||||
repository_owner=repository.owner,
|
||||
changeset_revision=repository.installed_changeset_revision,
|
||||
repository=repository,
|
||||
datatypes=datatypes,
|
||||
invalid_tools=invalid_tools,
|
||||
missing_tool_dependencies=missing_tool_dependencies,
|
||||
readme_files_dict=readme_files_dict,
|
||||
repository_dependencies=repository_dependencies_dict_for_display,
|
||||
tool_dependencies=tool_dependencies,
|
||||
valid_tools=valid_tools,
|
||||
workflows=workflows )
|
||||
return trans.fill_template( '/admin/tool_shed_repository/manage_repository.mako',
|
||||
repository=repository,
|
||||
description=description,
|
||||
repo_files_dir=repo_files_dir,
|
||||
containers_dict=containers_dict,
|
||||
message=message,
|
||||
status=status )
|
||||
@web.expose
|
||||
@@ -1153,8 +1131,8 @@ class AdminToolshed( AdminGalaxy ):
|
||||
shed_tool_conf = kwd[ 'shed_tool_conf' ]
|
||||
else:
|
||||
install_tool_dependencies = False
|
||||
# If installing a repository that includes no tools, get the relative tool_path from the file to which the
|
||||
# migrated_tools_config setting points.
|
||||
# If installing a repository that includes no tools, get the relative tool_path from the file to which the migrated_tools_config
|
||||
# setting points.
|
||||
shed_tool_conf = trans.app.config.migrated_tools_config
|
||||
# Get the tool path by searching the list of shed_tool_confs for the dictionary that contains the information about shed_tool_conf.
|
||||
for shed_tool_conf_dict in trans.app.toolbox.shed_tool_confs:
|
||||
@@ -1167,61 +1145,20 @@ class AdminToolshed( AdminGalaxy ):
|
||||
if file_name == shed_tool_conf:
|
||||
tool_path = shed_tool_conf_dict[ 'tool_path' ]
|
||||
break
|
||||
# Make sure all tool_shed_repository records exist.
|
||||
created_or_updated_tool_shed_repositories = []
|
||||
# Repositories will be filtered (e.g., if already installed, etc), so filter the associated repo_info_dicts accordingly.
|
||||
filtered_repo_info_dicts = []
|
||||
# Disciver all repository dependencies and retrieve information for installing them.
|
||||
repo_info_dicts = self.get_required_repo_info_dicts( tool_shed_url, repo_info_dicts )
|
||||
for repo_info_dict in repo_info_dicts:
|
||||
for name, repo_info_tuple in repo_info_dict.items():
|
||||
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
|
||||
suc.get_repo_info_tuple_contents( repo_info_tuple )
|
||||
clone_dir = os.path.join( tool_path, self.generate_tool_path( repository_clone_url, changeset_revision ) )
|
||||
relative_install_dir = os.path.join( clone_dir, name )
|
||||
# Make sure the repository was not already installed.
|
||||
installed_tool_shed_repository, installed_changeset_revision = self.repository_was_previously_installed( trans,
|
||||
tool_shed_url,
|
||||
name,
|
||||
repo_info_tuple,
|
||||
clone_dir )
|
||||
if installed_tool_shed_repository:
|
||||
message += "Revision <b>%s</b> of tool shed repository <b>%s</b> owned by <b>%s</b> " % ( changeset_revision, name, repository_owner )
|
||||
if installed_changeset_revision != changeset_revision:
|
||||
message += "was previously installed using changeset revision <b>%s</b>. " % installed_changeset_revision
|
||||
else:
|
||||
message += "was previously installed. "
|
||||
if installed_tool_shed_repository.uninstalled:
|
||||
message += "The repository has been uninstalled, however, so reinstall the original repository instead of installing it again. "
|
||||
elif installed_tool_shed_repository.deleted:
|
||||
message += "The repository has been deactivated, however, so activate the original repository instead of installing it again. "
|
||||
if installed_changeset_revision != changeset_revision:
|
||||
message += "You can get the latest updates for the repository using the <b>Get updates</b> option from the repository's "
|
||||
message += "<b>Repository Actions</b> pop-up menu. "
|
||||
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 ) ) )
|
||||
status = 'error'
|
||||
if len( repo_info_dicts ) == 1:
|
||||
new_kwd = dict( message=message, status=status )
|
||||
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
|
||||
action='browse_repositories',
|
||||
**new_kwd ) )
|
||||
else:
|
||||
log.debug( "Adding new row (or updating an existing row) for repository '%s' in the tool_shed_repository table." % name )
|
||||
tool_shed_repository = shed_util.create_or_update_tool_shed_repository( app=trans.app,
|
||||
name=name,
|
||||
description=description,
|
||||
installed_changeset_revision=changeset_revision,
|
||||
ctx_rev=ctx_rev,
|
||||
repository_clone_url=repository_clone_url,
|
||||
metadata_dict={},
|
||||
status=trans.model.ToolShedRepository.installation_status.NEW,
|
||||
current_changeset_revision=changeset_revision,
|
||||
owner=repository_owner,
|
||||
dist_to_shed=False )
|
||||
created_or_updated_tool_shed_repositories.append( tool_shed_repository )
|
||||
filtered_repo_info_dicts.append( encoding_util.tool_shed_encode( repo_info_dict ) )
|
||||
created_or_updated_tool_shed_repositories, repo_info_dicts, filtered_repo_info_dicts, message = \
|
||||
shed_util.create_repository_dependency_objects( trans, tool_path, tool_shed_url, repo_info_dicts, reinstalling=False )
|
||||
if message and len( repo_info_dicts ) == 1:
|
||||
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 ) ) )
|
||||
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
|
||||
action='browse_repositories',
|
||||
message=message,
|
||||
status='error' ) )
|
||||
if created_or_updated_tool_shed_repositories:
|
||||
if install_repository_dependencies:
|
||||
# Build repository dependency relationships.
|
||||
suc.build_repository_dependency_relationships( trans, repo_info_dicts, created_or_updated_tool_shed_repositories )
|
||||
# Handle contained tools.
|
||||
if includes_tools and ( new_tool_panel_section or tool_panel_section ):
|
||||
if new_tool_panel_section:
|
||||
section_id = new_tool_panel_section.lower().replace( ' ', '_' )
|
||||
@@ -1286,11 +1223,8 @@ class AdminToolshed( AdminGalaxy ):
|
||||
repo_info_dict = repo_info_dicts[ 0 ]
|
||||
name = repo_info_dict.keys()[ 0 ]
|
||||
repo_info_tuple = repo_info_dict[ name ]
|
||||
if len( repo_info_tuple ) == 6:
|
||||
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple
|
||||
repository_dependencies = None
|
||||
elif len( repo_info_tuple ) == 7:
|
||||
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = repo_info_tuple
|
||||
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
|
||||
suc.get_repo_info_tuple_contents( repo_info_tuple )
|
||||
url = suc.url_join( tool_shed_url,
|
||||
'repository/get_readme_files?name=%s&owner=%s&changeset_revision=%s' % \
|
||||
( name, repository_owner, changeset_revision ) )
|
||||
@@ -1303,9 +1237,15 @@ class AdminToolshed( AdminGalaxy ):
|
||||
repository_name=name,
|
||||
repository_owner=repository_owner,
|
||||
changeset_revision=changeset_revision,
|
||||
repository=None,
|
||||
datatypes=None,
|
||||
invalid_tools=None,
|
||||
missing_tool_dependencies=None,
|
||||
readme_files_dict=readme_files_dict,
|
||||
repository_dependencies=repository_dependencies,
|
||||
tool_dependencies=tool_dependencies )
|
||||
tool_dependencies=tool_dependencies,
|
||||
valid_tools=None,
|
||||
workflows=None )
|
||||
else:
|
||||
containers_dict = dict( readme_files_dict=None, repository_dependencies=None, tool_dependencies=None )
|
||||
# Handle tool dependencies chack box.
|
||||
@@ -1338,18 +1278,23 @@ class AdminToolshed( AdminGalaxy ):
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def reinstall_repository( self, trans, **kwd ):
|
||||
"""
|
||||
Reinstall a tool shed repository that has been previously uninstalled, making sure to handle all repository and tool dependencies of the
|
||||
repository.
|
||||
"""
|
||||
message = kwd.get( 'message', '' )
|
||||
status = kwd.get( 'status', 'done' )
|
||||
repository_id = kwd[ 'id' ]
|
||||
tool_shed_repository = suc.get_installed_tool_shed_repository( trans, repository_id )
|
||||
no_changes = kwd.get( 'no_changes', '' )
|
||||
no_changes_checked = CheckboxField.is_checked( no_changes )
|
||||
install_repository_dependencies = CheckboxField.is_checked( kwd.get( 'install_repository_dependencies', '' ) )
|
||||
install_tool_dependencies = CheckboxField.is_checked( kwd.get( 'install_tool_dependencies', '' ) )
|
||||
new_tool_panel_section = kwd.get( 'new_tool_panel_section', '' )
|
||||
tool_panel_section = kwd.get( 'tool_panel_section', '' )
|
||||
shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, tool_shed_repository )
|
||||
repository_clone_url = suc.generate_clone_url_for_installed_repository( trans.app, tool_shed_repository )
|
||||
clone_dir = os.path.join( tool_path, self.generate_tool_path( repository_clone_url, tool_shed_repository.installed_changeset_revision ) )
|
||||
clone_dir = os.path.join( tool_path, shed_util.generate_tool_path( repository_clone_url, tool_shed_repository.installed_changeset_revision ) )
|
||||
relative_install_dir = os.path.join( clone_dir, tool_shed_repository.name )
|
||||
tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, tool_shed_repository )
|
||||
tool_section = None
|
||||
@@ -1406,28 +1351,34 @@ class AdminToolshed( AdminGalaxy ):
|
||||
else:
|
||||
tool_section = None
|
||||
# The repository's status must be updated from 'Uninstall' to 'New' when initiating reinstall so the repository_installation_updater will function.
|
||||
tool_shed_repository = shed_util.create_or_update_tool_shed_repository( trans.app,
|
||||
tool_shed_repository.name,
|
||||
tool_shed_repository.description,
|
||||
tool_shed_repository.installed_changeset_revision,
|
||||
tool_shed_repository.ctx_rev,
|
||||
repository_clone_url,
|
||||
tool_shed_repository.metadata,
|
||||
trans.model.ToolShedRepository.installation_status.NEW,
|
||||
tool_shed_repository.installed_changeset_revision,
|
||||
tool_shed_repository.owner,
|
||||
tool_shed_repository.dist_to_shed )
|
||||
ctx_rev = shed_util.get_ctx_rev( tool_shed_url, tool_shed_repository.name, tool_shed_repository.owner, tool_shed_repository.installed_changeset_revision )
|
||||
tool_shed_repository = suc.create_or_update_tool_shed_repository( trans.app,
|
||||
tool_shed_repository.name,
|
||||
tool_shed_repository.description,
|
||||
tool_shed_repository.installed_changeset_revision,
|
||||
tool_shed_repository.ctx_rev,
|
||||
repository_clone_url,
|
||||
tool_shed_repository.metadata,
|
||||
trans.model.ToolShedRepository.installation_status.NEW,
|
||||
tool_shed_repository.installed_changeset_revision,
|
||||
tool_shed_repository.owner,
|
||||
tool_shed_repository.dist_to_shed )
|
||||
ctx_rev = suc.get_ctx_rev( tool_shed_url, tool_shed_repository.name, tool_shed_repository.owner, tool_shed_repository.installed_changeset_revision )
|
||||
repo_info_dicts = []
|
||||
repo_info_dict = kwd.get( 'repo_info_dict', None )
|
||||
# The repo_info_dict should be encoded.
|
||||
if not repo_info_dict:
|
||||
if repo_info_dict:
|
||||
# The repo_info_dict should be encoded.
|
||||
repo_info_dict = encoding_util.tool_shed_decode( repo_info_dict )
|
||||
else:
|
||||
# Entering this if block used to happen only if the tool_shed_repository does not include any valid tools. After repository dependencies
|
||||
# were introduced, it may never happen, but will keep the block just in case.
|
||||
repository_dependencies = self.get_repository_dependencies( trans=trans,
|
||||
repository_id=repository_id,
|
||||
repository_name=tool_shed_repository.name,
|
||||
repository_owner=tool_shed_repository.owner,
|
||||
changeset_revision=tool_shed_repository.installed_changeset_revision )
|
||||
# were introduced, it may never happen, but we'll keep the block just in case.
|
||||
if install_repository_dependencies:
|
||||
repository_dependencies = self.get_repository_dependencies( trans=trans,
|
||||
repository_id=repository_id,
|
||||
repository_name=tool_shed_repository.name,
|
||||
repository_owner=tool_shed_repository.owner,
|
||||
changeset_revision=tool_shed_repository.installed_changeset_revision )
|
||||
else:
|
||||
repository_dependencies = None
|
||||
repo = hg.repository( suc.get_configured_ui(), path=os.path.abspath( tool_shed_repository.repo_path( trans.app ) ) )
|
||||
repo_info_dict = suc.create_repo_info_dict( trans=trans,
|
||||
repository_clone_url=repository_clone_url,
|
||||
@@ -1440,6 +1391,16 @@ class AdminToolshed( AdminGalaxy ):
|
||||
metadata=metadata,
|
||||
repository_dependencies=repository_dependencies )
|
||||
repo_info_dict = encoding_util.tool_shed_encode( repo_info_dict )
|
||||
repo_info_dicts.append( repo_info_dict )
|
||||
# Make sure all tool_shed_repository records exist.
|
||||
created_or_updated_tool_shed_repositories = [ tool_shed_repository ]
|
||||
if install_repository_dependencies:
|
||||
created_or_updated_tool_shed_repositories, repo_info_dicts, filtered_repo_info_dicts = \
|
||||
shed_util.create_repository_dependency_objects( trans, tool_path, tool_shed_url, repo_info_dicts, reinstalling=True )
|
||||
if len( created_or_updated_tool_shed_repositories ) > 1:
|
||||
# Build repository dependency relationships.
|
||||
suc.build_repository_dependency_relationships( trans, filtered_repo_info_dicts, created_or_updated_tool_shed_repositories )
|
||||
encoded_repository_ids = [ trans.security.encode_id( r.id ) for r in created_or_updated_tool_shed_repositories ]
|
||||
new_kwd = dict( includes_tool_dependencies=tool_shed_repository.includes_tool_dependencies,
|
||||
includes_tools=tool_shed_repository.includes_tools,
|
||||
install_tool_dependencies=install_tool_dependencies,
|
||||
@@ -1451,12 +1412,12 @@ class AdminToolshed( AdminGalaxy ):
|
||||
tool_panel_section=tool_panel_section,
|
||||
tool_path=tool_path,
|
||||
tool_panel_section_key=tool_panel_section_key,
|
||||
tool_shed_repository_ids=[ repository_id ],
|
||||
tool_shed_repository_ids=encoded_repository_ids,
|
||||
tool_shed_url=tool_shed_url )
|
||||
encoded_kwd = encoding_util.tool_shed_encode( new_kwd )
|
||||
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
|
||||
action='initiate_repository_installation',
|
||||
shed_repository_ids=repository_id,
|
||||
shed_repository_ids=encoded_repository_ids,
|
||||
encoded_kwd=encoded_kwd,
|
||||
reinstalling=True ) )
|
||||
@web.json
|
||||
@@ -1481,48 +1442,23 @@ class AdminToolshed( AdminGalaxy ):
|
||||
return rval
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def repository_was_previously_installed( self, trans, tool_shed_url, repository_name, repo_info_tuple, clone_dir ):
|
||||
# Handle case where the repository was previously installed using an older changeset_revsion, but later the repository was updated
|
||||
# in the tool shed and now we're trying to install the latest changeset revision of the same repository instead of updating the one
|
||||
# that was previously installed. We'll look in the database instead of on disk since the repository may be uninstalled.
|
||||
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
|
||||
suc.get_repo_info_tuple_contents( repo_info_tuple )
|
||||
tool_shed = suc.get_tool_shed_from_clone_url( repository_clone_url )
|
||||
# Get all previous change set revisions from the tool shed for the repository back to, but excluding, the previous valid changeset
|
||||
# revision to see if it was previously installed using one of them.
|
||||
url = suc.url_join( tool_shed_url,
|
||||
'repository/previous_changeset_revisions?galaxy_url=%s&name=%s&owner=%s&changeset_revision=%s' % \
|
||||
( url_for( '/', qualified=True ), repository_name, repository_owner, changeset_revision ) )
|
||||
response = urllib2.urlopen( url )
|
||||
text = response.read()
|
||||
response.close()
|
||||
if text:
|
||||
#clone_path, clone_directory = os.path.split( clone_dir )
|
||||
changeset_revisions = util.listify( text )
|
||||
for previous_changeset_revision in changeset_revisions:
|
||||
tool_shed_repository = shed_util.get_tool_shed_repository_by_shed_name_owner_installed_changeset_revision( trans.app,
|
||||
tool_shed,
|
||||
repository_name,
|
||||
repository_owner,
|
||||
previous_changeset_revision )
|
||||
if tool_shed_repository and tool_shed_repository.status not in [ trans.model.ToolShedRepository.installation_status.NEW ]:
|
||||
return tool_shed_repository, previous_changeset_revision
|
||||
return None, None
|
||||
@web.expose
|
||||
@web.require_admin
|
||||
def reselect_tool_panel_section( self, trans, **kwd ):
|
||||
message = ''
|
||||
repository_id = kwd[ 'id' ]
|
||||
tool_shed_repository = suc.get_installed_tool_shed_repository( trans, repository_id )
|
||||
metadata = tool_shed_repository.metadata
|
||||
tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, tool_shed_repository )
|
||||
ctx_rev = shed_util.get_ctx_rev( tool_shed_url, tool_shed_repository.name, tool_shed_repository.owner, tool_shed_repository.installed_changeset_revision )
|
||||
ctx_rev = suc.get_ctx_rev( tool_shed_url, tool_shed_repository.name, tool_shed_repository.owner, tool_shed_repository.installed_changeset_revision )
|
||||
repository_clone_url = suc.generate_clone_url_for_installed_repository( trans.app, tool_shed_repository )
|
||||
repository_dependencies = self.get_repository_dependencies( trans=trans,
|
||||
repository_id=repository_id,
|
||||
repository_name=tool_shed_repository.name,
|
||||
repository_owner=tool_shed_repository.owner,
|
||||
changeset_revision=tool_shed_repository.installed_changeset_revision )
|
||||
if repository_dependencies:
|
||||
includes_repository_dependencies = True
|
||||
else:
|
||||
includes_repository_dependencies = False
|
||||
repo_info_dict = suc.create_repo_info_dict( trans=trans,
|
||||
repository_clone_url=repository_clone_url,
|
||||
changeset_revision=tool_shed_repository.installed_changeset_revision,
|
||||
@@ -1561,24 +1497,51 @@ class AdminToolshed( AdminGalaxy ):
|
||||
message += "The tools contained in your <b>%s</b> repository were last loaded into the tool panel outside of any sections. " % tool_shed_repository.name
|
||||
message += "Uncheck the <b>No changes</b> check box and select a tool panel section to load the tools into that section. "
|
||||
status = 'warning'
|
||||
if metadata and 'readme_files' in metadata:
|
||||
url = suc.url_join( tool_shed_url,
|
||||
'repository/get_readme_files?name=%s&owner=%s&changeset_revision=%s' % \
|
||||
( tool_shed_repository.name, tool_shed_repository.owner, tool_shed_repository.installed_changeset_revision ) )
|
||||
response = urllib2.urlopen( url )
|
||||
raw_text = response.read()
|
||||
response.close()
|
||||
readme_files_dict = from_json_string( raw_text )
|
||||
tool_dependencies = metadata.get( 'tool_dependencies', None )
|
||||
if metadata:
|
||||
datatypes = metadata.get( 'datatypes', None )
|
||||
invalid_tools = metadata.get( 'invalid_tools', None )
|
||||
if tool_shed_repository.has_readme_files:
|
||||
url = suc.url_join( tool_shed_url,
|
||||
'repository/get_readme_files?name=%s&owner=%s&changeset_revision=%s' % \
|
||||
( tool_shed_repository.name, tool_shed_repository.owner, tool_shed_repository.installed_changeset_revision ) )
|
||||
response = urllib2.urlopen( url )
|
||||
raw_text = response.read()
|
||||
response.close()
|
||||
readme_files_dict = from_json_string( raw_text )
|
||||
else:
|
||||
readme_files_dict = None
|
||||
repository_dependencies = metadata.get( 'repository_dependencies', None )
|
||||
repository_dependencies_dict_for_display = {}
|
||||
if repository_dependencies:
|
||||
# We need to add a root_key entry to the repository_dependencies dictionary since it will not be included in the installed tool
|
||||
# shed repository metadata.
|
||||
root_key = container_util.generate_repository_dependencies_key_for_repository( repository.tool_shed,
|
||||
repository.name,
|
||||
repository.owner,
|
||||
repository.installed_changeset_revision )
|
||||
rd_tups_for_display = []
|
||||
rd_tups = repository_dependencies[ 'repository_dependencies' ]
|
||||
repository_dependencies_dict_for_display[ 'root_key' ] = root_key
|
||||
repository_dependencies_dict_for_display[ root_key ] = rd_tups
|
||||
repository_dependencies_dict_for_display[ 'description' ] = repository_dependencies[ 'description' ]
|
||||
all_tool_dependencies = metadata.get( 'tool_dependencies', None )
|
||||
tool_dependencies, missing_tool_dependencies = shed_util.get_installed_and_missing_tool_dependencies( trans, repository, all_tool_dependencies )
|
||||
valid_tools = metadata.get( 'tools', None )
|
||||
workflows = metadata.get( 'workflows', None )
|
||||
containers_dict = suc.build_repository_containers_for_galaxy( trans=trans,
|
||||
toolshed_base_url=tool_shed_url,
|
||||
repository_name=tool_shed_repository.name,
|
||||
repository_owner=tool_shed_repository.owner,
|
||||
changeset_revision=tool_shed_repository.installed_changeset_revision,
|
||||
repository=tool_shed_repository,
|
||||
datatypes=datatypes,
|
||||
invalid_tools=invalid_tools,
|
||||
missing_tool_dependencies=missing_tool_dependencies,
|
||||
readme_files_dict=readme_files_dict,
|
||||
repository_dependencies=repository_dependencies,
|
||||
tool_dependencies=tool_dependencies )
|
||||
tool_dependencies=tool_dependencies,
|
||||
valid_tools=valid_tools,
|
||||
workflows=workflows )
|
||||
else:
|
||||
containers_dict = dict( readme_files_dict=None, repository_dependencies=None, tool_dependencies=None )
|
||||
# Handle repository dependencies check box.
|
||||
@@ -1597,6 +1560,8 @@ class AdminToolshed( AdminGalaxy ):
|
||||
repository=tool_shed_repository,
|
||||
no_changes_check_box=no_changes_check_box,
|
||||
original_section_name=original_section_name,
|
||||
includes_tool_dependencies=tool_shed_repository.includes_tool_dependencies,
|
||||
includes_repository_dependencies=includes_repository_dependencies,
|
||||
install_repository_dependencies_check_box=install_repository_dependencies_check_box,
|
||||
install_tool_dependencies_check_box=install_tool_dependencies_check_box,
|
||||
containers_dict=containers_dict,
|
||||
@@ -1797,7 +1762,7 @@ class AdminToolshed( AdminGalaxy ):
|
||||
changeset_revision = params.get( 'changeset_revision', None )
|
||||
latest_changeset_revision = params.get( 'latest_changeset_revision', None )
|
||||
latest_ctx_rev = params.get( 'latest_ctx_rev', None )
|
||||
repository = shed_util.get_tool_shed_repository_by_shed_name_owner_changeset_revision( trans.app, tool_shed_url, name, owner, changeset_revision )
|
||||
repository = suc.get_tool_shed_repository_by_shed_name_owner_changeset_revision( trans.app, tool_shed_url, name, owner, changeset_revision )
|
||||
if changeset_revision and latest_changeset_revision and latest_ctx_rev:
|
||||
if changeset_revision == latest_changeset_revision:
|
||||
message = "The installed repository named '%s' is current, there are no updates available. " % name
|
||||
|
||||
@@ -6,6 +6,7 @@ class UniverseApplication( object ):
|
||||
"""Encapsulates the state of a Universe application"""
|
||||
def __init__( self, **kwargs ):
|
||||
print >> sys.stderr, "python path is: " + ", ".join( sys.path )
|
||||
self.name = "reports"
|
||||
# Read config file and check for errors
|
||||
self.config = config.Configuration( **kwargs )
|
||||
self.config.check()
|
||||
|
||||
@@ -103,14 +103,16 @@
|
||||
</div>
|
||||
</div>
|
||||
%if repository_dependencies_root_folder:
|
||||
<div class="form-row">
|
||||
<label>Handle repository dependencies?</label>
|
||||
${install_repository_dependencies_check_box.get_html()}
|
||||
<div class="toolParamHelp" style="clear: both;">
|
||||
Un-check to skip automatic installation of these additional repositories required by this repository.
|
||||
%if install_repository_dependencies_check_box is not None:
|
||||
<div class="form-row">
|
||||
<label>Handle repository dependencies?</label>
|
||||
${install_repository_dependencies_check_box.get_html()}
|
||||
<div class="toolParamHelp" style="clear: both;">
|
||||
Un-check to skip automatic installation of these additional repositories required by this repository.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
<div style="clear: both"></div>
|
||||
%endif
|
||||
<div class="form-row">
|
||||
%if repository_dependencies_root_folder:
|
||||
<p/>
|
||||
@@ -123,19 +125,21 @@
|
||||
</div>
|
||||
%endif
|
||||
%if tool_dependencies_root_folder:
|
||||
<div class="form-row">
|
||||
<label>Handle tool dependencies?</label>
|
||||
<% disabled = trans.app.config.tool_dependency_dir is None %>
|
||||
${install_tool_dependencies_check_box.get_html( disabled=disabled )}
|
||||
<div class="toolParamHelp" style="clear: both;">
|
||||
%if disabled:
|
||||
Set the tool_dependency_dir configuration value in your Galaxy config to automatically handle tool dependencies.
|
||||
%else:
|
||||
Un-check to skip automatic handling of these tool dependencies.
|
||||
%endif
|
||||
%if install_tool_dependencies_check_box is not None:
|
||||
<div class="form-row">
|
||||
<label>Handle tool dependencies?</label>
|
||||
<% disabled = trans.app.config.tool_dependency_dir is None %>
|
||||
${install_tool_dependencies_check_box.get_html( disabled=disabled )}
|
||||
<div class="toolParamHelp" style="clear: both;">
|
||||
%if disabled:
|
||||
Set the tool_dependency_dir configuration value in your Galaxy config to automatically handle tool dependencies.
|
||||
%else:
|
||||
Un-check to skip automatic handling of these tool dependencies.
|
||||
%endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
<div style="clear: both"></div>
|
||||
%endif
|
||||
<div class="form-row">
|
||||
%if tool_dependencies_root_folder:
|
||||
<p/>
|
||||
|
||||
@@ -1,7 +1,19 @@
|
||||
<%inherit file="/base.mako"/>
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
<%namespace file="/webapps/community/repository/common.mako" import="*" />
|
||||
<%namespace file="/admin/tool_shed_repository/common.mako" import="*" />
|
||||
|
||||
<%def name="stylesheets()">
|
||||
${parent.stylesheets()}
|
||||
${h.css( "library" )}
|
||||
</%def>
|
||||
|
||||
<%def name="javascripts()">
|
||||
${parent.javascripts()}
|
||||
${h.js("libs/jquery/jquery.rating", "libs/jquery/jstorage" )}
|
||||
${container_javascripts()}
|
||||
</%def>
|
||||
|
||||
<br/><br/>
|
||||
<ul class="manage-table-actions">
|
||||
<li><a class="action-button" id="repository-${repository.id}-popup" class="menubutton">Repository Actions</a></li>
|
||||
@@ -91,218 +103,5 @@
|
||||
</div>
|
||||
<p/>
|
||||
%if not in_error_state:
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">${repository.name}</div>
|
||||
<div class="toolFormBody">
|
||||
<%
|
||||
metadata = repository.metadata or {}
|
||||
missing_tool_dependencies = repository.missing_tool_dependencies
|
||||
installed_tool_dependencies = repository.installed_tool_dependencies
|
||||
%>
|
||||
%if missing_tool_dependencies:
|
||||
<div class="form-row">
|
||||
<table width="100%">
|
||||
<tr bgcolor="#D8D8D8" width="100%">
|
||||
<td><b>Missing tool dependencies</i></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
<div class="form-row">
|
||||
<table class="grid">
|
||||
<tr>
|
||||
<td><b>name</b></td>
|
||||
<td><b>version</b></td>
|
||||
<td><b>type</b></td>
|
||||
<td><b>status</b></td>
|
||||
</tr>
|
||||
%for tool_dependency in missing_tool_dependencies:
|
||||
<tr>
|
||||
<td>
|
||||
<a class="view-info" href="${h.url_for( controller='admin_toolshed', action='manage_tool_dependencies', id=trans.security.encode_id( tool_dependency.id ) )}">
|
||||
${tool_dependency.name}
|
||||
</a>
|
||||
</td>
|
||||
<td>${tool_dependency.version}</td>
|
||||
<td>${tool_dependency.type}</td>
|
||||
<td>${tool_dependency.status}</td>
|
||||
</tr>
|
||||
%endfor
|
||||
</table>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endif
|
||||
%if installed_tool_dependencies:
|
||||
<div class="form-row">
|
||||
<table width="100%">
|
||||
<tr bgcolor="#D8D8D8" width="100%">
|
||||
<td><b>Installed tool dependencies<i> - click the name to browse the dependency installation directory</i></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
<div class="form-row">
|
||||
<table class="grid">
|
||||
<tr>
|
||||
<td><b>name</b></td>
|
||||
<td><b>version</b></td>
|
||||
<td><b>type</b></td>
|
||||
</tr>
|
||||
%for installed_tool_dependency in installed_tool_dependencies:
|
||||
<tr>
|
||||
<td>
|
||||
<a class="view-info" href="${h.url_for( controller='admin_toolshed', action='browse_tool_dependency', id=trans.security.encode_id( installed_tool_dependency.id ), repository_id=trans.security.encode_id( repository.id ) )}">
|
||||
${installed_tool_dependency.name}
|
||||
</a>
|
||||
</td>
|
||||
<td>${installed_tool_dependency.version}</td>
|
||||
<td>${installed_tool_dependency.type}</td>
|
||||
</tr>
|
||||
%endfor
|
||||
</table>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endif
|
||||
%if 'tools' in metadata:
|
||||
<div class="form-row">
|
||||
<table width="100%">
|
||||
<tr bgcolor="#D8D8D8" width="100%">
|
||||
<td><b>Tools</b><i> - click the name to view information about the tool</i></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<% tool_dicts = metadata[ 'tools' ] %>
|
||||
<table class="grid">
|
||||
<tr>
|
||||
<td><b>name</b></td>
|
||||
<td><b>description</b></td>
|
||||
<td><b>version</b></td>
|
||||
<td><b>requirements</b></td>
|
||||
</tr>
|
||||
%for tool_dict in tool_dicts:
|
||||
<tr>
|
||||
<td>
|
||||
<a class="view-info" href="${h.url_for( controller='admin_toolshed', action='view_tool_metadata', repository_id=trans.security.encode_id( repository.id ), tool_id=tool_dict[ 'id' ] )}">
|
||||
${tool_dict[ 'name' ]}
|
||||
</a>
|
||||
</td>
|
||||
<td>${tool_dict[ 'description' ]}</td>
|
||||
<td>${tool_dict[ 'version' ]}</td>
|
||||
<td>
|
||||
<%
|
||||
if 'requirements' in tool_dict:
|
||||
requirements = tool_dict[ 'requirements' ]
|
||||
else:
|
||||
requirements = None
|
||||
%>
|
||||
%if requirements:
|
||||
<%
|
||||
requirements_str = ''
|
||||
for requirement_dict in tool_dict[ 'requirements' ]:
|
||||
requirements_str += '%s (%s), ' % ( requirement_dict[ 'name' ], requirement_dict[ 'type' ] )
|
||||
requirements_str = requirements_str.rstrip( ', ' )
|
||||
%>
|
||||
${requirements_str}
|
||||
%else:
|
||||
none
|
||||
%endif
|
||||
</td>
|
||||
</tr>
|
||||
%endfor
|
||||
</table>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endif
|
||||
%if 'workflows' in metadata:
|
||||
## metadata[ 'workflows' ] is a list of tuples where each contained tuple is
|
||||
## [ <relative path to the .ga file in the repository>, <exported workflow dict> ]
|
||||
<div class="form-row">
|
||||
<table width="100%">
|
||||
<tr bgcolor="#D8D8D8" width="100%">
|
||||
<td><b>Workflows</b><i> - click the name to import</i></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
<div class="form-row">
|
||||
<% workflow_tups = metadata[ 'workflows' ] %>
|
||||
<table class="grid">
|
||||
<tr>
|
||||
<td><b>name</b></td>
|
||||
<td><b>steps</b></td>
|
||||
<td><b>format-version</b></td>
|
||||
<td><b>annotation</b></td>
|
||||
</tr>
|
||||
<% index = 0 %>
|
||||
%for workflow_tup in workflow_tups:
|
||||
<%
|
||||
import os.path
|
||||
relative_path = workflow_tup[ 0 ]
|
||||
full_path = os.path.abspath( relative_path )
|
||||
workflow_dict = workflow_tup[ 1 ]
|
||||
workflow_name = workflow_dict[ 'name' ]
|
||||
## Initially steps were not stored in the metadata record.
|
||||
steps = workflow_dict.get( 'steps', [] )
|
||||
format_version = workflow_dict[ 'format-version' ]
|
||||
annotation = workflow_dict[ 'annotation' ]
|
||||
%>
|
||||
<tr>
|
||||
<td>
|
||||
<div class="menubutton" style="float: left;" id="workflow-${index}-popup">
|
||||
${workflow_name}
|
||||
<div popupmenu="workflow-${index}-popup">
|
||||
<a class="action-button" href="${h.url_for( controller='workflow', action='import_workflow', installed_repository_file=full_path, repository_id=trans.security.encode_id( repository.id ) )}">Import to Galaxy</a>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
<td>
|
||||
%if steps:
|
||||
${len( steps )}
|
||||
%else:
|
||||
unknown
|
||||
%endif
|
||||
</td>
|
||||
<td>${format_version}</td>
|
||||
<td>${annotation}</td>
|
||||
</tr>
|
||||
<% index += 1 %>
|
||||
%endfor
|
||||
</table>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endif
|
||||
%if 'datatypes' in metadata:
|
||||
<div class="form-row">
|
||||
<table width="100%">
|
||||
<tr bgcolor="#D8D8D8" width="100%">
|
||||
<td><b>Data types</b></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
<div class="form-row">
|
||||
<% datatypes_dicts = metadata[ 'datatypes' ] %>
|
||||
<table class="grid">
|
||||
<tr>
|
||||
<td><b>extension</b></td>
|
||||
<td><b>type</b></td>
|
||||
<td><b>mimetype</b></td>
|
||||
<td><b>subclass</b></td>
|
||||
</tr>
|
||||
%for datatypes_dict in datatypes_dicts:
|
||||
<tr>
|
||||
<td>${datatypes_dict.get( 'extension', ' ' )}</td>
|
||||
<td>${datatypes_dict.get( 'dtype', ' ' )}</td>
|
||||
<td>${datatypes_dict.get( 'mimetype', ' ' )}</td>
|
||||
<td>${datatypes_dict.get( 'subclass', ' ' )}</td>
|
||||
</tr>
|
||||
%endfor
|
||||
</table>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
%endif
|
||||
</div>
|
||||
</div>
|
||||
<p/>
|
||||
${render_repository_items( repository.metadata, containers_dict, can_set_metadata=False )}
|
||||
%endif
|
||||
|
||||
@@ -2,6 +2,18 @@
|
||||
<%namespace file="/message.mako" import="render_msg" />
|
||||
<%namespace file="/admin/tool_shed_repository/common.mako" import="render_dependencies_section" />
|
||||
<%namespace file="/admin/tool_shed_repository/common.mako" import="render_readme_section" />
|
||||
<%namespace file="/webapps/community/repository/common.mako" import="*" />
|
||||
|
||||
<%def name="stylesheets()">
|
||||
${parent.stylesheets()}
|
||||
${h.css( "library" )}
|
||||
</%def>
|
||||
|
||||
<%def name="javascripts()">
|
||||
${parent.javascripts()}
|
||||
${h.js("libs/jquery/jquery.rating", "libs/jquery/jstorage" )}
|
||||
${container_javascripts()}
|
||||
</%def>
|
||||
|
||||
%if message:
|
||||
${render_msg( message, status )}
|
||||
|
||||
@@ -208,14 +208,17 @@
|
||||
folder_label = "%s<i> - %s</i>" % ( folder_label, folder.description )
|
||||
else:
|
||||
folder_label = "%s<i> - this repository requires installation of these additional repositories</i>" % folder_label
|
||||
elif folder.label == 'Valid tools':
|
||||
col_span_str = 'colspan="3"'
|
||||
if folder.description:
|
||||
folder_label = "%s<i> - %s</i>" % ( folder_label, folder.description )
|
||||
else:
|
||||
folder_label = "%s<i> - click the name to preview the tool and use the pop-up menu to inspect all metadata</i>" % folder_label
|
||||
elif folder.invalid_tools:
|
||||
folder_label = "%s<i> - click the tool config file name to see why the tool is invalid</i>" % folder_label
|
||||
elif folder.tool_dependencies:
|
||||
folder_label = "%s<i> - this repository's tools require handling of these dependencies</i>" % folder_label
|
||||
col_span_str = 'colspan="3"'
|
||||
elif folder.valid_tools:
|
||||
folder_label = "%s<i> - click the name to preview the tool and use the pop-up menu to inspect all metadata</i>" % folder_label
|
||||
col_span_str = 'colspan="3"'
|
||||
elif folder.workflows:
|
||||
col_span_str = 'colspan="4"'
|
||||
%>
|
||||
@@ -302,7 +305,7 @@
|
||||
%endif
|
||||
id="libraryItem-${encoded_id}">
|
||||
<td style="padding-left: ${pad+20}px;">
|
||||
%if invalid_tool.repository_id and invalid_tool.tool_config and invalid_tool.changeset_revision:
|
||||
%if trans.webapp.name == 'community' and invalid_tool.repository_id and invalid_tool.tool_config and invalid_tool.changeset_revision:
|
||||
<a class="view-info" href="${h.url_for( controller='repository', action='load_invalid_tool', repository_id=trans.security.encode_id( invalid_tool.repository_id ), tool_config=invalid_tool.tool_config, changeset_revision=invalid_tool.changeset_revision )}">
|
||||
${invalid_tool.tool_config | h}
|
||||
</a>
|
||||
@@ -376,12 +379,20 @@
|
||||
<th style="padding-left: ${pad+20}px;">${tool.name | h}</th>
|
||||
%else:
|
||||
<td style="padding-left: ${pad+20}px;">
|
||||
<div style="float:left;" class="menubutton split popup" id="tool-${encoded_id}-popup">
|
||||
<a class="view-info" href="${h.url_for( controller='repository', action='display_tool', repository_id=trans.security.encode_id( tool.repository_id ), tool_config=tool.tool_config, changeset_revision=tool.changeset_revision )}">${tool.name | h}</a>
|
||||
</div>
|
||||
<div popupmenu="tool-${encoded_id}-popup">
|
||||
<a class="action-button" href="${h.url_for( controller='repository', action='view_tool_metadata', repository_id=trans.security.encode_id( tool.repository_id ), changeset_revision=tool.changeset_revision, tool_id=tool.tool_id )}">View tool metadata</a>
|
||||
</div>
|
||||
%if tool.repository_id:
|
||||
%if trans.webapp.name == 'community':
|
||||
<div style="float:left;" class="menubutton split popup" id="tool-${encoded_id}-popup">
|
||||
<a class="view-info" href="${h.url_for( controller='repository', action='display_tool', repository_id=trans.security.encode_id( tool.repository_id ), tool_config=tool.tool_config, changeset_revision=tool.changeset_revision )}">${tool.name | h}</a>
|
||||
</div>
|
||||
<div popupmenu="tool-${encoded_id}-popup">
|
||||
<a class="action-button" href="${h.url_for( controller='repository', action='view_tool_metadata', repository_id=trans.security.encode_id( tool.repository_id ), changeset_revision=tool.changeset_revision, tool_id=tool.tool_id )}">View tool metadata</a>
|
||||
</div>
|
||||
%else:
|
||||
<a class="action-button" href="${h.url_for( controller='admin_toolshed', action='view_tool_metadata', repository_id=trans.security.encode_id( tool.repository_id ), changeset_revision=tool.changeset_revision, tool_id=tool.tool_id )}">View tool metadata</a>
|
||||
%endif
|
||||
%else:
|
||||
${tool.name | h}
|
||||
%endif
|
||||
</td>
|
||||
%endif
|
||||
<${cell_type}>${tool.description | h}</${cell_type}>
|
||||
@@ -459,7 +470,7 @@
|
||||
%>
|
||||
</%def>
|
||||
|
||||
<%def name="render_repository_items( repository_metadata_id, changeset_revision, metadata, containers_dict, can_set_metadata=False )">
|
||||
<%def name="render_repository_items( metadata, containers_dict, can_set_metadata=False )">
|
||||
<%
|
||||
from galaxy.tool_shed.encoding_util import tool_shed_encode
|
||||
|
||||
@@ -472,6 +483,7 @@
|
||||
readme_files_root_folder = containers_dict.get( 'readme_files', None )
|
||||
repository_dependencies_root_folder = containers_dict.get( 'repository_dependencies', None )
|
||||
tool_dependencies_root_folder = containers_dict.get( 'tool_dependencies', None )
|
||||
missing_tool_dependencies_root_folder = containers_dict.get( 'missing_tool_dependencies', None )
|
||||
valid_tools_root_folder = containers_dict.get( 'valid_tools', none )
|
||||
workflows_root_folder = containers_dict.get( 'workflows', None )
|
||||
|
||||
@@ -515,6 +527,13 @@
|
||||
${render_folder( tool_dependencies_root_folder, 0, parent=None, row_counter=row_counter, is_root_folder=True )}
|
||||
</table>
|
||||
%endif
|
||||
%if missing_tool_dependencies_root_folder:
|
||||
<p/>
|
||||
<% row_counter = RowCounter() %>
|
||||
<table cellspacing="2" cellpadding="2" border="0" width="100%" class="tables container-table" id="missing_tool_dependencies">
|
||||
${render_folder( missing_tool_dependencies_root_folder, 0, parent=None, row_counter=row_counter, is_root_folder=True )}
|
||||
</table>
|
||||
%endif
|
||||
</div>
|
||||
</div>
|
||||
%endif
|
||||
|
||||
@@ -210,7 +210,7 @@
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
${render_repository_items( repository_metadata_id, changeset_revision, metadata, containers_dict, can_set_metadata=True )}
|
||||
${render_repository_items( metadata, containers_dict, can_set_metadata=True )}
|
||||
<p/>
|
||||
<div class="toolForm">
|
||||
<div class="toolFormTitle">Manage categories</div>
|
||||
|
||||
@@ -81,4 +81,4 @@
|
||||
</div>
|
||||
</div>
|
||||
<p/>
|
||||
${render_repository_items( repository_metadata_id, changeset_revision, metadata, containers_dict, can_set_metadata=False )}
|
||||
${render_repository_items( metadata, containers_dict, can_set_metadata=False )}
|
||||
|
||||
@@ -188,7 +188,7 @@
|
||||
%endif
|
||||
</div>
|
||||
</div>
|
||||
${render_repository_items( repository_metadata_id, changeset_revision, metadata, containers_dict, can_set_metadata=False )}
|
||||
${render_repository_items( metadata, containers_dict, can_set_metadata=False )}
|
||||
%if repository.categories:
|
||||
<p/>
|
||||
<div class="toolForm">
|
||||
|
||||
@@ -67,10 +67,13 @@ class ShedTwillTestCase( TwillTestCase ):
|
||||
for dependency in installed_repository.metadata[ 'tool_dependencies' ]:
|
||||
tool_dependency = installed_repository.metadata[ 'tool_dependencies' ][ dependency ]
|
||||
strings_displayed.extend( [ tool_dependency[ 'name' ], tool_dependency[ 'version' ], tool_dependency[ 'type' ] ] )
|
||||
"""
|
||||
TODO: Uncomment these when Greg enhances the tool dependencies and missing tool dependencies containers to display the status.
|
||||
if dependencies_installed:
|
||||
strings_displayed.append( 'Installed' )
|
||||
else:
|
||||
strings_displayed.append( 'Never installed' )
|
||||
"""
|
||||
url = '/admin_toolshed/manage_repository?id=%s' % self.security.encode_id( installed_repository.id )
|
||||
self.visit_galaxy_url( url )
|
||||
self.check_for_strings( strings_displayed, strings_not_displayed )
|
||||
|
||||
@@ -55,7 +55,7 @@ class BasicToolShedFeatures( ShedTwillTestCase ):
|
||||
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_0000', common.test_user_1_name )
|
||||
self.verify_installed_repository_on_browse_page( installed_repository )
|
||||
self.display_installed_repository_manage_page( installed_repository,
|
||||
strings_displayed=[ 'Installed tool shed repository', 'Tools', 'Filter1' ] )
|
||||
strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'Filter1' ] )
|
||||
self.verify_tool_metadata_for_installed_repository( installed_repository )
|
||||
def test_0030_verify_installed_repository_metadata( self ):
|
||||
'''Verify that resetting the metadata on an installed repository does not change the metadata.'''
|
||||
|
||||
@@ -74,7 +74,7 @@ class ToolWithToolDependencies( ShedTwillTestCase ):
|
||||
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'freebayes_0010', common.test_user_1_name )
|
||||
self.verify_installed_repository_on_browse_page( installed_repository )
|
||||
self.display_installed_repository_manage_page( installed_repository,
|
||||
strings_displayed=[ 'Installed tool shed repository', 'Tools', 'FreeBayes' ] )
|
||||
strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'FreeBayes' ] )
|
||||
self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
|
||||
self.verify_tool_metadata_for_installed_repository( installed_repository )
|
||||
def test_0020_verify_installed_repository_metadata( self ):
|
||||
|
||||
+1
-1
@@ -69,7 +69,7 @@ class ToolWithRepositoryDependencies( ShedTwillTestCase ):
|
||||
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'emboss_0020', common.test_user_1_name )
|
||||
self.verify_installed_repository_on_browse_page( installed_repository )
|
||||
self.display_installed_repository_manage_page( installed_repository,
|
||||
strings_displayed=[ 'Installed tool shed repository', 'Tools', 'antigenic' ] )
|
||||
strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'antigenic' ] )
|
||||
self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
|
||||
self.verify_tool_metadata_for_installed_repository( installed_repository )
|
||||
def test_0020_verify_installed_repository_metadata( self ):
|
||||
|
||||
@@ -111,7 +111,7 @@ class RepositoryWithDependencyRevisions( ShedTwillTestCase ):
|
||||
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'emboss_0030', common.test_user_1_name )
|
||||
self.verify_installed_repository_on_browse_page( installed_repository )
|
||||
self.display_installed_repository_manage_page( installed_repository,
|
||||
strings_displayed=[ 'Installed tool shed repository', 'Tools', 'antigenic' ] )
|
||||
strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'antigenic' ] )
|
||||
self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
|
||||
self.verify_tool_metadata_for_installed_repository( installed_repository )
|
||||
self.update_installed_repository( installed_repository, strings_displayed=[ "there are no updates available" ] )
|
||||
|
||||
Reference in New Issue
Block a user