galaxy-commits
Threads by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
commit/galaxy-central: dan: Handle uninstalling Data Manager from Tool Shed corner case, where two different instantiations of a Data Manager have been installed, e.g. due to a new installable changeset revision.
by commits-noreply@bitbucket.org 13 Mar '13
by commits-noreply@bitbucket.org 13 Mar '13
13 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/8a3d271d79bb/
changeset: 8a3d271d79bb
user: dan
date: 2013-03-13 18:26:31
summary: Handle uninstalling Data Manager from Tool Shed corner case, where two different instantiations of a Data Manager have been installed, e.g. due to a new installable changeset revision.
affected #: 1 file
diff -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 -r 8a3d271d79bb6736b88b76918e4820d771c12250 lib/tool_shed/util/shed_util.py
--- a/lib/tool_shed/util/shed_util.py
+++ b/lib/tool_shed/util/shed_util.py
@@ -1574,15 +1574,33 @@
root = tree.getroot()
assert root.tag == 'data_managers', 'The file provided (%s) for removing data managers from is not a valid data manager xml file.' % ( shed_data_manager_conf_filename )
guids = [ data_manager_dict.get( 'guid' ) for data_manager_dict in metadata_dict.get( 'data_manager', {} ).get( 'data_managers', {} ).itervalues() if 'guid' in data_manager_dict ]
+ load_old_data_managers_by_guid = {}
data_manager_config_has_changes = False
config_elems = []
for elem in root:
- if elem.tag != 'data_manager' or elem.get( 'guid', None ) not in guids:
+ # Match Data Manager elements by guid and installed_changeset_revision
+ elem_matches_removed_data_manager = False
+ if elem.tag == 'data_manager':
+ guid = elem.get( 'guid', None )
+ if guid in guids:
+ tool_elem = elem.find( 'tool' )
+ if tool_elem is not None:
+ installed_changeset_revision_elem = tool_elem.find( 'installed_changeset_revision' )
+ if installed_changeset_revision_elem is not None:
+ if installed_changeset_revision_elem.text == repository.installed_changeset_revision:
+ elem_matches_removed_data_manager = True
+ else:
+ # This is a different version, which had been previously overridden
+ load_old_data_managers_by_guid[ guid ] = elem
+ if elem_matches_removed_data_manager:
+ data_manager_config_has_changes = True
+ else:
config_elems.append( elem )
- else:
- data_manager_config_has_changes = True
- #remove data managers from in memory
+ # Remove data managers from in memory
app.data_managers.remove_manager( guids )
+ # Load other versions of any now uninstalled data managers, if any
+ for elem in load_old_data_managers_by_guid.itervalues():
+ app.data_managers.load_manager_from_elem( elem )
# Persist the altered shed_data_manager_config file.
if data_manager_config_has_changes:
suc.data_manager_config_elems_to_xml_file( app, config_elems, shed_data_manager_conf_filename )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/34dfad3b8811/
changeset: 34dfad3b8811
user: inithello
date: 2013-03-13 17:45:47
summary: Shut down the update manager when the galaxy UniverseApplication's shutdown method is called.
affected #: 1 file
diff -r 1a68cc9626220afa542f0ac00951511e7eae56bf -r 34dfad3b8811968a7988de90817f499dc7ee860c lib/galaxy/app.py
--- a/lib/galaxy/app.py
+++ b/lib/galaxy/app.py
@@ -106,6 +106,8 @@
if self.config.get_bool( 'enable_tool_shed_check', False ):
from tool_shed.galaxy_install import update_manager
self.update_manager = update_manager.UpdateManager( self )
+ else:
+ self.update_manager = None
# Load proprietary datatype converters and display applications.
self.installed_repository_manager.load_proprietary_converters_and_display_applications()
# Load datatype display applications defined in local datatypes_conf.xml
@@ -166,6 +168,8 @@
self.object_store.shutdown()
if self.heartbeat:
self.heartbeat.shutdown()
+ if self.update_manager:
+ self.update_manager.shutdown()
try:
# If the datatypes registry was persisted, attempt to
# remove the temporary file in which it was written.
https://bitbucket.org/galaxy/galaxy-central/commits/9159442d180f/
changeset: 9159442d180f
user: inithello
date: 2013-03-13 17:48:55
summary: Add repository counts to install and test repository summary output. Add functional tests for repositories with datatype converters. Add functional tests for browsing Galaxy utilities. Add functional tests for the Galaxy update manager. Enhance functional tests to verify behavior when a repository is deleted. Change code style to be compliant with Galaxy team standards.
affected #: 13 files
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/install_and_test_tool_shed_repositories/functional_tests.py
--- a/test/install_and_test_tool_shed_repositories/functional_tests.py
+++ b/test/install_and_test_tool_shed_repositories/functional_tests.py
@@ -754,15 +754,15 @@
if repositories_tested > 0:
if repositories_passed:
print '# ----------------------------------------------------------------------------------'
- print "# Repositories passed:"
+ print "# %d repositories passed:" % len( repositories_passed )
show_summary_output( repositories_passed )
if repositories_failed:
print '# ----------------------------------------------------------------------------------'
- print "# Repositories failed:"
+ print "# %d repositories failed:" % len( repositories_failed )
show_summary_output( repositories_failed )
if repositories_failed_install:
print '# ----------------------------------------------------------------------------------'
- print "# Repositories not installed correctly:"
+ print "# %d repositories not installed correctly:" % len( repositories_failed_install )
show_summary_output( repositories_failed_install )
print "####################################################################################"
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/base/test_db_util.py
--- a/test/tool_shed/base/test_db_util.py
+++ b/test/tool_shed/base/test_db_util.py
@@ -9,15 +9,19 @@
def delete_obj( obj ):
sa_session.delete( obj )
sa_session.flush()
+
def delete_user_roles( user ):
for ura in user.roles:
sa_session.delete( ura )
sa_session.flush()
+
def flush( obj ):
sa_session.add( obj )
sa_session.flush()
+
def get_all_repositories():
return sa_session.query( model.Repository ).all()
+
def get_all_installed_repositories( actually_installed=False ):
if actually_installed:
return ga_session.query( galaxy.model.ToolShedRepository ) \
@@ -27,38 +31,46 @@
.all()
else:
return ga_session.query( galaxy.model.ToolShedRepository ).all()
+
def get_category_by_name( name ):
return sa_session.query( model.Category ) \
.filter( model.Category.table.c.name == name ) \
.first()
+
def get_default_user_permissions_by_role( role ):
return sa_session.query( model.DefaultUserPermissions ) \
.filter( model.DefaultUserPermissions.table.c.role_id == role.id ) \
.all()
+
def get_default_user_permissions_by_user( user ):
return sa_session.query( model.DefaultUserPermissions ) \
.filter( model.DefaultUserPermissions.table.c.user_id==user.id ) \
.all()
+
def get_galaxy_repository_by_name_owner_changeset_revision( repository_name, owner, changeset_revision ):
return ga_session.query( galaxy.model.ToolShedRepository ) \
.filter( and_( galaxy.model.ToolShedRepository.table.c.name == repository_name,
galaxy.model.ToolShedRepository.table.c.owner == owner,
galaxy.model.ToolShedRepository.table.c.changeset_revision == changeset_revision ) ) \
.first()
+
def get_installed_repository_by_id( repository_id ):
return ga_session.query( galaxy.model.ToolShedRepository ) \
.filter( galaxy.model.ToolShedRepository.table.c.id == repository_id ) \
.first()
+
def get_installed_repository_by_name_owner( repository_name, owner ):
return ga_session.query( galaxy.model.ToolShedRepository ) \
.filter( and_( galaxy.model.ToolShedRepository.table.c.name == repository_name,
galaxy.model.ToolShedRepository.table.c.owner == owner ) ) \
.first()
+
def get_private_role( user ):
for role in user.all_roles():
if role.name == user.email and role.description == 'Private Role for %s' % user.email:
return role
raise AssertionError( "Private role not found for user '%s'" % user.email )
+
def get_repository_reviews( repository_id, reviewer_user_id=None, changeset_revision=None ):
if reviewer_user_id and changeset_revision:
reviews = sa_session.query( model.RepositoryReview ) \
@@ -79,6 +91,7 @@
model.RepositoryReview.table.c.deleted == False ) ) \
.all()
return reviews
+
def get_reviews_ordered_by_changeset_revision( repository_id, changelog_tuples, reviewer_user_id=None ):
reviews = get_repository_reviews( repository_id, reviewer_user_id=reviewer_user_id )
ordered_reviews = []
@@ -87,16 +100,25 @@
if str( review.changeset_revision ) == str( changeset_hash ):
ordered_reviews.append( review )
return ordered_reviews
+
def get_repository_by_id( repository_id ):
return sa_session.query( model.Repository ) \
.filter( model.Repository.table.c.id == repository_id ) \
.first()
+
def get_repository_downloadable_revisions( repository_id ):
revisions = sa_session.query( model.RepositoryMetadata ) \
.filter( and_( model.RepositoryMetadata.table.c.repository_id == repository_id,
model.RepositoryMetadata.table.c.downloadable == True ) ) \
.all()
return revisions
+def get_repository_metadata_for_changeset_revision( repository_id, changeset_revision ):
+ repository_metadata = sa_session.query( model.RepositoryMetadata ) \
+ .filter( and_( model.RepositoryMetadata.table.c.repository_id == repository_id,
+ model.RepositoryMetadata.table.c.changeset_revision == changeset_revision ) ) \
+ .first()
+ return repository_metadata
+
def get_repository_review_by_user_id_changeset_revision( user_id, repository_id, changeset_revision ):
review = sa_session.query( model.RepositoryReview ) \
.filter( and_( model.RepositoryReview.table.c.user_id == user_id,
@@ -104,35 +126,44 @@
model.RepositoryReview.table.c.changeset_revision == changeset_revision ) ) \
.first()
return review
+
def get_role_by_name( role_name ):
return sa_session.query( model.Role ) \
.filter( model.Role.table.c.name == role_name ) \
.first()
+
def get_user( email ):
return sa_session.query( model.User ) \
.filter( model.User.table.c.email==email ) \
.first()
+
def get_user_by_name( username ):
return sa_session.query( model.User ) \
.filter( model.User.table.c.username==username ) \
.first()
+
def mark_obj_deleted( obj ):
obj.deleted = True
sa_session.add( obj )
sa_session.flush()
+
def refresh( obj ):
sa_session.refresh( obj )
+
def ga_refresh( obj ):
ga_session.refresh( obj )
+
def get_galaxy_private_role( user ):
for role in user.all_roles():
if role.name == user.email and role.description == 'Private Role for %s' % user.email:
return role
raise AssertionError( "Private role not found for user '%s'" % user.email )
+
def get_galaxy_user( email ):
return ga_session.query( galaxy.model.User ) \
.filter( galaxy.model.User.table.c.email==email ) \
.first()
+
def get_repository_by_name_and_owner( name, owner_username ):
owner = get_user_by_name( owner_username )
repository = sa_session.query( model.Repository ) \
@@ -140,6 +171,7 @@
model.Repository.table.c.user_id == owner.id ) ) \
.first()
return repository
+
def get_repository_metadata_by_repository_id_changeset_revision( repository_id, changeset_revision ):
repository_metadata = sa_session.query( model.RepositoryMetadata ) \
.filter( and_( model.RepositoryMetadata.table.c.repository_id == repository_id,
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -11,7 +11,9 @@
log = logging.getLogger( __name__ )
+
class ShedTwillTestCase( TwillTestCase ):
+
def setUp( self ):
# Security helper
self.security = security.SecurityHelper( id_secret='changethisinproductiontoo' )
@@ -35,36 +37,65 @@
self.galaxy_tool_dependency_dir = os.environ.get( 'GALAXY_TEST_TOOL_DEPENDENCY_DIR' )
self.shed_tools_dict = {}
self.home()
+
def add_repository_review_component( self, **kwd ):
url = '/repository_review/create_component?operation=create'
self.visit_url( url )
self.submit_form( 1, 'create_component_button', **kwd )
+
def browse_category( self, category, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository/browse_valid_categories?sort=name&operation=valid_repositories_by_category&id=%s' % \
self.security.encode_id( category.id )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def browse_component_review( self, review, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository_review/browse_review?id=%s' % self.security.encode_id( review.id )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
+ def browse_custom_datatypes( self, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/repository/browse_datatypes'
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+
def browse_repository( self, repository, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository/browse_repository?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
+ def browse_repository_dependencies( self, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/repository/browse_repository_dependencies'
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+
def browse_tool_shed( self, url, strings_displayed=[], strings_not_displayed=[] ):
self.visit_galaxy_url( '/admin_toolshed/browse_tool_shed?tool_shed_url=%s' % url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
+ def browse_tool_dependencies( self, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/repository/browse_tool_dependencies'
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+
+ def browse_tools( self, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/repository/browse_tools'
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+
def check_count_of_metadata_revisions_associated_with_repository( self, repository, metadata_count ):
self.check_repository_changelog( repository )
self.check_string_count_in_page( 'Repository metadata is associated with this change set.', metadata_count )
+
def check_for_valid_tools( self, repository, strings_displayed=[], strings_not_displayed=[] ):
strings_displayed.append( 'Valid tools' )
self.display_manage_repository_page( repository, strings_displayed, strings_not_displayed )
+
def check_galaxy_repository_db_status( self, repository_name, owner, expected_status ):
installed_repository = test_db_util.get_installed_repository_by_name_owner( repository_name, owner )
assert installed_repository.status == expected_status, 'Status in database is %s, expected %s' % \
( installed_repository.status, expected_status )
+
def check_galaxy_repository_tool_panel_section( self, repository, expected_tool_panel_section ):
metadata = repository.metadata
assert 'tools' in metadata, 'Tools not found in metadata: %s' % metadata
@@ -83,6 +114,7 @@
tool_panel_section = tool_panel_section_metadata[ tool_guid ][ 0 ][ 'name' ]
assert tool_panel_section == expected_tool_panel_section, 'Expected tool panel section %s, found %s\nMetadata: %s\n' % \
( expected_tool_panel_section, tool_panel_section, metadata )
+
def check_installed_repository_tool_dependencies( self,
installed_repository,
strings_displayed=[],
@@ -100,15 +132,18 @@
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 )
+
def check_repository_changelog( self, repository, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository/view_changelog?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def check_repository_dependency( self, repository, depends_on_repository, depends_on_changeset_revision=None, changeset_revision=None ):
strings_displayed = [ depends_on_repository.name, depends_on_repository.user.username ]
if depends_on_changeset_revision:
strings_displayed.append( depends_on_changeset_revision )
self.display_manage_repository_page( repository, changeset_revision=changeset_revision, strings_displayed=strings_displayed )
+
def check_repository_metadata( self, repository, tip_only=True ):
if tip_only:
assert self.tip_has_metadata( repository ) and len( self.get_repository_metadata_revisions( repository ) ) == 1, \
@@ -117,7 +152,8 @@
assert len( self.get_repository_metadata_revisions( repository ) ) > 0, \
'Repository tip is not a metadata revision: Repository tip - %s, metadata revisions - %s.' % \
( self.get_repository_tip( repository ), ', '.join( self.get_repository_metadata_revisions( repository ) ) )
- def check_repository_tools_for_changeset_revision( self, repository, changeset_revision ):
+
+ def check_repository_tools_for_changeset_revision( self, repository, changeset_revision, tool_metadata_strings_displayed=[], tool_page_strings_displayed=[] ):
'''
Loop through each tool dictionary in the repository metadata associated with the received changeset_revision.
For each of these, check for a tools attribute, and load the tool metadata page if it exists, then display that tool's page.
@@ -128,20 +164,17 @@
if 'tools' not in metadata:
raise AssertionError( 'No tools in %s revision %s.' % ( repository.name, changeset_revision ) )
for tool_dict in metadata[ 'tools' ]:
- metadata_strings_displayed = [ tool_dict[ 'guid' ],
- tool_dict[ 'version' ],
- tool_dict[ 'id' ],
- tool_dict[ 'name' ],
- tool_dict[ 'description' ],
- changeset_revision ]
+ tool_id = tool_dict[ 'id' ]
+ tool_xml = tool_dict[ 'tool_config' ]
url = '/repository/view_tool_metadata?repository_id=%s&changeset_revision=%s&tool_id=%s' % \
- ( self.security.encode_id( repository.id ), changeset_revision, tool_dict[ 'id' ] )
+ ( self.security.encode_id( repository.id ), changeset_revision, tool_id )
self.visit_url( url )
- self.check_for_strings( metadata_strings_displayed )
- self.load_display_tool_page( repository, tool_xml_path=tool_dict[ 'tool_config' ],
+ self.check_for_strings( tool_metadata_strings_displayed )
+ self.load_display_tool_page( repository, tool_xml_path=tool_xml,
changeset_revision=changeset_revision,
- strings_displayed=[ '%s (version %s)' % ( tool_dict[ 'name' ], tool_dict[ 'version' ] ) ],
+ strings_displayed=tool_page_strings_displayed,
strings_not_displayed=[] )
+
def check_repository_invalid_tools_for_changeset_revision( self, repository, changeset_revision, strings_displayed=[], strings_not_displayed=[] ):
'''Load the invalid tool page for each invalid tool associated with this changeset revision and verify the received error messages.'''
repository_metadata = self.get_repository_metadata_by_changeset_revision( repository, changeset_revision )
@@ -153,6 +186,7 @@
changeset_revision=changeset_revision,
strings_displayed=strings_displayed,
strings_not_displayed=strings_not_displayed )
+
def check_string_count_in_page( self, pattern, min_count, max_count=None ):
"""Checks the number of 'pattern' occurrences in the current browser page"""
page = self.last_page()
@@ -167,6 +201,7 @@
errmsg = "%i occurrences of '%s' found (min. %i, max. %i).\npage content written to '%s' " % \
( pattern_count, pattern, min_count, max_count, fname )
raise AssertionError( errmsg )
+
def create_category( self, **kwd ):
category = test_db_util.get_category_by_name( kwd[ 'name' ] )
if category is None:
@@ -174,6 +209,7 @@
self.submit_form( form_no=1, button="create_category_button", **kwd )
category = test_db_util.get_category_by_name( kwd[ 'name' ] )
return category
+
def create_checkbox_query_string( self, field_name, value ):
'''
From galaxy.web.form_builder.CheckboxField:
@@ -197,6 +233,7 @@
return '%s=%s&%s=%s' % ( field_name, field_value, field_name, field_value )
else:
return '%s=%s' % ( field_name, field_value )
+
def create_repository_complex_dependency( self, repository, xml_filename, depends_on={} ):
self.generate_repository_dependency_xml( depends_on[ 'repositories' ],
xml_filename,
@@ -207,6 +244,7 @@
'tool_dependencies.xml',
filepath=os.path.split( xml_filename )[0],
commit_message='Uploaded dependency on %s.' % ', '.join( repo.name for repo in depends_on[ 'repositories' ] ) )
+
def create_repository_dependency( self, repository=None, depends_on=[], filepath=None ):
dependency_description = '%s depends on %s.' % ( repository.name, ', '.join( repo.name for repo in depends_on ) )
self.generate_repository_dependency_xml( depends_on,
@@ -221,6 +259,7 @@
commit_message='Uploaded dependency on %s.' % ', '.join( repo.name for repo in depends_on ),
strings_displayed=[],
strings_not_displayed=[] )
+
def create_repository_review( self, repository, review_contents_dict, changeset_revision=None, copy_from=None):
strings_displayed = []
if not copy_from:
@@ -242,6 +281,7 @@
( self.get_repository_tip( repository ), self.security.encode_id( repository.id ), self.security.encode_id( review_id ) )
self.visit_url( url )
self.fill_review_form( review_contents_dict, strings_displayed, strings_not_displayed )
+
def create_user_in_galaxy( self, cntrller='user', email='test(a)bx.psu.edu', password='testuser', username='admin-user', redirect='' ):
self.visit_galaxy_url( "/user/create?cntrller=%s&use_panels=False" % cntrller )
tc.fv( '1', 'email', email )
@@ -272,6 +312,7 @@
except:
pass
return previously_created, username_taken, invalid_username
+
def delete_files_from_repository( self, repository, filenames=[], strings_displayed=[ 'were deleted from the repository' ], strings_not_displayed=[] ):
files_to_delete = []
basepath = self.get_repo_path( repository )
@@ -287,24 +328,38 @@
tc.fv( "1", "selected_files_to_delete", ','.join( files_to_delete ) )
tc.submit( 'select_files_to_delete_button' )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
+ def delete_repository( self, repository ):
+ repository_id = self.security.encode_id( repository.id )
+ self.visit_url( '/admin/browse_repositories' )
+ url = '/admin/browse_repositories?operation=Delete&id=%s' % repository_id
+ strings_displayed = [ 'Deleted 1 repository', repository.name ]
+ strings_not_displayed = []
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+
def display_all_workflows( self, strings_displayed=[], strings_not_displayed=[] ):
url = '/workflow'
self.visit_galaxy_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def display_galaxy_browse_repositories_page( self, strings_displayed=[], strings_not_displayed=[] ):
url = '/admin_toolshed/browse_repositories'
self.visit_galaxy_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def display_installed_repository_manage_page( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
url = '/admin_toolshed/manage_repository?id=%s' % self.security.encode_id( installed_repository.id )
self.visit_galaxy_url( url )
strings_displayed.append( installed_repository.installed_changeset_revision )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def display_installed_workflow_image( self, repository, workflow_name, strings_displayed=[], strings_not_displayed=[] ):
url = '/admin_toolshed/generate_workflow_image?repository_id=%s&workflow_name=%s' % \
( self.security.encode_id( repository.id ), tool_shed_encode( workflow_name ) )
self.visit_galaxy_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def display_manage_repository_page( self, repository, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
base_url = '/repository/manage_repository?id=%s' % self.security.encode_id( repository.id )
if changeset_revision:
@@ -314,10 +369,12 @@
url = base_url
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def display_repository_clone_page( self, owner_name, repository_name, strings_displayed=[], strings_not_displayed=[] ):
url = '/repos/%s/%s' % ( owner_name, repository_name )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def display_repository_file_contents( self, repository, filename, filepath=None, strings_displayed=[], strings_not_displayed=[] ):
'''Find a file in the repository and display the contents.'''
basepath = self.get_repo_path( repository )
@@ -331,10 +388,12 @@
url = '/repository/get_file_contents?file_path=%s' % os.path.join( relative_path, filename )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def display_reviewed_repositories_owned_by_user( self, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository_review/reviewed_repositories_i_own'
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def edit_repository_categories( self, repository, categories_to_add=[], categories_to_remove=[], restore_original=True ):
url = '/repository/manage_repository?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
@@ -359,10 +418,12 @@
strings_not_displayed.append( "selected>%s" % category )
tc.submit( "manage_categories_button" )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def display_repository_reviews_by_user( self, user, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository_review/repository_reviews_by_user?id=%s' % self.security.encode_id( user.id )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def edit_repository_information( self, repository, **kwd ):
url = '/repository/manage_repository?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
@@ -381,6 +442,7 @@
strings_displayed.append( self.escape_html( original_information[ input_elem_name ] ) )
tc.submit( "edit_repository_button" )
self.check_for_strings( strings_displayed )
+
def escape_html( self, string, unescape=False ):
html_entities = [ ('&', 'X' ), ( "'", ''' ), ( '"', '"' ) ]
for character, replacement in html_entities:
@@ -389,6 +451,7 @@
else:
string = string.replace( character, replacement )
return string
+
def fill_review_form( self, review_contents_dict, strings_displayed=[], strings_not_displayed=[] ):
kwd = dict()
for label, contents in review_contents_dict.items():
@@ -404,6 +467,7 @@
self.submit_form( 1, 'Workflows__ESEP__review_button', **kwd )
strings_displayed.append( 'Reviews were saved' )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def galaxy_login( self, email='test(a)bx.psu.edu', password='testuser', username='admin-user', redirect='' ):
previously_created, username_taken, invalid_username = \
self.create_user_in_galaxy( email=email, password=password, username=username, redirect=redirect )
@@ -413,11 +477,13 @@
tc.fv( '1', 'redirect', redirect )
tc.fv( '1', 'password', password )
tc.submit( 'login_button' )
+
def galaxy_logout( self ):
self.home()
self.visit_galaxy_url( "/user/logout" )
self.check_page_for_string( "You have been logged out" )
self.home()
+
def generate_invalid_dependency_xml( self, xml_filename, url, name, owner, changeset_revision, complex=True, package=None, version=None, description=None ):
file_path = os.path.split( xml_filename )[0]
dependency_entries = []
@@ -440,6 +506,7 @@
repository_dependency_xml = template_parser.safe_substitute( description=description, dependency_lines='\n'.join( dependency_entries ) )
# Save the generated xml to the specified location.
file( xml_filename, 'w' ).write( repository_dependency_xml )
+
def generate_repository_dependency_xml( self, repositories, xml_filename, dependency_description='', complex=False, package=None, version=None ):
file_path = os.path.split( xml_filename )[0]
if not os.path.exists( file_path ):
@@ -464,11 +531,13 @@
repository_dependency_xml = template_parser.safe_substitute( description=description, dependency_lines='\n'.join( dependency_entries ) )
# Save the generated xml to the specified location.
file( xml_filename, 'w' ).write( repository_dependency_xml )
+
def generate_temp_path( self, test_script_path, additional_paths=[] ):
temp_path = os.path.join( self.tool_shed_test_tmp_dir, test_script_path, os.sep.join( additional_paths ) )
if not os.path.exists( temp_path ):
os.makedirs( temp_path )
return temp_path
+
def get_datatypes_count( self ):
url = '/admin/view_datatypes_registry'
self.visit_galaxy_url( url )
@@ -477,11 +546,13 @@
if datatypes_count:
return datatypes_count.group( 1 )
return None
+
def get_filename( self, filename, filepath=None ):
if filepath is not None:
return os.path.abspath( os.path.join( filepath, filename ) )
else:
return os.path.abspath( os.path.join( self.file_dir, filename ) )
+
def get_last_reviewed_revision_by_user( self, user, repository ):
changelog_tuples = self.get_repository_changelog_tuples( repository )
reviews = test_db_util.get_reviews_ordered_by_changeset_revision( repository.id, changelog_tuples, reviewer_user_id = user.id )
@@ -490,6 +561,7 @@
else:
last_review = None
return last_review
+
def get_or_create_repository( self, owner=None, strings_displayed=[], strings_not_displayed=[], **kwd ):
repository = test_db_util.get_repository_by_name_and_owner( kwd[ 'name' ], owner )
if repository is None:
@@ -498,6 +570,7 @@
self.check_for_strings( strings_displayed, strings_not_displayed )
repository = test_db_util.get_repository_by_name_and_owner( kwd[ 'name' ], owner )
return repository
+
def get_repo_path( self, repository ):
# An entry in the hgweb.config file looks something like: repos/test/mira_assembler = database/community_files/000/repo_123
lhs = "repos/%s/%s" % ( repository.user.username, repository.name )
@@ -505,6 +578,7 @@
return self.hgweb_config_manager.get_entry( lhs )
except:
raise Exception( "Entry for repository %s missing in hgweb config file %s." % ( lhs, self.hgweb_config_manager.hgweb_config ) )
+
def get_repository_changelog_tuples( self, repository ):
repo = hg.repository( ui.ui(), self.get_repo_path( repository ) )
changelog_tuples = []
@@ -512,12 +586,14 @@
ctx = repo.changectx( changeset )
changelog_tuples.append( ( ctx.rev(), repo.changectx( changeset ) ) )
return changelog_tuples
+
def get_repository_datatypes_count( self, repository ):
metadata = self.get_repository_metadata( repository )[0].metadata
if 'datatypes' not in metadata:
return 0
else:
return len( metadata[ 'datatypes' ] )
+
def get_repository_file_list( self, base_path, current_path=None ):
'''Recursively load repository folder contents and append them to a list. Similar to os.walk but via /repository/open_folder.'''
if current_path is None:
@@ -548,19 +624,20 @@
else:
returned_file_list.append( file_dict[ 'title' ] )
return returned_file_list
+
def get_repository_metadata( self, repository ):
return [ metadata_revision for metadata_revision in repository.metadata_revisions ]
+
def get_repository_metadata_by_changeset_revision( self, repository, changeset_revision ):
- found = None
- for metadata_revision in repository.metadata_revisions:
- if metadata_revision.changeset_revision == changeset_revision:
- found = metadata_revision
- return found
+ return test_db_util.get_repository_metadata_for_changeset_revision( repository.id, changeset_revision )
+
def get_repository_metadata_revisions( self, repository ):
return [ str( repository_metadata.changeset_revision ) for repository_metadata in repository.metadata_revisions ]
+
def get_repository_tip( self, repository ):
repo = hg.repository( ui.ui(), self.get_repo_path( repository ) )
return str( repo.changectx( repo.changelog.tip() ) )
+
def get_tools_from_repository_metadata( self, repository, include_invalid=False ):
'''Get a list of valid and (optionally) invalid tool dicts from the repository metadata.'''
valid_tools = []
@@ -571,6 +648,7 @@
if include_invalid and 'invalid_tools' in repository_metadata.metadata:
invalid_tools.append( dict( tools=repository_metadata.metadata[ 'invalid_tools' ], changeset_revision=repository_metadata.changeset_revision ) )
return valid_tools, invalid_tools
+
def grant_role_to_user( self, user, role ):
strings_displayed = [ self.security.encode_id( role.id ), role.name ]
strings_not_displayed = []
@@ -587,6 +665,7 @@
self.visit_url( url )
strings_displayed = [ "Role '%s' has been updated" % role.name ]
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def grant_write_access( self,
repository,
usernames=[],
@@ -601,6 +680,7 @@
tc.fv( "user_access", "allow_push", '+%s' % username )
tc.submit( 'user_access_button' )
self.check_for_strings( post_submit_strings_displayed, post_submit_strings_not_displayed )
+
def import_workflow( self, repository, workflow_name, strings_displayed=[], strings_not_displayed=[] ):
url = '/admin_toolshed/import_workflow?repository_id=%s&workflow_name=%s' % \
( self.security.encode_id( repository.id ), tool_shed_encode( workflow_name ) )
@@ -608,6 +688,7 @@
if workflow_name not in strings_displayed:
strings_displayed.append( workflow_name )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def initiate_installation_process( self,
install_tool_dependencies=False,
install_repository_dependencies=True,
@@ -633,6 +714,7 @@
( ','.join( util.listify( repository_ids ) ), encoded_kwd, reinstalling )
self.visit_galaxy_url( url )
return util.listify( repository_ids )
+
def install_repositories_from_search_results( self, repositories, install_tool_dependencies=False,
strings_displayed=[], strings_not_displayed=[], **kwd ):
'''
@@ -658,6 +740,7 @@
self.submit_form( 1, 'select_tool_panel_section_button', **kwd )
repository_ids = self.initiate_installation_process()
self.wait_for_repository_installation( repository_ids )
+
def install_repository( self, name, owner, category_name, install_tool_dependencies=False,
install_repository_dependencies=True, changeset_revision=None,
strings_displayed=[], strings_not_displayed=[], preview_strings_displayed=[],
@@ -702,6 +785,7 @@
self.check_for_strings( post_submit_strings_displayed, strings_not_displayed )
repository_ids = self.initiate_installation_process( new_tool_panel_section=new_tool_panel_section )
self.wait_for_repository_installation( repository_ids )
+
def load_citable_url( self,
username,
repository_name,
@@ -733,20 +817,24 @@
url = '/repository/browse_repositories?user_id=%s&operation=repositories_by_user' % encoded_user_id
self.visit_url( url )
self.check_for_strings( strings_displayed_in_iframe, strings_not_displayed_in_iframe )
+
def load_display_tool_page( self, repository, tool_xml_path, changeset_revision, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository/display_tool?repository_id=%s&tool_config=%s&changeset_revision=%s' % \
( self.security.encode_id( repository.id ), tool_xml_path, changeset_revision )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def load_galaxy_tool_migrations_page( self, strings_displayed=[], strings_not_displayed=[] ):
url = '/admin/review_tool_migration_stages'
self.visit_galaxy_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def load_invalid_tool_page( self, repository, tool_xml, changeset_revision, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository/load_invalid_tool?repository_id=%s&tool_config=%s&changeset_revision=%s' % \
( self.security.encode_id( repository.id ), tool_xml, changeset_revision )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def load_workflow_image_in_tool_shed( self, repository, workflow_name, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
if not changeset_revision:
changeset_revision = self.get_repository_tip( repository )
@@ -757,10 +845,12 @@
( self.security.encode_id( metadata.id ), tool_shed_encode( workflow_name ) )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def manage_review_components( self, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository_review/manage_components'
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def preview_repository_in_tool_shed( self, name, owner, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
repository = test_db_util.get_repository_by_name_and_owner( name, owner )
if not changeset_revision:
@@ -768,6 +858,7 @@
self.visit_url( '/repository/preview_tools_in_changeset?repository_id=%s&changeset_revision=%s' % \
( self.security.encode_id( repository.id ), changeset_revision ) )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def preview_workflow_in_tool_shed( self, repository_name, owner, workflow_name, strings_displayed=[], strings_not_displayed=[] ):
repository = test_db_util.get_repository_by_name_and_owner( repository_name, owner )
metadata = self.get_repository_metadata( repository )
@@ -775,11 +866,13 @@
( tool_shed_encode( workflow_name ), self.security.encode_id( metadata[0].id ) )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def reactivate_repository( self, installed_repository ):
url = '/admin_toolshed/browse_repositories?operation=activate+or+reinstall&id=%s' % self.security.encode_id( installed_repository.id )
self.visit_galaxy_url( url )
strings_displayed = [ installed_repository.name, 'repository has been activated' ]
self.check_for_strings( strings_displayed, [] )
+
def reinstall_repository( self,
installed_repository,
install_repository_dependencies=True,
@@ -807,26 +900,32 @@
new_tool_panel_section )
# Finally, wait until all repositories are in a final state (either Error or Installed) before returning.
self.wait_for_repository_installation( repository_ids )
+
def repository_is_new( self, repository ):
repo = hg.repository( ui.ui(), self.get_repo_path( repository ) )
tip_ctx = repo.changectx( repo.changelog.tip() )
return tip_ctx.rev() < 0
+
def reset_installed_repository_metadata( self, repository ):
url = '/admin_toolshed/reset_repository_metadata?id=%s' % self.security.encode_id( repository.id )
self.visit_galaxy_url( url )
self.check_for_strings( [ 'Metadata has been reset' ] )
+
def reset_metadata_on_selected_repositories( self, repository_ids ):
self.visit_url( '/admin/reset_metadata_on_selected_repositories_in_tool_shed' )
kwd = dict( repository_ids=repository_ids )
self.submit_form( form_no=1, button="reset_metadata_on_selected_repositories_button", **kwd )
+
def reset_metadata_on_selected_installed_repositories( self, repository_ids ):
self.visit_galaxy_url( '/admin_toolshed/reset_metadata_on_selected_installed_repositories' )
kwd = dict( repository_ids=repository_ids )
self.submit_form( form_no=1, button="reset_metadata_on_selected_repositories_button", **kwd )
+
def reset_repository_metadata( self, repository ):
url = '/repository/reset_all_metadata?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
self.check_for_strings( [ 'All repository metadata has been reset.' ] )
+
def review_repository( self, repository, review_contents_dict, user=None, changeset_revision=None ):
strings_displayed = []
strings_not_displayed = []
@@ -838,10 +937,12 @@
url = '/repository_review/edit_review?id=%s' % self.security.encode_id( review.id )
self.visit_url( url )
self.fill_review_form( review_contents_dict, strings_displayed, strings_not_displayed )
+
def revoke_write_access( self, repository, username ):
url = '/repository/manage_repository?user_access_button=Remove&id=%s&remove_auth=%s' % \
( self.security.encode_id( repository.id ), username )
self.visit_url( url )
+
def search_for_valid_tools( self, search_fields={}, exact_matches=False, strings_displayed=[], strings_not_displayed=[], from_galaxy=False ):
if from_galaxy:
galaxy_url = '?galaxy_url=%s' % self.galaxy_url
@@ -854,6 +955,7 @@
tc.fv( "1", field_name, search_string )
tc.submit()
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def send_message_to_repository_owner( self,
repository,
message,
@@ -867,18 +969,30 @@
tc.fv( 1, 'message', message )
tc.submit()
self.check_for_strings( post_submit_strings_displayed, post_submit_strings_not_displayed )
+
def set_repository_deprecated( self, repository, set_deprecated=True, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository/deprecate?id=%s&mark_deprecated=%s' % ( self.security.encode_id( repository.id ), set_deprecated )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def set_repository_malicious( self, repository, set_malicious=True, strings_displayed=[], strings_not_displayed=[] ):
self.display_manage_repository_page( repository )
tc.fv( "malicious", "malicious", set_malicious )
tc.submit( "malicious_button" )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def tip_has_metadata( self, repository ):
tip = self.get_repository_tip( repository )
return test_db_util.get_repository_metadata_by_repository_id_changeset_revision( repository.id, tip )
+
+ def undelete_repository( self, repository ):
+ repository_id = self.security.encode_id( repository.id )
+ url = '/admin/browse_repositories?operation=Undelete&id=%s' % repository_id
+ strings_displayed = [ 'Undeleted 1 repository', repository.name ]
+ strings_not_displayed = []
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+
def uninstall_repository( self, installed_repository, remove_from_disk=True ):
url = '/admin_toolshed/deactivate_or_uninstall_repository?id=%s' % self.security.encode_id( installed_repository.id )
self.visit_galaxy_url( url )
@@ -893,10 +1007,12 @@
else:
strings_displayed.append( 'has been deactivated' )
self.check_for_strings( strings_displayed, strings_not_displayed=[] )
+
def update_installed_repository( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
url = '/admin_toolshed/check_for_updates?id=%s' % self.security.encode_id( installed_repository.id )
self.visit_galaxy_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+
def upload_file( self,
repository,
filename,
@@ -942,18 +1058,26 @@
# else:
# time.sleep( 1 )
# continue
+
def verify_installed_repositories( self, installed_repositories=[], uninstalled_repositories=[] ):
for repository_name, repository_owner in installed_repositories:
galaxy_repository = test_db_util.get_installed_repository_by_name_owner( repository_name, repository_owner )
if galaxy_repository:
assert galaxy_repository.status == 'Installed', \
'Repository %s should be installed, but is %s' % ( repository_name, galaxy_repository.status )
+
def verify_installed_repository_metadata_unchanged( self, name, owner ):
installed_repository = test_db_util.get_installed_repository_by_name_owner( name, owner )
metadata = installed_repository.metadata
self.reset_installed_repository_metadata( installed_repository )
new_metadata = installed_repository.metadata
assert metadata == new_metadata, 'Metadata for installed repository %s differs after metadata reset.' % name
+
+ def verify_installed_repository_no_tool_panel_section( self, repository ):
+ '''Verify that there is no 'tool_panel_section' entry in the repository metadata.'''
+ metadata = repository.metadata
+ assert 'tool_panel_section' not in metadata, 'Tool panel section incorrectly found in metadata: %s' % metadata
+
def verify_installed_repository_data_table_entries( self, required_data_table_entries ):
# The value of the received required_data_table_entries will be something like: [ 'sam_fa_indexes' ]
data_tables = util.parse_xml( self.shed_tool_data_table_conf )
@@ -1006,6 +1130,7 @@
# We better have an entry like: <table comment_char="#" name="sam_fa_indexes"> in our parsed data_tables
# or we know that the repository was not correctly installed!
assert found, 'No entry for %s in %s.' % ( required_data_table_entry, self.shed_tool_data_table_conf )
+
def verify_repository_reviews( self, repository, reviewer=None, strings_displayed=[], strings_not_displayed=[] ):
changeset_revision = self.get_repository_tip( repository )
# Verify that the currently logged in user has a repository review for the specified repository, reviewer, and changeset revision.
@@ -1017,6 +1142,7 @@
# Load the review and check for the components passed in strings_displayed.
review = test_db_util.get_repository_review_by_user_id_changeset_revision( reviewer.id, repository.id, changeset_revision )
self.browse_component_review( review, strings_displayed=strings_displayed )
+
def verify_tool_metadata_for_installed_repository( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
repository_id = self.security.encode_id( installed_repository.id )
for tool in installed_repository.metadata[ 'tools' ]:
@@ -1025,6 +1151,7 @@
url = '/admin_toolshed/view_tool_metadata?repository_id=%s&tool_id=%s' % ( repository_id, urllib.quote_plus( tool[ 'id' ] ) )
self.visit_galaxy_url( url )
self.check_for_strings( strings, strings_not_displayed )
+
def verify_unchanged_repository_metadata( self, repository ):
old_metadata = dict()
new_metadata = dict()
@@ -1036,14 +1163,17 @@
# Python's dict comparison recursively compares sorted key => value pairs and returns true if any key or value differs,
# or if the number of keys differs.
assert old_metadata == new_metadata, 'Metadata changed after reset on repository %s.' % repository.name
+
def view_installed_workflow( self, repository, workflow_name, strings_displayed=[], strings_not_displayed=[] ):
url = '/admin_toolshed/view_workflow?repository_id=%s&workflow_name=%s' % \
( self.security.encode_id( repository.id ), tool_shed_encode( workflow_name ) )
self.visit_galaxy_url( url )
self.check_for_strings( strings, strings_not_displayed )
+
def visit_galaxy_url( self, url ):
url = '%s%s' % ( self.galaxy_url, url )
self.visit_url( url )
+
def wait_for_repository_installation( self, repository_ids ):
final_states = [ galaxy_model.ToolShedRepository.installation_status.ERROR,
galaxy_model.ToolShedRepository.installation_status.INSTALLED ]
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/functional/test_0000_basic_repository_features.py
--- a/test/tool_shed/functional/test_0000_basic_repository_features.py
+++ b/test/tool_shed/functional/test_0000_basic_repository_features.py
@@ -5,8 +5,10 @@
repository_description = "Galaxy's filtering tool for test 0000"
repository_long_description = "Long description of Galaxy's filtering tool for test 0000"
+
class TestBasicRepositoryFeatures( ShedTwillTestCase ):
'''Test core repository features.'''
+
def test_0000_initiate_users( self ):
"""Create necessary user accounts and login as an admin user."""
self.logout()
@@ -24,10 +26,12 @@
admin_user = test_db_util.get_user( common.admin_email )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
admin_user_private_role = test_db_util.get_private_role( admin_user )
+
def test_0005_create_categories( self ):
"""Create categories for this test suite"""
self.create_category( name='Test 0000 Basic Repository Features 1', description='Test 0000 Basic Repository Features 1' )
self.create_category( name='Test 0000 Basic Repository Features 2', description='Test 0000 Basic Repository Features 2' )
+
def test_0010_create_repository( self ):
"""Create the filtering repository"""
self.logout()
@@ -41,6 +45,7 @@
owner=common.test_user_1_name,
category_id=self.security.encode_id( category.id ),
strings_displayed=strings_displayed )
+
def test_0015_edit_repository( self ):
"""Edit the repository name, description, and long description"""
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
@@ -48,17 +53,20 @@
new_description = "Edited filtering tool"
new_long_description = "Edited long description"
self.edit_repository_information( repository, repo_name=new_name, description=new_description, long_description=new_long_description )
+
def test_0020_change_repository_category( self ):
"""Change the categories associated with the filtering repository"""
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.edit_repository_categories( repository,
categories_to_add=[ "Test 0000 Basic Repository Features 2" ],
categories_to_remove=[ "Test 0000 Basic Repository Features 1" ] )
+
def test_0025_grant_write_access( self ):
'''Grant write access to another user'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.grant_write_access( repository, usernames=[ common.test_user_2_name ] )
self.revoke_write_access( repository, common.test_user_2_name )
+
def test_0030_upload_filtering_1_1_0( self ):
"""Upload filtering_1.1.0.tar to the repository"""
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
@@ -71,6 +79,7 @@
commit_message="Uploaded filtering 1.1.0",
strings_displayed=[],
strings_not_displayed=[] )
+
def test_0035_verify_repository( self ):
'''Display basic repository pages'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
@@ -78,12 +87,23 @@
self.check_for_valid_tools( repository, strings_displayed=[ 'Filter1' ] )
self.check_count_of_metadata_revisions_associated_with_repository( repository, metadata_count=1 )
tip = self.get_repository_tip( repository )
- self.check_repository_tools_for_changeset_revision( repository, tip )
+ tool_guid = '%s/repos/user1/filtering_0000/Filter1/1.1.0' % self.url.replace( 'http://', '' ).rstrip( '/' )
+ tool_metadata_strings_displayed = [ tool_guid,
+ '1.1.0', # The tool version.
+ 'Filter1', # The tool ID.
+ 'Filter', # The tool name.
+ 'data on any column using simple expressions' ] # The tool description.
+ tool_page_strings_displayed = [ 'Filter (version 1.1.0)' ]
+ self.check_repository_tools_for_changeset_revision( repository,
+ tip,
+ tool_metadata_strings_displayed=tool_metadata_strings_displayed,
+ tool_page_strings_displayed=tool_page_strings_displayed )
self.check_repository_metadata( repository, tip_only=False )
self.browse_repository( repository, strings_displayed=[ 'Browse %s revision' % repository.name, '(repository tip)' ] )
self.display_repository_clone_page( common.test_user_1_name,
repository_name,
strings_displayed=[ 'Uploaded filtering 1.1.0', latest_changeset_revision ] )
+
def test_0040_alter_repository_states( self ):
'''Test toggling the malicious and deprecated repository flags.'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
@@ -106,6 +126,7 @@
self.set_repository_deprecated( repository,
strings_displayed=[ 'has been marked as not deprecated', 'Mark as deprecated' ],
set_deprecated=False )
+
def test_0045_display_repository_tip_file( self ):
'''Display the contents of filtering.xml in the repository tip revision'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
@@ -114,6 +135,7 @@
filepath=None,
strings_displayed=[ '1.1.0' ],
strings_not_displayed=[] )
+
def test_0050_upload_filtering_txt_file( self ):
'''Upload filtering.txt file associated with tool version 1.1.0.'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
@@ -127,6 +149,7 @@
strings_displayed=[],
strings_not_displayed=[] )
self.display_manage_repository_page( repository, strings_displayed=[ 'Readme file for filtering 1.1.0' ] )
+
def test_0055_upload_filtering_test_data( self ):
'''Upload filtering test data.'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
@@ -145,6 +168,7 @@
strings_displayed=[],
strings_not_displayed=[] )
self.check_repository_metadata( repository, tip_only=True )
+
def test_0060_upload_filtering_2_2_0( self ):
'''Upload filtering version 2.2.0'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
@@ -157,6 +181,7 @@
commit_message="Uploaded filtering 2.2.0",
strings_displayed=[],
strings_not_displayed=[] )
+
def test_0065_verify_filtering_repository( self ):
'''Verify the new tool versions and repository metadata.'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
@@ -166,8 +191,19 @@
strings_displayed = [ 'Select a revision' ]
self.display_manage_repository_page( repository, strings_displayed=strings_displayed )
self.check_count_of_metadata_revisions_associated_with_repository( repository, metadata_count=2 )
- self.check_repository_tools_for_changeset_revision( repository, tip )
+ tool_guid = '%s/repos/user1/filtering_0000/Filter1/2.2.0' % self.url.replace( 'http://', '' ).rstrip( '/' )
+ tool_metadata_strings_displayed = [ tool_guid,
+ '2.2.0', # The tool version.
+ 'Filter1', # The tool ID.
+ 'Filter', # The tool name.
+ 'data on any column using simple expressions' ] # The tool description.
+ tool_page_strings_displayed = [ 'Filter (version 2.2.0)' ]
+ self.check_repository_tools_for_changeset_revision( repository,
+ tip,
+ tool_metadata_strings_displayed=tool_metadata_strings_displayed,
+ tool_page_strings_displayed=tool_page_strings_displayed )
self.check_repository_metadata( repository, tip_only=False )
+
def test_0070_upload_readme_txt_file( self ):
'''Upload readme.txt file associated with tool version 2.2.0.'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
@@ -186,22 +222,26 @@
self.display_manage_repository_page( repository,
strings_displayed=[ 'Readme file for filtering 1.1.0',
'This is a readme file.' ] )
+
def test_0075_delete_readme_txt_file( self ):
'''Delete the readme.txt file.'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.delete_files_from_repository( repository, filenames=[ 'readme.txt' ] )
self.check_count_of_metadata_revisions_associated_with_repository( repository, metadata_count=2 )
self.display_manage_repository_page( repository, strings_displayed=[ 'Readme file for filtering 1.1.0' ] )
+
def test_0080_search_for_valid_filter_tool( self ):
'''Search for the filtering tool by tool ID, name, and version.'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
tip_changeset = self.get_repository_tip( repository )
search_fields = dict( tool_id='Filter1', tool_name='filter', tool_version='2.2.0' )
self.search_for_valid_tools( search_fields=search_fields, strings_displayed=[ tip_changeset ], strings_not_displayed=[] )
+
def test_0085_verify_repository_metadata( self ):
'''Verify that resetting the metadata does not change it.'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.verify_unchanged_repository_metadata( repository )
+
def test_0090_verify_reserved_repository_name_handling( self ):
'''Check that reserved repository names are handled correctly.'''
category = test_db_util.get_category_by_name( 'Test 0000 Basic Repository Features 1' )
@@ -212,6 +252,7 @@
owner=common.test_user_1_name,
category_id=self.security.encode_id( category.id ),
strings_displayed=[ error_message ] )
+
def test_0100_verify_reserved_username_handling( self ):
'''Check that reserved usernames are handled correctly.'''
self.logout()
@@ -220,6 +261,7 @@
assert test_user_1 is None, 'Creating user with public name "repos" succeeded.'
error_message = 'The term <b>repos</b> is a reserved word in the tool shed, so it cannot be used as a public user name.'
self.check_for_strings( strings_displayed=[ error_message ] )
+
def test_0105_contact_repository_owner( self ):
'''Fill out and submit the form to contact the owner of a repository.'''
'''
@@ -239,3 +281,28 @@
strings_displayed=strings_displayed,
post_submit_strings_displayed=post_submit_strings_displayed )
+ def test_0110_delete_filtering_repository( self ):
+ '''Delete the filtering_0000 repository and verify that it no longer has any downloadable revisions.'''
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ self.delete_repository( repository )
+ # Explicitly reload all metadata revisions from the database, to ensure that we have the current status of the downloadable flag.
+ for metadata_revision in repository.metadata_revisions:
+ test_db_util.refresh( metadata_revision )
+ # Marking a repository as deleted should result in no metadata revisions being downloadable.
+ assert True not in [ metadata.downloadable for metadata in repository.metadata_revisions ]
+
+ def test_0115_undelete_filtering_repository( self ):
+ '''Undelete the filtering_0000 repository and verify that it now has two downloadable revisions.'''
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ self.undelete_repository( repository )
+ # Explicitly reload all metadata revisions from the database, to ensure that we have the current status of the downloadable flag.
+ for metadata_revision in repository.metadata_revisions:
+ test_db_util.refresh( metadata_revision )
+ # Marking a repository as undeleted should result in all previously downloadable metadata revisions being downloadable again.
+ # In this case, there should be two downloadable revisions, one for filtering 1.1.0 and one for filtering 2.2.0.
+ assert True in [ metadata.downloadable for metadata in repository.metadata_revisions ]
+ assert len( repository.downloadable_revisions ) == 2
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
@@ -5,8 +5,20 @@
repository_description = "Galaxy's freebayes tool"
repository_long_description = "Long description of Galaxy's freebayes tool"
+'''
+1. Create repository freebayes_0020 and upload only the tool XML.
+2. Upload the tool_data_table_conf.xml.sample file.
+3. Upload sam_fa_indices.loc.sample.
+4. Upload a tool_dependencies.xml file that should not parse correctly.
+5. Upload a tool_dependencies.xml file that specifies a version that does not match the tool's requirements.
+6. Upload a valid tool_dependencies.xml file.
+7. Check for the appropriate strings on the manage repository page.
+'''
+
+
class TestFreebayesRepository( ShedTwillTestCase ):
'''Testing freebayes with tool data table entries, .loc files, and tool dependencies.'''
+
def test_0000_create_or_login_admin_user( self ):
"""Create necessary user accounts and login as an admin user."""
self.logout()
@@ -19,11 +31,18 @@
admin_user = test_db_util.get_user( common.admin_email )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
admin_user_private_role = test_db_util.get_private_role( admin_user )
+
def test_0005_create_category( self ):
"""Create a category for this test suite"""
self.create_category( name='Test 0010 Repository With Tool Dependencies', description='Tests for a repository with tool dependencies.' )
+
def test_0010_create_freebayes_repository_and_upload_tool_xml( self ):
- '''Create freebayes repository and upload freebayes.xml without tool_data_table_conf.xml.sample. This should result in an error message and invalid tool.'''
+ '''Create freebayes repository and upload only freebayes.xml.'''
+ '''
+ We are at step 1 - Create repository freebayes_0020 and upload only the tool XML.
+ Uploading only the tool XML file should result in an invalid tool and an error message on
+ upload, as well as on the manage repository page.
+ '''
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
category = test_db_util.get_category_by_name( 'Test 0010 Repository With Tool Dependencies' )
@@ -44,11 +63,15 @@
strings_not_displayed=[] )
self.display_manage_repository_page( repository, strings_displayed=[ 'Invalid tools' ], strings_not_displayed=[ 'Valid tools' ] )
tip = self.get_repository_tip( repository )
- self.check_repository_invalid_tools_for_changeset_revision( repository,
- tip,
- strings_displayed=[ 'requires an entry', 'tool_data_table_conf.xml' ] )
+ strings_displayed = [ 'requires an entry', 'tool_data_table_conf.xml' ]
+ self.check_repository_invalid_tools_for_changeset_revision( repository, tip, strings_displayed=strings_displayed )
+
def test_0015_upload_missing_tool_data_table_conf_file( self ):
'''Upload the missing tool_data_table_conf.xml.sample file to the repository.'''
+ '''
+ We are at step 2 - Upload the tool_data_table_conf.xml.sample file.
+ Uploading the tool_data_table_conf.xml.sample alone should not make the tool valid, but the error message should change.
+ '''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
filename='freebayes/tool_data_table_conf.xml.sample',
@@ -61,11 +84,15 @@
strings_not_displayed=[] )
self.display_manage_repository_page( repository, strings_displayed=[ 'Invalid tools' ], strings_not_displayed=[ 'Valid tools' ] )
tip = self.get_repository_tip( repository )
- self.check_repository_invalid_tools_for_changeset_revision( repository,
- tip,
- strings_displayed=[ 'refers to a file', 'sam_fa_indices.loc' ] )
+ strings_displayed = [ 'refers to a file', 'sam_fa_indices.loc' ]
+ self.check_repository_invalid_tools_for_changeset_revision( repository, tip, strings_displayed=strings_displayed )
+
def test_0020_upload_missing_sample_loc_file( self ):
'''Upload the missing sam_fa_indices.loc.sample file to the repository.'''
+ '''
+ We are at step 3 - Upload the tool_data_table_conf.xml.sample file.
+ Uploading the tool_data_table_conf.xml.sample alone should not make the tool valid, but the error message should change.
+ '''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
filename='freebayes/sam_fa_indices.loc.sample',
@@ -76,8 +103,13 @@
commit_message='Uploaded tool data table .loc file.',
strings_displayed=[],
strings_not_displayed=[] )
+
def test_0025_upload_malformed_tool_dependency_xml( self ):
'''Upload tool_dependencies.xml with bad characters in the readme tag.'''
+ '''
+ We are at step 4 - Upload a tool_dependencies.xml file that should not parse correctly.
+ Upload a tool_dependencies.xml file that contains <> in the text of the readme tag. This should show an error message about malformed xml.
+ '''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
filename=os.path.join( 'freebayes', 'malformed_tool_dependencies', 'tool_dependencies.xml' ),
@@ -88,8 +120,13 @@
commit_message='Uploaded malformed tool dependency XML.',
strings_displayed=[ 'Exception attempting to parse tool_dependencies.xml', 'not well-formed' ],
strings_not_displayed=[] )
+
def test_0030_upload_invalid_tool_dependency_xml( self ):
'''Upload tool_dependencies.xml defining version 0.9.5 of the freebayes package.'''
+ '''
+ We are at step 5 - Upload a tool_dependencies.xml file that specifies a version that does not match the tool's requirements.
+ This should result in a message about the tool dependency configuration not matching the tool's requirements.
+ '''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
filename=os.path.join( 'freebayes', 'invalid_tool_dependencies', 'tool_dependencies.xml' ),
@@ -100,8 +137,13 @@
commit_message='Uploaded invalid tool dependency XML.',
strings_displayed=[ 'The settings for <b>name</b>, <b>version</b> and <b>type</b> from a contained tool configuration' ],
strings_not_displayed=[] )
+
def test_0035_upload_valid_tool_dependency_xml( self ):
'''Upload tool_dependencies.xml defining version 0.9.4_9696d0ce8a962f7bb61c4791be5ce44312b81cf8 of the freebayes package.'''
+ '''
+ We are at step 6 - Upload a valid tool_dependencies.xml file.
+ At this stage, there should be no errors on the upload page, as every missing or invalid file has been corrected.
+ '''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
filename=os.path.join( 'freebayes', 'tool_dependencies.xml' ),
@@ -112,9 +154,14 @@
commit_message='Uploaded valid tool dependency XML.',
strings_displayed=[],
strings_not_displayed=[] )
+
def test_0040_verify_tool_dependencies( self ):
'''Verify that the uploaded tool_dependencies.xml specifies the correct package versions.'''
+ '''
+ We are at step 7 - Check for the appropriate strings on the manage repository page.
+ Verify that the manage repository page now displays the valid tool dependencies, and that there are no invalid tools shown on the manage page.
+ '''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
- self.display_manage_repository_page( repository,
- strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Valid tools', 'package' ],
- strings_not_displayed=[ 'Invalid tools' ] )
+ strings_displayed = [ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Valid tools', 'package' ]
+ strings_not_displayed = [ 'Invalid tools' ]
+ self.display_manage_repository_page( repository, strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/functional/test_0070_invalid_tool.py
--- a/test/tool_shed/functional/test_0070_invalid_tool.py
+++ b/test/tool_shed/functional/test_0070_invalid_tool.py
@@ -7,8 +7,10 @@
category_name = 'Test 0070 Invalid Tool Revisions'
category_description = 'Tests for a repository with invalid tool revisions.'
+
class TestBismarkRepository( ShedTwillTestCase ):
'''Testing bismark with valid and invalid tool entries.'''
+
def test_0000_create_or_login_admin_user( self ):
"""Create necessary user accounts and login as an admin user."""
self.logout()
@@ -21,6 +23,7 @@
admin_user = test_db_util.get_user( common.admin_email )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
admin_user_private_role = test_db_util.get_private_role( admin_user )
+
def test_0005_create_category_and_repository( self ):
"""Create a category for this test suite, then create and populate a bismark repository. It should contain at least one each valid and invalid tool."""
category = self.create_category( name=category_name, description=category_description )
@@ -54,5 +57,15 @@
strings_not_displayed=[] )
valid_revision = self.get_repository_tip( repository )
test_db_util.refresh( repository )
- self.check_repository_tools_for_changeset_revision( repository, valid_revision )
+ tool_guid = '%s/repos/user1/bismark_0070/bismark_methylation_extractor/0.7.7.3' % self.url.replace( 'http://', '' ).rstrip( '/' )
+ tool_metadata_strings_displayed = [ tool_guid,
+ '0.7.7.3', # The tool version.
+ 'bismark_methylation_extractor', # The tool ID.
+ 'Bismark', # The tool name.
+ 'methylation extractor' ] # The tool description.
+ tool_page_strings_displayed = [ 'Bismark (version 0.7.7.3)' ]
+ self.check_repository_tools_for_changeset_revision( repository,
+ valid_revision,
+ tool_metadata_strings_displayed=tool_metadata_strings_displayed,
+ tool_page_strings_displayed=tool_page_strings_displayed )
self.check_repository_invalid_tools_for_changeset_revision( repository, invalid_revision )
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/functional/test_0130_datatype_converters.py
--- /dev/null
+++ b/test/tool_shed/functional/test_0130_datatype_converters.py
@@ -0,0 +1,83 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+repository_name = 'bed_to_gff_0130'
+repository_description = "Converter: BED to GFF"
+repository_long_description = "Convert bed to gff"
+
+category_name = 'Test 0130 Datatype Converters'
+category_description = 'Test 0130 Datatype Converters'
+
+'''
+1) Create a populate the bed_to_gff_converter repository
+2) Visit the manage repository page and make sure there is the appropriate valid too and datatype
+3) Visit the view tool metadata page and make sure that "Display in tool panel" is False
+'''
+
+
+class TestDatatypeConverters( ShedTwillTestCase ):
+ '''Test features related to datatype converters.'''
+
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+
+ def test_0005_create_bed_to_gff_repository( self ):
+ '''Create and populate bed_to_gff_0130.'''
+ '''
+ We are at step 1 - Create and populate the bed_to_gff_0130 repository.
+ Create the bed_to_gff_0130 repository and populate it with the files needed for this test.
+ '''
+ category = self.create_category( name=category_name, description=category_description )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ # Create a repository named bed_to_gff_0130 owned by user1.
+ repository = self.get_or_create_repository( name=repository_name,
+ description=repository_description,
+ long_description=repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ # Upload bed_to_gff_converter.tar to the repository.
+ self.upload_file( repository,
+ filename='bed_to_gff_converter/bed_to_gff_converter.tar',
+ filepath=None,
+ valid_tools_only=True,
+ uncompress_file=False,
+ remove_repo_files_not_in_tar=False,
+ commit_message='Uploaded bed_to_gff_converter.tar.',
+ strings_displayed=[],
+ strings_not_displayed=[] )
+
+ def test_0010_verify_tool_and_datatype( self ):
+ '''Verify that a valid tool and datatype are contained within the repository.'''
+ '''
+ We are at step 2 - Visit the manage repository page and make sure there is the appropriate valid tool and datatype.
+ There should be a 'Convert BED to GFF' tool and a 'galaxy.datatypes.interval:Bed' datatype with extension 'bed'
+ '''
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ strings_displayed = [ 'Convert BED to GFF', 'galaxy.datatypes.interval:Bed', 'bed', 'Valid tools', 'Datatypes' ]
+ strings_not_displayed = [ 'Invalid tools' ]
+ self.display_manage_repository_page( repository, strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
+
+ def test_0015_verify_tool_panel_display( self ):
+ '''Verify that the tool is configured not to be displayed in the tool panel.'''
+ '''
+ We are at step 3
+ Datatype converters that are associated with a datatype should have display in tool panel = False in the tool metadata.
+ '''
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ metadata = self.get_repository_metadata_by_changeset_revision( repository, self.get_repository_tip( repository ) )
+ tool_metadata_strings_displayed = '<label>Display in tool panel:</label>\n False'
+ self.check_repository_tools_for_changeset_revision( repository,
+ self.get_repository_tip( repository ),
+ tool_metadata_strings_displayed=tool_metadata_strings_displayed )
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/functional/test_0430_browse_utilities.py
--- /dev/null
+++ b/test/tool_shed/functional/test_0430_browse_utilities.py
@@ -0,0 +1,184 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+import logging
+log = logging.getLogger(__name__)
+
+datatypes_repository_name = 'emboss_datatypes_0430'
+datatypes_repository_description = 'Galaxy applicable datatypes for EMBOSS for test 0430'
+datatypes_repository_long_description = 'Long description of Galaxy applicable datatypes for EMBOSS for test 0430'
+
+emboss_repository_name = 'emboss_0430'
+emboss_repository_description = 'EMBOSS tools for test 0430'
+emboss_repository_long_description = 'Long description of EMBOSS tools for test 0430'
+
+freebayes_repository_name = 'freebayes_0430'
+freebayes_repository_description = 'Freebayes tool for test 0430'
+freebayes_repository_long_description = 'Long description of Freebayes tool for test 0430'
+
+
+'''
+1. Create and populate repositories.
+2. Browse Custom Datatypes.
+3. Browse Tools.
+4. Browse Repository Dependencies.
+5. Browse Tool Dependencies.
+'''
+
+
+class TestToolShedBrowseUtilities( ShedTwillTestCase ):
+ '''Test browsing for Galaxy utilities.'''
+
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts and login as an admin user."""
+ """
+ Create all the user accounts that are needed for this test script to run independently of other tests.
+ Previously created accounts will not be re-created.
+ """
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % common.test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+
+ def test_0005_create_datatypes_repository( self ):
+ """Create and populate the emboss_datatypes_0430 repository"""
+ """
+ We are at step 1.
+ Create and populate the repository that will contain one or more datatypes.
+ """
+ category = self.create_category( name='Test 0430 Galaxy Utilities',
+ description='Description of Test 0430 Galaxy Utilities category' )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ strings_displayed = [ 'Repository %s' % "'%s'" % datatypes_repository_name,
+ 'Repository %s has been created' % "'%s'" % datatypes_repository_name ]
+ repository = self.get_or_create_repository( name=datatypes_repository_name,
+ description=datatypes_repository_description,
+ long_description=datatypes_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=strings_displayed )
+ self.upload_file( repository,
+ filename='emboss/datatypes/datatypes_conf.xml',
+ filepath=None,
+ valid_tools_only=True,
+ uncompress_file=True,
+ remove_repo_files_not_in_tar=False,
+ commit_message='Uploaded datatypes_conf.xml.',
+ strings_displayed=[],
+ strings_not_displayed=[] )
+
+ def test_0010_create_emboss_repository( self ):
+ """Create and populate the emboss_0430 repository"""
+ """
+ We are at step 1.
+ Create the emboss_0430 repository, and populate it with tools.
+ """
+ category = self.create_category( name='Test 0430 Galaxy Utilities',
+ description='Description of Test 0430 Galaxy Utilities category' )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ strings_displayed = [ 'Repository %s' % "'%s'" % emboss_repository_name,
+ 'Repository %s has been created' % "'%s'" % emboss_repository_name ]
+ emboss_repository = self.get_or_create_repository( name=emboss_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=strings_displayed )
+ self.upload_file( emboss_repository,
+ filename='emboss/emboss.tar',
+ filepath=None,
+ valid_tools_only=True,
+ uncompress_file=True,
+ remove_repo_files_not_in_tar=False,
+ commit_message='Uploaded emboss.tar.',
+ strings_displayed=[],
+ strings_not_displayed=[] )
+
+ def test_0015_create_dependency_on_datatypes_repository( self ):
+ '''Create a dependency definition file that specifies emboss_datatypes_0430 and upload it to emboss_0430.'''
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ dependency_xml_path = self.generate_temp_path( 'test_0430', additional_paths=[ 'dependencies' ] )
+ self.create_repository_dependency( emboss_repository, depends_on=[ datatypes_repository ], filepath=dependency_xml_path )
+ self.check_repository_dependency( emboss_repository, datatypes_repository )
+
+ def test_0020_create_tool_dependency_repository( self ):
+ """Create and populate the freebayes_0430 repository"""
+ """
+ We are at step 1.
+ Create and populate the repository that will have a tool dependency defined.
+ """
+ category = self.create_category( name='Test 0430 Galaxy Utilities',
+ description='Description of Test 0430 Galaxy Utilities category' )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ strings_displayed = [ 'Repository %s' % "'%s'" % freebayes_repository_name,
+ 'Repository %s has been created' % "'%s'" % freebayes_repository_name ]
+ repository = self.get_or_create_repository( name=freebayes_repository_name,
+ description=freebayes_repository_description,
+ long_description=freebayes_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=strings_displayed )
+ self.upload_file( repository,
+ filename='freebayes/freebayes.tar',
+ filepath=None,
+ valid_tools_only=True,
+ uncompress_file=True,
+ remove_repo_files_not_in_tar=False,
+ commit_message='Uploaded freebayes.tar.',
+ strings_displayed=[],
+ strings_not_displayed=[] )
+
+ def test_0025_browse_custom_datatypes( self ):
+ '''Load the page to browse custom datatypes.'''
+ '''
+ We are at step 2.
+ Verify that the uploaded emboss datatypes repository has added to the custom datatypes page.
+ '''
+ repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ changeset_revision = self.get_repository_tip( repository )
+ strings_displayed = [ 'equicktandem', 'est2genome', 'supermatcher', 'galaxy.datatypes.data:Text', changeset_revision, 'user1', 'emboss_datatypes_0430' ]
+ self.browse_custom_datatypes( strings_displayed=strings_displayed )
+
+ def test_0030_browse_tools( self ):
+ '''Load the page to browse tools.'''
+ '''
+ We are at step 3.
+ Verify the existence of emboss tools in the browse tools page.
+ '''
+ repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ changeset_revision = self.get_repository_tip( repository )
+ strings_displayed = [ 'EMBOSS', 'antigenic1', '5.0.0', changeset_revision, 'user1', 'emboss_0430' ]
+ self.browse_tools( strings_displayed=strings_displayed )
+
+ def test_0035_browse_repository_dependencies( self ):
+ '''Browse repository dependencies and look for a dependency on emboss_datatypes_0430.'''
+ '''
+ We are at step 3.
+ Verify that the browse repository dependencies page shows emboss_datatypes_0430 as a dependency of emboss_0430.
+ '''
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ datatypes_changeset_revision = self.get_repository_tip( datatypes_repository )
+ emboss_changeset_revision = self.get_repository_tip( emboss_repository )
+ strings_displayed = [ datatypes_changeset_revision, emboss_changeset_revision, 'emboss_datatypes_0430', 'user1', 'emboss_0430' ]
+ self.browse_repository_dependencies( strings_displayed=strings_displayed )
+
+ def test_0040_browse_tool_dependencies( self ):
+ '''Browse tool dependencies and look for the right versions of freebayes and samtools.'''
+ '''
+ We are at step 4.
+ Verify that the browse tool dependencies page shows the correct dependencies defined for freebayes_0430.
+ '''
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ freebayes_changeset_revision = self.get_repository_tip( freebayes_repository )
+ strings_displayed = [ freebayes_changeset_revision, 'freebayes_0430', 'user1', '0.9.4_9696d0ce8a96', 'freebayes', 'samtools', '0.1.18' ]
+ self.browse_tool_dependencies( strings_displayed=strings_displayed )
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/functional/test_1000_install_basic_repository.py
--- a/test/tool_shed/functional/test_1000_install_basic_repository.py
+++ b/test/tool_shed/functional/test_1000_install_basic_repository.py
@@ -1,8 +1,10 @@
from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
import tool_shed.base.test_db_util as test_db_util
+
class BasicToolShedFeatures( ShedTwillTestCase ):
'''Test installing a basic repository.'''
+
def test_0000_initiate_users( self ):
"""Create necessary user accounts."""
self.logout()
@@ -20,6 +22,7 @@
galaxy_admin_user = test_db_util.get_galaxy_user( common.admin_email )
assert galaxy_admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
galaxy_admin_user_private_role = test_db_util.get_galaxy_private_role( galaxy_admin_user )
+
def test_0005_ensure_repositories_and_categories_exist( self ):
'''Create the 0000 category and upload the filtering repository to it, if necessary.'''
category = self.create_category( name='Test 0000 Basic Repository Features 1', description='Test 0000 Basic Repository Features 1' )
@@ -68,6 +71,7 @@
commit_message='Uploaded readme for 2.2.0',
strings_displayed=[],
strings_not_displayed=[] )
+
def test_0010_browse_tool_sheds( self ):
"""Browse the available tool sheds in this Galaxy instance."""
self.galaxy_logout()
@@ -75,13 +79,16 @@
self.visit_galaxy_url( '/admin_toolshed/browse_tool_sheds' )
self.check_page_for_string( 'Embedded tool shed for functional tests' )
self.browse_tool_shed( url=self.url, strings_displayed=[ 'Test 0000 Basic Repository Features 1', 'Test 0000 Basic Repository Features 2' ] )
+
def test_0015_browse_test_0000_category( self ):
'''Browse the category created in test 0000. It should contain the filtering_0000 repository also created in that test.'''
category = test_db_util.get_category_by_name( 'Test 0000 Basic Repository Features 1' )
self.browse_category( category, strings_displayed=[ 'filtering_0000' ] )
+
def test_0020_preview_filtering_repository( self ):
'''Load the preview page for the filtering_0000 repository in the tool shed.'''
self.preview_repository_in_tool_shed( 'filtering_0000', common.test_user_1_name, strings_displayed=[ 'filtering_0000', 'Valid tools' ] )
+
def test_0025_install_filtering_repository( self ):
self.install_repository( 'filtering_0000',
common.test_user_1_name,
@@ -97,6 +104,24 @@
strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'Filter1' ] )
self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
self.verify_tool_metadata_for_installed_repository( installed_repository )
- def test_0030_verify_installed_repository_metadata( self ):
+
+ def test_0030_install_filtering_repository_again( self ):
+ '''Attempt to install the already installed filtering repository, and check for the resulting error message.'''
+ installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_0000', common.test_user_1_name )
+ post_submit_strings_displayed = [ installed_repository.name,
+ installed_repository.owner,
+ installed_repository.installed_changeset_revision,
+ 'was previously installed',
+ 'to manage the repository' ]
+ self.install_repository( 'filtering_0000',
+ common.test_user_1_name,
+ 'Test 0000 Basic Repository Features 1',
+ post_submit_strings_displayed=post_submit_strings_displayed )
+ strings_displayed = [ 'filtering_0000',
+ 'user1',
+ installed_repository.installed_changeset_revision ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
+
+ def test_0035_verify_installed_repository_metadata( self ):
'''Verify that resetting the metadata on an installed repository does not change the metadata.'''
self.verify_installed_repository_metadata_unchanged( 'filtering_0000', common.test_user_1_name )
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/functional/test_1130_datatype_converters.py
--- /dev/null
+++ b/test/tool_shed/functional/test_1130_datatype_converters.py
@@ -0,0 +1,94 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+repository_name = 'bed_to_gff_0130'
+repository_description = "Converter: BED to GFF"
+repository_long_description = "Convert bed to gff"
+
+category_name = 'Test 0130 Datatype Converters'
+category_description = 'Test 0130 Datatype Converters'
+
+'''
+1) Install the bed_to_gff_converter repository.
+2) Make sure the page section to select a tool panel section is NOT displayed since the tool will not be displayed in the Galaxy tool panel.
+3) Make sure the bed_to_gff_converter tool is not displayed in the tool panel.
+'''
+
+
+class TestDatatypeConverters( ShedTwillTestCase ):
+ '''Test features related to datatype converters.'''
+
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ galaxy_admin_user = test_db_util.get_galaxy_user( common.admin_email )
+ assert galaxy_admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ galaxy_admin_user_private_role = test_db_util.get_galaxy_private_role( galaxy_admin_user )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+
+ def test_0005_create_bed_to_gff_repository( self ):
+ '''Create and populate bed_to_gff_0130.'''
+ category = self.create_category( name=category_name, description=category_description )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ # Create a repository named bed_to_gff_0130 owned by user1.
+ repository = self.get_or_create_repository( name=repository_name,
+ description=repository_description,
+ long_description=repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ # Upload bed_to_gff_converter.tar to the repository, if the repository is new.
+ self.upload_file( repository,
+ filename='bed_to_gff_converter/bed_to_gff_converter.tar',
+ filepath=None,
+ valid_tools_only=True,
+ uncompress_file=False,
+ remove_repo_files_not_in_tar=False,
+ commit_message='Uploaded bed_to_gff_converter.tar.',
+ strings_displayed=[],
+ strings_not_displayed=[] )
+
+ def test_0010_install_datatype_converter_to_galaxy( self ):
+ '''Install bed_to_gff_converter_0130 into the running Galaxy instance.'''
+ '''
+ We are at step 1 - Install the bed_to_gff_converter repository.
+ Install bed_to_gff_converter_0130, checking that the option to select the tool panel section is *not* displayed.
+ '''
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ preview_strings_displayed = [ repository.name, self.get_repository_tip( repository ) ]
+ strings_displayed = [ 'Choose the configuration file' ]
+ strings_not_displayed = [ 'tool panel section' ]
+ self.install_repository( repository_name,
+ common.test_user_1_name,
+ category_name,
+ install_tool_dependencies=False,
+ preview_strings_displayed=preview_strings_displayed,
+ strings_displayed=strings_displayed,
+ strings_not_displayed=strings_not_displayed,
+ post_submit_strings_displayed=[ repository.name, 'new' ],
+ includes_tools_for_display_in_tool_panel=False )
+
+ def test_0015_uninstall_and_verify_tool_panel_section( self ):
+ '''Uninstall bed_to_gff_converter_0130 and verify that the saved tool_panel_section is None.'''
+ '''
+ We are at step 3 - Make sure the bed_to_gff_converter tool is not displayed in the tool panel.
+ The previous tool panel section for a tool is only recorded in the metadata when a repository is uninstalled,
+ so we have to uninstall it first, then verify that it was not assigned a tool panel section.
+ '''
+ repository = test_db_util.get_installed_repository_by_name_owner( repository_name, common.test_user_1_name )
+ self.uninstall_repository( repository, remove_from_disk=True )
+ self.verify_installed_repository_no_tool_panel_section( repository )
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/functional/test_1410_update_manager.py
--- /dev/null
+++ b/test/tool_shed/functional/test_1410_update_manager.py
@@ -0,0 +1,125 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+import logging, time
+log = logging.getLogger(__name__)
+
+repository_name = 'filtering_1410'
+repository_description = "Galaxy's filtering tool"
+repository_long_description = "Long description of Galaxy's filtering repository"
+
+category_name = 'Test 1410 - Galaxy Update Manager'
+category_description = 'Functional test suite to test the update manager.'
+
+'''
+1. Create and populate the filtering_1410 repository.
+2. Install filtering_1410 to Galaxy.
+3. Upload a readme file.
+4. Verify that the browse page now shows an update available.
+'''
+
+
+class TestUpdateManager( ShedTwillTestCase ):
+ '''Test the Galaxy update manager.'''
+
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts and login as an admin user."""
+ """
+ Create all the user accounts that are needed for this test script to run independently of other tests.
+ Previously created accounts will not be re-created.
+ """
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % common.test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ galaxy_admin_user = test_db_util.get_galaxy_user( common.admin_email )
+ assert galaxy_admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ galaxy_admin_user_private_role = test_db_util.get_galaxy_private_role( galaxy_admin_user )
+
+ def test_0005_create_filtering_repository( self ):
+ '''Create and populate the filtering_1410 repository.'''
+ '''
+ We are at step 1 - Create and populate the filtering_1410 repository.
+ Create filtering_1410 and upload the tool tarball to it.
+ '''
+ category = self.create_category( name=category_name, description=category_description )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = self.get_or_create_repository( name=repository_name,
+ description=repository_description,
+ long_description=repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ) )
+ self.upload_file( repository,
+ filename='filtering/filtering_1.1.0.tar',
+ filepath=None,
+ valid_tools_only=True,
+ uncompress_file=True,
+ remove_repo_files_not_in_tar=True,
+ commit_message="Uploaded filtering 1.1.0",
+ strings_displayed=[],
+ strings_not_displayed=[] )
+
+ def test_0010_install_filtering_repository( self ):
+ '''Install the filtering_1410 repository.'''
+ '''
+ We are at step 2 - Install filtering_1410 to Galaxy.
+ Install the filtering repository to Galaxy.
+ '''
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ self.install_repository( 'filtering_1410',
+ common.test_user_1_name,
+ category_name,
+ new_tool_panel_section='test_1410' )
+ installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_1410', common.test_user_1_name )
+ strings_displayed = [ 'filtering_1410',
+ "Galaxy's filtering tool",
+ 'user1',
+ self.url.replace( 'http://', '' ),
+ installed_repository.installed_changeset_revision ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'Filter1' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
+ self.verify_tool_metadata_for_installed_repository( installed_repository )
+
+ def test_0015_upload_readme_file( self ):
+ '''Upload readme.txt to filtering_1410.'''
+ '''
+ We are at step 3 - Upload a readme file.
+ Upload readme.txt. This will have the effect of making the installed changeset revision not be the most recent downloadable revision,
+ but without generating a second downloadable revision. Then sleep for 3 seconds to make sure the update manager picks up the new
+ revision.
+ '''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ self.upload_file( repository,
+ filename='readme.txt',
+ filepath=None,
+ valid_tools_only=True,
+ uncompress_file=True,
+ remove_repo_files_not_in_tar=False,
+ commit_message="Uploaded readme.txt",
+ strings_displayed=[],
+ strings_not_displayed=[] )
+
+ def test_0020_check_for_displayed_update( self ):
+ '''Browse installed repositories and verify update.'''
+ '''
+ We are at step 4 - Verify that the browse page now shows an update available.
+ The browse page should now show filtering_1410 as installed, but with a yellow box indicating that there is an update available.
+ '''
+ # Wait 3 seconds, just to be sure we're past hours_between_check.
+ time.sleep( 3 )
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ self.display_galaxy_browse_repositories_page( strings_displayed=[ 'state-color-running' ] )
+
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/functional_tests.py
--- a/test/tool_shed/functional_tests.py
+++ b/test/tool_shed/functional_tests.py
@@ -278,8 +278,10 @@
database_connection = galaxy_database_connection,
database_engine_option_pool_size = '10',
datatype_converters_config_file = "datatype_converters_conf.xml.sample",
+ enable_tool_shed_check = True,
file_path = galaxy_file_path,
global_conf = global_conf,
+ hours_between_check = 0.001,
id_secret = 'changethisinproductiontoo',
job_queue_workers = 5,
log_destination = "stdout",
diff -r 34dfad3b8811968a7988de90817f499dc7ee860c -r 9159442d180f9f7baf282b93ad70ce6ddbecec32 test/tool_shed/test_data/bed_to_gff_converter/bed_to_gff_converter.tar
Binary file test/tool_shed/test_data/bed_to_gff_converter/bed_to_gff_converter.tar has changed
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Allow reloading Data Managers of the same ID.
by commits-noreply@bitbucket.org 13 Mar '13
by commits-noreply@bitbucket.org 13 Mar '13
13 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/1a68cc962622/
changeset: 1a68cc962622
user: dan
date: 2013-03-13 16:55:17
summary: Allow reloading Data Managers of the same ID.
affected #: 2 files
diff -r 5b8d2cb81bd023c8d62d8038c37d696b38aa91a7 -r 1a68cc9626220afa542f0ac00951511e7eae56bf lib/galaxy/tools/data_manager/manager.py
--- a/lib/galaxy/tools/data_manager/manager.py
+++ b/lib/galaxy/tools/data_manager/manager.py
@@ -25,8 +25,8 @@
self.filename = xml_filename or self.app.config.data_manager_config_file
self.load_from_xml( self.filename )
if self.app.config.shed_data_manager_config_file:
- self.load_from_xml( self.app.config.shed_data_manager_config_file, store_tool_path=False )
- def load_from_xml( self, xml_filename, store_tool_path=True ):
+ self.load_from_xml( self.app.config.shed_data_manager_config_file, store_tool_path=False, replace_existing=True )
+ def load_from_xml( self, xml_filename, store_tool_path=True, replace_existing=False ):
try:
tree = util.parse_xml( xml_filename )
except Exception, e:
@@ -44,19 +44,24 @@
tool_path = '.'
self.tool_path = tool_path
for data_manager_elem in root.findall( 'data_manager' ):
- self.load_manager_from_elem( data_manager_elem )
- def load_manager_from_elem( self, data_manager_elem, tool_path=None, add_manager=True ):
+ self.load_manager_from_elem( data_manager_elem, replace_existing=replace_existing )
+ def load_manager_from_elem( self, data_manager_elem, tool_path=None, add_manager=True, replace_existing=False ):
try:
data_manager = DataManager( self, data_manager_elem, tool_path=tool_path )
except Exception, e:
log.error( "Error loading data_manager '%s':\n%s" % ( e, util.xml_to_string( data_manager_elem ) ) )
return None
if add_manager:
- self.add_manager( data_manager )
+ self.add_manager( data_manager, replace_existing=replace_existing )
log.debug( 'Loaded Data Manager: %s' % ( data_manager.id ) )
return data_manager
- def add_manager( self, data_manager ):
- assert data_manager.id not in self.data_managers, "A data manager has been defined twice: %s" % ( data_manager.id )
+ def add_manager( self, data_manager, replace_existing=False ):
+ if not replace_existing:
+ assert data_manager.id not in self.data_managers, "A data manager has been defined twice: %s" % ( data_manager.id )
+ elif data_manager.id in self.data_managers:
+ # Data Manager already exists, remove first one and replace with new one
+ log.warning( "A data manager has been defined twice and will be replaced with the last loaded version: %s" % ( data_manager.id ) )
+ self.remove_manager( data_manager.id )
self.data_managers[ data_manager.id ] = data_manager
for data_table_name in data_manager.data_tables.keys():
if data_table_name not in self.managed_data_tables:
diff -r 5b8d2cb81bd023c8d62d8038c37d696b38aa91a7 -r 1a68cc9626220afa542f0ac00951511e7eae56bf lib/tool_shed/util/shed_util.py
--- a/lib/tool_shed/util/shed_util.py
+++ b/lib/tool_shed/util/shed_util.py
@@ -1261,7 +1261,7 @@
tool_elem = suc.generate_tool_elem( repository.tool_shed, repository.name, repository.installed_changeset_revision,
repository.owner, tool_config_filename, tool, None )
elem.insert( 0, tool_elem )
- data_manager = app.data_managers.load_manager_from_elem( elem, tool_path=shed_config_dict.get( 'tool_path', '' ) )
+ data_manager = app.data_managers.load_manager_from_elem( elem, tool_path=shed_config_dict.get( 'tool_path', '' ), replace_existing=True )
if data_manager:
rval.append( data_manager )
else:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Change community to tool_shed in manage_db.sh notes.
by commits-noreply@bitbucket.org 13 Mar '13
by commits-noreply@bitbucket.org 13 Mar '13
13 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/5b8d2cb81bd0/
changeset: 5b8d2cb81bd0
user: dan
date: 2013-03-13 16:15:07
summary: Change community to tool_shed in manage_db.sh notes.
affected #: 1 file
diff -r 07262aa197881ac0d69be70987f8fb89e0564570 -r 5b8d2cb81bd023c8d62d8038c37d696b38aa91a7 manage_db.sh
--- a/manage_db.sh
+++ b/manage_db.sh
@@ -2,7 +2,7 @@
#######
# NOTE: To downgrade to a specific version, use something like:
-# sh manage_db.sh downgrade --version=3 <community if using that webapp - galaxy is the default>
+# sh manage_db.sh downgrade --version=3 <tool_shed if using that webapp - galaxy is the default>
#######
cd `dirname $0`
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: browser tests: remove error handlers inside tryStepsCatch; add HDA state tests; begin moving selectors and text to central locations
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/07262aa19788/
changeset: 07262aa19788
user: carlfeberhard
date: 2013-03-12 22:32:41
summary: browser tests: remove error handlers inside tryStepsCatch; add HDA state tests; begin moving selectors and text to central locations
affected #: 6 files
diff -r c03c46ced8cc0ac2f36d92ac093684e6cf828609 -r 07262aa197881ac0d69be70987f8fb89e0564570 test/casperjs/anon-history-tests.js
--- a/test/casperjs/anon-history-tests.js
+++ b/test/casperjs/anon-history-tests.js
@@ -39,23 +39,22 @@
spaceghost.info( 'Will use fixtureData.testUser: ' + email );
}
-var galaxyCookieName = 'galaxysession',
-
- nameSelector = 'div#history-name',
- unnamedName = 'Unnamed history',
- subtitleSelector = 'div#history-subtitle-area',
- initialSizeStr = '0 bytes',
- tagIconSelector = '#history-tag.icon-button',
- annoIconSelector = '#history-annotate.icon-button',
- //emptyMsgSelector = '#emptyHistoryMessage';
- emptyMsgSelector = '.infomessagesmall',
- emptyMsgStr = "Your history is empty. Click 'Get Data' on the left pane to start",
-
- tooltipSelector = '.bs-tooltip',
- anonNameTooltip = 'You must be logged in to edit your history name',
+var tooltipSelector = '.bs-tooltip',
editableTextClass = 'editable-text',
- editableTextInputSelector = 'input#renaming-active';
+ editableTextInputSelector = 'input#renaming-active',
+
+ galaxyCookieName = 'galaxysession';
+
+ unnamedName = spaceghost.historypanel.data.text.history.newName,
+ nameSelector = spaceghost.historypanel.data.selectors.history.name,
+ subtitleSelector = spaceghost.historypanel.data.selectors.history.subtitle,
+ initialSizeStr = spaceghost.historypanel.data.text.history.newSize,
+ tagIconSelector = spaceghost.historypanel.data.selectors.history.tagIcon,
+ annoIconSelector = spaceghost.historypanel.data.selectors.history.annoIcon,
+ emptyMsgSelector = spaceghost.historypanel.data.selectors.history.emptyMsg,
+ emptyMsgStr = spaceghost.historypanel.data.text.history.emptyMsg,
+ anonNameTooltip = spaceghost.historypanel.data.text.anonymous.tooltips.name;
var historyFrameInfo = {},
testUploadInfo = {};
@@ -111,8 +110,8 @@
this.test.assertDoesntExist( tagIconSelector, 'Tag icon button not found' );
this.test.assertDoesntExist( annoIconSelector, 'Annotation icon button not found' );
+ this.test.assertExists( emptyMsgSelector, emptyMsgSelector + ' exists' );
this.test.comment( "A message about the current history being empty should be displayed" );
- this.test.assertExists( emptyMsgSelector, emptyMsgSelector + ' exists' );
this.test.assertVisible( emptyMsgSelector, 'Empty history message is visible' );
this.test.assertSelectorHasText( emptyMsgSelector, emptyMsgStr,
'Message contains "' + emptyMsgStr + '"' );
diff -r c03c46ced8cc0ac2f36d92ac093684e6cf828609 -r 07262aa197881ac0d69be70987f8fb89e0564570 test/casperjs/casperjs_runner.py
--- a/test/casperjs/casperjs_runner.py
+++ b/test/casperjs/casperjs_runner.py
@@ -344,6 +344,15 @@
self.run_js_script( 'anon-history-tests.js' )
+class Test_04_HDAs( CasperJSTestCase ):
+ """(Minimal) casperjs tests for tools.
+ """
+ def test_00_HDA_states( self ):
+ """Test structure rendering of HDAs in all the possible HDA states
+ """
+ self.run_js_script( 'hda-state-tests.js' )
+
+
# ==================================================================== MAIN
if __name__ == '__main__':
diff -r c03c46ced8cc0ac2f36d92ac093684e6cf828609 -r 07262aa197881ac0d69be70987f8fb89e0564570 test/casperjs/hda-state-tests.js
--- /dev/null
+++ b/test/casperjs/hda-state-tests.js
@@ -0,0 +1,140 @@
+// have to handle errors here - or phantom/casper won't bail but _HANG_
+try {
+ var utils = require( 'utils' ),
+ xpath = require( 'casper' ).selectXPath,
+ format = utils.format,
+
+ //...if there's a better way - please let me know, universe
+ scriptDir = require( 'system' ).args[3]
+ // remove the script filename
+ .replace( /[\w|\.|\-|_]*$/, '' )
+ // if given rel. path, prepend the curr dir
+ .replace( /^(?!\/)/, './' ),
+ spaceghost = require( scriptDir + 'spaceghost' ).create({
+ // script options here (can be overridden by CLI)
+ //verbose: true,
+ //logLevel: debug,
+ scriptDir: scriptDir
+ });
+
+ spaceghost.start();
+
+} catch( error ){
+ console.debug( error );
+ phantom.exit( 1 );
+}
+
+
+// ===================================================================
+/* TODO:
+ currently going to fake states via JS
+ - better if we can capture actual hdas in these states
+ - easier said than done - API?
+*/
+// =================================================================== globals and helpers
+var email = spaceghost.user.getRandomEmail(),
+ password = '123456';
+if( spaceghost.fixtureData.testUser ){
+ email = spaceghost.fixtureData.testUser.email;
+ password = spaceghost.fixtureData.testUser.password;
+ spaceghost.info( 'Will use fixtureData.testUser: ' + email );
+}
+
+var newHistoryName = "Test History",
+ historyFrameInfo = {},
+ filepathToUpload = '../../test-data/1.txt',
+ possibleHDAStates = [],
+ testUploadInfo = {};
+
+// ------------------------------------------------------------------- set up
+// start a new user
+spaceghost.user.loginOrRegisterUser( email, password );
+// ??: why is a reload needed here? If we don't, loggedInAs === '' ...
+spaceghost.thenOpen( spaceghost.baseUrl, function(){
+ var loggedInAs = spaceghost.user.loggedInAs();
+ this.test.assert( loggedInAs === email, 'loggedInAs() matches email: "' + loggedInAs + '"' );
+});
+
+// grab the history frame bounds for mouse later tests
+spaceghost.then( function(){
+ historyFrameInfo = this.getElementInfo( 'iframe[name="galaxy_history"]' );
+ //this.debug( 'historyFrameInfo:' + this.jsonStr( historyFrameInfo ) );
+});
+
+// upload a file
+spaceghost.then( function upload(){
+ spaceghost.tools.uploadFile( filepathToUpload, function uploadCallback( _uploadInfo ){
+ testUploadInfo = _uploadInfo;
+ this.info( 'testUploadInfo:' + this.jsonStr( testUploadInfo ) );
+ });
+});
+
+spaceghost.then( function getHDAStates(){
+ this.withFrame( this.selectors.frames.history, function(){
+ var model = this.evaluate( function(){
+ return Galaxy.currHistoryPanel.model.hdas.at( 0 ).attributes;
+ });
+ this.info( 'model:' + this.jsonStr( model ) );
+ });
+});
+
+spaceghost.then( function checkNewState(){
+ this.test.comment( 'HDAs in the "new" state should be well formed' );
+
+ this.withFrame( this.selectors.frames.history, function(){
+ // set state directly through model
+ //TODO: not ideal
+ this.evaluate( function(){
+ return Galaxy.currHistoryPanel.model.hdas.at( 0 ).set( 'state', 'new' );
+ });
+ // wait for re-render
+ this.wait( 500, function(){
+ var uploadSelector = '#' + testUploadInfo.hdaElement.attributes.id;
+ this.test.assertVisible( uploadSelector, 'HDA is visible' );
+
+ // should have proper title and hid
+ var titleSelector = uploadSelector + ' .historyItemTitle';
+ this.test.assertVisible( titleSelector, 'HDA title is visible' );
+ this.test.assertSelectorHasText( titleSelector, testUploadInfo.name,
+ 'HDA has proper title' );
+ this.test.assertSelectorHasText( titleSelector, testUploadInfo.hid,
+ 'HDA has proper hid' );
+
+ // should have the new state class
+ var newStateClass = 'historyItem-new',
+ uploadElement = this.getElementInfo( uploadSelector );
+ this.test.assert( uploadElement.attributes['class'].indexOf( newStateClass ) !== -1,
+ 'HDA has new state class' );
+
+ // since we're using css there's no great way to test this
+ //var stateIconSelector = uploadSelector + ' .state-icon';
+ //this.test.assertVisible( stateIconSelector, 'HDA has proper hid' );
+
+ // should NOT have any of the three, main buttons
+ var buttonSelector = uploadSelector + ' .historyItemButtons a';
+ this.test.assertDoesntExist( buttonSelector, 'No display, edit, or delete buttons' );
+
+ // expand and check the body
+ this.click( titleSelector );
+ this.wait( 500, function(){
+ var bodySelector = uploadSelector + ' .historyItemBody';
+ this.test.assertVisible( bodySelector, 'HDA body is visible (after expanding)' );
+
+ var expectedBodyText = 'This is a new dataset';
+ this.test.assertSelectorHasText( bodySelector, expectedBodyText,
+ 'HDA body has text: ' + expectedBodyText );
+
+ // restore to collapsed
+ this.click( titleSelector );
+ });
+ });
+ });
+});
+
+// =================================================================== TESTS
+
+
+// ===================================================================
+spaceghost.run( function(){
+ this.test.done();
+});
diff -r c03c46ced8cc0ac2f36d92ac093684e6cf828609 -r 07262aa197881ac0d69be70987f8fb89e0564570 test/casperjs/history-panel-tests.js
--- a/test/casperjs/history-panel-tests.js
+++ b/test/casperjs/history-panel-tests.js
@@ -24,7 +24,6 @@
phantom.exit( 1 );
}
-
// ===================================================================
/* TODO:
possibly break this file up
@@ -38,41 +37,36 @@
spaceghost.info( 'Will use fixtureData.testUser: ' + email );
}
-var nameSelector = 'div#history-name',
- unnamedName = 'Unnamed history',
- subtitleSelector = 'div#history-subtitle-area',
- initialSizeStr = '0 bytes',
- tagIconSelector = '#history-tag.icon-button',
- annoIconSelector = '#history-annotate.icon-button',
- emptyMsgSelector = '.infomessagesmall',
- emptyMsgStr = "Your history is empty. Click 'Get Data' on the left pane to start",
+// selectors and labels
+var nameSelector = spaceghost.historypanel.data.selectors.history.name,
+ subtitleSelector = spaceghost.historypanel.data.selectors.history.subtitle,
+ unnamedName = spaceghost.historypanel.data.text.history.newName,
+ initialSizeStr = spaceghost.historypanel.data.text.history.newSize,
+ tagIconSelector = spaceghost.historypanel.data.selectors.history.tagIcon,
+ annoIconSelector = spaceghost.historypanel.data.selectors.history.annoIcon,
+ emptyMsgSelector = spaceghost.historypanel.data.selectors.history.emptyMsg,
+ emptyMsgStr = spaceghost.historypanel.data.text.history.emptyMsg,
+ wrapperOkClassName = spaceghost.historypanel.data.selectors.hda.wrapper.stateClasses.ok,
+ tagAreaSelector = spaceghost.historypanel.data.selectors.history.tagArea,
+ annoAreaSelector = spaceghost.historypanel.data.selectors.history.annoArea,
+ nameTooltip = spaceghost.historypanel.data.text.history.tooltips.name,
tooltipSelector = '.bs-tooltip',
- nameTooltip = 'Click to rename history',
editableTextClass = 'editable-text',
editableTextInputSelector = 'input#renaming-active',
- wrapperOkClassName = 'historyItem-ok',
-
- tagAreaSelector = '#history-tag-area',
- annoAreaSelector = '#history-annotation-area',
refreshButtonSelector = 'a#history-refresh-button',
refreshButtonIconSelector = 'span.fa-icon-refresh',
refreshButtonHref = '/history',
- //historyOptionsButtonSelector = '#history-options-button',
- //historyOptionsButtonIconSelector = 'span.fa-icon-cog',
includeDeletedOptionsLabel = spaceghost.historyoptions.data.labels.options.includeDeleted;
-function historyOptionXpathByLabel( label ){
- return xpath( '//ul[@id="history-options-button-menu"]/li/a[text()[contains(.,"' + label + '")]]' );
-}
-
+// local
var newHistoryName = "Test History",
filepathToUpload = '../../test-data/1.txt',
historyFrameInfo = {},
- testUploadInfo = {};
+ uploadInfo = {};
// =================================================================== TESTS
@@ -184,7 +178,7 @@
// ------------------------------------------------------------------- check structure of NON empty history
// upload file: 1.txt
spaceghost.then( function upload(){
- this.test.comment( 'should be able to upload files' );
+ this.test.comment( 'uploaded file should appear in history' );
spaceghost.tools.uploadFile( filepathToUpload, function uploadCallback( _uploadInfo ){
this.debug( 'uploaded HDA info: ' + this.jsonStr( _uploadInfo ) );
var hasHda = _uploadInfo.hdaElement,
@@ -224,27 +218,21 @@
// ------------------------------------------------------------------- tags
// keeping this light here - better for it's own test file
+//TODO: check tooltips
spaceghost.then( function openTags(){
this.test.comment( 'tag area should open when the history panel tag icon is clicked' );
this.withFrame( this.selectors.frames.history, function(){
+ this.capture( 'tag-area.png' );
this.mouseEvent( 'click', tagIconSelector );
this.wait( 1000, function(){
this.test.assertVisible( tagAreaSelector, 'Tag area is now displayed' );
});
});
});
-spaceghost.then( function closeTags(){
- this.test.comment( 'tag area should close when the history panel tag icon is clicked again' );
- this.withFrame( this.selectors.frames.history, function(){
- this.mouseEvent( 'click', tagIconSelector );
- this.wait( 1000, function(){
- this.test.assertNotVisible( tagAreaSelector, 'Tag area is now hidden' );
- });
- });
-});
// ------------------------------------------------------------------- annotation
// keeping this light here - better for it's own test file
+//TODO: check tooltips
spaceghost.then( function openAnnotation(){
this.test.comment( 'annotation area should open when the history panel annotation icon is clicked' );
this.withFrame( this.selectors.frames.history, function(){
@@ -346,7 +334,8 @@
this.withFrame( this.selectors.frames.history, function(){
this.waitForSelector( nameSelector, function(){
//TODO: to conv. fn
- this.click( '#' + uploadInfo.hdaElement.attributes.id + ' .historyItemUndelete' );
+ this.click( '#' + uploadInfo.hdaElement.attributes.id
+ + ' ' + this.historypanel.data.selectors.history.undeleteLink );
});
});
});
diff -r c03c46ced8cc0ac2f36d92ac093684e6cf828609 -r 07262aa197881ac0d69be70987f8fb89e0564570 test/casperjs/modules/historypanel.js
--- a/test/casperjs/modules/historypanel.js
+++ b/test/casperjs/modules/historypanel.js
@@ -31,7 +31,6 @@
*/
// =================================================================== INTERNAL
-
// =================================================================== API (external)
/** Find the casper element info of the hda wrapper given the hda title and hid.
* NOTE: if more than one is found, will return the first found.
@@ -46,6 +45,7 @@
wrapperInfo = null;
//NOTE: depends on jquery
+ //TODO: move to xpath
wrapperInfo = spaceghost.evaluate( function( titleContains ){
// find the title, then the wrapper (2 containers up)
var $title = $( '.historyItemTitle:contains(' + titleContains + ')' );
@@ -199,3 +199,54 @@
});
return spaceghost;
};
+
+
+// =================================================================== SELECTORS
+//TODO: data is not a very good name
+HistoryPanel.prototype.data = {
+ selectors : {
+ history : {
+ name : 'div#history-name',
+ subtitle : 'div#history-subtitle-area',
+ tagIcon : '#history-tag.icon-button',
+ tagArea : '#history-tag-area',
+ annoIcon : '#history-annotate.icon-button',
+ annoArea : '#history-annotation-area',
+ emptyMsg : '.infomessagesmall',
+ undeleteLink : '.historyItemUndelete'
+ },
+ hda : {
+ wrapper : {
+ stateClasses : {
+ prefix : 'historyItem-',
+ ok : 'historyItem-ok'
+ }
+ }
+ }
+ },
+ labels : {
+ history : {
+ },
+ hda : {
+ }
+ },
+ text : {
+ anonymous : {
+ tooltips : {
+ name : 'You must be logged in to edit your history name'
+ }
+ },
+ history : {
+ tooltips : {
+ name : 'Click to rename history',
+ tagIcon : 'Edit history tags',
+ annoIcon : 'Edit history annotation'
+ },
+ newName : 'Unnamed history',
+ newSize : '0 bytes',
+ emptyMsg : "Your history is empty. Click 'Get Data' on the left pane to start"
+ },
+ hda : {
+ }
+ }
+};
diff -r c03c46ced8cc0ac2f36d92ac093684e6cf828609 -r 07262aa197881ac0d69be70987f8fb89e0564570 test/casperjs/spaceghost.js
--- a/test/casperjs/spaceghost.js
+++ b/test/casperjs/spaceghost.js
@@ -120,7 +120,7 @@
// save errors for later output (needs to go before process CLI)
this.errors = [];
- this.on( 'error', function( msg, backtrace ){
+ this.on( 'error', function pushErrorToStack( msg, backtrace ){
//this.debug( 'adding error to stack: ' + msg + ', trace:' + JSON.stringify( backtrace, null, 2 ) );
this.errors.push({ msg: msg, backtrace: backtrace });
});
@@ -187,6 +187,8 @@
//screenOnError : { defaultsTo: false, flag: 'error-screen', help: 'capture a screenshot on a page error' },
//textOnError : { defaultsTo: false, flag: 'error-text', help: 'output page text on a page error' },
//htmlOnError : { defaultsTo: false, flag: 'error-html', help: 'output page html on a page error' }
+ //htmlOnFail : { defaultsTo: false, flag: 'fail-html', help: 'output page html on a test failure' },
+ //screenOnFail : { defaultsTo: false, flag: 'fail-screen', help: 'capture a screenshot on a test failure' }
};
// --url parameter required (the url of the server to test with)
@@ -196,17 +198,16 @@
}
this.baseUrl = this.cli.get( 'url' );
+ //TODO: move these handlers into _setUpEventHandlers
// --return-json: supress all output except for JSON logs, test results, and errors at finish
// this switch allows a testing suite to send JSON data back via stdout (w/o logs, echos interferring)
this.options.returnJsonOnly = CLI_OPTIONS.returnJsonOnly.defaultsTo;
if( this.cli.has( CLI_OPTIONS.returnJsonOnly.flag ) ){
this.options.returnJsonOnly = true;
- //this._suppressOutput();
this._redirectOutputToStderr();
-
// output json on fail-first error
- this.on( 'error', function( msg, backtrace ){
+ this.on( 'error', function outputJSONOnError( msg, backtrace ){
//console.debug( 'return-json caught error' );
if( spaceghost.options.exitOnError ){
this.outputStateAsJson();
@@ -216,6 +217,7 @@
// non-error finshes/json-output are handled in run() for now
}
+ //TODO: remove boilerplate
// --error-on-alert=false: don't throw an error if the page calls alert (default: true)
this.options.raisePageError = CLI_OPTIONS.raisePageError.defaultsTo;
if( this.cli.has( CLI_OPTIONS.raisePageError.flag ) ){
@@ -244,10 +246,13 @@
this.on( 'page.error', this._saveHtmlOnErrorHandler );
}
- // --error-screen: print the casper.debugPage (the page's text) output on an error
+ // --error-screen: capture the casper browser screen on an error
if( this.cli.has( 'error-screen' ) ){
this.on( 'page.error', this._saveScreenOnErrorHandler );
}
+
+ // --fail-html: print the casper.debugHTML (the page's html) output on an test failure
+ // --fail-screen: print the casper browser screen output on an test failure
*/
// get any fixture data passed in as JSON in args
@@ -457,16 +462,18 @@
//TODO: * @param {Boolean} removeOtherListeners option to remove other listeners while this fires
// create three steps: 1) set up new error handler, 2) try the fn, 3) check for errors and rem. handler
var originalExitOnError,
+ originalErrorHandlers = [],
errorMsg = '', errorTrace = [],
recordError = function( msg, trace ){
errorMsg = msg; errorTrace = trace;
};
- // dont bail on the error (but preserve option), install hndlr to simply record msg, trace
- //NOTE: haven't had to remove other listeners yet
+ // dont bail on the error (but preserve option), uninstall other handlers,
+ // and install hndlr to simply record msg, trace
this.then( function(){
originalExitOnError = this.options.exitOnError;
this.options.exitOnError = false;
+ originalErrorHandlers = this.popAllListeners( 'error' );
this.on( 'error', recordError );
});
@@ -478,12 +485,24 @@
if( errorMsg ){
catchFn.call( this, errorMsg, errorTrace );
}
- // remove that listener either way and restore the bail option
+ // remove that listener either way, restore original handlers, and restore the bail option
this.removeListener( 'error', recordError );
+ this.addListeners( 'error', originalErrorHandlers );
this.options.exitOnError = originalExitOnError;
});
};
+/** Override capture to save to environ: GALAXY_TEST_SAVE (or passed in from CLI)
+ * @param {String} filename the image filename
+ */
+SpaceGhost.prototype.capture = function capture( filename, clipRect_or_selector ){
+ //TODO: override with saved output dir
+ if( clipRect_or_selector && ( !utils.isClipRect( clipRect_or_selector ) ) ){
+ this.debug( "USING CAPTURE SELECTOR" );
+ return this.captureSelector( filename, clipRect_or_selector );
+ }
+ return Casper.prototype.capture.apply( this, arguments );
+};
// =================================================================== TESTING
//TODO: form fill doesn't work as casperjs would want it - often a button -> controller url
@@ -600,6 +619,25 @@
// =================================================================== GALAXY CONVENIENCE
// =================================================================== MISCELAIN
+/** Pop all handlers for eventName from casper and return them in order.
+ * @param {String} eventName the name of the event from which to remove handlers
+ */
+SpaceGhost.prototype.popAllListeners = function popAllListeners( eventName ){
+ var returnedListeners = this.listeners( eventName );
+ this.removeAllListeners( eventName );
+ return returnedListeners;
+};
+
+/** Add the given list of handler functions to the listener for eventName in order.
+ * @param {String} eventName the name of the event to which to add handlers
+ * @param {Array} handlerArray an array of event handler functions to add
+ */
+SpaceGhost.prototype.addListeners = function addListeners( eventName, handlerArray ){
+ for( var i=0; i<handlerArray.length; i++ ){
+ this.addListener( eventName, handlerArray[i] );
+ }
+};
+
/** Send message to stderr
*/
SpaceGhost.prototype.stderr = function( msg ){
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Fix error message about missing app.config.biostar_url in the tool shed.
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c03c46ced8cc/
changeset: c03c46ced8cc
user: inithello
date: 2013-03-12 21:50:41
summary: Fix error message about missing app.config.biostar_url in the tool shed.
affected #: 1 file
diff -r bb15d2df55dd838914c1bc0c762dbdd039b7d8ae -r c03c46ced8cc0ac2f36d92ac093684e6cf828609 lib/galaxy/webapps/tool_shed/config.py
--- a/lib/galaxy/webapps/tool_shed/config.py
+++ b/lib/galaxy/webapps/tool_shed/config.py
@@ -82,6 +82,7 @@
self.support_url = kwargs.get( 'support_url', 'http://wiki.g2.bx.psu.edu/Support' )
self.wiki_url = kwargs.get( 'wiki_url', 'http://wiki.g2.bx.psu.edu/FrontPage' )
self.blog_url = kwargs.get( 'blog_url', None )
+ self.biostar_url = kwargs.get( 'biostar_url', None )
self.screencasts_url = kwargs.get( 'screencasts_url', None )
self.log_events = False
self.cloud_controller_instance = False
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Handle exceptions when attempting to parse certain xml definition files contained in tool shed repositories.
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/bb15d2df55dd/
changeset: bb15d2df55dd
user: greg
date: 2013-03-12 21:36:44
summary: Handle exceptions when attempting to parse certain xml definition files contained in tool shed repositories.
affected #: 3 files
diff -r 1344cb5a487538671a652398ff254572b76e7719 -r bb15d2df55dd838914c1bc0c762dbdd039b7d8ae lib/tool_shed/galaxy_install/__init__.py
--- a/lib/tool_shed/galaxy_install/__init__.py
+++ b/lib/tool_shed/galaxy_install/__init__.py
@@ -1,7 +1,7 @@
"""
Classes encapsulating the management of repositories installed from Galaxy tool sheds.
"""
-import os
+import os, logging
import tool_shed.util.shed_util
import tool_shed.util.shed_util_common
from galaxy.model.orm import and_
@@ -12,6 +12,8 @@
pkg_resources.require( 'elementtree' )
from elementtree import ElementTree, ElementInclude
+log = logging.getLogger( __name__ )
+
class InstalledRepositoryManager( object ):
def __init__( self, app ):
self.app = app
@@ -23,7 +25,11 @@
self.installed_repository_dicts = []
def get_repository_install_dir( self, tool_shed_repository ):
for tool_config in self.tool_configs:
- tree = ElementTree.parse( tool_config )
+ try:
+ tree = ElementTree.parse( tool_config )
+ except Exception, e:
+ log.debug( "Exception attempting to parse %s: %s" % ( str( tool_config ), str( e ) ) )
+ return None
root = tree.getroot()
ElementInclude.include( root )
tool_path = root.get( 'tool_path', None )
diff -r 1344cb5a487538671a652398ff254572b76e7719 -r bb15d2df55dd838914c1bc0c762dbdd039b7d8ae lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
@@ -15,6 +15,7 @@
def clean_tool_shed_url( base_url ):
protocol, base = base_url.split( '://' )
return base.rstrip( '/' )
+
def create_or_update_tool_dependency( app, tool_shed_repository, name, version, type, status, set_status=True ):
# Called from Galaxy (never the tool shed) when a new repository is being installed or when an uninstalled repository is being reinstalled.
sa_session = app.model.context.current
@@ -32,6 +33,7 @@
sa_session.add( tool_dependency )
sa_session.flush()
return tool_dependency
+
def create_temporary_tool_dependencies_config( tool_shed_url, name, owner, changeset_revision ):
"""Make a call to the tool shed to get the required repository's tool_dependencies.xml file."""
url = url_join( tool_shed_url,
@@ -54,6 +56,7 @@
message += "%s of installed repository %s owned by %s." % ( str( changeset_revision ), str( name ), str( owner ) )
raise Exception( message )
return None
+
def get_absolute_path_to_file_in_repository( repo_files_dir, file_name ):
"""Return the absolute path to a specified disk file contained in a repository."""
stripped_file_name = strip_path( file_name )
@@ -64,6 +67,7 @@
if name == stripped_file_name:
return os.path.abspath( os.path.join( root, name ) )
return file_path
+
def get_tool_shed_repository_by_tool_shed_name_owner_changeset_revision( app, tool_shed_url, name, owner, changeset_revision ):
sa_session = app.model.context.current
tool_shed = clean_tool_shed_url( tool_shed_url )
@@ -90,6 +94,7 @@
if tool_shed_repository:
return tool_shed_repository
return None
+
def get_tool_dependency_by_name_type_repository( app, repository, name, type ):
sa_session = app.model.context.current
return sa_session.query( app.model.ToolDependency ) \
@@ -97,6 +102,7 @@
app.model.ToolDependency.table.c.name == name,
app.model.ToolDependency.table.c.type == type ) ) \
.first()
+
def get_tool_dependency_by_name_version_type_repository( app, repository, name, version, type ):
sa_session = app.model.context.current
return sa_session.query( app.model.ToolDependency ) \
@@ -105,6 +111,7 @@
app.model.ToolDependency.table.c.version == version,
app.model.ToolDependency.table.c.type == type ) ) \
.first()
+
def get_tool_dependency_install_dir( app, repository_name, repository_owner, repository_changeset_revision, tool_dependency_type, tool_dependency_name,
tool_dependency_version ):
if tool_dependency_type == 'package':
@@ -121,8 +128,10 @@
repository_owner,
repository_name,
repository_changeset_revision ) )
+
def get_tool_shed_repository_install_dir( app, tool_shed_repository ):
return os.path.abspath( tool_shed_repository.repo_files_directory( app ) )
+
def get_updated_changeset_revisions_from_tool_shed( tool_shed_url, name, owner, changeset_revision ):
"""Get all appropriate newer changeset revisions for the repository defined by the received tool_shed_url / name / owner combination."""
url = url_join( tool_shed_url,
@@ -131,6 +140,7 @@
text = response.read()
response.close()
return text
+
def handle_set_environment_entry_for_package( app, install_dir, tool_shed_repository, package_name, package_version, elem ):
action_dict = {}
actions = []
@@ -168,6 +178,7 @@
actions.append( ( action_type, action_dict ) )
return tool_dependency, actions
return None, actions
+
def install_and_build_package_via_fabric( app, tool_dependency, actions_dict ):
sa_session = app.model.context.current
try:
@@ -182,6 +193,7 @@
tool_dependency.status = app.model.ToolDependency.installation_status.INSTALLED
sa_session.add( tool_dependency )
sa_session.flush()
+
def install_package( app, elem, tool_shed_repository, tool_dependencies=None ):
# The value of tool_dependencies is a partial or full list of ToolDependency records associated with the tool_shed_repository.
sa_session = app.model.context.current
@@ -317,6 +329,7 @@
sa_session.add( tool_dependency )
sa_session.flush()
return tool_dependency
+
def install_via_fabric( app, tool_dependency, actions_elem, install_dir, package_name=None, proprietary_fabfile_path=None, **kwd ):
"""Parse a tool_dependency.xml file's <actions> tag set to gather information for the installation via fabric."""
sa_session = app.model.context.current
@@ -389,6 +402,7 @@
raise Exception( 'Tool dependency installation using proprietary fabric scripts is not yet supported.' )
else:
install_and_build_package_via_fabric( app, tool_dependency, actions_dict )
+
def listify( item ):
"""
Make a single item a single item list, or return a list if passed a
@@ -402,6 +416,7 @@
return item.split( ',' )
else:
return [ item ]
+
def populate_actions_dict( app, dependent_install_dir, required_install_dir, tool_shed_repository, package_name, package_version, tool_dependencies_config ):
"""
Populate an actions dictionary that can be sent to fabric_util.install_and_build_package. This method handles the scenario where a tool_dependencies.xml
@@ -420,24 +435,26 @@
action_dict = {}
if tool_dependencies_config:
required_td_tree = parse_xml( tool_dependencies_config )
- required_td_root = required_td_tree.getroot()
- for required_td_elem in required_td_root:
- # Find the appropriate package name and version.
- if required_td_elem.tag == 'package':
- # <package name="bwa" version="0.5.9">
- required_td_package_name = required_td_elem.get( 'name', None )
- required_td_package_version = required_td_elem.get( 'version', None )
- if required_td_package_name==package_name and required_td_package_version==package_version:
- tool_dependency, actions = handle_set_environment_entry_for_package( app=app,
- install_dir=required_install_dir,
- tool_shed_repository=tool_shed_repository,
- package_name=package_name,
- package_version=package_version,
- elem=required_td_elem )
- if actions:
- actions_dict[ 'actions' ] = actions
- break
+ if required_td_tree:
+ required_td_root = required_td_tree.getroot()
+ for required_td_elem in required_td_root:
+ # Find the appropriate package name and version.
+ if required_td_elem.tag == 'package':
+ # <package name="bwa" version="0.5.9">
+ required_td_package_name = required_td_elem.get( 'name', None )
+ required_td_package_version = required_td_elem.get( 'version', None )
+ if required_td_package_name==package_name and required_td_package_version==package_version:
+ tool_dependency, actions = handle_set_environment_entry_for_package( app=app,
+ install_dir=required_install_dir,
+ tool_shed_repository=tool_shed_repository,
+ package_name=package_name,
+ package_version=package_version,
+ elem=required_td_elem )
+ if actions:
+ actions_dict[ 'actions' ] = actions
+ break
return tool_dependency, actions_dict
+
def run_proprietary_fabric_method( app, elem, proprietary_fabfile_path, install_dir, package_name=None, **kwd ):
"""
TODO: Handle this using the fabric api.
@@ -474,6 +491,7 @@
if returncode:
return message
handle_environment_settings( app, tool_dependency, install_dir, cmd )
+
def run_subprocess( app, cmd ):
env = os.environ
PYTHONPATH = env.get( 'PYTHONPATH', '' )
@@ -496,6 +514,7 @@
except:
pass
return returncode, message
+
def set_environment( app, elem, tool_shed_repository ):
"""
Create a ToolDependency to set an environment variable. This is different from the process used to set an environment variable that is associated
@@ -548,6 +567,7 @@
sa_session.add( tool_dependency )
sa_session.flush()
print 'Environment variable ', env_var_name, 'set in', install_dir
+
def strip_path( fpath ):
if not fpath:
return fpath
@@ -556,12 +576,18 @@
except:
file_name = fpath
return file_name
+
def parse_xml( file_name ):
"""Returns a parsed xml tree."""
- tree = ElementTree.parse( file_name )
+ try:
+ tree = ElementTree.parse( file_name )
+ except Exception, e:
+ print "Exception attempting to parse ", file_name, ": ", str( e )
+ return None
root = tree.getroot()
ElementInclude.include( root )
return tree
+
def url_join( *args ):
parts = []
for arg in args:
diff -r 1344cb5a487538671a652398ff254572b76e7719 -r bb15d2df55dd838914c1bc0c762dbdd039b7d8ae lib/tool_shed/util/shed_util.py
--- a/lib/tool_shed/util/shed_util.py
+++ b/lib/tool_shed/util/shed_util.py
@@ -1054,7 +1054,11 @@
"""
installed_tool_dependencies = []
# Parse the tool_dependencies.xml config.
- tree = ElementTree.parse( tool_dependencies_config )
+ try:
+ tree = ElementTree.parse( tool_dependencies_config )
+ except Exception, e:
+ log.debug( "Exception attempting to parse %s: %s" % ( str( tool_dependencies_config ), str( e ) ) )
+ return installed_tool_dependencies
root = tree.getroot()
ElementInclude.include( root )
fabric_version_checked = False
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/4e08a83d7f9b/
changeset: 4e08a83d7f9b
user: inithello
date: 2013-03-12 21:23:31
summary: Explicitly set flags in repository_metadata records when a new tip has been uploaded that does not generate a new downloadable changeset revision.
affected #: 1 file
diff -r 9510a9b449c400ca441c8e1fccd66e6a71f22624 -r 4e08a83d7f9bacd20b956dc3e97810df6c19c730 lib/tool_shed/util/shed_util_common.py
--- a/lib/tool_shed/util/shed_util_common.py
+++ b/lib/tool_shed/util/shed_util_common.py
@@ -3837,6 +3837,30 @@
repository_metadata.changeset_revision = repository.tip( trans.app )
repository_metadata.metadata = metadata_dict
repository_metadata.downloadable = downloadable
+ if 'datatypes' in metadata_dict:
+ repository_metadata.includes_datatypes = True
+ else:
+ repository_metadata.includes_datatypes = False
+ if 'repository_dependencies' in metadata_dict:
+ repository_metadata.has_repository_dependencies = True
+ else:
+ repository_metadata.has_repository_dependencies = False
+ if 'tool_dependencies' in metadata_dict:
+ repository_metadata.includes_tool_dependencies = True
+ else:
+ repository_metadata.includes_tool_dependencies = False
+ if 'tools' in metadata_dict:
+ repository_metadata.includes_tools = True
+ else:
+ repository_metadata.includes_tools = False
+ if 'workflows' in metadata_dict:
+ repository_metadata.includes_workflows = True
+ else:
+ repository_metadata.includes_workflows = False
+ repository_metadata.do_not_test = False
+ repository_metadata.time_last_tested = None
+ repository_metadata.tools_functionally_correct = False
+ repository_metadata.tool_test_errors = None
trans.sa_session.add( repository_metadata )
trans.sa_session.flush()
else:
https://bitbucket.org/galaxy/galaxy-central/commits/1344cb5a4875/
changeset: 1344cb5a4875
user: inithello
date: 2013-03-12 21:23:48
summary: Fix for setting hours_between_check.
affected #: 1 file
diff -r 4e08a83d7f9bacd20b956dc3e97810df6c19c730 -r 1344cb5a487538671a652398ff254572b76e7719 lib/galaxy/config.py
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -70,7 +70,7 @@
self.enable_tool_shed_check = string_as_bool( kwargs.get( 'enable_tool_shed_check', False ) )
try:
self.hours_between_check = kwargs.get( 'hours_between_check', 12 )
- if isinstance( hours_between_check, float ):
+ if isinstance( self.hours_between_check, float ):
# Float values are supported for functional tests.
if self.hours_between_check < 0.001 or self.hours_between_check > 24.0:
self.hours_between_check = 12.0
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: history panel: remove display, edit, and delete buttons from hdas in the new state; pack scripts
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/9510a9b449c4/
changeset: 9510a9b449c4
user: carlfeberhard
date: 2013-03-12 21:14:37
summary: history panel: remove display, edit, and delete buttons from hdas in the new state; pack scripts
affected #: 4 files
diff -r e0e98d8937f4c01d65208dc65af9fe33bae62e0d -r 9510a9b449c400ca441c8e1fccd66e6a71f22624 static/scripts/mvc/dataset/hda-base.js
--- a/static/scripts/mvc/dataset/hda-base.js
+++ b/static/scripts/mvc/dataset/hda-base.js
@@ -201,6 +201,7 @@
// don't show display if not viewable or not accessible
// (do show if in error, running)
if( ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
+ || ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.NEW )
|| ( !this.model.get( 'accessible' ) ) ){
this.displayButton = null;
return null;
diff -r e0e98d8937f4c01d65208dc65af9fe33bae62e0d -r 9510a9b449c400ca441c8e1fccd66e6a71f22624 static/scripts/mvc/dataset/hda-edit.js
--- a/static/scripts/mvc/dataset/hda-edit.js
+++ b/static/scripts/mvc/dataset/hda-edit.js
@@ -99,8 +99,8 @@
// don't show edit while uploading, in-accessible
// DO show if in error (ala previous history panel)
//TODO??: not viewable/accessible are essentially the same (not viewable set from accessible)
- if( ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.UPLOAD )
- //|| ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.ERROR )
+ if( ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.NEW )
+ || ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.UPLOAD )
|| ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
|| ( !this.model.get( 'accessible' ) ) ){
this.editButton = null;
@@ -136,7 +136,8 @@
_render_deleteButton : function(){
// don't show delete if...
//TODO??: not viewable/accessible are essentially the same (not viewable set from accessible)
- if( ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
+ if( ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.NEW )
+ || ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
|| ( !this.model.get( 'accessible' ) ) ){
this.deleteButton = null;
return null;
diff -r e0e98d8937f4c01d65208dc65af9fe33bae62e0d -r 9510a9b449c400ca441c8e1fccd66e6a71f22624 static/scripts/packed/mvc/dataset/hda-base.js
--- a/static/scripts/packed/mvc/dataset/hda-base.js
+++ b/static/scripts/packed/mvc/dataset/hda-base.js
@@ -1,1 +1,1 @@
-var HDABaseView=BaseView.extend(LoggableMixin).extend({tagName:"div",className:"historyItemContainer",initialize:function(a){if(a.logger){this.logger=this.model.logger=a.logger}this.log(this+".initialize:",a);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton];if(!a.urlTemplates){throw ("HDAView needs urlTemplates on initialize")}this.urlTemplates=a.urlTemplates;this.expanded=a.expanded||false;this.model.bind("change",this.render,this)},render:function(){var b=this,e=this.model.get("id"),c=this.model.get("state"),a=$("<div/>").attr("id","historyItem-"+e),d=(this.$el.children().size()===0);this.$el.attr("id","historyItemContainer-"+e);this.urls=this._renderUrls(this.urlTemplates,this.model.toJSON());a.addClass("historyItemWrapper").addClass("historyItem").addClass("historyItem-"+c);a.append(this._render_warnings());a.append(this._render_titleBar());this._setUpBehaviors(a);this.body=$(this._render_body());a.append(this.body);this.$el.fadeOut("fast",function(){b.$el.children().remove();b.$el.append(a).fadeIn("fast",function(){b.log(b+" rendered:",b.$el);var f="rendered";if(d){f+=":initial"}else{if(b.model.inReadyState()){f+=":ready"}}b.trigger(f)})});return this},_renderUrls:function(d,a){var b=this,c={};_.each(d,function(e,f){if(_.isObject(e)){c[f]=b._renderUrls(e,a)}else{if(f==="meta_download"){c[f]=b._renderMetaDownloadUrls(e,a)}else{try{c[f]=_.template(e,a)}catch(g){throw (b+"._renderUrls error: "+g+"\n rendering:"+e+"\n with "+JSON.stringify(a))}}}});return c},_renderMetaDownloadUrls:function(b,a){return _.map(a.meta_files,function(c){return{url:_.template(b,{id:a.id,file_type:c.file_type}),file_type:c.file_type}})},_setUpBehaviors:function(a){a=a||this.$el;make_popup_menus(a);a.find(".tooltip").tooltip({placement:"bottom"})},_render_warnings:function(){return $(jQuery.trim(HDABaseView.templates.messages(this.model.toJSON())))},_render_titleBar:function(){var a=$('<div class="historyItemTitleBar" style="overflow: hidden"></div>');a.append(this._render_titleButtons());a.append('<span class="state-icon"></span>');a.append(this._render_titleLink());return a},_render_titleButtons:function(){var a=$('<div class="historyItemButtons"></div>');a.append(this._render_displayButton());return a},_render_displayButton:function(){if((this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.displayButton=null;return null}var a={icon_class:"display",target:"galaxy_main"};if(this.model.get("purged")){a.enabled=false;a.title=_l("Cannot display datasets removed from disk")}else{a.title=_l("Display data in browser");a.href=this.urls.display}this.displayButton=new IconButtonView({model:new IconButton(a)});return this.displayButton.render().$el},_render_titleLink:function(){return $(jQuery.trim(HDABaseView.templates.titleLink(_.extend(this.model.toJSON(),{urls:this.urls}))))},_render_hdaSummary:function(){var a=_.extend(this.model.toJSON(),{urls:this.urls});return HDABaseView.templates.hdaSummary(a)},_render_primaryActionButtons:function(c){var a=this,b=$("<div/>").attr("id","primary-actions-"+this.model.get("id"));_.each(c,function(d){b.append(d.call(a))});return b},_render_downloadButton:function(){if(this.model.get("purged")||!this.model.hasData()){return null}var a=HDABaseView.templates.downloadLinks(_.extend(this.model.toJSON(),{urls:this.urls}));return $(a)},_render_showParamsButton:function(){this.showParamsButton=new IconButtonView({model:new IconButton({title:_l("View details"),href:this.urls.show_params,target:"galaxy_main",icon_class:"information"})});return this.showParamsButton.render().$el},_render_displayApps:function(){if(!this.model.hasData()){return null}var a=$("<div/>").addClass("display-apps");if(!_.isEmpty(this.model.get("display_types"))){a.append(HDABaseView.templates.displayApps({displayApps:this.model.get("display_types")}))}if(!_.isEmpty(this.model.get("display_apps"))){a.append(HDABaseView.templates.displayApps({displayApps:this.model.get("display_apps")}))}return a},_render_peek:function(){var a=this.model.get("peek");if(!a){return null}return $("<div/>").append($("<pre/>").attr("id","peek"+this.model.get("id")).addClass("peek").append(a))},_render_body:function(){var a=$("<div/>").attr("id","info-"+this.model.get("id")).addClass("historyItemBody").attr("style","display: none");if(this.expanded){this._render_body_html(a);a.show()}return a},_render_body_html:function(a){a.html("");switch(this.model.get("state")){case HistoryDatasetAssociation.STATES.NEW:break;case HistoryDatasetAssociation.STATES.NOT_VIEWABLE:this._render_body_not_viewable(a);break;case HistoryDatasetAssociation.STATES.UPLOAD:this._render_body_uploading(a);break;case HistoryDatasetAssociation.STATES.PAUSED:this._render_body_paused(a);break;case HistoryDatasetAssociation.STATES.QUEUED:this._render_body_queued(a);break;case HistoryDatasetAssociation.STATES.RUNNING:this._render_body_running(a);break;case HistoryDatasetAssociation.STATES.ERROR:this._render_body_error(a);break;case HistoryDatasetAssociation.STATES.DISCARDED:this._render_body_discarded(a);break;case HistoryDatasetAssociation.STATES.SETTING_METADATA:this._render_body_setting_metadata(a);break;case HistoryDatasetAssociation.STATES.EMPTY:this._render_body_empty(a);break;case HistoryDatasetAssociation.STATES.FAILED_METADATA:this._render_body_failed_metadata(a);break;case HistoryDatasetAssociation.STATES.OK:this._render_body_ok(a);break;default:a.append($('<div>Error: unknown dataset state "'+this.model.get("state")+'".</div>'))}a.append('<div style="clear: both"></div>');this._setUpBehaviors(a)},_render_body_not_viewable:function(a){a.append($("<div>"+_l("You do not have permission to view dataset")+".</div>"))},_render_body_uploading:function(a){a.append($("<div>"+_l("Dataset is uploading")+"</div>"))},_render_body_queued:function(a){a.append($("<div>"+_l("Job is waiting to run")+".</div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_paused:function(a){a.append($("<div>"+_l("Job is paused. Use the history menu to resume")+".</div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_running:function(a){a.append("<div>"+_l("Job is currently running")+".</div>");a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_error:function(a){if(!this.model.get("purged")){a.append($("<div>"+this.model.get("misc_blurb")+"</div>"))}a.append((_l("An error occurred with this dataset")+": <i>"+$.trim(this.model.get("misc_info"))+"</i>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers.concat([this._render_downloadButton])))},_render_body_discarded:function(a){a.append("<div>"+_l("The job creating this dataset was cancelled before completion")+".</div>");a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_setting_metadata:function(a){a.append($("<div>"+_l("Metadata is being auto-detected")+".</div>"))},_render_body_empty:function(a){a.append($("<div>"+_l("No data")+": <i>"+this.model.get("misc_blurb")+"</i></div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_failed_metadata:function(a){a.append($(HDABaseView.templates.failedMetadata(_.extend(this.model.toJSON(),{urls:this.urls}))));this._render_body_ok(a)},_render_body_ok:function(a){a.append(this._render_hdaSummary());if(this.model.isDeletedOrPurged()){a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton]));return}a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton]));a.append('<div class="clear"/>');a.append(this._render_displayApps());a.append(this._render_peek())},events:{"click .historyItemTitle":"toggleBodyVisibility"},toggleBodyVisibility:function(c,a){var b=this;this.expanded=(a===undefined)?(!this.body.is(":visible")):(a);if(this.expanded){b._render_body_html(b.body);this.body.slideDown("fast",function(){b.trigger("body-expanded",b.model.get("id"))})}else{this.body.slideUp("fast",function(){b.trigger("body-collapsed",b.model.get("id"))})}},remove:function(b){var a=this;this.$el.fadeOut("fast",function(){a.$el.remove();if(b){b()}})},toString:function(){var a=(this.model)?(this.model+""):("(no model)");return"HDABaseView("+a+")"}});HDABaseView.templates={warningMsg:Handlebars.templates["template-warningmessagesmall"],messages:Handlebars.templates["template-hda-warning-messages"],titleLink:Handlebars.templates["template-hda-titleLink"],hdaSummary:Handlebars.templates["template-hda-hdaSummary"],downloadLinks:Handlebars.templates["template-hda-downloadLinks"],failedMetadata:Handlebars.templates["template-hda-failedMetadata"],displayApps:Handlebars.templates["template-hda-displayApps"]};
\ No newline at end of file
+var HDABaseView=BaseView.extend(LoggableMixin).extend({tagName:"div",className:"historyItemContainer",initialize:function(a){if(a.logger){this.logger=this.model.logger=a.logger}this.log(this+".initialize:",a);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton];if(!a.urlTemplates){throw ("HDAView needs urlTemplates on initialize")}this.urlTemplates=a.urlTemplates;this.expanded=a.expanded||false;this.model.bind("change",this.render,this)},render:function(){var b=this,e=this.model.get("id"),c=this.model.get("state"),a=$("<div/>").attr("id","historyItem-"+e),d=(this.$el.children().size()===0);this.$el.attr("id","historyItemContainer-"+e);this.urls=this._renderUrls(this.urlTemplates,this.model.toJSON());a.addClass("historyItemWrapper").addClass("historyItem").addClass("historyItem-"+c);a.append(this._render_warnings());a.append(this._render_titleBar());this._setUpBehaviors(a);this.body=$(this._render_body());a.append(this.body);this.$el.fadeOut("fast",function(){b.$el.children().remove();b.$el.append(a).fadeIn("fast",function(){b.log(b+" rendered:",b.$el);var f="rendered";if(d){f+=":initial"}else{if(b.model.inReadyState()){f+=":ready"}}b.trigger(f)})});return this},_renderUrls:function(d,a){var b=this,c={};_.each(d,function(e,f){if(_.isObject(e)){c[f]=b._renderUrls(e,a)}else{if(f==="meta_download"){c[f]=b._renderMetaDownloadUrls(e,a)}else{try{c[f]=_.template(e,a)}catch(g){throw (b+"._renderUrls error: "+g+"\n rendering:"+e+"\n with "+JSON.stringify(a))}}}});return c},_renderMetaDownloadUrls:function(b,a){return _.map(a.meta_files,function(c){return{url:_.template(b,{id:a.id,file_type:c.file_type}),file_type:c.file_type}})},_setUpBehaviors:function(a){a=a||this.$el;make_popup_menus(a);a.find(".tooltip").tooltip({placement:"bottom"})},_render_warnings:function(){return $(jQuery.trim(HDABaseView.templates.messages(this.model.toJSON())))},_render_titleBar:function(){var a=$('<div class="historyItemTitleBar" style="overflow: hidden"></div>');a.append(this._render_titleButtons());a.append('<span class="state-icon"></span>');a.append(this._render_titleLink());return a},_render_titleButtons:function(){var a=$('<div class="historyItemButtons"></div>');a.append(this._render_displayButton());return a},_render_displayButton:function(){if((this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(this.model.get("state")===HistoryDatasetAssociation.STATES.NEW)||(!this.model.get("accessible"))){this.displayButton=null;return null}var a={icon_class:"display",target:"galaxy_main"};if(this.model.get("purged")){a.enabled=false;a.title=_l("Cannot display datasets removed from disk")}else{a.title=_l("Display data in browser");a.href=this.urls.display}this.displayButton=new IconButtonView({model:new IconButton(a)});return this.displayButton.render().$el},_render_titleLink:function(){return $(jQuery.trim(HDABaseView.templates.titleLink(_.extend(this.model.toJSON(),{urls:this.urls}))))},_render_hdaSummary:function(){var a=_.extend(this.model.toJSON(),{urls:this.urls});return HDABaseView.templates.hdaSummary(a)},_render_primaryActionButtons:function(c){var a=this,b=$("<div/>").attr("id","primary-actions-"+this.model.get("id"));_.each(c,function(d){b.append(d.call(a))});return b},_render_downloadButton:function(){if(this.model.get("purged")||!this.model.hasData()){return null}var a=HDABaseView.templates.downloadLinks(_.extend(this.model.toJSON(),{urls:this.urls}));return $(a)},_render_showParamsButton:function(){this.showParamsButton=new IconButtonView({model:new IconButton({title:_l("View details"),href:this.urls.show_params,target:"galaxy_main",icon_class:"information"})});return this.showParamsButton.render().$el},_render_displayApps:function(){if(!this.model.hasData()){return null}var a=$("<div/>").addClass("display-apps");if(!_.isEmpty(this.model.get("display_types"))){a.append(HDABaseView.templates.displayApps({displayApps:this.model.get("display_types")}))}if(!_.isEmpty(this.model.get("display_apps"))){a.append(HDABaseView.templates.displayApps({displayApps:this.model.get("display_apps")}))}return a},_render_peek:function(){var a=this.model.get("peek");if(!a){return null}return $("<div/>").append($("<pre/>").attr("id","peek"+this.model.get("id")).addClass("peek").append(a))},_render_body:function(){var a=$("<div/>").attr("id","info-"+this.model.get("id")).addClass("historyItemBody").attr("style","display: none");if(this.expanded){this._render_body_html(a);a.show()}return a},_render_body_html:function(a){a.html("");switch(this.model.get("state")){case HistoryDatasetAssociation.STATES.NEW:this._render_body_new(a);break;case HistoryDatasetAssociation.STATES.NOT_VIEWABLE:this._render_body_not_viewable(a);break;case HistoryDatasetAssociation.STATES.UPLOAD:this._render_body_uploading(a);break;case HistoryDatasetAssociation.STATES.PAUSED:this._render_body_paused(a);break;case HistoryDatasetAssociation.STATES.QUEUED:this._render_body_queued(a);break;case HistoryDatasetAssociation.STATES.RUNNING:this._render_body_running(a);break;case HistoryDatasetAssociation.STATES.ERROR:this._render_body_error(a);break;case HistoryDatasetAssociation.STATES.DISCARDED:this._render_body_discarded(a);break;case HistoryDatasetAssociation.STATES.SETTING_METADATA:this._render_body_setting_metadata(a);break;case HistoryDatasetAssociation.STATES.EMPTY:this._render_body_empty(a);break;case HistoryDatasetAssociation.STATES.FAILED_METADATA:this._render_body_failed_metadata(a);break;case HistoryDatasetAssociation.STATES.OK:this._render_body_ok(a);break;default:a.append($('<div>Error: unknown dataset state "'+this.model.get("state")+'".</div>'))}a.append('<div style="clear: both"></div>');this._setUpBehaviors(a)},_render_body_new:function(b){var a="This is a new dataset and not all of its data are available yet";b.append($("<div>"+_l(a)+"</div>"))},_render_body_not_viewable:function(a){a.append($("<div>"+_l("You do not have permission to view dataset")+"</div>"))},_render_body_uploading:function(a){a.append($("<div>"+_l("Dataset is uploading")+"</div>"))},_render_body_queued:function(a){a.append($("<div>"+_l("Job is waiting to run")+"</div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_paused:function(a){a.append($("<div>"+_l("Job is paused. Use the history menu to resume")+"</div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_running:function(a){a.append("<div>"+_l("Job is currently running")+"</div>");a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_error:function(a){if(!this.model.get("purged")){a.append($("<div>"+this.model.get("misc_blurb")+"</div>"))}a.append((_l("An error occurred with this dataset")+": <i>"+$.trim(this.model.get("misc_info"))+"</i>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers.concat([this._render_downloadButton])))},_render_body_discarded:function(a){a.append("<div>"+_l("The job creating this dataset was cancelled before completion")+".</div>");a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_setting_metadata:function(a){a.append($("<div>"+_l("Metadata is being auto-detected")+".</div>"))},_render_body_empty:function(a){a.append($("<div>"+_l("No data")+": <i>"+this.model.get("misc_blurb")+"</i></div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_failed_metadata:function(a){a.append($(HDABaseView.templates.failedMetadata(_.extend(this.model.toJSON(),{urls:this.urls}))));this._render_body_ok(a)},_render_body_ok:function(a){a.append(this._render_hdaSummary());if(this.model.isDeletedOrPurged()){a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton]));return}a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton]));a.append('<div class="clear"/>');a.append(this._render_displayApps());a.append(this._render_peek())},events:{"click .historyItemTitle":"toggleBodyVisibility"},toggleBodyVisibility:function(c,a){var b=this;this.expanded=(a===undefined)?(!this.body.is(":visible")):(a);if(this.expanded){b._render_body_html(b.body);this.body.slideDown("fast",function(){b.trigger("body-expanded",b.model.get("id"))})}else{this.body.slideUp("fast",function(){b.trigger("body-collapsed",b.model.get("id"))})}},remove:function(b){var a=this;this.$el.fadeOut("fast",function(){a.$el.remove();if(b){b()}})},toString:function(){var a=(this.model)?(this.model+""):("(no model)");return"HDABaseView("+a+")"}});HDABaseView.templates={warningMsg:Handlebars.templates["template-warningmessagesmall"],messages:Handlebars.templates["template-hda-warning-messages"],titleLink:Handlebars.templates["template-hda-titleLink"],hdaSummary:Handlebars.templates["template-hda-hdaSummary"],downloadLinks:Handlebars.templates["template-hda-downloadLinks"],failedMetadata:Handlebars.templates["template-hda-failedMetadata"],displayApps:Handlebars.templates["template-hda-displayApps"]};
\ No newline at end of file
diff -r e0e98d8937f4c01d65208dc65af9fe33bae62e0d -r 9510a9b449c400ca441c8e1fccd66e6a71f22624 static/scripts/packed/mvc/dataset/hda-edit.js
--- a/static/scripts/packed/mvc/dataset/hda-edit.js
+++ b/static/scripts/packed/mvc/dataset/hda-edit.js
@@ -1,1 +1,1 @@
-var HDAEditView=HDABaseView.extend(LoggableMixin).extend({initialize:function(a){HDABaseView.prototype.initialize.call(this,a);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton,this._render_rerunButton]},_setUpBehaviors:function(c){HDABaseView.prototype._setUpBehaviors.call(this,c);var a=this,b=this.urls.purge,d=c.find("#historyItemPurger-"+this.model.get("id"));if(d){d.attr("href",["javascript","void(0)"].join(":"));d.click(function(e){var f=jQuery.ajax(b);f.success(function(i,g,h){a.model.set("purged",true)});f.error(function(h,g,i){alert("("+h.status+") Unable to purge this dataset:\n"+i)})})}},_render_warnings:function(){return $(jQuery.trim(HDABaseView.templates.messages(_.extend(this.model.toJSON(),{urls:this.urls}))))},_render_titleButtons:function(){var a=$('<div class="historyItemButtons"></div>');a.append(this._render_displayButton());a.append(this._render_editButton());a.append(this._render_deleteButton());return a},_render_editButton:function(){if((this.model.get("state")===HistoryDatasetAssociation.STATES.UPLOAD)||(this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.editButton=null;return null}var c=this.model.get("purged"),a=this.model.get("deleted"),b={title:_l("Edit Attributes"),href:this.urls.edit,target:"galaxy_main",icon_class:"edit"};if(a||c){b.enabled=false;if(c){b.title=_l("Cannot edit attributes of datasets removed from disk")}else{if(a){b.title=_l("Undelete dataset to edit attributes")}}}this.editButton=new IconButtonView({model:new IconButton(b)});return this.editButton.render().$el},_render_deleteButton:function(){if((this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.deleteButton=null;return null}var a=this,b=a.urls["delete"],c={title:_l("Delete"),href:b,id:"historyItemDeleter-"+this.model.get("id"),icon_class:"delete",on_click:function(){$.ajax({url:b,type:"POST",error:function(){a.$el.show()},success:function(){a.model.set({deleted:true})}})}};if(this.model.get("deleted")||this.model.get("purged")){c={title:_l("Dataset is already deleted"),icon_class:"delete",enabled:false}}this.deleteButton=new IconButtonView({model:new IconButton(c)});return this.deleteButton.render().$el},_render_hdaSummary:function(){var a=_.extend(this.model.toJSON(),{urls:this.urls});if(this.model.get("metadata_dbkey")==="?"&&!this.model.isDeletedOrPurged()){_.extend(a,{dbkey_unknown_and_editable:true})}return HDABaseView.templates.hdaSummary(a)},_render_errButton:function(){if(this.model.get("state")!==HistoryDatasetAssociation.STATES.ERROR){this.errButton=null;return null}this.errButton=new IconButtonView({model:new IconButton({title:_l("View or report this error"),href:this.urls.report_error,target:"galaxy_main",icon_class:"bug"})});return this.errButton.render().$el},_render_rerunButton:function(){this.rerunButton=new IconButtonView({model:new IconButton({title:_l("Run this job again"),href:this.urls.rerun,target:"galaxy_main",icon_class:"arrow-circle"})});return this.rerunButton.render().$el},_render_visualizationsButton:function(){var c=this.model.get("dbkey"),a=this.model.get("visualizations"),f=this.urls.visualization,d={},g={dataset_id:this.model.get("id"),hda_ldda:"hda"};if(c){g.dbkey=c}if(!(this.model.hasData())||!(a&&a.length)||!(f)){this.visualizationsButton=null;return null}this.visualizationsButton=new IconButtonView({model:new IconButton({title:_l("Visualize"),href:f,icon_class:"chart_curve"})});var b=this.visualizationsButton.render().$el;b.addClass("visualize-icon");function e(h){switch(h){case"trackster":return create_trackster_action_fn(f,g,c);case"scatterplot":return create_scatterplot_action_fn(f,g);default:return function(){window.parent.location=f+"/"+h+"?"+$.param(g)}}}if(a.length===1){b.attr("title",a[0]);b.click(e(a[0]))}else{_.each(a,function(i){var h=i.charAt(0).toUpperCase()+i.slice(1);d[_l(h)]=e(i)});make_popupmenu(b,d)}return b},_render_secondaryActionButtons:function(b){var c=$("<div/>"),a=this;c.attr("style","float: right;").attr("id","secondary-actions-"+this.model.get("id"));_.each(b,function(d){c.append(d.call(a))});return c},_render_tagButton:function(){if(!(this.model.hasData())||(!this.urls.tags.get)){this.tagButton=null;return null}this.tagButton=new IconButtonView({model:new IconButton({title:_l("Edit dataset tags"),target:"galaxy_main",href:this.urls.tags.get,icon_class:"tags"})});return this.tagButton.render().$el},_render_annotateButton:function(){if(!(this.model.hasData())||(!this.urls.annotation.get)){this.annotateButton=null;return null}this.annotateButton=new IconButtonView({model:new IconButton({title:_l("Edit dataset annotation"),target:"galaxy_main",icon_class:"annotate"})});return this.annotateButton.render().$el},_render_tagArea:function(){if(!this.urls.tags.set){return null}return $(HDAEditView.templates.tagArea(_.extend(this.model.toJSON(),{urls:this.urls})))},_render_annotationArea:function(){if(!this.urls.annotation.get){return null}return $(HDAEditView.templates.annotationArea(_.extend(this.model.toJSON(),{urls:this.urls})))},_render_body_error:function(a){HDABaseView.prototype._render_body_error.call(this,a);var b=a.find("#primary-actions-"+this.model.get("id"));b.prepend(this._render_errButton())},_render_body_ok:function(a){a.append(this._render_hdaSummary());if(this.model.isDeletedOrPurged()){a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton,this._render_rerunButton]));return}a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton,this._render_rerunButton,this._render_visualizationsButton]));a.append(this._render_secondaryActionButtons([this._render_tagButton,this._render_annotateButton]));a.append('<div class="clear"/>');a.append(this._render_tagArea());a.append(this._render_annotationArea());a.append(this._render_displayApps());a.append(this._render_peek())},events:{"click .historyItemTitle":"toggleBodyVisibility","click a.icon-button.tags":"loadAndDisplayTags","click a.icon-button.annotate":"loadAndDisplayAnnotation"},loadAndDisplayTags:function(b){this.log(this+".loadAndDisplayTags",b);var c=this.$el.find(".tag-area"),a=c.find(".tag-elt");if(c.is(":hidden")){if(!jQuery.trim(a.html())){$.ajax({url:this.urls.tags.get,error:function(){alert(_l("Tagging failed"))},success:function(d){a.html(d);a.find(".tooltip").tooltip();c.slideDown("fast")}})}else{c.slideDown("fast")}}else{c.slideUp("fast")}return false},loadAndDisplayAnnotation:function(b){this.log(this+".loadAndDisplayAnnotation",b);var d=this.$el.find(".annotation-area"),c=d.find(".annotation-elt"),a=this.urls.annotation.set;if(d.is(":hidden")){if(!jQuery.trim(c.html())){$.ajax({url:this.urls.annotation.get,error:function(){alert(_l("Annotations failed"))},success:function(e){if(e===""){e="<em>"+_l("Describe or add notes to dataset")+"</em>"}c.html(e);d.find(".tooltip").tooltip();async_save_text(c.attr("id"),c.attr("id"),a,"new_annotation",18,true,4);d.slideDown("fast")}})}else{d.slideDown("fast")}}else{d.slideUp("fast")}return false},toString:function(){var a=(this.model)?(this.model+""):("(no model)");return"HDAView("+a+")"}});HDAEditView.templates={tagArea:Handlebars.templates["template-hda-tagArea"],annotationArea:Handlebars.templates["template-hda-annotationArea"]};function create_scatterplot_action_fn(a,b){action=function(){var d=$(window.parent.document).find("iframe#galaxy_main"),c=a+"/scatterplot?"+$.param(b);d.attr("src",c);$("div.popmenu-wrapper").remove();return false};return action}function create_trackster_action_fn(a,c,b){return function(){var d={};if(b){d["f-dbkey"]=b}$.ajax({url:a+"/list_tracks?"+$.param(d),dataType:"html",error:function(){alert(_l("Could not add this dataset to browser")+".")},success:function(e){var f=window.parent;f.show_modal(_l("View Data in a New or Saved Visualization"),"",{Cancel:function(){f.hide_modal()},"View in saved visualization":function(){f.show_modal(_l("Add Data to Saved Visualization"),e,{Cancel:function(){f.hide_modal()},"Add to visualization":function(){$(f.document).find("input[name=id]:checked").each(function(){var g=$(this).val();c.id=g;f.location=a+"/trackster?"+$.param(c)})}})},"View in new visualization":function(){f.location=a+"/trackster?"+$.param(c)}})}});return false}};
\ No newline at end of file
+var HDAEditView=HDABaseView.extend(LoggableMixin).extend({initialize:function(a){HDABaseView.prototype.initialize.call(this,a);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton,this._render_rerunButton]},_setUpBehaviors:function(c){HDABaseView.prototype._setUpBehaviors.call(this,c);var a=this,b=this.urls.purge,d=c.find("#historyItemPurger-"+this.model.get("id"));if(d){d.attr("href",["javascript","void(0)"].join(":"));d.click(function(e){var f=jQuery.ajax(b);f.success(function(i,g,h){a.model.set("purged",true)});f.error(function(h,g,i){alert("("+h.status+") Unable to purge this dataset:\n"+i)})})}},_render_warnings:function(){return $(jQuery.trim(HDABaseView.templates.messages(_.extend(this.model.toJSON(),{urls:this.urls}))))},_render_titleButtons:function(){var a=$('<div class="historyItemButtons"></div>');a.append(this._render_displayButton());a.append(this._render_editButton());a.append(this._render_deleteButton());return a},_render_editButton:function(){if((this.model.get("state")===HistoryDatasetAssociation.STATES.NEW)||(this.model.get("state")===HistoryDatasetAssociation.STATES.UPLOAD)||(this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.editButton=null;return null}var c=this.model.get("purged"),a=this.model.get("deleted"),b={title:_l("Edit Attributes"),href:this.urls.edit,target:"galaxy_main",icon_class:"edit"};if(a||c){b.enabled=false;if(c){b.title=_l("Cannot edit attributes of datasets removed from disk")}else{if(a){b.title=_l("Undelete dataset to edit attributes")}}}this.editButton=new IconButtonView({model:new IconButton(b)});return this.editButton.render().$el},_render_deleteButton:function(){if((this.model.get("state")===HistoryDatasetAssociation.STATES.NEW)||(this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.deleteButton=null;return null}var a=this,b=a.urls["delete"],c={title:_l("Delete"),href:b,id:"historyItemDeleter-"+this.model.get("id"),icon_class:"delete",on_click:function(){$.ajax({url:b,type:"POST",error:function(){a.$el.show()},success:function(){a.model.set({deleted:true})}})}};if(this.model.get("deleted")||this.model.get("purged")){c={title:_l("Dataset is already deleted"),icon_class:"delete",enabled:false}}this.deleteButton=new IconButtonView({model:new IconButton(c)});return this.deleteButton.render().$el},_render_hdaSummary:function(){var a=_.extend(this.model.toJSON(),{urls:this.urls});if(this.model.get("metadata_dbkey")==="?"&&!this.model.isDeletedOrPurged()){_.extend(a,{dbkey_unknown_and_editable:true})}return HDABaseView.templates.hdaSummary(a)},_render_errButton:function(){if(this.model.get("state")!==HistoryDatasetAssociation.STATES.ERROR){this.errButton=null;return null}this.errButton=new IconButtonView({model:new IconButton({title:_l("View or report this error"),href:this.urls.report_error,target:"galaxy_main",icon_class:"bug"})});return this.errButton.render().$el},_render_rerunButton:function(){this.rerunButton=new IconButtonView({model:new IconButton({title:_l("Run this job again"),href:this.urls.rerun,target:"galaxy_main",icon_class:"arrow-circle"})});return this.rerunButton.render().$el},_render_visualizationsButton:function(){var c=this.model.get("dbkey"),a=this.model.get("visualizations"),f=this.urls.visualization,d={},g={dataset_id:this.model.get("id"),hda_ldda:"hda"};if(c){g.dbkey=c}if(!(this.model.hasData())||!(a&&a.length)||!(f)){this.visualizationsButton=null;return null}this.visualizationsButton=new IconButtonView({model:new IconButton({title:_l("Visualize"),href:f,icon_class:"chart_curve"})});var b=this.visualizationsButton.render().$el;b.addClass("visualize-icon");function e(h){switch(h){case"trackster":return create_trackster_action_fn(f,g,c);case"scatterplot":return create_scatterplot_action_fn(f,g);default:return function(){window.parent.location=f+"/"+h+"?"+$.param(g)}}}if(a.length===1){b.attr("title",a[0]);b.click(e(a[0]))}else{_.each(a,function(i){var h=i.charAt(0).toUpperCase()+i.slice(1);d[_l(h)]=e(i)});make_popupmenu(b,d)}return b},_render_secondaryActionButtons:function(b){var c=$("<div/>"),a=this;c.attr("style","float: right;").attr("id","secondary-actions-"+this.model.get("id"));_.each(b,function(d){c.append(d.call(a))});return c},_render_tagButton:function(){if(!(this.model.hasData())||(!this.urls.tags.get)){this.tagButton=null;return null}this.tagButton=new IconButtonView({model:new IconButton({title:_l("Edit dataset tags"),target:"galaxy_main",href:this.urls.tags.get,icon_class:"tags"})});return this.tagButton.render().$el},_render_annotateButton:function(){if(!(this.model.hasData())||(!this.urls.annotation.get)){this.annotateButton=null;return null}this.annotateButton=new IconButtonView({model:new IconButton({title:_l("Edit dataset annotation"),target:"galaxy_main",icon_class:"annotate"})});return this.annotateButton.render().$el},_render_tagArea:function(){if(!this.urls.tags.set){return null}return $(HDAEditView.templates.tagArea(_.extend(this.model.toJSON(),{urls:this.urls})))},_render_annotationArea:function(){if(!this.urls.annotation.get){return null}return $(HDAEditView.templates.annotationArea(_.extend(this.model.toJSON(),{urls:this.urls})))},_render_body_error:function(a){HDABaseView.prototype._render_body_error.call(this,a);var b=a.find("#primary-actions-"+this.model.get("id"));b.prepend(this._render_errButton())},_render_body_ok:function(a){a.append(this._render_hdaSummary());if(this.model.isDeletedOrPurged()){a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton,this._render_rerunButton]));return}a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton,this._render_rerunButton,this._render_visualizationsButton]));a.append(this._render_secondaryActionButtons([this._render_tagButton,this._render_annotateButton]));a.append('<div class="clear"/>');a.append(this._render_tagArea());a.append(this._render_annotationArea());a.append(this._render_displayApps());a.append(this._render_peek())},events:{"click .historyItemTitle":"toggleBodyVisibility","click a.icon-button.tags":"loadAndDisplayTags","click a.icon-button.annotate":"loadAndDisplayAnnotation"},loadAndDisplayTags:function(b){this.log(this+".loadAndDisplayTags",b);var c=this.$el.find(".tag-area"),a=c.find(".tag-elt");if(c.is(":hidden")){if(!jQuery.trim(a.html())){$.ajax({url:this.urls.tags.get,error:function(){alert(_l("Tagging failed"))},success:function(d){a.html(d);a.find(".tooltip").tooltip();c.slideDown("fast")}})}else{c.slideDown("fast")}}else{c.slideUp("fast")}return false},loadAndDisplayAnnotation:function(b){this.log(this+".loadAndDisplayAnnotation",b);var d=this.$el.find(".annotation-area"),c=d.find(".annotation-elt"),a=this.urls.annotation.set;if(d.is(":hidden")){if(!jQuery.trim(c.html())){$.ajax({url:this.urls.annotation.get,error:function(){alert(_l("Annotations failed"))},success:function(e){if(e===""){e="<em>"+_l("Describe or add notes to dataset")+"</em>"}c.html(e);d.find(".tooltip").tooltip();async_save_text(c.attr("id"),c.attr("id"),a,"new_annotation",18,true,4);d.slideDown("fast")}})}else{d.slideDown("fast")}}else{d.slideUp("fast")}return false},toString:function(){var a=(this.model)?(this.model+""):("(no model)");return"HDAView("+a+")"}});HDAEditView.templates={tagArea:Handlebars.templates["template-hda-tagArea"],annotationArea:Handlebars.templates["template-hda-annotationArea"]};function create_scatterplot_action_fn(a,b){action=function(){var d=$(window.parent.document).find("iframe#galaxy_main"),c=a+"/scatterplot?"+$.param(b);d.attr("src",c);$("div.popmenu-wrapper").remove();return false};return action}function create_trackster_action_fn(a,c,b){return function(){var d={};if(b){d["f-dbkey"]=b}$.ajax({url:a+"/list_tracks?"+$.param(d),dataType:"html",error:function(){alert(_l("Could not add this dataset to browser")+".")},success:function(e){var f=window.parent;f.show_modal(_l("View Data in a New or Saved Visualization"),"",{Cancel:function(){f.hide_modal()},"View in saved visualization":function(){f.show_modal(_l("Add Data to Saved Visualization"),e,{Cancel:function(){f.hide_modal()},"Add to visualization":function(){$(f.document).find("input[name=id]:checked").each(function(){var g=$(this).val();c.id=g;f.location=a+"/trackster?"+$.param(c)})}})},"View in new visualization":function(){f.location=a+"/trackster?"+$.param(c)}})}});return false}};
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e0e98d8937f4/
changeset: e0e98d8937f4
user: dannon
date: 2013-03-12 20:39:52
summary: Remove unused import.
affected #: 1 file
diff -r a9cb31de456c2e9bcdb1022adc1fc972df7bc73a -r e0e98d8937f4c01d65208dc65af9fe33bae62e0d lib/galaxy/webapps/galaxy/controllers/tool_runner.py
--- a/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
+++ b/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
@@ -12,7 +12,6 @@
from galaxy.tools.parameters.basic import DataToolParameter, UnvalidatedValue
from galaxy.util.bunch import Bunch
from galaxy.util.hash_util import is_hashable
-from galaxy.util import biostar
from galaxy.web import error, url_for
from galaxy.web.base.controller import BaseUIController
from galaxy.web.form_builder import SelectField
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Do not display empty Sections in the workflow editor tool list.
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a9cb31de456c/
changeset: a9cb31de456c
user: dan
date: 2013-03-12 20:37:05
summary: Do not display empty Sections in the workflow editor tool list.
affected #: 1 file
diff -r ad68e867b900920043d75e109e36e24f88d7a698 -r a9cb31de456c2e9bcdb1022adc1fc972df7bc73a templates/webapps/galaxy/workflow/editor.mako
--- a/templates/webapps/galaxy/workflow/editor.mako
+++ b/templates/webapps/galaxy/workflow/editor.mako
@@ -909,7 +909,7 @@
<div class="toolSectionWrapper">
%if key.startswith( 'tool' ):
${render_tool( val, False )}
- %elif key.startswith( 'section' ):
+ %elif key.startswith( 'section' ) and val.elems:
<% section = val %><div class="toolSectionTitle" id="title_${section.id}"><span>${section.name}</span>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Add Data Manager Tools to the workflow editor tool list, when user is admin.
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ad68e867b900/
changeset: ad68e867b900
user: dan
date: 2013-03-12 20:32:32
summary: Add Data Manager Tools to the workflow editor tool list, when user is admin.
affected #: 1 file
diff -r a8caad109542661a7222c504a529ab5afbe303fb -r ad68e867b900920043d75e109e36e24f88d7a698 templates/webapps/galaxy/workflow/editor.mako
--- a/templates/webapps/galaxy/workflow/editor.mako
+++ b/templates/webapps/galaxy/workflow/editor.mako
@@ -930,6 +930,23 @@
%endif
</div>
%endfor
+ ## Data Manager Tools
+ %if trans.user_is_admin() and trans.app.data_managers.data_managers:
+ <div> </div>
+ <div class="toolSectionWrapper">
+ <div class="toolSectionTitle" id="title___DATA_MANAGER_TOOLS__">
+ <span>Data Manager Tools</span>
+ </div>
+ <div id="__DATA_MANAGER_TOOLS__" class="toolSectionBody">
+ <div class="toolSectionBg">
+ %for data_manager_id, data_manager_val in trans.app.data_managers.data_managers.items():
+ ${ render_tool( data_manager_val.tool, True ) }
+ %endfor
+ </div>
+ </div>
+ </div>
+ %endif
+ ## End Data Manager Tools
</div>
## Feedback when search returns no results.
<div id="search-no-results" style="display: none; padding-top: 5px">
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: james_taylor: biostar: support for asking questions with integrated authentication, still need support for landing page and search
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a8caad109542/
changeset: a8caad109542
user: james_taylor
date: 2013-03-12 20:14:25
summary: biostar: support for asking questions with integrated authentication, still need support for landing page and search
affected #: 7 files
diff -r a7475ad6ecfc0f1fcdab3cfacce586a107aa8057 -r a8caad109542661a7222c504a529ab5afbe303fb lib/galaxy/config.py
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -254,7 +254,9 @@
amqp_config = {}
for k, v in amqp_config:
self.amqp[k] = v
- self.biostar = kwargs.get( 'biostar', None )
+ self.biostar_url = kwargs.get( 'biostar_url', None )
+ self.biostar_key_name = kwargs.get( 'biostar_key_name', None )
+ self.biostar_key = kwargs.get( 'biostar_key', None )
self.running_functional_tests = string_as_bool( kwargs.get( 'running_functional_tests', False ) )
# Experimental: This will not be enabled by default and will hide
# nonproduction code.
diff -r a7475ad6ecfc0f1fcdab3cfacce586a107aa8057 -r a8caad109542661a7222c504a529ab5afbe303fb lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -402,6 +402,30 @@
self.app.model.ToolShedRepository.table.c.owner == owner,
self.app.model.ToolShedRepository.table.c.installed_changeset_revision == installed_changeset_revision ) ) \
.first()
+
+ def get_tool_components( self, tool_id, tool_version=None, get_loaded_tools_by_lineage=False, set_selected=False ):
+ """
+ Retrieve all loaded versions of a tool from the toolbox and return a select list enabling selection of a different version, the list of the tool's
+ loaded versions, and the specified tool.
+ """
+ toolbox = self
+ tool_version_select_field = None
+ tools = []
+ tool = None
+ # Backwards compatibility for datasource tools that have default tool_id configured, but which are now using only GALAXY_URL.
+ tool_ids = listify( tool_id )
+ for tool_id in tool_ids:
+ if get_loaded_tools_by_lineage:
+ tools = toolbox.get_loaded_tools_by_lineage( tool_id )
+ else:
+ tools = toolbox.get_tool( tool_id, tool_version=tool_version, get_all_versions=True )
+ if tools:
+ tool = toolbox.get_tool( tool_id, tool_version=tool_version, get_all_versions=False )
+ if len( tools ) > 1:
+ tool_version_select_field = self.build_tool_version_select_field( tools, tool.id, set_selected )
+ break
+ return tool_version_select_field, tools, tool
+
def load_tool_tag_set( self, elem, panel_dict, integrated_panel_dict, tool_path, load_panel_dict, guid=None, index=None ):
try:
path = elem.get( "file" )
diff -r a7475ad6ecfc0f1fcdab3cfacce586a107aa8057 -r a8caad109542661a7222c504a529ab5afbe303fb lib/galaxy/webapps/galaxy/controllers/biostar.py
--- /dev/null
+++ b/lib/galaxy/webapps/galaxy/controllers/biostar.py
@@ -0,0 +1,86 @@
+"""
+Support for integration with the Biostar Q&A application
+"""
+
+from galaxy.web.base.controller import BaseUIController, url_for, error, web
+
+import base64
+import json
+import hmac
+
+# Biostar requires all keys to be present, so we start with a template
+DEFAULT_PAYLOAD = {
+ 'email': "",
+ 'title': "Question about Galaxy",
+ 'tags': 'galaxy',
+ 'tool_name': '',
+ 'tool_version': '',
+ 'tool_id': ''
+}
+
+def encode_data( key, data ):
+ """
+ Encode data to send a question to Biostar
+ """
+ text = json.dumps(data)
+ text = base64.urlsafe_b64encode(text)
+ digest = hmac.new(key, text).hexdigest()
+ return text, digest
+
+
+class BiostarController( BaseUIController ):
+ """
+ Provides integration with Biostar through external authentication, see: http://liondb.com/help/x/
+ """
+
+ @web.expose
+ def biostar_redirect( self, trans, payload={}, biostar_action=None ):
+ """
+ Generate a redirect to a Biostar site using external authentication to
+ pass Galaxy user information and information about a specific tool.
+ """
+ # Ensure biostar integration is enabled
+ if not trans.app.config.biostar_url:
+ return error( "Biostar integration is not enabled" )
+ # Start building up the payload
+ payload = dict( DEFAULT_PAYLOAD, **payload )
+ # Do the best we can of providing user information for the payload
+ if trans.user:
+ payload['email'] = trans.user.email
+ if trans.user.username:
+ payload['username'] = trans.user.username
+ payload['display_name'] = trans.user.username
+ else:
+ payload['display_name'] = "Galaxy User"
+ else:
+ payload['username'] = payload['display_name'] = "Anonymous Galaxy User %d" % trans.galaxy_session.id
+ data, digest = encode_data( trans.app.config.biostar_key, payload )
+ return trans.response.send_redirect( url_for( trans.app.config.biostar_url, data=data, digest=digest, name=trans.app.config.biostar_key_name, action=biostar_action ) )
+
+ @web.expose
+ def biostar_question_redirect( self, trans, payload={} ):
+ """
+ Generate a redirect to a Biostar site using external authentication to
+ pass Galaxy user information and information about a specific tool.
+ """
+ return self.biostar_redirect( trans, payload=payload, biostar_action='new' )
+
+ @web.expose
+ def biostar_tool_question_redirect( self, trans, tool_id=None ):
+ """
+ Generate a redirect to a Biostar site using external authentication to
+ pass Galaxy user information and information about a specific tool.
+ """
+ # tool_id is required
+ if tool_id is None:
+ return error( "No tool_id provided" )
+ # Load the tool
+ tool_version_select_field, tools, tool = \
+ self.app.toolbox.get_tool_components( tool_id, tool_version=None, get_loaded_tools_by_lineage=False, set_selected=True )
+ # No matching tool, unlikely
+ if not tool:
+ return error( "No tool found matching '%s'" % tool_id )
+ # Tool specific information for payload
+ payload = { 'title': "Question about Galaxy tool '%s'" % tool.name, 'tool_name': tool.name, 'tool_version': tool.version, 'tool_id': tool.id }
+ # Pass on to regular question method
+ return self.biostar_question_redirect( trans, payload )
\ No newline at end of file
diff -r a7475ad6ecfc0f1fcdab3cfacce586a107aa8057 -r a8caad109542661a7222c504a529ab5afbe303fb lib/galaxy/webapps/galaxy/controllers/root.py
--- a/lib/galaxy/webapps/galaxy/controllers/root.py
+++ b/lib/galaxy/webapps/galaxy/controllers/root.py
@@ -26,28 +26,26 @@
params=kwd )
## ---- Tool related -----------------------------------------------------
-
+
@web.expose
def tool_menu( self, trans ):
if trans.app.config.require_login and not trans.user:
- return trans.fill_template( '/no_access.mako', message = 'Please log in to access Galaxy tools.' )
- else:
- ## Get most recently used tools.
- toolbox = self.get_toolbox()
- recent_tools = []
- if trans.user:
- for row in trans.sa_session.query( self.app.model.Job.tool_id ). \
- filter( self.app.model.Job.user==trans.user ). \
- order_by( self.app.model.Job.create_time.desc() ):
- tool_id = row[0]
- a_tool = toolbox.get_tool( tool_id )
- if a_tool and not a_tool.hidden and a_tool not in recent_tools:
- recent_tools.append( a_tool )
- ## TODO: make number of recently used tools a user preference.
- if len ( recent_tools ) == 5:
- break
-
- return trans.fill_template('/root/tool_menu.mako', toolbox=toolbox, recent_tools=recent_tools )
+ return trans.fill_template( '/no_access.mako', message='Please log in to access Galaxy tools.' )
+ toolbox = self.get_toolbox()
+ ## Get most recently used tools.
+ # recent_tools = []
+ # if trans.user:
+ # for row in trans.sa_session.query( self.app.model.Job.tool_id ) \
+ # .filter( self.app.model.Job.user == trans.user ) \
+ # .order_by( self.app.model.Job.create_time.desc() ):
+ # tool_id = row[0]
+ # a_tool = toolbox.get_tool( tool_id )
+ # if a_tool and not a_tool.hidden and a_tool not in recent_tools:
+ # recent_tools.append( a_tool )
+ # ## TODO: make number of recently used tools a user preference.
+ # if len( recent_tools ) == 5:
+ # break
+ return trans.fill_template( '/root/tool_menu.mako', toolbox=toolbox )
@web.json
def tool_search( self, trans, **kwd ):
@@ -215,7 +213,7 @@
"html": unicode( trans.fill_template( "root/history_item.mako", data=data, hid=data.hid ), 'utf-8' ),
"force_history_refresh": force_history_refresh
}
-
+
return rval
@web.json
@@ -231,7 +229,7 @@
def __user_get_usage( self, trans ):
usage = trans.app.quota_agent.get_usage( trans )
- percent = trans.app.quota_agent.get_percent( trans=trans, usage=usage )
+ percent = trans.app.quota_agent.get_percent( trans=trans, usage=usage )
rval = {}
if percent is None:
rval['usage'] = util.nice_size( usage )
@@ -239,20 +237,19 @@
rval['percent'] = percent
return rval
-
## ---- Dataset display / editing ----------------------------------------
@web.expose
def display( self, trans, id=None, hid=None, tofile=None, toext=".txt", **kwd ):
"""
- Returns data directly into the browser.
+ Returns data directly into the browser.
Sets the mime-type according to the extension
"""
if hid is not None:
try:
hid = int( hid )
except:
- return "hid '%s' is invalid" %str( hid )
+ return "hid '%s' is invalid" % str( hid )
history = trans.get_history()
for dataset in history.datasets:
if dataset.hid == hid:
@@ -264,7 +261,7 @@
try:
data = self.app.model.HistoryDatasetAssociation.get( id )
except:
- return "Dataset id '%s' is invalid" %str( id )
+ return "Dataset id '%s' is invalid" % str( id )
if data:
current_user_roles = trans.get_current_user_roles()
if trans.app.security_agent.can_access_dataset( current_user_roles, data.dataset ):
@@ -281,7 +278,7 @@
trans.log_event( "Display dataset id: %s" % str(id) )
try:
return open( data.file_name )
- except:
+ except:
return "This dataset contains no content"
else:
return "You are not allowed to access this dataset"
@@ -322,7 +319,7 @@
return data.as_display_type( display_app, **kwd )
elif authz_method == 'display_at' and trans.app.host_security_agent.allow_action( trans.request.remote_addr,
data.permitted_actions.DATASET_ACCESS,
- dataset = data ):
+ dataset=data ):
trans.response.set_content_type( data.get_mime() )
return data.as_display_type( display_app, **kwd )
else:
@@ -349,12 +346,14 @@
return trans.fill_template( "/history/options.mako",
user=trans.get_user(),
history=trans.get_history( create=True ) )
+
@web.expose
def history_delete( self, trans, id ):
"""
Backward compatibility with check_galaxy script.
"""
return trans.webapp.controllers['history'].list( trans, id, operation='delete' )
+
@web.expose
def clear_history( self, trans ):
"""Clears the history for a user"""
@@ -365,6 +364,7 @@
trans.sa_session.flush()
trans.log_event( "History id %s cleared" % (str(history.id)) )
trans.response.send_redirect( url_for("/index" ) )
+
@web.expose
def history_import( self, trans, id=None, confirm=False, **kwd ):
msg = ""
@@ -379,7 +379,7 @@
if import_history.user_id == user.id:
return trans.show_error_message( "You cannot import your own history.")
new_history = import_history.copy( target_user=trans.user )
- new_history.name = "imported: "+new_history.name
+ new_history.name = "imported: " + new_history.name
new_history.user_id = user.id
galaxy_session = trans.get_galaxy_session()
try:
@@ -399,7 +399,7 @@
to begin.""" % ( new_history.name, web.url_for( '/' ) ) )
elif not user_history.datasets or confirm:
new_history = import_history.copy()
- new_history.name = "imported: "+new_history.name
+ new_history.name = "imported: " + new_history.name
new_history.user_id = None
galaxy_session = trans.get_galaxy_session()
try:
@@ -420,22 +420,24 @@
Warning! If you import this history, you will lose your current
history. Click <a href="%s">here</a> to confirm.
""" % web.url_for( controller='root', action='history_import', id=id, confirm=True ) )
+
@web.expose
def history_new( self, trans, name=None ):
trans.new_history( name=name )
trans.log_event( "Created new History, id: %s." % str(trans.history.id) )
- return trans.show_message( "New history created", refresh_frames = ['history'] )
+ return trans.show_message( "New history created", refresh_frames=['history'] )
+
@web.expose
- def history_add_to( self, trans, history_id=None, file_data=None, name="Data Added to History",info=None,ext="txt",dbkey="?",copy_access_from=None,**kwd ):
+ def history_add_to( self, trans, history_id=None, file_data=None, name="Data Added to History", info=None, ext="txt", dbkey="?", copy_access_from=None, **kwd ):
"""Adds a POSTed file to a History"""
try:
history = trans.sa_session.query( trans.app.model.History ).get( history_id )
- data = trans.app.model.HistoryDatasetAssociation( name = name,
- info = info,
- extension = ext,
- dbkey = dbkey,
- create_dataset = True,
- sa_session = trans.sa_session )
+ data = trans.app.model.HistoryDatasetAssociation( name=name,
+ info=info,
+ extension=ext,
+ dbkey=dbkey,
+ create_dataset=True,
+ sa_session=trans.sa_session )
if copy_access_from:
copy_access_from = trans.sa_session.query( trans.app.model.HistoryDatasetAssociation ).get( copy_access_from )
trans.app.security_agent.copy_dataset_permissions( copy_access_from.dataset, data.dataset )
@@ -457,11 +459,12 @@
trans.sa_session.flush()
data.set_peek()
trans.sa_session.flush()
- trans.log_event("Added dataset %d to history %d" %(data.id, trans.history.id))
- return trans.show_ok_message("Dataset "+str(data.hid)+" added to history "+str(history_id)+".")
+ trans.log_event("Added dataset %d to history %d" % (data.id, trans.history.id))
+ return trans.show_ok_message( "Dataset " + str(data.hid) + " added to history " + str(history_id) + "." )
except Exception, e:
trans.log_event( "Failed to add dataset to history: %s" % ( e ) )
return trans.show_error_message("Adding File to History has Failed")
+
@web.expose
def history_set_default_permissions( self, trans, id=None, **kwd ):
"""Sets the permissions on a history"""
@@ -494,6 +497,7 @@
else:
#user not logged in, history group must be only public
return trans.show_error_message( "You must be logged in to change a history's default permissions." )
+
@web.expose
def dataset_make_primary( self, trans, id=None):
"""Copies a dataset and makes primary"""
@@ -506,7 +510,7 @@
history.add_dataset(new_data)
trans.sa_session.add( new_data )
trans.sa_session.flush()
- return trans.show_message( "<p>Secondary dataset has been made primary.</p>", refresh_frames=['history'] )
+ return trans.show_message( "<p>Secondary dataset has been made primary.</p>", refresh_frames=['history'] )
except:
return trans.show_error_message( "<p>Failed to make secondary dataset primary.</p>" )
diff -r a7475ad6ecfc0f1fcdab3cfacce586a107aa8057 -r a8caad109542661a7222c504a529ab5afbe303fb lib/galaxy/webapps/galaxy/controllers/tool_runner.py
--- a/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
+++ b/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
@@ -12,6 +12,7 @@
from galaxy.tools.parameters.basic import DataToolParameter, UnvalidatedValue
from galaxy.util.bunch import Bunch
from galaxy.util.hash_util import is_hashable
+from galaxy.util import biostar
from galaxy.web import error, url_for
from galaxy.web.base.controller import BaseUIController
from galaxy.web.form_builder import SelectField
@@ -42,28 +43,10 @@
def default(self, trans, tool_id=None, **kwd):
"""Catches the tool id and redirects as needed"""
return self.index(trans, tool_id=tool_id, **kwd)
+
def __get_tool_components( self, tool_id, tool_version=None, get_loaded_tools_by_lineage=False, set_selected=False ):
- """
- Retrieve all loaded versions of a tool from the toolbox and return a select list enabling selection of a different version, the list of the tool's
- loaded versions, and the specified tool.
- """
- toolbox = self.get_toolbox()
- tool_version_select_field = None
- tools = []
- tool = None
- # Backwards compatibility for datasource tools that have default tool_id configured, but which are now using only GALAXY_URL.
- tool_ids = galaxy.util.listify( tool_id )
- for tool_id in tool_ids:
- if get_loaded_tools_by_lineage:
- tools = toolbox.get_loaded_tools_by_lineage( tool_id )
- else:
- tools = toolbox.get_tool( tool_id, tool_version=tool_version, get_all_versions=True )
- if tools:
- tool = toolbox.get_tool( tool_id, tool_version=tool_version, get_all_versions=False )
- if len( tools ) > 1:
- tool_version_select_field = self.build_tool_version_select_field( tools, tool.id, set_selected )
- break
- return tool_version_select_field, tools, tool
+ return self.get_toolbox().get_tool_components( tool_id, tool_version, get_loaded_tools_by_lineage, set_selected )
+
@web.expose
def index(self, trans, tool_id=None, from_noframe=None, **kwd):
# No tool id passed, redirect to main page
diff -r a7475ad6ecfc0f1fcdab3cfacce586a107aa8057 -r a8caad109542661a7222c504a529ab5afbe303fb templates/webapps/galaxy/base_panels.mako
--- a/templates/webapps/galaxy/base_panels.mako
+++ b/templates/webapps/galaxy/base_panels.mako
@@ -120,9 +120,9 @@
## Help tab.
<%
menu_options = []
- qa_url = app.config.get( "qa_url", None )
- if qa_url:
- menu_options = [ [_('Galaxy Q&A'), qa_url, "_blank" ] ]
+ if app.config.biostar_url:
+ menu_options = [ [_('Galaxy Q&A Site'), h.url_for( controller='biostar', action='biostar_redirect', biostar_action='show/tag/galaxy' ), "_blank" ],
+ [_('Ask a question'), h.url_for( controller='biostar', action='biostar_question_redirect' ), "_blank" ] ]
menu_options.extend( [
[_('Support'), app.config.get( "support_url", "http://wiki.g2.bx.psu.edu/Support" ), "_blank" ],
[_('Tool shed wiki'), app.config.get( "wiki_url", "http://wiki.g2.bx.psu.edu/Tool%20Shed" ), "_blank" ],
diff -r a7475ad6ecfc0f1fcdab3cfacce586a107aa8057 -r a8caad109542661a7222c504a529ab5afbe303fb templates/webapps/galaxy/tool_form.mako
--- a/templates/webapps/galaxy/tool_form.mako
+++ b/templates/webapps/galaxy/tool_form.mako
@@ -308,10 +308,10 @@
%else:
<div class="toolFormTitle">${tool.name} ${tool_version_select_field.get_html()}
%endif
- %if trans.app.config.biostar:
+
+ %if trans.app.config.biostar_url:
<!-- BioStar links -->
- <a href="${trans.app.config.biostar}/new/post/tagged/${low_tool_name}" target="galaxy_main" class="icon-button general-question tooltip close-side-panels" data-original-title="Ask a tool related question"></a>
- <a href="${trans.app.config.biostar}/show/tag/${low_tool_name}/" target="galaxy_main" class="icon-button tag-question tooltip close-side-panels" data-original-title="See tool related posts" ></a>
+ <span class="pull-right"><a href="${h.url_for( controller='biostar', action='biostar_tool_question_redirect', tool_id=tool.id )}" target="galaxy_main" class="fa-icon-question-sign tooltip" data-original-title="Ask a question about this tool"></a></span><!-- End of BioStar links -->
%endif
</div>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Handle exceptions when attempting to parse a datatypes_conf.xml file in a tool shed repository.
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a7475ad6ecfc/
changeset: a7475ad6ecfc
user: greg
date: 2013-03-12 20:02:03
summary: Handle exceptions when attempting to parse a datatypes_conf.xml file in a tool shed repository.
affected #: 1 file
diff -r 01e294adf7ac8715039d0baed1d44417e338c1a4 -r a7475ad6ecfc0f1fcdab3cfacce586a107aa8057 lib/tool_shed/util/shed_util_common.py
--- a/lib/tool_shed/util/shed_util_common.py
+++ b/lib/tool_shed/util/shed_util_common.py
@@ -1190,7 +1190,11 @@
return metadata_dict
def generate_datatypes_metadata( app, repository_clone_url, repository_files_dir, datatypes_config, metadata_dict ):
"""Update the received metadata_dict with information from the parsed datatypes_config."""
- tree = ElementTree.parse( datatypes_config )
+ try:
+ tree = ElementTree.parse( datatypes_config )
+ except Exception, e:
+ log.debug( "Exception attempting to parse %s: %s" % ( str( datatypes_config ), str( e ) ) )
+ return metadata_dict
root = tree.getroot()
ElementInclude.include( root )
repository_datatype_code_files = []
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Add grids for tool shed repositories that are ready for review or have tools with invalid functional tests.
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/01e294adf7ac/
changeset: 01e294adf7ac
user: greg
date: 2013-03-12 19:29:19
summary: Add grids for tool shed repositories that are ready for review or have tools with invalid functional tests.
affected #: 4 files
diff -r f6bc826d0ec20da52746e0703774175e835aee94 -r 01e294adf7ac8715039d0baed1d44417e338c1a4 lib/galaxy/webapps/tool_shed/controllers/repository_review.py
--- a/lib/galaxy/webapps/tool_shed/controllers/repository_review.py
+++ b/lib/galaxy/webapps/tool_shed/controllers/repository_review.py
@@ -20,11 +20,13 @@
class RepositoryReviewController( BaseUIController, common_util.ItemRatings ):
component_grid = repository_review_grids.ComponentGrid()
+ repositories_ready_for_review_grid = repository_review_grids.RepositoriesReadyForReviewGrid()
repositories_reviewed_by_me_grid = repository_review_grids.RepositoriesReviewedByMeGrid()
repositories_with_reviews_grid = repository_review_grids.RepositoriesWithReviewsGrid()
repositories_without_reviews_grid = repository_review_grids.RepositoriesWithoutReviewsGrid()
repository_reviews_by_user_grid = repository_review_grids.RepositoryReviewsByUserGrid()
reviewed_repositories_i_own_grid = repository_review_grids.ReviewedRepositoriesIOwnGrid()
+ repositories_with_invalid_tests_grid = repository_review_grids.RepositoriesWithInvalidTestsGrid()
@web.expose
@web.require_login( "approve repository review" )
@@ -368,6 +370,31 @@
return self.component_grid( trans, **kwd )
@web.expose
+ @web.require_login( "manage repositories ready for review" )
+ def manage_repositories_ready_for_review( self, trans, **kwd ):
+ """
+ A repository is ready to be reviewed if one of the following conditions is met:
+ 1) It contains no tools
+ 2) It contains tools the tools_functionally_correct flag is set to True. This implies that the repository metadata revision was installed and tested
+ by the Tool Shed's install and test framework.
+ """
+ if 'operation' in kwd:
+ operation = kwd['operation'].lower()
+ if operation == "inspect repository revisions":
+ return trans.response.send_redirect( web.url_for( controller='repository_review',
+ action='create_review',
+ **kwd ) )
+ if operation == "view_or_manage_repository":
+ return trans.response.send_redirect( web.url_for( controller='repository_review',
+ action='view_or_manage_repository',
+ **kwd ) )
+ message = 'Any of these repositories that contain tools have been installed into Galaxy and proven to be functionally correct by executing the tests defined '
+ message += 'for each tool. Repositories that do not contain tools have not been installed into Galaxy. '
+ kwd[ 'message' ] = message
+ kwd[ 'status' ] = 'warning'
+ return self.repositories_ready_for_review_grid( trans, **kwd )
+
+ @web.expose
@web.require_login( "manage repositories reviewed by me" )
def manage_repositories_reviewed_by_me( self, trans, **kwd ):
# The value of the received id is the encoded repository id.
@@ -383,6 +410,25 @@
return self.repositories_reviewed_by_me_grid( trans, **kwd )
@web.expose
+ @web.require_login( "manage repositories with invalid tests" )
+ def manage_repositories_with_invalid_tests( self, trans, **kwd ):
+ """Display a list of repositories that contain tools, have not yet been reviewed, and have invalid functional tests."""
+ if 'operation' in kwd:
+ operation = kwd['operation'].lower()
+ if operation == "inspect repository revisions":
+ return trans.response.send_redirect( web.url_for( controller='repository_review',
+ action='create_review',
+ **kwd ) )
+ if operation == "view_or_manage_repository":
+ return trans.response.send_redirect( web.url_for( controller='repository_review',
+ action='view_or_manage_repository',
+ **kwd ) )
+ message = 'These repositories contain tools with invalid functional tests (they have not yet been reviewed). '
+ kwd[ 'message' ] = message
+ kwd[ 'status' ] = 'warning'
+ return self.repositories_with_invalid_tests_grid( trans, **kwd )
+
+ @web.expose
@web.require_login( "manage repositories with reviews" )
def manage_repositories_with_reviews( self, trans, **kwd ):
# The value of the received id is the encoded repository id.
diff -r f6bc826d0ec20da52746e0703774175e835aee94 -r 01e294adf7ac8715039d0baed1d44417e338c1a4 lib/tool_shed/grids/repository_review_grids.py
--- a/lib/tool_shed/grids/repository_review_grids.py
+++ b/lib/tool_shed/grids/repository_review_grids.py
@@ -1,7 +1,7 @@
import os, logging
from galaxy.webapps.tool_shed import model
from galaxy.web.framework.helpers import grids
-from galaxy.model.orm import and_
+from galaxy.model.orm import and_, or_
from tool_shed.grids.repository_grids import RepositoryGrid
import tool_shed.util.shed_util_common as suc
@@ -11,13 +11,21 @@
log = logging.getLogger( __name__ )
+
class ComponentGrid( grids.Grid ):
+
+
class NameColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, component ):
return component.name
+
+
class DescriptionColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, component ):
return component.description
+
title = "Repository review components"
model_class = model.Component
template='/webapps/tool_shed/repository_review/grid.mako'
@@ -44,6 +52,8 @@
class RepositoriesWithReviewsGrid( RepositoryGrid ):
# This grid filters out repositories that have been marked as either deprecated or deleted.
+
+
class WithReviewsRevisionColumn( grids.GridColumn ):
def get_value( self, trans, grid, repository ):
# Restrict to revisions that have been reviewed.
@@ -53,10 +63,12 @@
for review in repository.reviews:
changeset_revision = review.changeset_revision
rev, label = suc.get_rev_label_from_changeset_revision( repo, changeset_revision )
- rval += '<a href="manage_repository_reviews_of_revision'
- rval += '?id=%s&changeset_revision=%s">%s</a><br/>' % ( trans.security.encode_id( repository.id ), changeset_revision, label )
+ rval += '<a href="manage_repository_reviews_of_revision?id=%s&changeset_revision=%s">%s</a><br/>' % \
+ ( trans.security.encode_id( repository.id ), changeset_revision, label )
return rval
return ''
+
+
class WithoutReviewsRevisionColumn( grids.GridColumn ):
def get_value( self, trans, grid, repository ):
# Restrict the options to revisions that have not yet been reviewed.
@@ -67,11 +79,14 @@
rev, label, changeset_revision = suc.get_rev_label_changeset_revision_from_repository_metadata( trans,
repository_metadata,
repository=repository )
- rval += '<a href="manage_repository_reviews_of_revision'
- rval += '?id=%s&changeset_revision=%s">%s</a><br/>' % ( trans.security.encode_id( repository.id ), changeset_revision, label )
+ rval += '<a href="manage_repository_reviews_of_revision?id=%s&changeset_revision=%s">%s</a><br/>' % \
+ ( trans.security.encode_id( repository.id ), changeset_revision, label )
return rval
return ''
+
+
class ReviewersColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, repository ):
rval = ''
if repository.reviewers:
@@ -95,7 +110,7 @@
ReviewersColumn( "Reviewers", attach_popup=False )
]
columns.append( grids.MulticolFilterColumn( "Search repository name",
- cols_to_filter=[ columns[0] ],
+ cols_to_filter=[ columns[ 0 ] ],
key="free-text-search",
visible=False,
filterable="standard" ) )
@@ -105,6 +120,7 @@
condition=( lambda item: not item.deleted ),
async_compatible=False )
]
+
def build_initial_query( self, trans, **kwd ):
return trans.sa_session.query( model.Repository ) \
.filter( and_( model.Repository.table.c.deleted == False,
@@ -114,6 +130,7 @@
.outerjoin( ( model.ComponentReview.table, model.ComponentReview.table.c.repository_review_id == model.RepositoryReview.table.c.id ) ) \
.outerjoin( ( model.Component.table, model.Component.table.c.id == model.ComponentReview.table.c.component_id ) )
+
class RepositoriesWithoutReviewsGrid( RepositoriesWithReviewsGrid ):
# This grid filters out repositories that have been marked as either deprecated or deleted.
title = "Repositories with no reviews"
@@ -123,14 +140,14 @@
link=( lambda item: dict( operation="view_or_manage_repository", id=item.id ) ),
attach_popup=True ),
RepositoriesWithReviewsGrid.DescriptionColumn( "Synopsis",
- key="description",
- attach_popup=False ),
+ key="description",
+ attach_popup=False ),
RepositoriesWithReviewsGrid.WithoutReviewsRevisionColumn( "Revisions for review" ),
RepositoriesWithReviewsGrid.UserColumn( "Owner",
attach_popup=False )
]
columns.append( grids.MulticolFilterColumn( "Search repository name, description",
- cols_to_filter=[ columns[0], columns[1] ],
+ cols_to_filter=[ columns[ 0 ], columns[ 1 ] ],
key="free-text-search",
visible=False,
filterable="standard" ) )
@@ -138,6 +155,7 @@
allow_multiple=False,
condition=( lambda item: not item.deleted ),
async_compatible=False ) ]
+
def build_initial_query( self, trans, **kwd ):
return trans.sa_session.query( model.Repository ) \
.filter( and_( model.Repository.table.c.deleted == False,
@@ -145,8 +163,51 @@
model.Repository.reviews == None ) ) \
.join( model.User.table )
+
+class RepositoriesReadyForReviewGrid( RepositoriesWithoutReviewsGrid ):
+ # Repositories that are ready for human review are those that either:
+ # 1) Have no tools
+ # 2) Have tools that have been proven to be functionally correct within Galaxy.
+ # This grid filters out repositories that have been marked as either deprecated or deleted.
+ title = "Repositories ready for review"
+ columns = [
+ RepositoriesWithoutReviewsGrid.NameColumn( "Repository name",
+ key="name",
+ link=( lambda item: dict( operation="view_or_manage_repository", id=item.id ) ),
+ attach_popup=True ),
+ RepositoriesWithoutReviewsGrid.DescriptionColumn( "Synopsis",
+ key="description",
+ attach_popup=False ),
+ RepositoriesWithoutReviewsGrid.WithoutReviewsRevisionColumn( "Revisions for review" ),
+ RepositoriesWithoutReviewsGrid.UserColumn( "Owner",
+ attach_popup=False )
+ ]
+ columns.append( grids.MulticolFilterColumn( "Search repository name, description",
+ cols_to_filter=[ columns[ 0 ], columns[ 1 ] ],
+ key="free-text-search",
+ visible=False,
+ filterable="standard" ) )
+ operations = [ grids.GridOperation( "Inspect repository revisions",
+ allow_multiple=False,
+ condition=( lambda item: not item.deleted ),
+ async_compatible=False ) ]
+
+ def build_initial_query( self, trans, **kwd ):
+ return trans.sa_session.query( model.Repository ) \
+ .filter( and_( model.Repository.table.c.deleted == False,
+ model.Repository.table.c.deprecated == False,
+ model.Repository.reviews == None ) ) \
+ .join( model.RepositoryMetadata.table ) \
+ .filter( and_( model.RepositoryMetadata.table.c.downloadable == True,
+ or_( model.RepositoryMetadata.table.c.includes_tools == False,
+ and_( model.RepositoryMetadata.table.c.includes_tools == True,
+ model.RepositoryMetadata.table.c.tools_functionally_correct == True ) ) ) ) \
+ .join( model.User.table )
+
+
class RepositoriesReviewedByMeGrid( RepositoriesWithReviewsGrid ):
# This grid filters out repositories that have been marked as either deprecated or deleted.
+
def build_initial_query( self, trans, **kwd ):
return trans.sa_session.query( model.Repository ) \
.filter( and_( model.Repository.table.c.deleted == False,
@@ -157,15 +218,25 @@
.outerjoin( ( model.ComponentReview.table, model.ComponentReview.table.c.repository_review_id == model.RepositoryReview.table.c.id ) ) \
.outerjoin( ( model.Component.table, model.Component.table.c.id == model.ComponentReview.table.c.component_id ) )
+
class RepositoryReviewsByUserGrid( grids.Grid ):
# This grid filters out repositories that have been marked as deprecated.
+
+
class RepositoryNameColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, review ):
return review.repository.name
+
+
class RepositoryDescriptionColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, review ):
return review.repository.description
+
+
class RevisionColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, review ):
encoded_review_id = trans.security.encode_id( review.id )
rval = '<a class="action-button" href="'
@@ -175,7 +246,10 @@
rval +='browse_review'
rval += '?id=%s">%s</a>' % ( encoded_review_id, suc.get_revision_label( trans, review.repository, review.changeset_revision ) )
return rval
+
+
class RatingColumn( grids.TextColumn ):
+
def get_value( self, trans, grid, review ):
if review.rating:
rval = '<input '
@@ -187,6 +261,7 @@
rval += '/>'
return rval
return ''
+
title = "Reviews by user"
model_class = model.RepositoryReview
template='/webapps/tool_shed/repository_review/grid.mako'
@@ -217,6 +292,7 @@
num_rows_per_page = 50
preserve_state = False
use_paging = True
+
def build_initial_query( self, trans, **kwd ):
user_id = trans.security.decode_id( kwd[ 'id' ] )
return trans.sa_session.query( model.RepositoryReview ) \
@@ -225,6 +301,7 @@
.join( ( model.Repository.table, model.RepositoryReview.table.c.repository_id == model.Repository.table.c.id ) ) \
.filter( model.Repository.table.c.deprecated == False )
+
class ReviewedRepositoriesIOwnGrid( RepositoriesWithReviewsGrid ):
title = "Reviewed repositories I own"
columns = [
@@ -248,6 +325,7 @@
condition=( lambda item: not item.deleted ),
async_compatible=False )
]
+
def build_initial_query( self, trans, **kwd ):
return trans.sa_session.query( model.Repository ) \
.join( ( model.RepositoryReview.table, model.RepositoryReview.table.c.repository_id == model.Repository.table.c.id ) ) \
@@ -255,4 +333,43 @@
.join( ( model.User.table, model.User.table.c.id == model.RepositoryReview.table.c.user_id ) ) \
.outerjoin( ( model.ComponentReview.table, model.ComponentReview.table.c.repository_review_id == model.RepositoryReview.table.c.id ) ) \
.outerjoin( ( model.Component.table, model.Component.table.c.id == model.ComponentReview.table.c.component_id ) )
-
\ No newline at end of file
+
+
+class RepositoriesWithInvalidTestsGrid( RepositoriesWithoutReviewsGrid ):
+ # Repositories that are ready for human review are those that either:
+ # 1) Have no tools
+ # 2) Have tools that have been proven to be functionally correct within Galaxy.
+ # This grid filters out repositories that have been marked as either deprecated or deleted.
+ title = "Repositories that contain tools with invalid functional tests"
+ columns = [
+ RepositoriesWithoutReviewsGrid.NameColumn( "Repository name",
+ key="name",
+ link=( lambda item: dict( operation="view_or_manage_repository", id=item.id ) ),
+ attach_popup=True ),
+ RepositoriesWithoutReviewsGrid.DescriptionColumn( "Synopsis",
+ key="description",
+ attach_popup=False ),
+ RepositoriesWithoutReviewsGrid.WithoutReviewsRevisionColumn( "Revisions for review" ),
+ RepositoriesWithoutReviewsGrid.UserColumn( "Owner",
+ attach_popup=False )
+ ]
+ columns.append( grids.MulticolFilterColumn( "Search repository name, description",
+ cols_to_filter=[ columns[ 0 ], columns[ 1 ] ],
+ key="free-text-search",
+ visible=False,
+ filterable="standard" ) )
+ operations = [ grids.GridOperation( "Inspect repository revisions",
+ allow_multiple=False,
+ condition=( lambda item: not item.deleted ),
+ async_compatible=False ) ]
+
+ def build_initial_query( self, trans, **kwd ):
+ return trans.sa_session.query( model.Repository ) \
+ .filter( and_( model.Repository.table.c.deleted == False,
+ model.Repository.table.c.deprecated == False,
+ model.Repository.reviews == None ) ) \
+ .join( model.RepositoryMetadata.table ) \
+ .filter( and_( model.RepositoryMetadata.table.c.downloadable == True,
+ model.RepositoryMetadata.table.c.includes_tools == True,
+ model.RepositoryMetadata.table.c.tools_functionally_correct == False ) ) \
+ .join( model.User.table )
diff -r f6bc826d0ec20da52746e0703774175e835aee94 -r 01e294adf7ac8715039d0baed1d44417e338c1a4 templates/webapps/tool_shed/admin/index.mako
--- a/templates/webapps/tool_shed/admin/index.mako
+++ b/templates/webapps/tool_shed/admin/index.mako
@@ -72,6 +72,15 @@
</div><div class="toolSectionBody"><div class="toolSectionBg">
+ <div class="toolTitle">
+ <a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_ready_for_review' )}">Repositories ready for review</a>
+ </div>
+ <div class="toolTitle">
+ <a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_with_invalid_tests' )}">Repositories with invalid tests</a>
+ </div>
+ <div class="toolTitle">
+ <a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_without_reviews' )}">All repositories with no reviews</a>
+ </div>
%if trans.user.repository_reviews:
<div class="toolTitle"><a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_reviewed_by_me' )}">Repositories reviewed by me</a>
@@ -81,9 +90,6 @@
<a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_with_reviews' )}">All reviewed repositories</a></div><div class="toolTitle">
- <a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_without_reviews' )}">Repositories with no reviews</a>
- </div>
- <div class="toolTitle"><a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_components' )}">Manage review components</a></div></div>
diff -r f6bc826d0ec20da52746e0703774175e835aee94 -r 01e294adf7ac8715039d0baed1d44417e338c1a4 templates/webapps/tool_shed/index.mako
--- a/templates/webapps/tool_shed/index.mako
+++ b/templates/webapps/tool_shed/index.mako
@@ -129,6 +129,15 @@
</div><div class="toolSectionBody"><div class="toolSectionBg">
+ <div class="toolTitle">
+ <a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_ready_for_review' )}">Repositories ready for review</a>
+ </div>
+ <div class="toolTitle">
+ <a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_with_invalid_tests' )}">Repositories with invalid tests</a>
+ </div>
+ <div class="toolTitle">
+ <a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_without_reviews' )}">All repositories with no reviews</a>
+ </div>
%if trans.user.repository_reviews:
<div class="toolTitle"><a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_reviewed_by_me' )}">Repositories reviewed by me</a>
@@ -138,9 +147,6 @@
<a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_with_reviews' )}">All reviewed repositories</a></div><div class="toolTitle">
- <a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_without_reviews' )}">Repositories with no reviews</a>
- </div>
- <div class="toolTitle"><a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_components' )}">Manage review components</a></div></div>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: browser tests: better parsing of environ vars, prevent subprocess hanging, allow setting debug flags via environ var
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f6bc826d0ec2/
changeset: f6bc826d0ec2
user: carlfeberhard
date: 2013-03-12 18:28:58
summary: browser tests: better parsing of environ vars, prevent subprocess hanging, allow setting debug flags via environ var
affected #: 3 files
diff -r d8009117d5a0af02767c27162a2d5bd3befb9b5d -r f6bc826d0ec20da52746e0703774175e835aee94 test/casperjs/casperjs_runner.py
--- a/test/casperjs/casperjs_runner.py
+++ b/test/casperjs/casperjs_runner.py
@@ -47,6 +47,7 @@
_TODO = """
get data back from js scripts (uploaded files, etc.)
use returned json to output list of failed assertions if code == 2
+ better way to turn debugging on from the environment
"""
# ====================================================================
@@ -72,7 +73,7 @@
debug = False
# bit of a hack - this is the beginning of the last string when capserjs --verbose=true --logLevel=debug
# use this to get subprocess to stop waiting for output
- casper_done_str = '[info] [phantom] Done'
+ casper_done_str = '# Tests complete'
# convert js test results to unittest.TestResults
results_adapter = None #CasperJsonToUnittestResultsConverter()
@@ -140,8 +141,11 @@
command_line_list.append( '--return-json' )
# check flag to output (very) verbose debugging messages from casperjs and tests
- if self.debug:
+ #NOTE: this can be set in the class or by using the debug_these_tests flag in server_env
+ if( ( self.debug )
+ or ( rel_script_path in self.env.debug_these_tests ) ):
command_line_list.extend([ '--verbose=true', '--logLevel=debug' ])
+ #TODO: add capture, html output flags
#TODO: allow casperjs cli options ('--includes='), ?in args, kwargs?
command_line_list.extend( args )
@@ -297,16 +301,15 @@
class Test_01_User( CasperJSTestCase ):
"""TestCase that uses javascript and a headless browser to test dynamic pages.
"""
- #debug = True
def test_10_registration( self ):
"""User registration tests: register new user, logout, attempt bad registrations.
"""
# all keywords will be compiled into a single JSON obj and passed to the server
#self.run_js_script( 'registration-tests.js',
+ # testUser=test_user )
# # this causes a time out in history-panel-tests: why?
# # also: I can't seem to bump the timeout to an error (using a handler) - causes script to hang
# # removing for the sake of bbot
- # testUser=test_user )
self.run_js_script( 'registration-tests.js' )
#TODO:?? could theoretically do db cleanup, checks here with SQLALX
@@ -321,7 +324,6 @@
class Test_02_Tools( CasperJSTestCase ):
"""(Minimal) casperjs tests for tools.
"""
- #debug = True
def test_10_upload( self ):
"""Tests uploading files
"""
@@ -331,7 +333,6 @@
class Test_03_HistoryPanel( CasperJSTestCase ):
"""(Minimal) casperjs tests for tools.
"""
- #debug = True
def test_00_history_panel( self ):
"""Test history panel basics (controls, structure, refresh, history options menu, etc.).
"""
@@ -347,6 +348,8 @@
# ==================================================================== MAIN
if __name__ == '__main__':
log.setLevel( logging.DEBUG )
+ from server_env import log as server_env_log
+ server_env_log.setLevel( logging.DEBUG )
setup_module()
#TODO: server_env config doesn't work with unittest's lame main fn
unittest.main()
diff -r d8009117d5a0af02767c27162a2d5bd3befb9b5d -r f6bc826d0ec20da52746e0703774175e835aee94 test/casperjs/server_env.py
--- a/test/casperjs/server_env.py
+++ b/test/casperjs/server_env.py
@@ -22,6 +22,7 @@
ENV_FILE_DIR = 'GALAXY_TEST_FILE_DIR'
ENV_TOOL_SHED_TEST_FILE = 'GALAXY_TOOL_SHED_TEST_FILE'
ENV_SAVED_FILES_DIR = 'GALAXY_TEST_SAVE' # AKA: twilltestcase.keepOutdir
+ ENV_DEBUG_THESE_TESTS = 'GALAXY_DEBUG_THESE_TESTS'
DEFAULT_PROTOCOL = 'http'
DEFAULT_HOST = 'localhost'
@@ -33,8 +34,7 @@
does not yet exist.
"""
# singleton pattern
- if( ( not cls._instance )
- or ( config ) ):
+ if not cls._instance:
log.debug( 'creating singleton instance of "%s", config: %s', str( cls ), str( config ) )
cls._instance = cls( config )
return cls._instance
@@ -43,60 +43,93 @@
self.config = env_config_dict or {}
self.protocol = self._get_setting_from_config_or_env(
- 'protocol', self.ENV_PROTOCOL, self.DEFAULT_PROTOCOL )
+ 'protocol', self.ENV_PROTOCOL, self.DEFAULT_PROTOCOL ) #TODO: required=True )
self.host = self._get_setting_from_config_or_env(
- 'host', self.ENV_HOST, self.DEFAULT_HOST )
+ 'host', self.ENV_HOST, self.DEFAULT_HOST ) #TODO: required=True )
self.port = self._get_setting_from_config_or_env(
- 'port', self.ENV_PORT, self.DEFAULT_PORT )
+ 'port', self.ENV_PORT, self.DEFAULT_PORT ) #TODO: required=True )
+ #TODO: move these setters/init'rs into a parser dict
self.history_id = self._get_setting_from_config_or_env(
- 'history_id', self.ENV_HISTORY_ID, default=None )
+ 'history_id', self.ENV_HISTORY_ID )
self.file_dir = self._get_setting_from_config_or_env(
- 'file_dir', self.ENV_FILE_DIR, default=None )
-
+ 'file_dir', self.ENV_FILE_DIR )
self.tool_shed_test_file = self._get_setting_from_config_or_env(
- 'tool_shed_test_file', self.ENV_TOOL_SHED_TEST_FILE, default=None )
+ 'tool_shed_test_file', self.ENV_TOOL_SHED_TEST_FILE )
self.shed_tools_dict = self._get_shed_tools_dict()
+ # saved output goes here: test diffs, screenshots, html, etc.
self.saved_output_dir = self._get_setting_from_config_or_env(
- 'saved_output_dir', self.ENV_SAVED_FILES_DIR, default=None )
- self._init_saved_files_dir()
+ 'saved_output_dir', self.ENV_SAVED_FILES_DIR )
+ self._create_saved_output_dir()
- def _get_setting_from_config_or_env( self, config_name, env_name, default=False ):
+ # if a test script (e.g. 'history-panel-tests.js') is listed in this var,
+ # the test will output additional/full debug info
+ self.debug_these_tests = self._get_setting_from_config_or_env(
+ 'debug_these_tests', self.ENV_DEBUG_THESE_TESTS )
+ self._parse_debug_these_tests()
+
+ log.debug( 'server_env: %s', str( self.as_dict() ) )
+
+ def as_dict( self, attributes=None ):
+ if not attributes:
+ #TODO:?? raise to class scope?
+ attributes = [ 'protocol', 'host', 'port', 'history_id', 'file_dir',
+ 'tool_shed_test_file', 'shed_tools_dict', 'saved_output_dir', 'debug_these_tests' ]
+ this_dict = {}
+ for attr_name in attributes:
+ attr_val = getattr( self, attr_name )
+ this_dict[ attr_name ] = attr_val
+ return this_dict
+
+ def _get_setting_from_config_or_env( self, config_name, env_name, default=None ):
"""Try to get a setting from (in order):
TestEnvironment.config, the os env, or some default (if not False).
"""
- #TODO: if falsy value needed, use None - not ideal
- config = self.config.get( config_name, None )
- env = os.environ.get( env_name, None )
- if( ( not ( config or env ) )
- and ( default == False ) ):
- raise AttributeError( '"%s" was not set via config or %s or default' %( config_name, env_name ) )
- return config or env or default
+ config_val = self.config.get( config_name, None )
+ env_val = os.environ.get( env_name, None )
+ return config_val or env_val or default
def _get_shed_tools_dict( self ):
"""Read the shed tools from the tool shed test file if given,
otherwise an empty dict.
"""
+ shed_tools_dict = {}
if self.tool_shed_test_file:
- f = open( self.tool_shed_test_file, 'r' )
- text = f.read()
- f.close()
- return from_json_string( text )
- else:
- return {}
+ try:
+ f = open( self.tool_shed_test_file, 'r' )
+ text = f.read()
+ f.close()
+ shed_tools_dict = from_json_string( text )
+ except Exception, exc:
+ log.error( 'Error reading tool shed test file "%s": %s', self.tool_shed_test_file, exc, exc_info=True )
- def _init_saved_files_dir( self ):
+ return shed_tools_dict
+
+ def _create_saved_output_dir( self ):
"""Set up the desired directory to save test output.
"""
- if self.saved_output_dir > '':
+ if self.saved_output_dir:
try:
- os.makedirs( self.saved_output_dir )
+ if not os.path.exists( self.saved_output_dir ):
+ os.makedirs( self.saved_output_dir )
except Exception, exc:
log.error( 'unable to create saved files directory "%s": %s',
self.saved_output_dir, exc, exc_info=True )
self.saved_output_dir = None
+ def _parse_debug_these_tests( self, delim=',' ):
+ """Simple parser for the list of test scripts on which to set debug=True.
+ """
+ debug_list = []
+ if self.debug_these_tests:
+ try:
+ debug_list = self.debug_these_tests.split( delim )
+ except Exception, exc:
+ log.error( 'unable to parse debug_these_tests "%s": %s',
+ self.debug_these_tests, exc, exc_info=True )
+ self.debug_these_tests = debug_list
+
@property
def url( self ):
"""Builds and returns the url of the test server.
diff -r d8009117d5a0af02767c27162a2d5bd3befb9b5d -r f6bc826d0ec20da52746e0703774175e835aee94 test/casperjs/spaceghost.js
--- a/test/casperjs/spaceghost.js
+++ b/test/casperjs/spaceghost.js
@@ -432,7 +432,10 @@
var returnCode = ( this.test.testResults.failed )?( 2 ):( 0 );
// if --return-json is used: output json and exit
+ //NOTE: used by the test runner to gather JSON test info from stdout
if( this.options.returnJsonOnly ){
+ // echo a string to indicate that tests are complete (used in casperjs_runner.py to stop process)
+ this.echo( '# Tests complete' );
this.outputStateAsJson();
this.exit( returnCode );
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Automated script to mark repositories as deprecated if no metadata records are associated with the repository, and the repository is older than the specified cutoff date.
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d8009117d5a0/
changeset: d8009117d5a0
user: inithello
date: 2013-03-12 16:29:12
summary: Automated script to mark repositories as deprecated if no metadata records are associated with the repository, and the repository is older than the specified cutoff date.
affected #: 1 file
diff -r 2c56c1e49f288ed53234f485c0f19606d013dd1b -r d8009117d5a0af02767c27162a2d5bd3befb9b5d lib/tool_shed/scripts/deprecate_repositories_without_metadata.py
--- /dev/null
+++ b/lib/tool_shed/scripts/deprecate_repositories_without_metadata.py
@@ -0,0 +1,169 @@
+#!/usr/bin/env python
+
+import os, sys, logging, string, textwrap
+
+new_path = [ os.path.join( os.getcwd(), "lib" ) ]
+new_path.extend( sys.path[1:] )
+sys.path = new_path
+
+log = logging.getLogger()
+log.setLevel( 10 )
+log.addHandler( logging.StreamHandler( sys.stdout ) )
+
+from galaxy import eggs
+import pkg_resources
+pkg_resources.require( "SQLAlchemy >= 0.4" )
+
+import time, ConfigParser, shutil
+from datetime import datetime, timedelta
+from time import strftime
+from optparse import OptionParser
+
+from galaxy.tools import parameters
+from tool_shed.util.shed_util_common import url_join
+import galaxy.webapps.tool_shed.config as tool_shed_config
+import galaxy.webapps.tool_shed.model.mapping
+import sqlalchemy as sa
+from galaxy.model.orm import and_, not_, distinct
+from galaxy.util import send_mail as galaxy_send_mail
+
+assert sys.version_info[:2] >= ( 2, 4 )
+
+def build_citable_url( host, repository ):
+ return url_join( host, 'view', repository.user.username, repository.name )
+
+def main():
+ '''
+ Script to deprecate any repositories that are older than n days, and have been empty since creation.
+ '''
+ parser = OptionParser()
+ parser.add_option( "-d", "--days", dest="days", action="store", type="int", help="number of days (14)", default=14 )
+ parser.add_option( "-i", "--info_only", action="store_true", dest="info_only", help="info about the requested action", default=False )
+ parser.add_option( "-v", "--verbose", action="store_true", dest="verbose", help="verbose mode, print the name of each repository", default=False )
+ ( options, args ) = parser.parse_args()
+ ini_file = args[0]
+ config_parser = ConfigParser.ConfigParser( {'here':os.getcwd()} )
+ config_parser.read( ini_file )
+ config_dict = {}
+ for key, value in config_parser.items( "app:main" ):
+ config_dict[key] = value
+ config = tool_shed_config.Configuration( **config_dict )
+
+ app = DeprecateRepositoriesApplication( config )
+ cutoff_time = datetime.utcnow() - timedelta( days=options.days )
+ now = strftime( "%Y-%m-%d %H:%M:%S" )
+ print "\n####################################################################################"
+ print "# %s - Handling stuff older than %i days" % ( now, options.days )
+
+ if options.info_only:
+ print "# Displaying info only ( --info_only )"
+
+ deprecate_repositories( app, cutoff_time, days=options.days, info_only=options.info_only, verbose=options.verbose )
+
+def send_mail_to_owner( app, name, owner, email, repositories_deprecated, days=14 ):
+ '''
+ Sends an email to the owner of the provided repository.
+ '''
+ smtp_server = app.config.get( 'smtp_server', None )
+ from_address = app.config.get( 'email_from', None )
+ # Since there is no way to programmatically determine the URL for the tool shed from the .ini file, this method requires that
+ # an environment variable named TOOL_SHED_CANONICAL_URL be set, pointing to the tool shed that is being checked.
+ url = os.environ.get( 'TOOL_SHED_CANONICAL_URL', None )
+ if None in [ smtp_server, from_address ]:
+ print '# Mail not configured, not sending email to repository owner.'
+ return
+ elif url is None:
+ print '# Environment variable TOOL_SHED_CANONICAL_URL not set, not sending email to repository owner.'
+ return
+ subject = "Regarding your tool shed repositories at %s" % url
+ message_body_template = 'The tool shed automated repository checker has discovered that one or more of your repositories hosted ' + \
+ 'at this tool shed url ${url} have remained empty for over ${days} days, so they have been marked as deprecated. If you have plans ' + \
+ 'for these repositories, you can mark them as un-deprecated at any time.'
+ message_template = string.Template( message_body_template )
+ body = '\n'.join( textwrap.wrap( message_template.safe_substitute( days=days, url=url ), width=95 ) )
+ body += '\n\n'
+ body += 'Repositories that were deprecated:\n'
+ body += '\n'.join( [ build_citable_url( url, repository ) for repository in repositories_deprecated ] )
+ try:
+ galaxy_send_mail( from_address, repository.user.email, subject, body, app.config )
+ print "# An email has been sent to %s, the owner of %s." % ( repository.user.username, ', '.join( [ repository.name for repository in repositories_deprecated ] ) )
+ return True
+ except Exception, e:
+ print "# An error occurred attempting to send email: %s" % str( e )
+ return False
+
+def deprecate_repositories( app, cutoff_time, days=14, info_only=False, verbose=False ):
+ # This method will get a list of repositories that were created on or before cutoff_time, but have never
+ # had any metadata records associated with them. Then it will iterate through that list and deprecate the
+ # repositories, sending an email to each repository owner.
+ dataset_count = 0
+ disk_space = 0
+ start = time.time()
+ repository_ids_to_not_check = []
+ # Get a unique list of repository ids from the repository_metadata table. Any repository ID found in this table is not
+ # empty, and will not be checked.
+ metadata_records = sa.select( [ distinct( app.model.RepositoryMetadata.table.c.repository_id ) ],
+ from_obj=app.model.RepositoryMetadata.table ) \
+ .execute()
+ for metadata_record in metadata_records:
+ repository_ids_to_not_check.append( metadata_record.repository_id )
+ # Get the repositories that are A) not present in the above list, and b) older than the specified time.
+ # This will yield a list of repositories that have been created more than n days ago, but never populated.
+ repository_query = sa.select( [ app.model.Repository.table.c.id ],
+ whereclause = and_( app.model.Repository.table.c.create_time < cutoff_time,
+ app.model.Repository.table.c.deprecated == False,
+ app.model.Repository.table.c.deleted == False,
+ not_( app.model.Repository.table.c.id.in_( repository_ids_to_not_check ) ) ),
+ from_obj = [ app.model.Repository.table ] )
+ query_result = repository_query.execute()
+ repositories = []
+ repositories_by_owner = {}
+ repository_ids = [ row.id for row in query_result ]
+ # Iterate through the list of repository ids for empty repositories and deprecate them unless info_only is set.
+ for repository_id in repository_ids:
+ repository = app.sa_session.query( app.model.Repository ) \
+ .filter( app.model.Repository.table.c.id == repository_id ) \
+ .one()
+ owner = repository.user
+ if info_only:
+ print '# Repository %s owned by %s would have been deprecated, but info_only was set.' % ( repository.name, repository.user.username )
+ else:
+ if verbose:
+ print '# Deprecating repository %s owned by %s.' % ( repository.name, owner.username )
+ if owner.username not in repositories_by_owner:
+ repositories_by_owner[ owner.username ] = dict( owner=owner, repositories=[] )
+ repositories_by_owner[ owner.username ][ 'repositories' ].append( repository )
+ repositories.append( repository )
+ # Send an email to each repository owner, listing the repositories that were deprecated.
+ for repository_owner in repositories_by_owner:
+ for repository in repositories_by_owner[ repository_owner ][ 'repositories' ]:
+ repository.deprecated = True
+ app.sa_session.add( repository )
+ app.sa_session.flush()
+ owner = repositories_by_owner[ repository_owner ][ 'owner' ]
+ send_mail_to_owner( app, repository.name, owner.username, owner.email, repositories_by_owner[ repository_owner ][ 'repositories' ], days )
+ stop = time.time()
+ print '# Deprecated %d repositories.' % len( repositories )
+ print "# Elapsed time: ", stop - start
+ print "####################################################################################"
+
+class DeprecateRepositoriesApplication( object ):
+ """Encapsulates the state of a Universe application"""
+ def __init__( self, config ):
+ if config.database_connection is False:
+ config.database_connection = "sqlite:///%s?isolation_level=IMMEDIATE" % config.database
+ # Setup the database engine and ORM
+ self.model = galaxy.webapps.tool_shed.model.mapping.init( config.file_path, config.database_connection, engine_options={}, create_tables=False )
+ self.config = config
+ @property
+ def sa_session( self ):
+ """
+ Returns a SQLAlchemy session -- currently just gets the current
+ session from the threadlocal session context, but this is provided
+ to allow migration toward a more SQLAlchemy 0.4 style of use.
+ """
+ return self.model.context.current
+ def shutdown( self ):
+ pass
+
+if __name__ == "__main__": main()
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/2c56c1e49f28/
changeset: 2c56c1e49f28
user: greg
date: 2013-03-12 15:46:15
summary: Handle tool shed repositories that contain only tools that should not be displayed in the Galaxy tool panel from those that contain tools that should be displayed in the Galaxy tool panel appropriately. Selecting a tool pnale section is no longer allowed for repositories that do not contany any tools that should be displayed there. This behavior exists when installing or resinstalling repositories into Galaxy.
affected #: 14 files
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -3217,6 +3217,14 @@
return 'tools' in self.metadata
return False
@property
+ def includes_tools_for_display_in_tool_panel( self ):
+ if self.includes_tools:
+ tool_dicts = self.metadata[ 'tools' ]
+ for tool_dict in tool_dicts:
+ if tool_dict.get( 'add_to_tool_panel', True ):
+ return True
+ return False
+ @property
def includes_tool_dependencies( self ):
if self.metadata:
return 'tool_dependencies' in self.metadata
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -89,7 +89,8 @@
if repository.uninstalled:
# Since we're reinstalling the repository we need to find the latest changeset revision to which it can be updated so that we
# can reset the metadata if necessary. This will ensure that information about repository dependencies and tool dependencies
- # will be current. Only allow selecting a different section in the tool panel if the repository was uninstalled.
+ # will be current. Only allow selecting a different section in the tool panel if the repository was uninstalled and it contained
+ # tools that should be displayed in the tool panel.
changeset_revision_dict = shed_util.get_update_to_changeset_revision_and_ctx_rev( trans, repository )
current_changeset_revision = changeset_revision_dict.get( 'changeset_revision', None )
current_ctx_rev = changeset_revision_dict.get( 'ctx_rev', None )
@@ -213,7 +214,7 @@
repository_install_dir = None
errors = ''
if params.get( 'deactivate_or_uninstall_repository_button', False ):
- if tool_shed_repository.includes_tools:
+ if tool_shed_repository.includes_tools_for_display_in_tool_panel:
# Handle tool panel alterations.
shed_util.remove_from_tool_panel( trans, tool_shed_repository, shed_tool_conf, uninstall=remove_from_disk_checked )
if tool_shed_repository.includes_data_managers:
@@ -944,6 +945,8 @@
tool_panel_section_keys = []
# One or more repositories may include tools, but not necessarily all of them.
includes_tools = util.string_as_bool( kwd.get( 'includes_tools', False ) )
+ # Some tools should not be displayed in the tool panel (e.g., DataManager tools and datatype converters).
+ includes_tools_for_display_in_tool_panel = util.string_as_bool( kwd.get( 'includes_tools_for_display_in_tool_panel', False ) )
includes_tool_dependencies = util.string_as_bool( kwd.get( 'includes_tool_dependencies', False ) )
install_tool_dependencies = kwd.get( 'install_tool_dependencies', '' )
encoded_repo_info_dicts = util.listify( kwd.get( 'encoded_repo_info_dicts', None ) )
@@ -960,12 +963,13 @@
response.close()
repo_information_dict = json.from_json_string( raw_text )
includes_tools = util.string_as_bool( repo_information_dict.get( 'includes_tools', False ) )
+ includes_tools_for_display_in_tool_panel = util.string_as_bool( repo_information_dict.get( 'includes_tools_for_display_in_tool_panel', False ) )
has_repository_dependencies = util.string_as_bool( repo_information_dict.get( 'has_repository_dependencies', False ) )
includes_tool_dependencies = util.string_as_bool( repo_information_dict.get( 'includes_tool_dependencies', False ) )
encoded_repo_info_dicts = util.listify( repo_information_dict.get( 'repo_info_dicts', [] ) )
repo_info_dicts = [ encoding_util.tool_shed_decode( encoded_repo_info_dict ) for encoded_repo_info_dict in encoded_repo_info_dicts ]
- if ( ( not includes_tools and not has_repository_dependencies ) and kwd.get( 'select_shed_tool_panel_config_button', False ) ) or \
- ( ( includes_tools or has_repository_dependencies ) and kwd.get( 'select_tool_panel_section_button', False ) ):
+ if ( ( not includes_tools_for_display_in_tool_panel and not has_repository_dependencies ) and kwd.get( 'select_shed_tool_panel_config_button', False ) ) or \
+ ( ( includes_tools_for_display_in_tool_panel or has_repository_dependencies ) and kwd.get( 'select_tool_panel_section_button', False ) ):
install_repository_dependencies = CheckboxField.is_checked( install_repository_dependencies )
if includes_tool_dependencies:
install_tool_dependencies = CheckboxField.is_checked( install_tool_dependencies )
@@ -992,7 +996,7 @@
status='error' ) )
if created_or_updated_tool_shed_repositories:
# Handle contained tools.
- if includes_tools and ( new_tool_panel_section or tool_panel_section ):
+ if includes_tools_for_display_in_tool_panel and ( new_tool_panel_section or tool_panel_section ):
if new_tool_panel_section:
section_id = new_tool_panel_section.lower().replace( ' ', '_' )
tool_panel_section_key = 'section_%s' % str( section_id )
@@ -1021,6 +1025,7 @@
for tsr in created_or_updated_tool_shed_repositories:
tool_panel_section_keys.append( tool_panel_section_key )
new_kwd = dict( includes_tools=includes_tools,
+ includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
has_repository_dependencies=has_repository_dependencies,
install_repository_dependencies=install_repository_dependencies,
includes_tool_dependencies=includes_tool_dependencies,
@@ -1108,10 +1113,11 @@
install_tool_dependencies_check_box = CheckboxField( 'install_tool_dependencies', checked=install_tool_dependencies_check_box_checked )
# Handle repository dependencies check box.
install_repository_dependencies_check_box = CheckboxField( 'install_repository_dependencies', checked=True )
- if includes_tools or has_repository_dependencies:
+ if includes_tools_for_display_in_tool_panel or has_repository_dependencies:
return trans.fill_template( '/admin/tool_shed_repository/select_tool_panel_section.mako',
encoded_repo_info_dicts=encoded_repo_info_dicts,
includes_tools=includes_tools,
+ includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
includes_tool_dependencies=includes_tool_dependencies,
install_tool_dependencies_check_box=install_tool_dependencies_check_box,
has_repository_dependencies=has_repository_dependencies,
@@ -1130,6 +1136,7 @@
return trans.fill_template( '/admin/tool_shed_repository/select_shed_tool_panel_config.mako',
encoded_repo_info_dicts=encoded_repo_info_dicts,
includes_tools=includes_tools,
+ includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
includes_tool_dependencies=includes_tool_dependencies,
install_tool_dependencies_check_box=install_tool_dependencies_check_box,
has_repository_dependencies=has_repository_dependencies,
@@ -1169,7 +1176,7 @@
metadata = tool_shed_repository.metadata
# Keep track of tool dependencies defined for the current repository or those defined for any of it's repository dependencies.
includes_tool_dependencies = tool_shed_repository.includes_tool_dependencies
- if tool_shed_repository.includes_tools:
+ if tool_shed_repository.includes_tools_for_display_in_tool_panel:
# Handle the selected tool panel location for loading tools included in the tool shed repository.
tool_section, new_tool_panel_section, tool_panel_section_key = \
shed_util.handle_tool_panel_selection( trans=trans,
@@ -1239,6 +1246,7 @@
encoded_repository_ids = [ trans.security.encode_id( r.id ) for r in created_or_updated_tool_shed_repositories ]
new_kwd = dict( includes_tool_dependencies=includes_tool_dependencies,
includes_tools=tool_shed_repository.includes_tools,
+ includes_tools_for_display_in_tool_panel=tool_shed_repository.includes_tools_for_display_in_tool_panel,
install_tool_dependencies=install_tool_dependencies,
repo_info_dicts=filtered_repo_info_dicts,
message=message,
@@ -1316,6 +1324,7 @@
includes_data_managers = updated_repo_info_dict.get( 'includes_data_managers', False )
includes_datatypes = updated_repo_info_dict.get( 'includes_datatypes', False )
includes_tools = updated_repo_info_dict.get( 'includes_tools', False )
+ includes_tools_for_display_in_tool_panel = updated_repo_info_dict.get( 'includes_tools_for_display_in_tool_panel', False )
includes_workflows = updated_repo_info_dict.get( 'includes_workflows', False )
has_repository_dependencies = updated_repo_info_dict.get( 'has_repository_dependencies', False )
includes_tool_dependencies = updated_repo_info_dict.get( 'includes_tool_dependencies', False )
@@ -1327,6 +1336,7 @@
includes_datatypes = False
includes_tool_dependencies = False
includes_tools = False
+ includes_tools_for_display_in_tool_panel = False
includes_workflows = False
readme_files_dict = None
tool_dependencies = None
@@ -1337,6 +1347,12 @@
includes_datatypes = True
if 'tools' in metadata:
includes_tools = True
+ # Handle includes_tools_for_display_in_tool_panel.
+ tool_dicts = metadata[ 'tools' ]
+ for tool_dict in tool_dicts:
+ if tool_dict.get( 'add_to_tool_panel', True ):
+ includes_tools_for_display_in_tool_panel = True
+ break
if 'tool_dependencies' in metadata:
includes_tool_dependencies = True
if 'workflows' in metadata:
@@ -1365,7 +1381,7 @@
has_repository_dependencies = True
else:
has_repository_dependencies = False
- if includes_tools:
+ if includes_tools_for_display_in_tool_panel:
# Get the location in the tool panel in which the tools were originally loaded.
if 'tool_panel_section' in metadata:
tool_panel_dict = metadata[ 'tool_panel_section' ]
@@ -1428,6 +1444,7 @@
includes_data_managers=includes_data_managers,
includes_datatypes=includes_datatypes,
includes_tools=includes_tools,
+ includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
includes_tool_dependencies=includes_tool_dependencies,
includes_workflows=includes_workflows,
has_repository_dependencies=has_repository_dependencies,
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b lib/galaxy/webapps/tool_shed/controllers/repository.py
--- a/lib/galaxy/webapps/tool_shed/controllers/repository.py
+++ b/lib/galaxy/webapps/tool_shed/controllers/repository.py
@@ -928,10 +928,12 @@
includes_data_managers = False
includes_datatypes = False
includes_tools = False
+ includes_tools_for_display_in_tool_panel = False
has_repository_dependencies = False
includes_tool_dependencies = False
includes_workflows = False
if repository_metadata:
+ includes_tools_for_display_in_tool_panel = repository_metadata.includes_tools_for_display_in_tool_panel
metadata = repository_metadata.metadata
if metadata:
if 'data_manager' in metadata:
@@ -946,7 +948,7 @@
has_repository_dependencies = True
if 'workflows' in metadata:
includes_workflows = True
- return includes_data_managers, includes_datatypes, includes_tools, includes_tool_dependencies, has_repository_dependencies, includes_workflows
+ return includes_data_managers, includes_datatypes, includes_tools, includes_tools_for_display_in_tool_panel, includes_tool_dependencies, has_repository_dependencies, includes_workflows
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
@@ -958,7 +960,7 @@
repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans,
trans.security.encode_id( repository.id ),
changeset_revision )
- includes_data_managers, includes_datatypes, includes_tools, includes_tool_dependencies, has_repository_dependencies, includes_workflows = \
+ includes_data_managers, includes_datatypes, includes_tools, includes_tools_for_display_in_tool_panel, includes_tool_dependencies, has_repository_dependencies, includes_workflows = \
has_galaxy_utilities( repository_metadata )
repo_dir = repository.repo_path( trans.app )
repo = hg.repository( suc.get_configured_ui(), repo_dir )
@@ -971,6 +973,7 @@
includes_data_managers=includes_data_managers,
includes_datatypes=includes_datatypes,
includes_tools=includes_tools,
+ includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
includes_tool_dependencies=includes_tool_dependencies,
has_repository_dependencies=has_repository_dependencies,
includes_workflows=includes_workflows )
@@ -995,7 +998,7 @@
trans.security.encode_id( repository.id ),
changeset_hash )
if update_to_repository_metadata:
- includes_data_managers, includes_datatypes, includes_tools, includes_tool_dependencies, has_repository_dependencies, includes_workflows = \
+ includes_data_managers, includes_datatypes, includes_tools, includes_tools_for_display_in_tool_panel, includes_tool_dependencies, has_repository_dependencies, includes_workflows = \
has_galaxy_utilities( update_to_repository_metadata )
# We found a RepositoryMetadata record.
if changeset_hash == repository.tip( trans.app ):
@@ -1012,6 +1015,7 @@
update_dict[ 'includes_data_managers' ] = includes_data_managers
update_dict[ 'includes_datatypes' ] = includes_datatypes
update_dict[ 'includes_tools' ] = includes_tools
+ update_dict[ 'includes_tools_for_display_in_tool_panel' ] = includes_tools_for_display_in_tool_panel
update_dict[ 'includes_tool_dependencies' ] = includes_tool_dependencies
update_dict[ 'includes_workflows' ] = includes_workflows
update_dict[ 'has_repository_dependencies' ] = has_repository_dependencies
@@ -1115,6 +1119,7 @@
a local Galaxy instance.
"""
includes_tools = False
+ includes_tools_for_display_in_tool_panel = False
has_repository_dependencies = False
includes_tool_dependencies = False
repo_info_dicts = []
@@ -1127,6 +1132,8 @@
if not includes_tools:
if 'tools' in metadata:
includes_tools = True
+ if not includes_tools_for_display_in_tool_panel:
+ includes_tools_for_display_in_tool_panel = repository_metadata.includes_tools_for_display_in_tool_panel
if not has_repository_dependencies:
if 'repository_dependencies' in metadata:
has_repository_dependencies = True
@@ -1148,6 +1155,7 @@
repository_dependencies=None )
repo_info_dicts.append( encoding_util.tool_shed_encode( repo_info_dict ) )
return dict( includes_tools=includes_tools,
+ includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
has_repository_dependencies=has_repository_dependencies,
includes_tool_dependencies=includes_tool_dependencies,
repo_info_dicts=repo_info_dicts )
@@ -1261,6 +1269,7 @@
includes_data_managers = False
includes_datatypes = False
includes_tools = False
+ includes_tools_for_display_in_tool_panel = False
includes_workflows = False
readme_files_dict = None
metadata = repository_metadata.metadata
@@ -1271,6 +1280,12 @@
includes_datatypes = True
if 'tools' in metadata:
includes_tools = True
+ # Handle includes_tools_for_display_in_tool_panel.
+ tool_dicts = metadata[ 'tools' ]
+ for tool_dict in tool_dicts:
+ if tool_dict.get( 'includes_tools_for_display_in_tool_panel', False ):
+ includes_tools_for_display_in_tool_panel = True
+ break
if 'workflows' in metadata:
includes_workflows = True
readme_files_dict = suc.build_readme_files_dict( metadata )
@@ -1289,6 +1304,7 @@
return dict( includes_data_managers=includes_data_managers,
includes_datatypes=includes_datatypes,
includes_tools=includes_tools,
+ includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel,
has_repository_dependencies=has_repository_dependencies,
includes_tool_dependencies=includes_tool_dependencies,
includes_workflows=includes_workflows,
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b lib/galaxy/webapps/tool_shed/model/__init__.py
--- a/lib/galaxy/webapps/tool_shed/model/__init__.py
+++ b/lib/galaxy/webapps/tool_shed/model/__init__.py
@@ -215,6 +215,14 @@
self.includes_tools = includes_tools
self.includes_tool_dependencies = includes_tool_dependencies
self.includes_workflows = includes_workflows
+ @property
+ def includes_tools_for_display_in_tool_panel( self ):
+ if self.metadata:
+ tool_dicts = self.metadata.get( 'tools', [] )
+ for tool_dict in tool_dicts:
+ if tool_dict.get( 'add_to_tool_panel', True ):
+ return True
+ return False
def as_dict( self, value_mapper=None ):
return self.get_api_value( view='element', value_mapper=value_mapper )
def get_api_value( self, view='collection', value_mapper=None ):
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b lib/tool_shed/util/shed_util.py
--- a/lib/tool_shed/util/shed_util.py
+++ b/lib/tool_shed/util/shed_util.py
@@ -28,7 +28,7 @@
shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
repository.deleted = False
repository.status = trans.model.ToolShedRepository.installation_status.INSTALLED
- if repository.includes_tools:
+ if repository.includes_tools_for_display_in_tool_panel:
metadata = repository.metadata
repository_tools_tups = suc.get_repository_tools_tups( trans.app, metadata )
# Reload tools into the appropriate tool panel section.
@@ -963,6 +963,7 @@
includes_data_managers = update_dict.get( 'includes_data_managers', False )
includes_datatypes = update_dict.get( 'includes_datatypes', False )
includes_tools = update_dict.get( 'includes_tools', False )
+ includes_tools_for_display_in_tool_panel = update_dict.get( 'includes_tools_for_display_in_tool_panel', False )
includes_tool_dependencies = update_dict.get( 'includes_tool_dependencies', False )
includes_workflows = update_dict.get( 'includes_workflows', False )
has_repository_dependencies = update_dict.get( 'has_repository_dependencies', False )
@@ -972,6 +973,7 @@
changeset_revision_dict[ 'includes_data_managers' ] = includes_data_managers
changeset_revision_dict[ 'includes_datatypes' ] = includes_datatypes
changeset_revision_dict[ 'includes_tools' ] = includes_tools
+ changeset_revision_dict[ 'includes_tools_for_display_in_tool_panel' ] = includes_tools_for_display_in_tool_panel
changeset_revision_dict[ 'includes_tool_dependencies' ] = includes_tool_dependencies
changeset_revision_dict[ 'includes_workflows' ] = includes_workflows
changeset_revision_dict[ 'has_repository_dependencies' ] = has_repository_dependencies
@@ -982,6 +984,7 @@
changeset_revision_dict[ 'includes_data_managers' ] = False
changeset_revision_dict[ 'includes_datatypes' ] = False
changeset_revision_dict[ 'includes_tools' ] = False
+ changeset_revision_dict[ 'includes_tools_for_display_in_tool_panel' ] = False
changeset_revision_dict[ 'includes_tool_dependencies' ] = False
changeset_revision_dict[ 'includes_workflows' ] = False
changeset_revision_dict[ 'has_repository_dependencies' ] = False
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b templates/admin/tool_shed_repository/deactivate_or_uninstall_repository.mako
--- a/templates/admin/tool_shed_repository/deactivate_or_uninstall_repository.mako
+++ b/templates/admin/tool_shed_repository/deactivate_or_uninstall_repository.mako
@@ -59,7 +59,7 @@
<div class="toolParamHelp" style="clear: both;">
* The repository and all of it's contents will remain on disk.
</div>
- %if repository.includes_tools:
+ %if repository.includes_tools_for_display_in_tool_panel:
<div class="toolParamHelp" style="clear: both;">
* The repository's tools will not be loaded into the tool panel.
</div>
@@ -87,7 +87,7 @@
<div class="toolParamHelp" style="clear: both;">
* The repository and all of it's contents will be removed from disk.
</div>
- %if repository.includes_tools:
+ %if repository.includes_tools_for_display_in_tool_panel:
<div class="toolParamHelp" style="clear: both;">
* The repository's tool tag sets will be removed from the tool config file in which they are defined.
</div>
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
--- a/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
+++ b/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
@@ -66,7 +66,7 @@
%else:
<input type="hidden" name="shed_tool_conf" value="${shed_tool_conf}"/>
%endif
- %if includes_tools:
+ %if includes_tools_for_display_in_tool_panel:
<div style="clear: both"></div><div class="form-row">
${no_changes_check_box.get_html()}
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b templates/admin/tool_shed_repository/select_shed_tool_panel_config.mako
--- a/templates/admin/tool_shed_repository/select_shed_tool_panel_config.mako
+++ b/templates/admin/tool_shed_repository/select_shed_tool_panel_config.mako
@@ -60,7 +60,7 @@
</div><div class="toolForm"><div class="toolFormBody">
- <form name="select_shed_tool_panel_config" id="select_shed_tool_panel_config" action="${h.url_for( controller='admin_toolshed', action='prepare_for_install', tool_shed_url=tool_shed_url, encoded_repo_info_dicts=encoded_repo_info_dicts, includes_tools=includes_tools, includes_tool_dependencies=includes_tool_dependencies )}" method="post" >
+ <form name="select_shed_tool_panel_config" id="select_shed_tool_panel_config" action="${h.url_for( controller='admin_toolshed', action='prepare_for_install', tool_shed_url=tool_shed_url, encoded_repo_info_dicts=encoded_repo_info_dicts, includes_tools=includes_tools, includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel, includes_tool_dependencies=includes_tool_dependencies )}" method="post" ><div style="clear: both"></div><% readme_files_dict = containers_dict.get( 'readme_files', None ) %>
%if readme_files_dict:
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b templates/admin/tool_shed_repository/select_tool_panel_section.mako
--- a/templates/admin/tool_shed_repository/select_tool_panel_section.mako
+++ b/templates/admin/tool_shed_repository/select_tool_panel_section.mako
@@ -60,7 +60,7 @@
</div><div class="toolForm"><div class="toolFormBody">
- <form name="select_tool_panel_section" id="select_tool_panel_section" action="${h.url_for( controller='admin_toolshed', action='prepare_for_install', tool_shed_url=tool_shed_url, encoded_repo_info_dicts=encoded_repo_info_dicts, includes_tools=includes_tools, includes_tool_dependencies=includes_tool_dependencies )}" method="post" >
+ <form name="select_tool_panel_section" id="select_tool_panel_section" action="${h.url_for( controller='admin_toolshed', action='prepare_for_install', tool_shed_url=tool_shed_url, encoded_repo_info_dicts=encoded_repo_info_dicts, includes_tools=includes_tools, includes_tools_for_display_in_tool_panel=includes_tools_for_display_in_tool_panel, includes_tool_dependencies=includes_tool_dependencies )}" method="post" ><div style="clear: both"></div><% readme_files_dict = containers_dict.get( 'readme_files', None ) %>
%if readme_files_dict:
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -661,7 +661,7 @@
def install_repository( self, name, owner, category_name, install_tool_dependencies=False,
install_repository_dependencies=True, changeset_revision=None,
strings_displayed=[], strings_not_displayed=[], preview_strings_displayed=[],
- post_submit_strings_displayed=[], new_tool_panel_section=None, includes_tools=True,
+ post_submit_strings_displayed=[], new_tool_panel_section=None, includes_tools_for_display_in_tool_panel=True,
**kwd ):
self.browse_tool_shed( url=self.url )
self.browse_category( test_db_util.get_category_by_name( category_name ) )
@@ -692,7 +692,7 @@
kwd[ 'shed_tool_conf' ] = self.shed_tool_conf
if new_tool_panel_section:
kwd[ 'new_tool_panel_section' ] = new_tool_panel_section
- if includes_tools:
+ if includes_tools_for_display_in_tool_panel:
self.submit_form( 1, 'select_tool_panel_section_button', **kwd )
self.check_for_strings( post_submit_strings_displayed, strings_not_displayed )
else:
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b test/tool_shed/functional/test_1060_install_repository_with_workflow.py
--- a/test/tool_shed/functional/test_1060_install_repository_with_workflow.py
+++ b/test/tool_shed/functional/test_1060_install_repository_with_workflow.py
@@ -137,7 +137,7 @@
common.test_user_1_name,
'Test 0060 Workflow Features',
install_tool_dependencies=False,
- includes_tools=False )
+ includes_tools_for_display_in_tool_panel=False )
def test_0030_import_workflow_from_installed_repository( self ):
'''Import the workflow from the installed repository and verify that it appears in the list of all workflows.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( workflow_repository_name, common.test_user_1_name )
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b test/tool_shed/functional/test_1090_install_tool_from_tool_search.py
--- a/test/tool_shed/functional/test_1090_install_tool_from_tool_search.py
+++ b/test/tool_shed/functional/test_1090_install_tool_from_tool_search.py
@@ -252,7 +252,7 @@
self.install_repository( emboss_datatypes_repository_name,
common.test_user_1_name,
category_name,
- includes_tools=False )
+ includes_tools_for_display_in_tool_panel=False )
installed_repositories = [ ( emboss_datatypes_repository_name, common.test_user_1_name ),
( freebayes_repository_name, common.test_user_1_name ) ]
uninstalled_repositories = [ ( emboss_repository_name, common.test_user_1_name ),
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
--- a/test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
+++ b/test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
@@ -233,7 +233,7 @@
install_tool_dependencies=True,
preview_strings_displayed=preview_strings_displayed,
post_submit_strings_displayed=[ base_repository.name, tool_repository.name, 'new' ],
- includes_tools=True )
+ includes_tools_for_display_in_tool_panel=True )
def test_0050_verify_installed_repositories( self ):
'''Verify that the installed repositories are displayed properly.'''
base_repository = test_db_util.get_installed_repository_by_name_owner( bwa_base_repository_name, common.test_user_1_name )
diff -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 -r 2c56c1e49f288ed53234f485c0f19606d013dd1b test/tool_shed/functional/test_1110_install_repository_with_invalid_repository_dependency.py
--- a/test/tool_shed/functional/test_1110_install_repository_with_invalid_repository_dependency.py
+++ b/test/tool_shed/functional/test_1110_install_repository_with_invalid_repository_dependency.py
@@ -182,6 +182,6 @@
install_repository_dependencies=True,
preview_strings_displayed=preview_strings_displayed,
post_submit_strings_displayed=[ repository.name, repository.name, 'new' ],
- includes_tools=True )
+ includes_tools_for_display_in_tool_panel=True )
repository = test_db_util.get_installed_repository_by_name_owner( emboss_repository_name, common.test_user_1_name )
self.display_installed_repository_manage_page( repository, strings_not_displayed=[ 'Repository dependencies' ] )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: history panel: have 'new' state HDAs display their body properly
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/86411cd12e2f/
changeset: 86411cd12e2f
user: carlfeberhard
date: 2013-03-12 15:42:41
summary: history panel: have 'new' state HDAs display their body properly
affected #: 3 files
diff -r 6ea891cafbbb7f9435887ca86b0823e1b8709882 -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 static/scripts/mvc/dataset/hda-base.js
--- a/static/scripts/mvc/dataset/hda-base.js
+++ b/static/scripts/mvc/dataset/hda-base.js
@@ -358,6 +358,7 @@
//TODO: not a fan of this dispatch
switch( this.model.get( 'state' ) ){
case HistoryDatasetAssociation.STATES.NEW :
+ this._render_body_new( body );
break;
case HistoryDatasetAssociation.STATES.NOT_VIEWABLE :
this._render_body_not_viewable( body );
@@ -400,12 +401,21 @@
this._setUpBehaviors( body );
},
+ /** Render a new dataset - this should be a transient state that's never shown
+ * in case it does tho, we'll make sure there's some information here
+ * @param {jQuery} parent DOM to which to append this body
+ */
+ _render_body_new : function( parent ){
+ var newMsg = 'This is a new dataset and not all of its data are available yet';
+ parent.append( $( '<div>' + _l( newMsg ) + '</div>' ) );
+ },
+
/** Render inaccessible, not-owned by curr user.
* @param {jQuery} parent DOM to which to append this body
*/
_render_body_not_viewable : function( parent ){
//TODO: revisit - still showing display, edit, delete (as common) - that CAN'T be right
- parent.append( $( '<div>' + _l( 'You do not have permission to view dataset' ) + '.</div>' ) );
+ parent.append( $( '<div>' + _l( 'You do not have permission to view dataset' ) + '</div>' ) );
},
/** Render an HDA still being uploaded.
@@ -419,7 +429,7 @@
* @param {jQuery} parent DOM to which to append this body
*/
_render_body_queued : function( parent ){
- parent.append( $( '<div>' + _l( 'Job is waiting to run' ) + '.</div>' ) );
+ parent.append( $( '<div>' + _l( 'Job is waiting to run' ) + '</div>' ) );
parent.append( this._render_primaryActionButtons( this.defaultPrimaryActionButtonRenderers ));
},
@@ -427,7 +437,7 @@
* @param {jQuery} parent DOM to which to append this body
*/
_render_body_paused: function( parent ){
- parent.append( $( '<div>' + _l( 'Job is paused. Use the history menu to resume' ) + '.</div>' ) );
+ parent.append( $( '<div>' + _l( 'Job is paused. Use the history menu to resume' ) + '</div>' ) );
parent.append( this._render_primaryActionButtons( this.defaultPrimaryActionButtonRenderers ));
},
@@ -435,7 +445,7 @@
* @param {jQuery} parent DOM to which to append this body
*/
_render_body_running : function( parent ){
- parent.append( '<div>' + _l( 'Job is currently running' ) + '.</div>' );
+ parent.append( '<div>' + _l( 'Job is currently running' ) + '</div>' );
parent.append( this._render_primaryActionButtons( this.defaultPrimaryActionButtonRenderers ));
},
diff -r 6ea891cafbbb7f9435887ca86b0823e1b8709882 -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 static/style/base.less
--- a/static/style/base.less
+++ b/static/style/base.less
@@ -1650,6 +1650,15 @@
}
}
+div.historyItem-new {
+ .state-icon {
+ .fa-icon();
+ &:before {
+ content: "\f071";
+ }
+ }
+}
+
// Special case for showing the spinner but not changing the background
div.historyItemTitleBar.spinner .state-icon {
background: url(data_running.gif) 0 1px no-repeat !important;
diff -r 6ea891cafbbb7f9435887ca86b0823e1b8709882 -r 86411cd12e2f591f6f6f7502a8481d832bcf56c0 static/style/blue/base.css
--- a/static/style/blue/base.css
+++ b/static/style/blue/base.css
@@ -1133,6 +1133,7 @@
div.historyItem-queued{background:#eeeeee;}
div.historyItem-noPermission{filter:alpha(opacity=60);-moz-opacity:.60;opacity:.60;}
div.historyItem-paused{background:#d9edf7;}div.historyItem-paused .state-icon{font-family:FontAwesome;font-size:1.1666666666666667em;background-image:none !important;background-position:0% 0%;background-repeat:repeat;}div.historyItem-paused .state-icon:before{content:"\f04c";}
+div.historyItem-new .state-icon{font-family:FontAwesome;font-size:1.1666666666666667em;background-image:none !important;background-position:0% 0%;background-repeat:repeat;}div.historyItem-new .state-icon:before{content:"\f071";}
div.historyItemTitleBar.spinner .state-icon{background:url(data_running.gif) 0 1px no-repeat !important;}
div.historyItemButtons{float:right;}
div.historyItemBody div{padding-top:2px;}
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Fix issue where the check script was unsetting the galaxy environment information.
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6ea891cafbbb/
changeset: 6ea891cafbbb
user: inithello
date: 2013-03-12 14:36:56
summary: Fix issue where the check script was unsetting the galaxy environment information.
affected #: 1 file
diff -r b89a535240e5cb5fc123264b6294f86a577d02d9 -r 6ea891cafbbb7f9435887ca86b0823e1b8709882 lib/tool_shed/scripts/check_repositories_for_functional_tests.py
--- a/lib/tool_shed/scripts/check_repositories_for_functional_tests.py
+++ b/lib/tool_shed/scripts/check_repositories_for_functional_tests.py
@@ -172,10 +172,6 @@
# a user can't install.
# Initialize the repository_status dict with the test environment, but leave the test_errors empty.
repository_status = {}
- repository_status[ 'test_environment' ] = get_test_environment()
- repository_status[ 'test_environment' ][ 'tool_shed_database_version' ] = get_database_version( app )
- repository_status[ 'test_environment' ][ 'tool_shed_mercurial_version' ] = __version__.version
- repository_status[ 'test_environment' ][ 'tool_shed_revision' ] = get_repository_current_revision( os.getcwd() )
repository_status[ 'invalid_tests' ] = []
metadata_records_to_check = app.sa_session.query( app.model.RepositoryMetadata ) \
.filter( and_( app.model.RepositoryMetadata.table.c.downloadable == True,
@@ -186,6 +182,13 @@
for metadata_record in metadata_records_to_check:
if metadata_record.tool_test_errors:
repository_status = metadata_record.tool_test_errors
+ if 'test_environment' in repository_status:
+ repository_status[ 'test_environment' ] = get_test_environment( repository_status[ 'test_environment' ] )
+ else:
+ repository_status[ 'test_environment' ] = get_test_environment()
+ repository_status[ 'test_environment' ][ 'tool_shed_database_version' ] = get_database_version( app )
+ repository_status[ 'test_environment' ][ 'tool_shed_mercurial_version' ] = __version__.version
+ repository_status[ 'test_environment' ][ 'tool_shed_revision' ] = get_repository_current_revision( os.getcwd() )
name = metadata_record.repository.name
owner = metadata_record.repository.user.username
changeset_revision = str( metadata_record.changeset_revision )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Include tool shed environment information when displaying functional test results in the tool shed.
by commits-noreply@bitbucket.org 12 Mar '13
by commits-noreply@bitbucket.org 12 Mar '13
12 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/b89a535240e5/
changeset: b89a535240e5
user: greg
date: 2013-03-12 14:06:52
summary: Include tool shed environment information when displaying functional test results in the tool shed.
affected #: 1 file
diff -r be95601bd33fde791b42dff3e7446d0ccdcf7fd1 -r b89a535240e5cb5fc123264b6294f86a577d02d9 templates/webapps/tool_shed/repository/display_tool_functional_test_results.mako
--- a/templates/webapps/tool_shed/repository/display_tool_functional_test_results.mako
+++ b/templates/webapps/tool_shed/repository/display_tool_functional_test_results.mako
@@ -136,25 +136,30 @@
</div><div class="form-row"><table width="100%">
- <tr bgcolor="#D8D8D8" width="100%"><td><b>Test environment</td></tr>
+ <tr bgcolor="#D8D8D8" width="100%"><td><b>Tool Shed environment</td></tr></table></div><div class="form-row">
- <label>Architecture:</label>
- ${test_environment_dict.get( 'architecture', 'unknown' ) | h}
+ <label>Tool shed version:</label>
+ ${test_environment_dict.get( 'tool_shed_revision', 'unknown' ) | h}
<div style="clear: both"></div></div><div class="form-row">
- <label>Python version:</label>
- ${test_environment_dict.get( 'python_version', 'unknown' ) | h}
+ <label>Tool shed database version:</label>
+ ${test_environment_dict.get( 'tool_shed_database_version', 'unknown' ) | h}
<div style="clear: both"></div></div><div class="form-row">
- <label>Operating system:</label>
- ${test_environment_dict.get( 'system', 'unknown' ) | h}
+ <label>Mercurial version:</label>
+ ${test_environment_dict.get( 'tool_shed_mercurial_version', 'unknown' ) | h}
<div style="clear: both"></div></div><div class="form-row">
+ <table width="100%">
+ <tr bgcolor="#D8D8D8" width="100%"><td><b>Galaxy environment</td></tr>
+ </table>
+ </div>
+ <div class="form-row"><label>Galaxy version:</label>
${test_environment_dict.get( 'galaxy_revision', 'unknown' ) | h}
<div style="clear: both"></div>
@@ -164,6 +169,21 @@
${test_environment_dict.get( 'galaxy_database_version', 'unknown' ) | h}
<div style="clear: both"></div></div>
+ <div class="form-row">
+ <label>Architecture:</label>
+ ${test_environment_dict.get( 'architecture', 'unknown' ) | h}
+ <div style="clear: both"></div>
+ </div>
+ <div class="form-row">
+ <label>Operating system:</label>
+ ${test_environment_dict.get( 'system', 'unknown' ) | h}
+ <div style="clear: both"></div>
+ </div>
+ <div class="form-row">
+ <label>Python version:</label>
+ ${test_environment_dict.get( 'python_version', 'unknown' ) | h}
+ <div style="clear: both"></div>
+ </div>
%if test_errors:
<div class="form-row"><table width="100%">
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Fix for installing and testing repositories where all functional tests fail.
by commits-noreply@bitbucket.org 11 Mar '13
by commits-noreply@bitbucket.org 11 Mar '13
11 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/5d9328262021/
changeset: 5d9328262021
user: inithello
date: 2013-03-11 19:21:32
summary: Fix for installing and testing repositories where all functional tests fail.
affected #: 1 file
diff -r c07417582dd369a02625d3b3d170718fd69bdd12 -r 5d9328262021b414c9005f79b0c97605acdd4c94 test/install_and_test_tool_shed_repositories/functional_tests.py
--- a/test/install_and_test_tool_shed_repositories/functional_tests.py
+++ b/test/install_and_test_tool_shed_repositories/functional_tests.py
@@ -155,9 +155,11 @@
self.passed[ test_identifier ].append( fixed_test_id )
def getTestStatus( self, test_identifier ):
- tests_passed = self.passed[ test_identifier ]
- del self.passed[ test_identifier ]
- return tests_passed
+ if test_identifier in self.passed:
+ tests_passed = self.passed[ test_identifier ]
+ del self.passed[ test_identifier ]
+ return tests_passed
+ return []
def execute_uninstall_method( repository_dict ):
# Delete any configured tool functional tests from the test_toolbox.__dict__, otherwise nose will find them
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Improve structure of invalid tools dict. Clarify summary and detailed log output. Add check for required environment variables.
by commits-noreply@bitbucket.org 11 Mar '13
by commits-noreply@bitbucket.org 11 Mar '13
11 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c07417582dd3/
changeset: c07417582dd3
user: inithello
date: 2013-03-11 18:49:12
summary: Improve structure of invalid tools dict. Clarify summary and detailed log output. Add check for required environment variables.
affected #: 3 files
diff -r a2f58a2b87876f8db9a8703782633b84f4dc13ef -r c07417582dd369a02625d3b3d170718fd69bdd12 install_and_test_tool_shed_repositories.sh
--- a/install_and_test_tool_shed_repositories.sh
+++ b/install_and_test_tool_shed_repositories.sh
@@ -2,5 +2,42 @@
# A good place to look for nose info: http://somethingaboutorange.com/mrl/projects/nose/
-python test/install_and_test_tool_shed_repositories/functional_tests.py $* -v --with-nosehtml --html-report-file ./test/install_and_test_tool_shed_repositories/run_functional_tests.html test/install_and_test_tool_shed_repositories/functional/test_install_repositories.py test/functional/test_toolbox.py
+# The test/install_and_test_tool_shed_repositories/functional_tests.py can not be executed directly, because it must have certain functional test definitions
+# in sys.argv. Running it through this shell script is the best way to ensure that it has the required definitions.
+# This script requires the following environment variables:
+# GALAXY_INSTALL_TEST_TOOL_SHED_API_KEY - must be set to the API key for the tool shed that is being checked.
+# GALAXY_INSTALL_TEST_TOOL_SHED_URL - must be set to a URL that the tool shed is listening on.
+# If the tool shed url is not specified in tool_sheds_conf.xml, GALAXY_INSTALL_TEST_TOOL_SHEDS_CONF must be set to a tool sheds configuration file
+# that does specify that url, otherwise repository installation will fail.
+
+if [ -z $GALAXY_INSTALL_TEST_TOOL_SHED_API_KEY ] ; then
+ echo "This script requires the GALAXY_INSTALL_TEST_TOOL_SHED_API_KEY environment variable to be set and non-empty."
+ exit 1
+fi
+
+if [ -z $GALAXY_INSTALL_TEST_TOOL_SHED_URL ] ; then
+ echo "This script requires the GALAXY_INSTALL_TEST_TOOL_SHED_URL environment variable to be set and non-empty."
+ exit 1
+fi
+
+if [ -z "$GALAXY_INSTALL_TEST_TOOL_SHEDS_CONF" ] ; then
+ if grep --quiet $GALAXY_INSTALL_TEST_TOOL_SHED_URL tool_sheds_conf.xml; then
+ echo "Tool sheds configuration tool_sheds_conf.xml ok, proceeding."
+ else
+ echo "ERROR: Tool sheds configuration tool_sheds_conf.xml does not have an entry for $GALAXY_INSTALL_TEST_TOOL_SHED_URL."
+ exit 1
+ fi
+else
+ if grep --quiet $GALAXY_INSTALL_TEST_TOOL_SHED_URL $GALAXY_INSTALL_TEST_TOOL_SHEDS_CONF; then
+ echo "Tool sheds configuration $GALAXY_INSTALL_TEST_TOOL_SHEDS_CONF ok, proceeding."
+ else
+ echo "ERROR: Tool sheds configuration $GALAXY_INSTALL_TEST_TOOL_SHEDS_CONF does not have an entry for $GALAXY_INSTALL_TEST_TOOL_SHED_URL"
+ exit 1
+ fi
+fi
+
+python test/install_and_test_tool_shed_repositories/functional_tests.py $* -v --with-nosehtml --html-report-file \
+ test/install_and_test_tool_shed_repositories/run_functional_tests.html \
+ test/install_and_test_tool_shed_repositories/functional/test_install_repositories.py \
+ test/functional/test_toolbox.py
diff -r a2f58a2b87876f8db9a8703782633b84f4dc13ef -r c07417582dd369a02625d3b3d170718fd69bdd12 lib/tool_shed/scripts/check_repositories_for_functional_tests.py
--- a/lib/tool_shed/scripts/check_repositories_for_functional_tests.py
+++ b/lib/tool_shed/scripts/check_repositories_for_functional_tests.py
@@ -55,7 +55,11 @@
type="int", help="Control the amount of detail in the log output. --verbosity=1 is "
"the same as -v")
( options, args ) = parser.parse_args()
- ini_file = args[0]
+ try:
+ ini_file = args[0]
+ except IndexError:
+ print "Usage: python %s <tool shed .ini file> [options]" % sys.argv[ 0 ]
+ exit( 127 )
config_parser = ConfigParser.ConfigParser( {'here':os.getcwd()} )
config_parser.read( ini_file )
config_dict = {}
@@ -161,6 +165,8 @@
has_tests = 0
no_tests = 0
no_tools = 0
+ valid_revisions = 0
+ invalid_revisions = 0
# Get the list of metadata records to check for functional tests and test data. Limit this to records that have not been flagged do_not_test
# or tools_functionally_correct. Also filter out changeset revisions that are not downloadable, because it's redundant to test a revision that
# a user can't install.
@@ -173,6 +179,7 @@
repository_status[ 'invalid_tests' ] = []
metadata_records_to_check = app.sa_session.query( app.model.RepositoryMetadata ) \
.filter( and_( app.model.RepositoryMetadata.table.c.downloadable == True,
+ app.model.RepositoryMetadata.table.c.includes_tools == True,
app.model.RepositoryMetadata.table.c.do_not_test == False,
app.model.RepositoryMetadata.table.c.tools_functionally_correct == False ) ) \
.all()
@@ -185,87 +192,14 @@
repository_status[ 'invalid_tests' ] = []
if metadata_record.repository.id not in checked_repository_ids:
checked_repository_ids.append( metadata_record.repository.id )
- if verbosity >= 1:
- print '# Checking for functional tests in changeset revision %s of %s, owned by %s.' % \
- ( changeset_revision, name, owner )
+ if verbosity >= 1:
+ print '# -------------------------------------------------------------------------------------------'
+ print '# Now checking revision %s of %s, owned by %s.' % ( changeset_revision, name, owner )
# If this changeset revision has no tools, we don't need to do anything here, the install and test script has a filter for returning
# only repositories that contain tools.
if 'tools' not in metadata_record.metadata:
- no_tools += 1
continue
else:
- # Loop through all the tools in this metadata record, checking each one for defined functional tests.
- for tool_metadata in metadata_record.metadata[ 'tools' ]:
- tool_count += 1
- tool_id = tool_metadata[ 'id' ]
- tool_version = tool_metadata[ 'version' ]
- tool_guid = tool_metadata[ 'guid' ]
- if verbosity >= 2:
- print "# Checking tool ID '%s' in changeset revision %s of %s." % \
- ( tool_id, changeset_revision, name )
- # If there are no tests, this tool should not be tested, since the tool functional tests only report failure if the test itself fails,
- # not if it's missing or undefined. Filtering out those repositories at this step will reduce the number of "false negatives" the
- # automated functional test framework produces.
- if 'tests' not in tool_metadata or not tool_metadata[ 'tests' ]:
- if verbosity >= 2:
- print '# No functional tests defined for %s.' % tool_id
- # The repository_metadata.tool_test_errors attribute should always have the following structure:
- # {
- # "test_environment":
- # {
- # "galaxy_revision": "9001:abcd1234",
- # "galaxy_database_version": "114",
- # "tool_shed_revision": "9001:abcd1234",
- # "tool_shed_mercurial_version": "2.3.1",
- # "tool_shed_database_version": "17",
- # "python_version": "2.7.2",
- # "architecture": "x86_64",
- # "system": "Darwin 12.2.0"
- # },
- # "test_errors":
- # [
- # {
- # "test_id": "The test ID, generated by twill",
- # "tool_id": "The tool ID that was tested",
- # "tool_version": "The tool version that was tested",
- # "stderr": "The output of the test, or a more detailed description of what was tested and what the outcome was."
- # "traceback": "The captured traceback."
- # },
- # ]
- # "passed_tests":
- # [
- # {
- # "test_id": "The test ID, generated by twill",
- # "tool_id": "The tool ID that was tested",
- # "tool_version": "The tool version that was tested",
- # "stderr": "The output of the test, or a more detailed description of what was tested and what the outcome was."
- # },
- # ]
- # "invalid_tests":
- # [
- # {
- # "tool_id": "The tool ID that does not have functional tests defined.",
- # "tool_version": "The version of the tool."
- # "tool_guid": "The guid of the tool."
- # "reason_test_is_invalid": "A short explanation of what is invalid.
- # },
- # ]
- # }
- # Optionally, "traceback" may be included in a test_errors dict, if it is relevant. No script should overwrite anything other
- # than the list relevant to what it is testing.
- test_errors = dict( tool_id=tool_id, tool_version=tool_version, tool_guid=tool_guid )
- repository_status[ 'invalid_tests' ].append( test_errors )
- no_tests += 1
- else:
- if verbosity >= 2:
- print "# Tool ID '%s' in changeset revision %s of %s has one or more valid functional tests defined." % \
- ( tool_id, changeset_revision, name )
- has_tests += 1
- if verbosity >= 1:
- if not repository_status[ 'invalid_tests' ]:
- print '# All tools have functional tests in changeset revision %s of repository %s owned by %s.' % ( changeset_revision, name, owner )
- else:
- print '# Some tools missing functional tests in changeset revision %s of repository %s owned by %s.' % ( changeset_revision, name, owner )
has_test_data = False
# Clone the repository up to the changeset revision we're checking.
repo_dir = metadata_record.repository.repo_path( app )
@@ -285,9 +219,47 @@
# Remove the cloned repository path.
if os.path.exists( work_dir ):
shutil.rmtree( work_dir )
- if not has_test_data:
- if verbosity >= 1:
+ if verbosity >= 1:
+ if not has_test_data:
print '# Test data missing in changeset revision %s of repository %s owned by %s.' % ( changeset_revision, name, owner )
+ else:
+ print '# Test data found in changeset revision %s of repository %s owned by %s.' % ( changeset_revision, name, owner )
+ print '# Checking for functional tests in changeset revision %s of %s, owned by %s.' % \
+ ( changeset_revision, name, owner )
+ # Loop through all the tools in this metadata record, checking each one for defined functional tests.
+ for tool_metadata in metadata_record.metadata[ 'tools' ]:
+ tool_count += 1
+ tool_id = tool_metadata[ 'id' ]
+ tool_version = tool_metadata[ 'version' ]
+ tool_guid = tool_metadata[ 'guid' ]
+ if verbosity >= 2:
+ print "# Checking tool ID '%s' in changeset revision %s of %s." % \
+ ( tool_id, changeset_revision, name )
+ # If there are no tests, this tool should not be tested, since the tool functional tests only report failure if the test itself fails,
+ # not if it's missing or undefined. Filtering out those repositories at this step will reduce the number of "false negatives" the
+ # automated functional test framework produces.
+ tool_has_tests = True
+ if 'tests' not in tool_metadata or not tool_metadata[ 'tests' ]:
+ tool_has_tests = False
+ if verbosity >= 2:
+ print '# No functional tests defined for %s.' % tool_id
+ no_tests += 1
+ else:
+ tool_has_tests = True
+ if verbosity >= 2:
+ print "# Tool ID '%s' in changeset revision %s of %s has one or more valid functional tests defined." % \
+ ( tool_id, changeset_revision, name )
+ has_tests += 1
+ failure_reason = ''
+ problem_found = False
+ if not has_test_data:
+ failure_reason += 'Repository does not have a test-data directory. '
+ problem_found = True
+ if not tool_has_tests:
+ failure_reason += 'Functional test definitions missing for %s. ' % tool_id
+ problem_found = True
+ test_errors = dict( tool_id=tool_id, tool_version=tool_version, tool_guid=tool_guid,
+ reason_test_is_invalid=failure_reason )
# The repository_metadata.tool_test_errors attribute should always have the following structure:
# {
# "test_environment":
@@ -323,21 +295,28 @@
# "invalid_tests":
# [
# {
- # "tool_id": "The tool ID that does not have functional tests defined.",
+ # "tool_id": "The ID of the tool that does not have valid tests.",
# "tool_version": "The version of the tool."
# "tool_guid": "The guid of the tool."
- # "reason_test_is_invalid": "A short explanation of what is invalid.
+ # "reason_test_is_invalid": "A short explanation of what is invalid."
# },
# ]
# }
+ #
# Optionally, "traceback" may be included in a test_errors dict, if it is relevant. No script should overwrite anything other
# than the list relevant to what it is testing.
- test_errors = dict( tool_id=None, tool_version=None, tool_guid=None,
- reason_test_is_invalid="Repository %s is missing a test-data directory." % name )
- repository_status[ 'invalid_tests' ].append( test_errors )
+ # Only append this error dict if it hasn't already been added.
+ if problem_found:
+ if test_errors not in repository_status[ 'invalid_tests' ]:
+ repository_status[ 'invalid_tests' ].append( test_errors )
+ if not repository_status[ 'invalid_tests' ]:
+ valid_revisions += 1
+ if verbosity >= 1:
+ print '# All tools have functional tests in changeset revision %s of repository %s owned by %s.' % ( changeset_revision, name, owner )
else:
+ invalid_revisions += 1
if verbosity >= 1:
- print '# Test data found in changeset revision %s of repository %s owned by %s.' % ( changeset_revision, name, owner )
+ print '# Some tools missing functional tests in changeset revision %s of repository %s owned by %s.' % ( changeset_revision, name, owner )
if not info_only:
# If repository_status[ 'test_errors' ] is empty, no issues were found, and we can just update time_last_tested with the platform
# on which this script was run.
@@ -356,8 +335,10 @@
app.sa_session.add( metadata_record )
app.sa_session.flush()
stop = time.time()
+ print '# -------------------------------------------------------------------------------------------'
print '# Checked %d repositories with %d tools in %d changeset revisions.' % ( len( checked_repository_ids ), tool_count, len( metadata_records_to_check ) )
- print '# Skipped %d changeset revisions without tools.' % no_tools
+ print '# %d revisions found with functional tests and test data for all tools.' % valid_revisions
+ print '# %d revisions found with one or more tools missing functional tests and/or test data.' % invalid_revisions
print '# Found %d tools without functional tests.' % no_tests
print '# Found %d tools with functional tests.' % has_tests
if info_only:
diff -r a2f58a2b87876f8db9a8703782633b84f4dc13ef -r c07417582dd369a02625d3b3d170718fd69bdd12 test/install_and_test_tool_shed_repositories/functional_tests.py
--- a/test/install_and_test_tool_shed_repositories/functional_tests.py
+++ b/test/install_and_test_tool_shed_repositories/functional_tests.py
@@ -104,11 +104,20 @@
</tables>
'''
-# Define a default location to find the list of repositories to check.
-galaxy_repository_list = os.environ.get( 'GALAXY_INSTALL_TEST_REPOSITORY_LIST_LOCATIOM', 'repository_list.json' )
-galaxy_tool_shed_url = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_SHED_URL', 'http://localhost:9009' )
+# The tool shed url and api key must be set for this script to work correctly. Additionally, if the tool shed url does not
+# point to one of the defaults, the GALAXY_INSTALL_TEST_TOOL_SHEDS_CONF needs to point to a tool sheds configuration file
+# that contains a definition for that tool shed.
+
+galaxy_tool_shed_url = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_SHED_URL', None )
tool_shed_api_key = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_SHED_API_KEY', None )
-assert tool_shed_api_key is not None, 'Unable to proceed without API key.'
+
+if tool_shed_api_key is None:
+ print "This script requires the GALAXY_INSTALL_TEST_TOOL_SHED_API_KEY environment variable to be set and non-empty."
+ exit( 1 )
+
+if galaxy_tool_shed_url is None:
+ print "This script requires the GALAXY_INSTALL_TEST_TOOL_SHED_URL environment variable to be set and non-empty."
+ exit( 1 )
if 'GALAXY_INSTALL_TEST_SECRET' not in os.environ:
galaxy_encode_secret = 'changethisinproductiontoo'
@@ -462,8 +471,7 @@
# Get a list of repositories to test from the tool shed specified in the GALAXY_INSTALL_TEST_TOOL_SHED_URL environment variable.
log.info( "Retrieving repositories to install from the URL:\n%s\n" % str( galaxy_tool_shed_url ) )
repositories_to_install = get_repositories_to_install( galaxy_tool_shed_url, source='url' )
- log.info( "Retrieved %d repositories to install..." % len( repositories_to_install ) )
- repositories_tested = len( repositories_to_install )
+ log.info( "Retrieved %d repositories from the API." % len( repositories_to_install ) )
for repository_to_install_dict in repositories_to_install:
# We need to get some details from the tool shed API, such as repository name and owner, to pass on to the
# module that will generate the install methods.
@@ -473,13 +481,15 @@
# and therefore do not need to be checked. If they are undeleted, this script will then test them the next time it runs.
if repository_info_dict[ 'deleted' ]:
log.info( "Skipping revision %s of repository id %s (%s/%s) since the repository is deleted..." % \
- ( repository_info_dict[ 'changeset_revision' ],
- repository_info_dict[ 'repository_id' ],
+ ( repository_to_install_dict[ 'changeset_revision' ],
+ repository_to_install_dict[ 'repository_id' ],
repository_info_dict[ 'owner' ],
repository_info_dict[ 'name' ] ) )
continue
# Now merge the dict returned from /api/repository_revisions with the detailed dict we just retrieved.
detailed_repository_list.append( dict( repository_info_dict.items() + repository_to_install_dict.items() ) )
+ repositories_tested = len( detailed_repository_list )
+ log.info( 'After removing deleted repositories from the list, %d remain to be tested.' % repositories_tested )
if '-list_repositories' in sys.argv:
log.info( "The API returned the following repositories, not counting deleted:" )
for repository_info_dict in detailed_repository_list:
@@ -741,15 +751,15 @@
print "# Repository revisions tested: %d" % repositories_tested
if repositories_tested > 0:
if repositories_passed:
- print "# "
+ print '# ----------------------------------------------------------------------------------'
print "# Repositories passed:"
show_summary_output( repositories_passed )
if repositories_failed:
- print "# "
+ print '# ----------------------------------------------------------------------------------'
print "# Repositories failed:"
show_summary_output( repositories_failed )
if repositories_failed_install:
- print "# "
+ print '# ----------------------------------------------------------------------------------'
print "# Repositories not installed correctly:"
show_summary_output( repositories_failed_install )
print "####################################################################################"
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Do not display unnecessary invalid test tesults when displaying functional test results in the tool shed.
by commits-noreply@bitbucket.org 11 Mar '13
by commits-noreply@bitbucket.org 11 Mar '13
11 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a2f58a2b8787/
changeset: a2f58a2b8787
user: greg
date: 2013-03-11 15:49:12
summary: Do not display unnecessary invalid test tesults when displaying functional test results in the tool shed.
affected #: 1 file
diff -r 15fe17fcdeb7d7a86f605bc93600242c843d897d -r a2f58a2b87876f8db9a8703782633b84f4dc13ef templates/webapps/tool_shed/repository/display_tool_functional_test_results.mako
--- a/templates/webapps/tool_shed/repository/display_tool_functional_test_results.mako
+++ b/templates/webapps/tool_shed/repository/display_tool_functional_test_results.mako
@@ -253,7 +253,7 @@
guid = test_results_dict.get( 'tool_guid', None )
tool_id = test_results_dict.get( 'tool_id', None )
tool_version = test_results_dict.get( 'tool_version', None )
- reason_test_is_invalid = test_results_dict.get( 'reason_test_is_invalid', 'unknown' )
+ reason_test_is_invalid = test_results_dict.get( 'reason_test_is_invalid', None )
if reason_test_is_invalid:
reason_test_is_invalid = to_safe_string( reason_test_is_invalid, to_html=True )
%>
@@ -262,10 +262,12 @@
<td colspan="2" bgcolor="#FFFFCC">Tool id: <b>${tool_id}</b> version: <b>${tool_version}</b></td></tr>
%endif
- <tr>
- <td><b>Reason test is invalid</b></td>
- <td>${reason_test_is_invalid}</td>
- </tr>
+ %if reason_test_is_invalid:
+ <tr>
+ <td><b>Reason test is invalid</b></td>
+ <td>${reason_test_is_invalid}</td>
+ </tr>
+ %endif
%endfor
</table></div>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Enhancesments for displaying functional tests run against installed tool shed repositories that contain tools.
by commits-noreply@bitbucket.org 11 Mar '13
by commits-noreply@bitbucket.org 11 Mar '13
11 Mar '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/15fe17fcdeb7/
changeset: 15fe17fcdeb7
user: greg
date: 2013-03-11 15:38:15
summary: Enhancesments for displaying functional tests run against installed tool shed repositories that contain tools.
affected #: 1 file
diff -r 0a6b63eca3ff6a72cd874bf36f73a2b5905aff65 -r 15fe17fcdeb7d7a86f605bc93600242c843d897d templates/webapps/tool_shed/repository/display_tool_functional_test_results.mako
--- a/templates/webapps/tool_shed/repository/display_tool_functional_test_results.mako
+++ b/templates/webapps/tool_shed/repository/display_tool_functional_test_results.mako
@@ -28,11 +28,15 @@
# about the test environment even if all tests passed and the repository_metadata.tools_functionally_correct column is set to True.
tool_test_errors = repository_metadata.tool_test_errors
test_environment_dict = tool_test_errors.get( 'test_environment', None )
+ invalid_tests = tool_test_errors.get( 'invalid_tests', [] )
test_errors = tool_test_errors.get( 'test_errors', [] )
+ tests_passed = tool_test_errors.get( 'tests_passed', [] )
else:
tool_test_errors = None
test_environment_dict = {}
+ invalid_tests = []
test_errors = []
+ tests_passed = []
if can_push:
browse_label = 'Browse or delete repository tip files'
@@ -121,7 +125,7 @@
<b>Repository name:</b><br/>
${repository.name}
%endif
-%if tool_test_errors:
+%if invalid_tests or tool_test_errors or tests_passed:
<p/><div class="toolForm"><div class="toolFormTitle">Tool functional test results</div>
@@ -151,61 +155,48 @@
<div style="clear: both"></div></div><div class="form-row">
- <table width="100%">
- <tr bgcolor="#D8D8D8" width="100%"><td><b>Test results</td></tr>
- </table>
+ <label>Galaxy version:</label>
+ ${test_environment_dict.get( 'galaxy_revision', 'unknown' ) | h}
+ <div style="clear: both"></div></div><div class="form-row">
- <table class="grid">
- %for test_results_dict in test_errors:
- <%
- test_id = test_results_dict.get( 'test_id', 'unknown' )
- if test_id != 'unknown':
- # The test_id looks something like:
- # test_tool_000003 (functional.test_toolbox.TestForTool_localhost:9009/repos/test/bwa_mappers/bwa_color_wrapper/1.0.2)
- # Highlight the tool id and version.
- test_id_items = test_id.split( '/' )
- tool_id = test_id_items[ -2 ]
- tool_id = '<b>%s</b>' % tool_id
- test_id_items[ -2 ] = tool_id
- tool_version = test_id_items[ -1 ]
- tool_version = '<b>%s</b>' % ( tool_version.rstrip( ')' ) )
- tool_version = '%s)' % tool_version
- test_id_items[ -1 ] = tool_version
- test_id = '/'.join( test_id_items )
- test_id_items = test_id.split( ' ' )
- test_num = test_id_items[ 0 ]
- test_num = '<b>%s</b>' % test_num
- test_id_items[ 0 ] = test_num
- test_id = ' '.join( test_id_items )
-
- test_status = '<font color="green">Test passed</font>'
- stdout = test_results_dict.get( 'stdout', '' )
- if stdout:
- stdout = to_safe_string( stdout, to_html=True )
+ <label>Galaxy database version:</label>
+ ${test_environment_dict.get( 'galaxy_database_version', 'unknown' ) | h}
+ <div style="clear: both"></div>
+ </div>
+ %if test_errors:
+ <div class="form-row">
+ <table width="100%">
+ <tr bgcolor="#D8D8D8" width="100%"><td><b>Tests that failed</td></tr>
+ </table>
+ </div>
+ <div class="form-row">
+ <table class="grid">
+ %for test_results_dict in test_errors:
+ <%
+ test_id = test_results_dict.get( 'test_id', 'unknown' )
+ tool_id = test_results_dict.get( 'tool_id', 'unknown' )
+ tool_version = test_results_dict.get( 'tool_version', 'unknown' )
+ test_status = '<font color="red">Test failed</font>'
+
stderr = test_results_dict.get( 'stderr', '' )
if stderr:
stderr = to_safe_string( stderr, to_html=True )
- test_status = '<font color="red">Test failed</font>'
traceback = test_results_dict.get( 'traceback', '' )
if traceback:
traceback = to_safe_string( traceback, to_html=True )
- test_status = '<font color="red">Test failed</font>'
- %>
- <tr>
- <td bgcolor="#FFFFCC"><b>Test id</b></td>
- <td bgcolor="#FFFFCC">${test_id}</td>
- </tr>
- <tr>
- <td><b>Status</b></td>
- <td>${test_status}</td>
- </tr>
- %if repository_metadata.tools_functionally_correct:
+ %><tr>
- <td><b>Stdout</b></td>
- <td>${stdout}</td>
+ <td colspan="2" bgcolor="#FFFFCC">Tool id: <b>${tool_id}</b> version: <b>${tool_version}</b></td></tr>
- %else:
+ <tr>
+ <td><b>Test id</b></td>
+ <td>${test_id}</td>
+ </tr>
+ <tr>
+ <td><b>Status</b></td>
+ <td>${test_status}</td>
+ </tr><tr><td><b>Stderr</b></td><td>${stderr}</td>
@@ -214,11 +205,71 @@
<td><b>Traceback</b></td><td>${traceback}</td></tr>
- %endif
- %endfor
- </table>
- <div style="clear: both"></div>
- </div>
+ %endfor
+ </table>
+ <div style="clear: both"></div>
+ </div>
+ %endif
+ %if tests_passed:
+ <div class="form-row">
+ <table width="100%">
+ <tr bgcolor="#D8D8D8" width="100%"><td><b>Tests that passed successfully</td></tr>
+ </table>
+ </div>
+ <div class="form-row">
+ <table class="grid">
+ %for test_results_dict in tests_passed:
+ <%
+ test_id = test_results_dict.get( 'test_id', 'unknown' )
+ tool_id = test_results_dict.get( 'tool_id', 'unknown' )
+ tool_version = test_results_dict.get( 'tool_version', 'unknown' )
+ test_status = '<font color="green">Test passed</font>'
+ %>
+ <tr>
+ <td colspan="2" bgcolor="#FFFFCC">Tool id: <b>${tool_id}</b> version: <b>${tool_version}</b></td>
+ </tr>
+ <tr>
+ <td><b>Test id</b></td>
+ <td>${test_id}</td>
+ </tr>
+ <tr>
+ <td><b>Status</b></td>
+ <td>${test_status}</td>
+ </tr>
+ %endfor
+ </table>
+ </div>
+ %endif
+ %if invalid_tests:
+ <div class="form-row">
+ <table width="100%">
+ <tr bgcolor="#D8D8D8" width="100%"><td><b>Invalid tests</td></tr>
+ </table>
+ </div>
+ <div class="form-row">
+ <table class="grid">
+ %for test_results_dict in invalid_tests:
+ <%
+ guid = test_results_dict.get( 'tool_guid', None )
+ tool_id = test_results_dict.get( 'tool_id', None )
+ tool_version = test_results_dict.get( 'tool_version', None )
+ reason_test_is_invalid = test_results_dict.get( 'reason_test_is_invalid', 'unknown' )
+ if reason_test_is_invalid:
+ reason_test_is_invalid = to_safe_string( reason_test_is_invalid, to_html=True )
+ %>
+ %if tool_id or tool_version:
+ <tr>
+ <td colspan="2" bgcolor="#FFFFCC">Tool id: <b>${tool_id}</b> version: <b>${tool_version}</b></td>
+ </tr>
+ %endif
+ <tr>
+ <td><b>Reason test is invalid</b></td>
+ <td>${reason_test_is_invalid}</td>
+ </tr>
+ %endfor
+ </table>
+ </div>
+ %endif
</div></div>
%endif
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0