galaxy-commits
Threads by month
- ----- 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
April 2013
- 1 participants
- 197 discussions
commit/galaxy-central: greg: More tool shed dictionary fixes.
by commits-noreply@bitbucket.org 25 Apr '13
by commits-noreply@bitbucket.org 25 Apr '13
25 Apr '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/dc08c095b1a5/
Changeset: dc08c095b1a5
User: greg
Date: 2013-04-25 22:38:00
Summary: More tool shed dictionary fixes.
Affected #: 1 file
diff -r e3fae8e819f24eb43e555f857a15a77a1584b84e -r dc08c095b1a53fab468b21706889e3a87400648f lib/galaxy/webapps/tool_shed/util/container_util.py
--- a/lib/galaxy/webapps/tool_shed/util/container_util.py
+++ b/lib/galaxy/webapps/tool_shed/util/container_util.py
@@ -1027,10 +1027,10 @@
for passed_tests_dict in passed_tests_dicts:
passed_test_id += 1
passed_test = PassedTest( id=passed_test_id,
- stderr=passed_tests_dict[ 'stderr' ],
- test_id=passed_tests_dict[ 'test_id' ],
- tool_id=passed_tests_dict[ 'tool_id' ],
- tool_version=passed_tests_dict[ 'tool_version' ] )
+ stderr=passed_tests_dict.get( 'stderr', '' ),
+ test_id=passed_tests_dict.get( 'test_id' '' ),
+ tool_id=passed_tests_dict.get( 'tool_id', '' ),
+ tool_version=passed_tests_dict.get( 'tool_version', '' ) )
folder.passed_tests.append( passed_test )
failed_tests_dicts = tool_test_results_dict[ 'failed_tests' ]
if failed_tests_dicts:
@@ -1047,7 +1047,7 @@
tool_version=failed_tests_dict.get( 'tool_version', '' ),
traceback=failed_tests_dict.get( 'traceback', '' ) )
folder.failed_tests.append( failed_test )
- missing_test_components_dicts = tool_test_results_dict[ 'missing_test_components' ]
+ missing_test_components_dicts = tool_test_results_dict.get( 'missing_test_components', [] )
if missing_test_components_dicts:
folder_id += 1
folder = Folder( id=folder_id, key='missing_test_components', label='Tools missing tests or test data', parent=test_results_folder )
@@ -1056,10 +1056,10 @@
for missing_test_components_dict in missing_test_components_dicts:
missing_test_component_id += 1
missing_test_component = MissingTestComponent( id=missing_test_component_id,
- missing_components=missing_test_components_dict[ 'missing_components' ],
- tool_guid=missing_test_components_dict[ 'tool_guid' ],
- tool_id=missing_test_components_dict[ 'tool_id' ],
- tool_version=missing_test_components_dict[ 'tool_version' ] )
+ missing_components=missing_test_components_dict.get( 'missing_components', '' ),
+ tool_guid=missing_test_components_dict.get( 'tool_guid', '' ),
+ tool_id=missing_test_components_dict.get( 'tool_id', '' ),
+ tool_version=missing_test_components_dict.get( 'tool_version', '' ) )
folder.missing_test_components.append( missing_test_component )
else:
tool_test_results_root_folder = None
@@ -1098,10 +1098,10 @@
steps = 'unknown'
workflow_id += 1
workflow = Workflow( id=workflow_id,
- workflow_name=workflow_dict[ 'name' ],
+ workflow_name=workflow_dict.get( 'name', '' ),
steps=steps,
- format_version=workflow_dict[ 'format-version' ],
- annotation=workflow_dict[ 'annotation' ],
+ format_version=workflow_dict.get( 'format-version', '' ),
+ annotation=workflow_dict.get( 'annotation', '' ),
repository_metadata_id=repository_metadata_id,
repository_id=repository_id )
folder.workflows.append( workflow )
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 missing entries in the failed tests dictionary in the tool shed.
by commits-noreply@bitbucket.org 25 Apr '13
by commits-noreply@bitbucket.org 25 Apr '13
25 Apr '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e3fae8e819f2/
Changeset: e3fae8e819f2
User: greg
Date: 2013-04-25 22:33:41
Summary: Handle missing entries in the failed tests dictionary in the tool shed.
Affected #: 1 file
diff -r 1d56c002d32e9116f9c6dc57587d9ffa00e24ca0 -r e3fae8e819f24eb43e555f857a15a77a1584b84e lib/galaxy/webapps/tool_shed/util/container_util.py
--- a/lib/galaxy/webapps/tool_shed/util/container_util.py
+++ b/lib/galaxy/webapps/tool_shed/util/container_util.py
@@ -1041,11 +1041,11 @@
for failed_tests_dict in failed_tests_dicts:
failed_test_id += 1
failed_test = FailedTest( id=failed_test_id,
- stderr=failed_tests_dict[ 'stderr' ],
- test_id=failed_tests_dict[ 'test_id' ],
- tool_id=failed_tests_dict[ 'tool_id' ],
- tool_version=failed_tests_dict[ 'tool_version' ],
- traceback=failed_tests_dict[ 'traceback' ] )
+ stderr=failed_tests_dict.get( 'stderr', '' ),
+ test_id=failed_tests_dict.get( 'test_id', '' ),
+ tool_id=failed_tests_dict.get( 'tool_id', '' ),
+ tool_version=failed_tests_dict.get( 'tool_version', '' ),
+ traceback=failed_tests_dict.get( 'traceback', '' ) )
folder.failed_tests.append( failed_test )
missing_test_components_dicts = tool_test_results_dict[ 'missing_test_components' ]
if missing_test_components_dicts:
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: Display automated tool test results in a container in the tool shed rather than a separate page.
by commits-noreply@bitbucket.org 25 Apr '13
by commits-noreply@bitbucket.org 25 Apr '13
25 Apr '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/1d56c002d32e/
Changeset: 1d56c002d32e
User: greg
Date: 2013-04-25 22:17:23
Summary: Display automated tool test results in a container in the tool shed rather than a separate page.
Affected #: 5 files
diff -r 3d569f107f1d449b028fc4d5390dd8d07fdf26ce -r 1d56c002d32e9116f9c6dc57587d9ffa00e24ca0 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
@@ -734,50 +734,6 @@
status='error' ) )
@web.expose
- def display_tool_functional_test_results( self, trans, repository_id, repository_metadata_id, **kwd ):
- """
- The test framework in ~/test/install_and_test_tool_shed_repositories can be executed on a regularly defined schedule (e.g., via cron) to install appropriate
- repositories from a tool shed into a Galaxy instance and run defined functional tests for the tools included in the repository. This process affects the values
- if these columns in the repository_metadata table: do_not_test, missing_test_components, time_last_tested, tools_functionally_correct and tool_test_results.
- """
- params = util.Params( kwd )
- message = util.restore_text( params.get( 'message', '' ) )
- status = params.get( 'status', 'done' )
- repository = suc.get_repository_by_id( trans, repository_id )
- if repository:
- repository_metadata = metadata_util.get_repository_metadata_by_id( trans, repository_metadata_id )
- changeset_revision = repository_metadata.changeset_revision
- if repository_metadata:
- metadata = repository_metadata.metadata
- if metadata:
- revision_label = suc.get_revision_label( trans, repository, repository_metadata.changeset_revision )
- return trans.fill_template( '/webapps/tool_shed/repository/display_tool_functional_test_results.mako',
- repository=repository,
- repository_metadata=repository_metadata,
- revision_label=revision_label,
- message=message,
- status=status )
- else:
- message = 'Missing metadata for revision <b>%s</b> of repository <b>%s</b> owned by <b>%s</b>.' % \
- ( str( changeset_revision ), str( repository.name ), str( repository.user.username ) )
- else:
- message = 'Invalid repository_metadata_id <b>%s</b> received for displaying functional test errors for repository <b>%s</b>.' % \
- ( str( repository_metadata_id ), str( repository.name ) )
- else:
- message = 'Invalid repository_id received for displaying functional test errors.<b>%s</b>.' % str( repository_id )
- return trans.response.send_redirect( web.url_for( controller='repository',
- action='browse_repositories',
- message=message,
- status='error' ) )
- return trans.response.send_redirect( web.url_for( controller='repository',
- action='browse_repository',
- operation='view_or_manage_repository',
- id=repository_id,
- changeset_revision=changeset_revision,
- message=message,
- status='error' ) )
-
- @web.expose
def display_tool_help_image_in_repository( self, trans, **kwd ):
repository_id = kwd.get( 'repository_id', None )
image_file = kwd.get( 'image_file', None )
@@ -2668,11 +2624,6 @@
repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision )
if repository_metadata:
repository_metadata_id = trans.security.encode_id( repository_metadata.id )
- # TODO: Fix this when the install and test framework is completed.
- # if repository_metadata.tool_test_results:
- # tool_test_results = json.from_json_string( repository_metadata.tool_test_results )
- # else:
- # tool_test_results = None
metadata = repository_metadata.metadata
if metadata:
if 'tools' in metadata:
@@ -2708,7 +2659,6 @@
else:
repository_metadata_id = None
metadata = None
- #tool_test_results = None
is_malicious = suc.changeset_is_malicious( trans, repository_id, repository.tip( trans.app ) )
changeset_revision_select_field = grids_util.build_changeset_revision_select_field( trans,
repository,
@@ -2732,7 +2682,6 @@
tool=tool,
tool_metadata_dict=tool_metadata_dict,
tool_lineage=tool_lineage,
- #tool_test_results=tool_test_results,
changeset_revision=changeset_revision,
revision_label=revision_label,
changeset_revision_select_field=changeset_revision_select_field,
diff -r 3d569f107f1d449b028fc4d5390dd8d07fdf26ce -r 1d56c002d32e9116f9c6dc57587d9ffa00e24ca0 lib/galaxy/webapps/tool_shed/util/container_util.py
--- a/lib/galaxy/webapps/tool_shed/util/container_util.py
+++ b/lib/galaxy/webapps/tool_shed/util/container_util.py
@@ -2,6 +2,7 @@
import os
import threading
from galaxy.util import asbool
+from galaxy.web.framework.helpers import time_ago
from tool_shed.util import readme_util
import tool_shed.util.shed_util_common as suc
@@ -29,6 +30,10 @@
self.valid_data_managers = []
self.invalid_data_managers = []
self.tool_dependencies = []
+ self.failed_tests = []
+ self.missing_test_components = []
+ self.passed_tests = []
+ self.test_environments = []
self.repository_dependencies = []
self.readme_files = []
self.workflows = []
@@ -85,6 +90,18 @@
self.display_app_containers = display_app_containers
+class FailedTest( object ):
+ """Failed tool tests object"""
+
+ def __init__( self, id=None, stderr=None, test_id=None, tool_id=None, tool_version=None, traceback=None ):
+ self.id = id
+ self.stderr = stderr
+ self.test_id = test_id
+ self.tool_id = tool_id
+ self.tool_version = tool_version
+ self.traceback = traceback
+
+
class InvalidDataManager( object ):
"""Invalid data Manager object"""
@@ -129,6 +146,28 @@
self.error = error
+class MissingTestComponent( object ):
+ """Missing tool test components object"""
+
+ def __init__( self, id=None, missing_components=None, tool_guid=None, tool_id=None, tool_version=None ):
+ self.id = id
+ self.missing_components = missing_components
+ self.tool_guid = tool_guid
+ self.tool_id = tool_id
+ self.tool_version = tool_version
+
+
+class PassedTest( object ):
+ """Passed tool tests object"""
+
+ def __init__( self, id=None, stderr=None, test_id=None, tool_id=None, tool_version=None ):
+ self.id = id
+ self.stderr = stderr
+ self.test_id = test_id
+ self.tool_id = tool_id
+ self.tool_version = tool_version
+
+
class ReadMe( object ):
"""Readme text object"""
@@ -157,6 +196,23 @@
return [ self.toolshed, self.repository_name, self.repository_owner, self.changeset_revision, asbool( str( self.prior_installation_required ) ) ]
+class TestEnvironment( object ):
+ """Tool test environment object"""
+
+ def __init__( self, id=None, architecture=None, galaxy_database_version=None, galaxy_revision=None, python_version=None, system=None, time_last_tested=None,
+ tool_shed_database_version=None, tool_shed_mercurial_version=None, tool_shed_revision=None ):
+ self.id = id
+ self.architecture = architecture
+ self.galaxy_database_version = galaxy_database_version
+ self.galaxy_revision = galaxy_revision
+ self.python_version = python_version
+ self.system = system
+ self.time_last_tested = time_last_tested
+ self.tool_shed_database_version = tool_shed_database_version
+ self.tool_shed_mercurial_version = tool_shed_mercurial_version
+ self.tool_shed_revision = tool_shed_revision
+
+
class Tool( object ):
"""Tool object"""
@@ -632,6 +688,11 @@
)
if repository_metadata:
metadata = repository_metadata.metadata
+ tool_test_results = repository_metadata.tool_test_results
+ try:
+ time_last_tested = time_ago( repository_metadata.time_last_tested )
+ except:
+ time_last_tested = None
lock = threading.Lock()
lock.acquire( True )
try:
@@ -710,6 +771,10 @@
changeset_revision,
label='Valid tools' )
containers_dict[ 'valid_tools' ] = valid_tools_root_folder
+ # Tool test results container.
+ if tool_test_results:
+ folder_id, tool_test_results_root_folder = build_tool_test_results_folder( trans, folder_id, tool_test_results, time_last_tested=time_last_tested )
+ containers_dict[ 'tool_test_results' ] = tool_test_results_root_folder
# Workflows container.
if metadata:
if 'workflows' in metadata:
@@ -928,6 +993,78 @@
tool_dependencies_root_folder = None
return folder_id, tool_dependencies_root_folder
+def build_tool_test_results_folder( trans, folder_id, tool_test_results_dict, label='Tool test results', time_last_tested=None ):
+ """Return a folder hierarchy containing tool dependencies."""
+ # This container is displayed only in the tool shed.
+ if tool_test_results_dict:
+ folder_id += 1
+ tool_test_results_root_folder = Folder( id=folder_id, key='root', label='root', parent=None )
+ test_environment_dict = tool_test_results_dict[ 'test_environment' ]
+ if test_environment_dict:
+ folder_id += 1
+ test_results_folder = Folder( id=folder_id, key='test_results', label=label, parent=tool_test_results_root_folder )
+ tool_test_results_root_folder.folders.append( test_results_folder )
+ folder_id += 1
+ folder = Folder( id=folder_id, key='test_environment', label='Automated test environment', parent=test_results_folder )
+ test_results_folder.folders.append( folder )
+ test_environment = TestEnvironment( id=1,
+ architecture=test_environment_dict[ 'architecture' ],
+ galaxy_database_version=test_environment_dict[ 'galaxy_database_version' ],
+ galaxy_revision=test_environment_dict[ 'galaxy_revision' ],
+ python_version=test_environment_dict[ 'python_version' ],
+ system=test_environment_dict[ 'system' ],
+ time_last_tested=time_last_tested,
+ tool_shed_database_version=test_environment_dict[ 'tool_shed_database_version' ],
+ tool_shed_mercurial_version=test_environment_dict[ 'tool_shed_mercurial_version' ],
+ tool_shed_revision=test_environment_dict[ 'tool_shed_revision' ] )
+ folder.test_environments.append( test_environment )
+ passed_tests_dicts = tool_test_results_dict[ 'passed_tests' ]
+ if passed_tests_dicts:
+ folder_id += 1
+ folder = Folder( id=folder_id, key='passed_tests', label='Tests that passed successfully', parent=test_results_folder )
+ test_results_folder.folders.append( folder )
+ passed_test_id = 0
+ for passed_tests_dict in passed_tests_dicts:
+ passed_test_id += 1
+ passed_test = PassedTest( id=passed_test_id,
+ stderr=passed_tests_dict[ 'stderr' ],
+ test_id=passed_tests_dict[ 'test_id' ],
+ tool_id=passed_tests_dict[ 'tool_id' ],
+ tool_version=passed_tests_dict[ 'tool_version' ] )
+ folder.passed_tests.append( passed_test )
+ failed_tests_dicts = tool_test_results_dict[ 'failed_tests' ]
+ if failed_tests_dicts:
+ folder_id += 1
+ folder = Folder( id=folder_id, key='failed_tests', label='Tests that failed', parent=test_results_folder )
+ test_results_folder.folders.append( folder )
+ failed_test_id = 0
+ for failed_tests_dict in failed_tests_dicts:
+ failed_test_id += 1
+ failed_test = FailedTest( id=failed_test_id,
+ stderr=failed_tests_dict[ 'stderr' ],
+ test_id=failed_tests_dict[ 'test_id' ],
+ tool_id=failed_tests_dict[ 'tool_id' ],
+ tool_version=failed_tests_dict[ 'tool_version' ],
+ traceback=failed_tests_dict[ 'traceback' ] )
+ folder.failed_tests.append( failed_test )
+ missing_test_components_dicts = tool_test_results_dict[ 'missing_test_components' ]
+ if missing_test_components_dicts:
+ folder_id += 1
+ folder = Folder( id=folder_id, key='missing_test_components', label='Tools missing tests or test data', parent=test_results_folder )
+ test_results_folder.folders.append( folder )
+ missing_test_component_id = 0
+ for missing_test_components_dict in missing_test_components_dicts:
+ missing_test_component_id += 1
+ missing_test_component = MissingTestComponent( id=missing_test_component_id,
+ missing_components=missing_test_components_dict[ 'missing_components' ],
+ tool_guid=missing_test_components_dict[ 'tool_guid' ],
+ tool_id=missing_test_components_dict[ 'tool_id' ],
+ tool_version=missing_test_components_dict[ 'tool_version' ] )
+ folder.missing_test_components.append( missing_test_component )
+ else:
+ tool_test_results_root_folder = None
+ return folder_id, tool_test_results_root_folder
+
def build_workflows_folder( trans, folder_id, workflows, repository_metadata_id=None, repository_id=None, label='Workflows' ):
"""
Return a folder hierarchy containing workflow objects for each workflow dictionary in the received workflows list. When
diff -r 3d569f107f1d449b028fc4d5390dd8d07fdf26ce -r 1d56c002d32e9116f9c6dc57587d9ffa00e24ca0 templates/webapps/tool_shed/repository/common.mako
--- a/templates/webapps/tool_shed/repository/common.mako
+++ b/templates/webapps/tool_shed/repository/common.mako
@@ -325,6 +325,26 @@
${render_invalid_data_manager( data_manager, pad, my_row, row_counter, row_is_header )}
%endfor
%endif
+ %if folder.test_environments:
+ %for test_environment in folder.test_environments:
+ ${render_test_environment( test_environment, pad, my_row, row_counter )}
+ %endfor
+ %endif
+ %if folder.failed_tests:
+ %for failed_test in folder.failed_tests:
+ ${render_failed_test( failed_test, pad, my_row, row_counter )}
+ %endfor
+ %endif
+ %if folder.passed_tests:
+ %for passed_test in folder.passed_tests:
+ ${render_passed_test( passed_test, pad, my_row, row_counter )}
+ %endfor
+ %endif
+ %if folder.missing_test_components:
+ %for missing_test_component in folder.missing_test_components:
+ ${render_missing_test_component( missing_test_component, pad, my_row, row_counter )}
+ %endfor
+ %endif
</%def><%def name="render_datatype( datatype, pad, parent, row_counter, row_is_header=False )">
@@ -351,22 +371,22 @@
%></%def>
-<%def name="render_valid_data_manager( data_manager, pad, parent, row_counter, row_is_header=False )">
- <%
- encoded_id = trans.security.encode_id( data_manager.id )
- if row_is_header:
- cell_type = 'th'
- else:
- cell_type = 'td'
- %>
+<%def name="render_failed_test( failed_test, pad, parent, row_counter, row_is_header=False )">
+ <% encoded_id = trans.security.encode_id( failed_test.id ) %><tr class="datasetRow"
%if parent is not None:
parent="${parent}"
%endif
id="libraryItem-${encoded_id}">
- <${cell_type} style="padding-left: ${pad+20}px;">${data_manager.name | h}</${cell_type}>
- <${cell_type}>${data_manager.version | h}</${cell_type}>
- <${cell_type}>${data_manager.data_tables | h}</${cell_type}>
+ <td style="padding-left: ${pad+20}px;">
+ <table class="grid" id="readme_table">
+ <tr><td bgcolor="#FFFFCC"><b>Tool id:</b> ${failed_test.tool_id | h}</td></tr>
+ <tr><td><b>Tool version:</b> ${failed_test.tool_id | h}</td></tr>
+ <tr><td><b>Test:</b> ${failed_test.test_id | h}</td></tr>
+ <tr><td><b>Stderr:</b><br/>${failed_test.stderr | h}</td></tr>
+ <tr><td><b>Traceback:</b><br/>${failed_test.traceback | h}</td></tr>
+ </table>
+ </td></tr><%
my_row = row_counter.count
@@ -467,6 +487,28 @@
%></%def>
+<%def name="render_missing_test_component( missing_test_component, pad, parent, row_counter, row_is_header=False )">
+ <% encoded_id = trans.security.encode_id( missing_test_component.id ) %>
+ <tr class="datasetRow"
+ %if parent is not None:
+ parent="${parent}"
+ %endif
+ id="libraryItem-${encoded_id}">
+ <td style="padding-left: ${pad+20}px;">
+ <table class="grid" id="readme_table">
+ <tr><td bgcolor="#FFFFCC"><b>Tool id:</b> ${missing_test_component.tool_id | h}</td></tr>
+ <tr><td><b>Tool version:</b> ${missing_test_component.tool_version | h}</td></tr>
+ <tr><td><b>Tool guid:</b> ${missing_test_component.tool_guid | h}</td></tr>
+ <tr><td><b>Missing components:</b><br/>${missing_test_component.missing_components | h}</td></tr>
+ </table>
+ </td>
+ </tr>
+ <%
+ my_row = row_counter.count
+ row_counter.increment()
+ %>
+</%def>
+
<%def name="render_readme( readme, pad, parent, row_counter )"><%
from tool_shed.util.shed_util_common import to_safe_string
@@ -564,6 +606,28 @@
%></%def>
+<%def name="render_passed_test( passed_test, pad, parent, row_counter, row_is_header=False )">
+ <% encoded_id = trans.security.encode_id( passed_test.id ) %>
+ <tr class="datasetRow"
+ %if parent is not None:
+ parent="${parent}"
+ %endif
+ id="libraryItem-${encoded_id}">
+ <td style="padding-left: ${pad+20}px;">
+ <table class="grid" id="readme_table">
+ <tr><td bgcolor="#FFFFCC"><b>Tool id:</b> ${passed_test.tool_id | h}</td></tr>
+ <tr><td><b>Tool version:</b> ${passed_test.tool_id | h}</td></tr>
+ <tr><td><b>Test:</b> ${passed_test.test_id | h}</td></tr>
+ <tr><td><b>Stderr:</b><br/>${passed_test.stderr | h}</td></tr>
+ </table>
+ </td>
+ </tr>
+ <%
+ my_row = row_counter.count
+ row_counter.increment()
+ %>
+</%def>
+
<%def name="render_tool( tool, pad, parent, row_counter, row_is_header )"><%
encoded_id = trans.security.encode_id( tool.id )
@@ -672,6 +736,56 @@
%></%def>
+<%def name="render_test_environment( test_environment, pad, parent, row_counter, row_is_header=False )">
+ <% encoded_id = trans.security.encode_id( test_environment.id ) %>
+ <tr class="datasetRow"
+ %if parent is not None:
+ parent="${parent}"
+ %endif
+ id="libraryItem-${encoded_id}">
+ <td style="padding-left: ${pad+20}px;">
+ <table class="grid" id="readme_table">
+ <tr><td><b>Time tested:</b> ${test_environment.time_last_tested | h}</td></tr>
+ <tr><td><b>System:</b> ${test_environment.system | h}</td></tr>
+ <tr><td><b>Architecture:</b> ${test_environment.architecture | h}</td></tr>
+ <tr><td><b>Python version:</b> ${test_environment.python_version | h}</td></tr>
+ <tr><td><b>Galaxy revision:</b> ${test_environment.galaxy_revision | h}</td></tr>
+ <tr><td><b>Galaxy database version:</b> ${test_environment.galaxy_database_version | h}</td></tr>
+ <tr><td><b>Tool shed revision:</b> ${test_environment.tool_shed_revision | h}</td></tr>
+ <tr><td><b>Tool shed database version:</b> ${test_environment.tool_shed_database_version | h}</td></tr>
+ <tr><td><b>Tool shed mercurial version:</b> ${test_environment.tool_shed_mercurial_version | h}</td></tr>
+ </table>
+ </td>
+ </tr>
+ <%
+ my_row = row_counter.count
+ row_counter.increment()
+ %>
+</%def>
+
+<%def name="render_valid_data_manager( data_manager, pad, parent, row_counter, row_is_header=False )">
+ <%
+ encoded_id = trans.security.encode_id( data_manager.id )
+ if row_is_header:
+ cell_type = 'th'
+ else:
+ cell_type = 'td'
+ %>
+ <tr class="datasetRow"
+ %if parent is not None:
+ parent="${parent}"
+ %endif
+ id="libraryItem-${encoded_id}">
+ <${cell_type} style="padding-left: ${pad+20}px;">${data_manager.name | h}</${cell_type}>
+ <${cell_type}>${data_manager.version | h}</${cell_type}>
+ <${cell_type}>${data_manager.data_tables | h}</${cell_type}>
+ </tr>
+ <%
+ my_row = row_counter.count
+ row_counter.increment()
+ %>
+</%def>
+
<%def name="render_workflow( workflow, pad, parent, row_counter, row_is_header=False )"><%
from tool_shed.util.encoding_util import tool_shed_encode
@@ -723,18 +837,20 @@
has_workflows = metadata and 'workflows' in metadata
datatypes_root_folder = containers_dict.get( 'datatypes', None )
+ invalid_data_managers_root_folder = containers_dict.get( 'invalid_data_managers', None )
+ invalid_repository_dependencies_root_folder = containers_dict.get( 'invalid_repository_dependencies', None )
+ invalid_tool_dependencies_root_folder = containers_dict.get( 'invalid_tool_dependencies', None )
invalid_tools_root_folder = containers_dict.get( 'invalid_tools', None )
- invalid_repository_dependencies_root_folder = containers_dict.get( 'invalid_repository_dependencies', None )
+ missing_repository_dependencies_root_folder = containers_dict.get( 'missing_repository_dependencies', None )
+ missing_tool_dependencies_root_folder = containers_dict.get( 'missing_tool_dependencies', None )
readme_files_root_folder = containers_dict.get( 'readme_files', None )
repository_dependencies_root_folder = containers_dict.get( 'repository_dependencies', None )
- missing_repository_dependencies_root_folder = containers_dict.get( 'missing_repository_dependencies', None )
- invalid_tool_dependencies_root_folder = containers_dict.get( 'invalid_tool_dependencies', None )
+ test_environment_root_folder = containers_dict.get( 'test_environment', None )
tool_dependencies_root_folder = containers_dict.get( 'tool_dependencies', None )
- missing_tool_dependencies_root_folder = containers_dict.get( 'missing_tool_dependencies', None )
+ tool_test_results_root_folder = containers_dict.get( 'tool_test_results', None )
+ valid_data_managers_root_folder = containers_dict.get( 'valid_data_managers', None )
valid_tools_root_folder = containers_dict.get( 'valid_tools', None )
workflows_root_folder = containers_dict.get( 'workflows', None )
- valid_data_managers_root_folder = containers_dict.get( 'valid_data_managers', None )
- invalid_data_managers_root_folder = containers_dict.get( 'invalid_data_managers', None )
has_contents = datatypes_root_folder or invalid_tools_root_folder or valid_tools_root_folder or workflows_root_folder
has_dependencies = \
@@ -864,4 +980,16 @@
</div></div>
%endif
+ %if tool_test_results_root_folder:
+ <div class="toolForm">
+ <div class="toolFormTitle">Automated tool test results</div>
+ <div class="toolFormBody">
+ <p/>
+ <% row_counter = RowCounter() %>
+ <table cellspacing="2" cellpadding="2" border="0" width="100%" class="tables container-table" id="test_environment">
+ ${render_folder( tool_test_results_root_folder, 0, parent=None, row_counter=row_counter, is_root_folder=True )}
+ </table>
+ </div>
+ </div>
+ %endif
</%def>
diff -r 3d569f107f1d449b028fc4d5390dd8d07fdf26ce -r 1d56c002d32e9116f9c6dc57587d9ffa00e24ca0 templates/webapps/tool_shed/repository/manage_repository.mako
--- a/templates/webapps/tool_shed/repository/manage_repository.mako
+++ b/templates/webapps/tool_shed/repository/manage_repository.mako
@@ -26,13 +26,6 @@
can_undeprecate = trans.user and ( is_admin or repository.user == trans.user ) and is_deprecated
can_upload = can_push
can_view_change_log = not is_new
- if repository_metadata:
- if repository_metadata.includes_tools and repository_metadata.tool_test_results is not None:
- can_display_tool_functional_test_results = True
- else:
- can_display_tool_functional_test_results = False
- else:
- can_display_tool_functional_test_results = False
if can_push:
browse_label = 'Browse or delete repository tip files'
@@ -88,9 +81,6 @@
%if can_browse_repository_reviews:
<a class="action-button" href="${h.url_for( controller='repository_review', action='manage_repository_reviews', id=trans.app.security.encode_id( repository.id ) )}">Browse reviews of this repository</a>
%endif
- %if can_display_tool_functional_test_results:
- <a class="action-button" href="${h.url_for( controller='repository', action='display_tool_functional_test_results', repository_id=trans.security.encode_id( repository.id ), repository_metadata_id=trans.security.encode_id( repository_metadata.id ) )}">View tool functional test results</a>
- %endif
%if can_upload:
<a class="action-button" href="${h.url_for( controller='upload', action='upload', repository_id=trans.security.encode_id( repository.id ) )}">Upload files to repository</a>
%endif
diff -r 3d569f107f1d449b028fc4d5390dd8d07fdf26ce -r 1d56c002d32e9116f9c6dc57587d9ffa00e24ca0 templates/webapps/tool_shed/repository/view_repository.mako
--- a/templates/webapps/tool_shed/repository/view_repository.mako
+++ b/templates/webapps/tool_shed/repository/view_repository.mako
@@ -25,14 +25,6 @@
can_view_change_log = trans.webapp.name == 'tool_shed' and not is_new
changeset_revision_is_repository_tip = changeset_revision == repository.tip( trans.app )
- if repository_metadata:
- if repository_metadata.includes_tools and repository_metadata.tool_test_results is not None:
- can_display_tool_functional_test_results = True
- else:
- can_display_tool_functional_test_results = False
- else:
- can_display_tool_functional_test_results = False
-
if can_push:
browse_label = 'Browse or delete repository tip files'
else:
@@ -88,9 +80,6 @@
%if can_browse_repository_reviews:
<a class="action-button" href="${h.url_for( controller='repository_review', action='manage_repository_reviews', id=trans.app.security.encode_id( repository.id ) )}">Browse reviews of this repository</a>
%endif
- %if can_display_tool_functional_test_results:
- <a class="action-button" href="${h.url_for( controller='repository', action='display_tool_functional_test_results', repository_id=trans.security.encode_id( repository.id ), repository_metadata_id=trans.security.encode_id( repository_metadata.id ) )}">View tool functional test results</a>
- %endif
%if can_upload:
<a class="action-button" href="${h.url_for( controller='upload', action='upload', repository_id=trans.security.encode_id( repository.id ) )}">Upload files to repository</a>
%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
commit/galaxy-central: inithello: Fix for failing upload tool functional tests.
by commits-noreply@bitbucket.org 25 Apr '13
by commits-noreply@bitbucket.org 25 Apr '13
25 Apr '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/3d569f107f1d/
Changeset: 3d569f107f1d
User: inithello
Date: 2013-04-25 21:16:23
Summary: Fix for failing upload tool functional tests.
Affected #: 1 file
diff -r 1fa287b15af5dab0ac84545835752b4f87e87328 -r 3d569f107f1d449b028fc4d5390dd8d07fdf26ce test/base/twilltestcase.py
--- a/test/base/twilltestcase.py
+++ b/test/base/twilltestcase.py
@@ -242,7 +242,20 @@
# Wait for upload processing to finish (TODO: this should be done in each test case instead)
self.wait()
+ def json_from_url( self, url ):
+ self.visit_url( url )
+ return from_json_string( self.last_page() )
+
# Functions associated with histories
+ def get_history_from_api( self, encoded_history_id=None ):
+ if encoded_history_id is None:
+ history = self.get_latest_history()
+ encoded_history_id = history[ 'id' ]
+ return self.json_from_url( '/api/histories/%s/contents' % encoded_history_id )
+
+ def get_latest_history( self ):
+ return self.json_from_url( '/api/histories' )[ 0 ]
+
def check_history_for_errors( self ):
"""Raises an exception if there are errors in a history"""
self.home()
@@ -317,43 +330,29 @@
Uses history page JSON to determine whether this history is empty
(i.e. has no undeleted datasets).
"""
- def has_no_undeleted_hdas( hda_list ):
- if not len( hda_list ):
- return True
- for hda in hda_list:
- if not( hda[ 'deleted' ] or hda[ 'purged' ] ):
- return False
- return True
- try:
- self.check_history_json( r'\bhdas\s*=\s*(.*);', has_no_undeleted_hdas )
- except AssertionError, exc:
- log.error( 'history is not empty' )
- raise exc
+ return len( self.get_history_from_api() ) == 0
def check_hda_json_for_key_value( self, hda_id, key, value, use_string_contains=False ):
"""
- Uses history page JSON to determine whether the current history:
- (1) has an hda with hda_id,
- (2) that hda has a JSON var named 'key',
- (3) that var 'key' == value
- If use_string_contains=True, this will search for value in var 'key'
- instead of testing for an entire, exact match (string only).
+ Uses the history API to determine whether the current history:
+ (1) Has a history dataset with the required ID.
+ (2) That dataset has the required key.
+ (3) The contents of that key match the provided value.
+ If use_string_contains=True, this will perform a substring match, otherwise an exact match.
"""
#TODO: multi key, value
- def hda_has_key_value( hda_list ):
- for hda in hda_list:
- # if we found the hda and there's a var in the json named key
- if( ( hda[ 'id' ] == hda_id )
- and ( key in hda ) ):
- var = hda[ key ]
- # test for partial string containment if str and requested
- if( ( type( var ) == str )
- and ( use_string_contains ) ):
- return ( value in var )
- # otherwise, test for equivalence
- return ( var == value )
- return False
- self.check_history_json( r'\bhdas\s*=\s*(.*);', hda_has_key_value )
+ hda = dict()
+ for history_item in self.get_history_from_api():
+ if history_item[ 'id' ] == hda_id:
+ hda = self.json_from_url( history_item[ 'url' ] )
+ break
+ if hda:
+ if key in hda:
+ if use_string_contains:
+ return value in hda[ key ]
+ else:
+ return value == hda[ key ]
+ return False
def clear_history( self ):
"""Empties a history of all datasets"""
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: Tools API: ensure error handling on index, show; Browser tests: add api.tools module and create tests for index, show
by commits-noreply@bitbucket.org 25 Apr '13
by commits-noreply@bitbucket.org 25 Apr '13
25 Apr '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/1fa287b15af5/
Changeset: 1fa287b15af5
User: carlfeberhard
Date: 2013-04-25 20:31:43
Summary: Tools API: ensure error handling on index, show; Browser tests: add api.tools module and create tests for index, show
Affected #: 3 files
diff -r 6eed572a8bdcd6dc9bf2fcd54360217c1f447f20 -r 1fa287b15af5dab0ac84545835752b4f87e87328 lib/galaxy/webapps/galaxy/api/tools.py
--- a/lib/galaxy/webapps/galaxy/api/tools.py
+++ b/lib/galaxy/webapps/galaxy/api/tools.py
@@ -5,6 +5,9 @@
from galaxy.util.json import to_json_string, from_json_string
from galaxy.visualization.data_providers.genome import *
+import logging
+log = logging.getLogger( __name__ )
+
class ToolsController( BaseAPIController, UsesVisualizationMixin ):
"""
RESTful controller for interactions with tools.
@@ -29,7 +32,12 @@
trackster = util.string_as_bool( kwds.get( 'trackster', 'False' ) )
# Create return value.
- return self.app.toolbox.to_dict( trans, in_panel=in_panel, trackster=trackster )
+ try:
+ return self.app.toolbox.to_dict( trans, in_panel=in_panel, trackster=trackster )
+ except Exception, exc:
+ log.error( 'could not convert toolbox to dictionary: %s', str( exc ), exc_info=True )
+ trans.response.status = 500
+ return { 'error': str( exc ) }
@web.expose_api
def show( self, trans, id, **kwd ):
@@ -37,7 +45,12 @@
GET /api/tools/{tool_id}
Returns tool information, including parameters and inputs.
"""
- return self.app.toolbox.tools_by_id[ id ].to_dict( trans, for_display=True )
+ try:
+ return self.app.toolbox.tools_by_id[ id ].to_dict( trans, for_display=True )
+ except Exception, exc:
+ log.error( 'could not convert tool (%s) to dictionary: %s', id, str( exc ), exc_info=True )
+ trans.response.status = 500
+ return { 'error': str( exc ) }
@web.expose_api
def create( self, trans, payload, **kwd ):
@@ -45,7 +58,6 @@
POST /api/tools
Executes tool using specified inputs and returns tool's outputs.
"""
-
# HACK: for now, if action is rerun, rerun tool.
action = payload.get( 'action', None )
if action == 'rerun':
diff -r 6eed572a8bdcd6dc9bf2fcd54360217c1f447f20 -r 1fa287b15af5dab0ac84545835752b4f87e87328 test/casperjs/api-tool-tests.js
--- /dev/null
+++ b/test/casperjs/api-tool-tests.js
@@ -0,0 +1,222 @@
+/* Utility to load a specific page and output html, page text, or a screenshot
+ * Optionally wait for some time, text, or dom selector
+ */
+try {
+ //...if there's a better way - please let me know, universe
+ var 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
+ });
+
+} catch( error ){
+ console.debug( error );
+ phantom.exit( 1 );
+}
+spaceghost.start();
+
+// =================================================================== SET UP
+var utils = require( 'utils' );
+
+var email = spaceghost.user.getRandomEmail(),
+ password = '123456';
+if( spaceghost.fixtureData.testUser ){
+ email = spaceghost.fixtureData.testUser.email;
+ password = spaceghost.fixtureData.testUser.password;
+}
+spaceghost.user.loginOrRegisterUser( email, password );
+
+function hasKeys( object, keysArray ){
+ if( !utils.isObject( object ) ){ return false; }
+ for( var i=0; i<keysArray.length; i += 1 ){
+ if( !object.hasOwnProperty( keysArray[i] ) ){
+ spaceghost.debug( 'key not found: ' + keysArray[i] );
+ return false;
+ }
+ }
+ return true;
+}
+
+function compareObjs( obj1, where ){
+ for( var key in where ){
+ if( where.hasOwnProperty( key ) ){
+ if( !obj1.hasOwnProperty( key ) ){ return false; }
+ if( obj1[ key ] !== where[ key ] ){ return false; }
+ }
+ }
+ return true;
+}
+
+function findObject( objectArray, where, start ){
+ start = start || 0;
+ for( var i=start; i<objectArray.length; i += 1 ){
+ if( compareObjs( objectArray[i], where ) ){ return objectArray[i]; }
+ }
+ return null;
+}
+
+// =================================================================== TESTS
+var panelSectionKeys = [
+ 'elems', 'id', 'name', 'type', 'version'
+ ],
+ panelToolKeys = [
+ 'id', 'name', 'description', 'version', 'link', 'target', 'min_width', 'type'
+ ],
+ toolSummaryKeys = [
+ 'id', 'name', 'description', 'version'
+ ],
+ toolDetailKeys = [
+ 'id', 'name', 'description', 'version', 'inputs'
+ ],
+ toolInputKeys = [
+ 'html', 'label', 'name', 'type'
+ // there are others, but it's not consistent across all inputs
+ ];
+
+function attemptShowOnAllTools(){
+ //NOTE: execute like: attemptShowOnAllTools.call( spaceghost )
+ toolIndex = this.api.tools.index( false );
+ var toolErrors = {};
+ function ObjectKeySet(){
+ var self = this;
+ function addOne( key ){
+ if( !self.hasOwnProperty( key ) ){
+ self[ key ] = true;
+ }
+ }
+ self.__add = function( obj ){
+ for( var key in obj ){
+ if( obj.hasOwnProperty( key ) ){
+ addOne( key );
+ }
+ }
+ };
+ return self;
+ }
+ var set = new ObjectKeySet();
+ for( i=0; i<toolIndex.length; i+=1 ){
+ var tool = toolIndex[i];
+ try {
+ toolShow = this.api.tools.show( tool.id );
+ this.info( 'checking: ' + tool.id );
+ for( var j=0; j<toolShow.inputs.length; j+=1 ){
+ var input = toolShow.inputs[j];
+ set.__add( input );
+ }
+ } catch( err ){
+ var message = JSON.parse( err.message ).error;
+ this.error( '\t error: ' + message );
+ toolErrors[ tool.id ] = message;
+ }
+ }
+ this.debug( this.jsonStr( toolErrors ) );
+ this.debug( this.jsonStr( set ) );
+}
+
+spaceghost.thenOpen( spaceghost.baseUrl ).then( function(){
+
+ // ------------------------------------------------------------------------------------------- INDEX
+ // ........................................................................................... (defaults)
+ this.test.comment( 'index should get a list of tools in panel form (by default)' );
+ var toolIndex = this.api.tools.index();
+ //this.debug( this.jsonStr( toolIndex ) );
+ this.test.assert( utils.isArray( toolIndex ), "index returned an array: length " + toolIndex.length );
+ this.test.assert( toolIndex.length >= 1, 'Has at least one tool section' );
+
+ this.test.comment( 'index panel form should be separated into sections (by default)' );
+ var firstSection = toolIndex[0]; // get data
+ //this.debug( this.jsonStr( firstSection ) );
+ this.test.assert( hasKeys( firstSection, panelSectionKeys ), 'Has the proper keys' );
+ //TODO: test form of indiv. keys
+
+ this.test.comment( 'index sections have a list of tool "elems"' );
+ this.test.assert( utils.isArray( firstSection.elems ), firstSection.name + ".elems is an array: "
+ + "length " + firstSection.elems.length );
+ this.test.assert( firstSection.elems.length >= 1, 'Has at least one tool' );
+
+ var firstTool = firstSection.elems[0]; // get data
+ //this.debug( this.jsonStr( firstTool ) );
+ this.test.assert( hasKeys( firstTool, panelToolKeys ), 'Has the proper keys' );
+
+ // ........................................................................................... in_panel=False
+ this.test.comment( 'index should get a list of all tools when in_panel=false' );
+ toolIndex = this.api.tools.index( false );
+ //this.debug( this.jsonStr( toolIndex ) );
+ this.test.assert( utils.isArray( toolIndex ), "index returned an array: length " + toolIndex.length );
+ this.test.assert( toolIndex.length >= 1, 'Has at least one tool' );
+
+ this.test.comment( 'index non-panel form should be a simple list of tool summaries' );
+ firstSection = toolIndex[0];
+ //this.debug( this.jsonStr( firstSection ) );
+ this.test.assert( hasKeys( firstSection, toolSummaryKeys ), 'Has the proper keys' );
+ //TODO: test uniqueness of ids
+ //TODO: test form of indiv. keys
+
+ // ........................................................................................... trackster=True
+ this.test.comment( '(like in_panel=True) index with trackster=True should '
+ + 'get a (smaller) list of tools in panel form (by default)' );
+ toolIndex = this.api.tools.index( undefined, true );
+ //this.debug( this.jsonStr( toolIndex ) );
+ this.test.assert( utils.isArray( toolIndex ), "index returned an array: length " + toolIndex.length );
+ this.test.assert( toolIndex.length >= 1, 'Has at least one tool section' );
+
+ this.test.comment( 'index with trackster=True should be separated into sections (by default)' );
+ firstSection = toolIndex[0]; // get data
+ //this.debug( this.jsonStr( firstSection ) );
+ this.test.assert( hasKeys( firstSection, panelSectionKeys ), 'Has the proper keys' );
+ //TODO: test form of indiv. keys
+
+ this.test.comment( 'index sections with trackster=True have a list of tool "elems"' );
+ this.test.assert( utils.isArray( firstSection.elems ), firstSection.name + ".elems is an array: "
+ + "length " + firstSection.elems.length );
+ this.test.assert( firstSection.elems.length >= 1, 'Has at least one tool' );
+
+ firstTool = firstSection.elems[0]; // get data
+ //this.debug( this.jsonStr( firstTool ) );
+ this.test.assert( hasKeys( firstTool, panelToolKeys ), 'Has the proper keys' );
+
+ // ............................................................................ trackster=True, in_panel=False
+ // this yields the same as in_panel=False...
+
+
+ // ------------------------------------------------------------------------------------------- SHOW
+ this.test.comment( 'show should get detailed data about the tool with the given id' );
+ // get the tool select first from tool index
+ toolIndex = this.api.tools.index();
+ var selectFirst = findObject( findObject( toolIndex, { id: 'textutil' }).elems, { id: 'Show beginning1' });
+ //this.debug( this.jsonStr( selectFirst ) );
+
+ var toolShow = this.api.tools.show( selectFirst.id );
+ //this.debug( this.jsonStr( toolShow ) );
+ this.test.assert( utils.isObject( toolShow ), "show returned an object" );
+ this.test.assert( hasKeys( toolShow, toolDetailKeys ), 'Has the proper keys' );
+
+ this.test.comment( 'show data should include an array of input objects' );
+ this.test.assert( utils.isArray( toolShow.inputs ), "inputs is an array: "
+ + "length " + toolShow.inputs.length );
+ this.test.assert( toolShow.inputs.length >= 1, 'Has at least one element' );
+ for( var i=0; i<toolShow.inputs.length; i += 1 ){
+ var input = toolShow.inputs[i];
+ this.test.comment( 'checking input #' + i + ': ' + ( input.name || '(no name)' ) );
+ this.test.assert( utils.isObject( input ), "input is an object" );
+ this.test.assert( hasKeys( input, toolInputKeys ), 'Has the proper keys' );
+ }
+ //TODO: test form of indiv. keys
+
+
+ // ------------------------------------------------------------------------------------------- CREATE
+ // this is a method of running a job. Shouldn't that be in jobs.create?
+
+ // ------------------------------------------------------------------------------------------- MISC
+ //attemptShowOnAllTools.call( spaceghost );
+});
+
+// ===================================================================
+spaceghost.run( function(){
+});
diff -r 6eed572a8bdcd6dc9bf2fcd54360217c1f447f20 -r 1fa287b15af5dab0ac84545835752b4f87e87328 test/casperjs/modules/api.js
--- a/test/casperjs/modules/api.js
+++ b/test/casperjs/modules/api.js
@@ -20,6 +20,7 @@
this.histories = new HistoriesAPI( this );
this.hdas = new HDAAPI( this );
+ this.tools = new ToolsAPI( this );
};
exports.API = API;
@@ -219,7 +220,7 @@
};
HDAAPI.prototype.index = function index( historyId, ids ){
- this.api.spaceghost.info( 'hda.index: ' + [ historyId, ids ] );
+ this.api.spaceghost.info( 'hdas.index: ' + [ historyId, ids ] );
var data = {};
if( ids ){
ids = ( utils.isArray( ids ) )?( ids.join( ',' ) ):( ids );
@@ -232,7 +233,7 @@
};
HDAAPI.prototype.show = function show( historyId, id, deleted ){
- this.api.spaceghost.info( 'hda.show: ' + [ historyId, id, (( deleted )?( 'w deleted' ):( '' )) ] );
+ this.api.spaceghost.info( 'hdas.show: ' + [ historyId, id, (( deleted )?( 'w deleted' ):( '' )) ] );
id = ( id === 'most_recently_used' )?( id ):( this.api.ensureId( id ) );
deleted = deleted || false;
@@ -242,7 +243,7 @@
};
HDAAPI.prototype.create = function create( historyId, payload ){
- this.api.spaceghost.info( 'hda.create: ' + [ historyId, this.api.spaceghost.jsonStr( payload ) ] );
+ this.api.spaceghost.info( 'hdas.create: ' + [ historyId, this.api.spaceghost.jsonStr( payload ) ] );
// py.payload <-> ajax.data
payload = this.api.ensureObject( payload );
@@ -253,7 +254,7 @@
};
HDAAPI.prototype.update = function create( historyId, id, payload ){
- this.api.spaceghost.info( 'hda.update: ' + [ historyId, id, this.api.spaceghost.jsonStr( payload ) ] );
+ this.api.spaceghost.info( 'hdas.update: ' + [ historyId, id, this.api.spaceghost.jsonStr( payload ) ] );
// py.payload <-> ajax.data
historyId = this.api.ensureId( historyId );
@@ -267,3 +268,53 @@
});
};
+// =================================================================== TOOLS
+var ToolsAPI = function HDAAPI( api ){
+ this.api = api;
+};
+ToolsAPI.prototype.toString = function toString(){
+ return this.api + '.ToolsAPI';
+};
+
+// -------------------------------------------------------------------
+ToolsAPI.prototype.urlTpls = {
+ index : 'api/tools',
+ show : 'api/tools/%s',
+ create : 'api/tools'
+};
+
+ToolsAPI.prototype.index = function index( in_panel, trackster ){
+ this.api.spaceghost.info( 'tools.index: ' + [ in_panel, trackster ] );
+ var data = {};
+ // in_panel defaults to true, trackster defaults to false
+ if( in_panel !== undefined ){
+ data.in_panel = ( in_panel )?( true ):( false );
+ }
+ if( in_panel !== undefined ){
+ data.trackster = ( trackster )?( true ):( false );
+ }
+ return this.api._ajax( utils.format( this.urlTpls.index ), {
+ data : data
+ });
+};
+
+ToolsAPI.prototype.show = function show( id ){
+ this.api.spaceghost.info( 'tools.show: ' + [ id ] );
+ var data = {};
+
+ return this.api._ajax( utils.format( this.urlTpls.show, id ), {
+ data : data
+ });
+};
+
+//ToolsAPI.prototype.create = function create( payload ){
+// this.api.spaceghost.info( 'tools.create: ' + [ this.api.spaceghost.jsonStr( payload ) ] );
+//
+// // py.payload <-> ajax.data
+// payload = this.api.ensureObject( payload );
+// return this.api._ajax( utils.format( this.urlTpls.create, this.api.ensureId( historyId ) ), {
+// type : 'POST',
+// data : payload
+// });
+//};
+
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: Update tool functional test result mako template to reflect the new structure of the test results dict. Add compatibility with the stable branch to the functional tests' API updater.
by commits-noreply@bitbucket.org 25 Apr '13
by commits-noreply@bitbucket.org 25 Apr '13
25 Apr '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6eed572a8bdc/
Changeset: 6eed572a8bdc
User: inithello
Date: 2013-04-25 18:23:04
Summary: Update tool functional test result mako template to reflect the new structure of the test results dict. Add compatibility with the stable branch to the functional tests' API updater.
Affected #: 2 files
diff -r 41d8cdde47297746aa82ce4858006bd2632331db -r 6eed572a8bdcd6dc9bf2fcd54360217c1f447f20 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
@@ -56,15 +56,15 @@
# repository_metadata.tools_functionally_correct column is set to True.
tool_test_results = repository_metadata.tool_test_results
test_environment_dict = tool_test_results.get( 'test_environment', None )
- invalid_tests = tool_test_results.get( 'invalid_tests', [] )
- test_errors = tool_test_results.get( 'test_errors', [] )
- tests_passed = tool_test_results.get( 'tests_passed', [] )
+ missing_test_components = tool_test_results.get( 'missing_test_components', [] )
+ failed_tests = tool_test_results.get( 'failed_tests', [] )
+ passed_tests = tool_test_results.get( 'passed_tests', [] )
else:
tool_test_results = None
test_environment_dict = {}
- invalid_tests = []
- test_errors = []
- tests_passed = []
+ missing_test_components = []
+ failed_tests = []
+ passed_tests = []
if can_push:
browse_label = 'Browse or delete repository tip files'
@@ -144,7 +144,7 @@
<b>Repository name:</b><br/>
${repository.name}
%endif
-%if invalid_tests or tool_test_results or tests_passed:
+%if missing_test_components or tool_test_results or passed_tests:
<p/><div class="toolForm"><div class="toolFormTitle">Tool functional test results</div>
@@ -203,7 +203,7 @@
${test_environment_dict.get( 'python_version', 'unknown' ) | h}
<div style="clear: both"></div></div>
- %if test_errors:
+ %if failed_tests:
<div class="form-row"><table width="100%"><tr bgcolor="#D8D8D8" width="100%"><td><b>Tests that failed</td></tr>
@@ -211,7 +211,7 @@
</div><div class="form-row"><table class="grid">
- %for test_results_dict in test_errors:
+ %for test_results_dict in failed_tests:
<%
test_id = test_results_dict.get( 'test_id', 'unknown' )
tool_id = test_results_dict.get( 'tool_id', 'unknown' )
@@ -244,7 +244,7 @@
<div style="clear: both"></div></div>
%endif
- %if tests_passed:
+ %if passed_tests:
<div class="form-row"><table width="100%"><tr bgcolor="#D8D8D8" width="100%"><td><b>Tests that passed successfully</td></tr>
@@ -252,7 +252,7 @@
</div><div class="form-row"><table class="grid">
- %for test_results_dict in tests_passed:
+ %for test_results_dict in passed_tests:
<%
test_id = test_results_dict.get( 'test_id', 'unknown' )
tool_id = test_results_dict.get( 'tool_id', 'unknown' )
@@ -274,7 +274,7 @@
</table></div>
%endif
- %if invalid_tests:
+ %if missing_test_components:
<div class="form-row"><table width="100%"><tr bgcolor="#D8D8D8" width="100%"><td><b>Invalid tests</td></tr>
@@ -282,22 +282,22 @@
</div><div class="form-row"><table class="grid">
- %for test_results_dict in invalid_tests:
+ %for test_results_dict in missing_test_components:
<%
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', None )
+ missing_components = test_results_dict.get( 'missing_components', None )
%>
%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
- %if reason_test_is_invalid:
+ %if missing_components:
<tr><td><b>Reason test is invalid</b></td>
- <td>${render_functional_test_text( reason_test_is_invalid )}</td>
+ <td>${render_functional_test_text( missing_components )}</td></tr>
%endif
%endfor
diff -r 41d8cdde47297746aa82ce4858006bd2632331db -r 6eed572a8bdcd6dc9bf2fcd54360217c1f447f20 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
@@ -291,6 +291,17 @@
params[ 'tools_functionally_correct' ] = 'false'
params[ 'do_not_test' ] = 'false'
params[ 'tool_test_results' ] = test_results_dict
+ # BEGIN compatibility code.
+ # TODO: The repository_revisions API controller ignores any received parameter that is not present in the database schema,
+ # but the compatibility code here should be removed when the main tool shed is updated with the new database migration version.
+ params[ 'tool_test_errors' ] = test_results_dict
+ if test_results_dict[ 'failed_tests' ]:
+ params[ 'tool_test_errors' ][ 'test_errors' ] = test_results_dict[ 'failed_tests' ]
+ if test_results_dict[ 'passed_tests' ]:
+ params[ 'tool_test_errors' ][ 'tests_passed' ] = test_results_dict[ 'passed_tests' ]
+ # Copying the missing_test_components key is not necessary, since the main tool shed is running its own version of the
+ # check repositories script, which correctly updates the invalid_tests key.
+ # END compatibility code.
if '-info_only' in sys.argv:
return {}
else:
@@ -636,7 +647,8 @@
repository_status[ 'test_environment' ] = test_environment
repository_status[ 'passed_tests' ] = []
repository_status[ 'failed_tests' ] = []
- repository_status[ 'missing_test_components' ] = []
+ if 'missing_test_components' not in repository_status:
+ repository_status[ 'missing_test_components' ] = []
if not has_test_data:
log.error( 'Test data is missing for this repository. Updating repository and skipping functional tests.' )
# Record the lack of test data.
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: Update tool_test_results dict's attribute names for consistency. Only flag a changeset revision not to be tested if there no valid tests found in that revision.
by commits-noreply@bitbucket.org 25 Apr '13
by commits-noreply@bitbucket.org 25 Apr '13
25 Apr '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/41d8cdde4729/
Changeset: 41d8cdde4729
User: inithello
Date: 2013-04-25 17:13:53
Summary: Update tool_test_results dict's attribute names for consistency. Only flag a changeset revision not to be tested if there no valid tests found in that revision.
Affected #: 2 files
diff -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 -r 41d8cdde47297746aa82ce4858006bd2632331db 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
@@ -130,16 +130,6 @@
"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 error was."
- "traceback": "The traceback, if any."
- },
- ]
"passed_tests":
[
{
@@ -147,14 +137,24 @@
"tool_id": "The tool ID that was tested",
"tool_version": "The tool version that was tested",
},
- ]
- "invalid_tests":
+ ],
+ "failed_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.
+ "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 error was.",
+ "traceback": "The traceback, if any."
+ },
+ ],
+ "missing_test_components":
+ [
+ {
+ "tool_id": "The tool ID that is missing functional test definitions and/or test data.",
+ "tool_version": "The version of the tool.",
+ "tool_guid": "The guid of the tool.",
+ "missing_components": "The components that are missing for this tool to be considered testable."
},
]
}
@@ -182,7 +182,7 @@
repository_status = metadata_record.tool_test_results
# Clear any old invalid tests for this metadata revision, since this could lead to duplication of invalid test rows,
# or tests incorrectly labeled as invalid.
- repository_status[ 'invalid_tests' ] = []
+ repository_status[ 'missing_test_components' ] = []
if 'test_environment' in repository_status:
repository_status[ 'test_environment' ] = get_test_environment( repository_status[ 'test_environment' ] )
else:
@@ -204,6 +204,7 @@
continue
else:
has_test_data = False
+ testable_revision_found = False
# Clone the repository up to the changeset revision we're checking.
repo_dir = metadata_record.repository.repo_path( app )
repo = hg.repository( get_configured_ui(), repo_dir )
@@ -254,12 +255,15 @@
failure_reason = ''
problem_found = False
missing_test_files = []
+ has_test_files = False
if tool_has_tests and has_test_data:
missing_test_files = check_for_missing_test_files( tool_metadata[ 'tests' ], test_data_path )
if missing_test_files:
if verbosity >= 2:
print "# Tool ID '%s' in changeset revision %s of %s is missing one or more required test files: %s" % \
( tool_id, changeset_revision, name, ', '.join( missing_test_files ) )
+ else:
+ has_test_files = True
if not has_test_data:
failure_reason += 'Repository does not have a test-data directory. '
problem_found = True
@@ -270,7 +274,7 @@
failure_reason += 'One or more test files are missing for tool %s: %s' % ( tool_id, ', '.join( missing_test_files ) )
problem_found = True
test_errors = dict( tool_id=tool_id, tool_version=tool_version, tool_guid=tool_guid,
- reason_test_is_invalid=failure_reason )
+ missing_components=failure_reason )
# The repository_metadata.tool_test_results attribute should always have the following structure:
# {
# "test_environment":
@@ -284,7 +288,15 @@
# "architecture": "x86_64",
# "system": "Darwin 12.2.0"
# },
- # "test_errors":
+ # "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",
+ # },
+ # ],
+ # "failed_tests":
# [
# {
# "test_id": "The test ID, generated by twill",
@@ -293,23 +305,14 @@
# "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":
+ # ],
+ # "missing_test_components":
# [
# {
# "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."
+ # "missing_components": "The components that are missing for this tool to be considered testable."
# },
# ]
# }
@@ -318,12 +321,14 @@
# than the list relevant to what it is testing.
# 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 test_errors not in repository_status[ 'missing_test_components' ]:
+ repository_status[ 'missing_test_components' ].append( test_errors )
+ if tool_has_tests and has_test_files:
+ testable_revision_found = True
# Remove the cloned repository path. This has to be done after the check for required test files, for obvious reasons.
if os.path.exists( work_dir ):
shutil.rmtree( work_dir )
- if not repository_status[ 'invalid_tests' ]:
+ if not repository_status[ 'missing_test_components' ]:
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 )
@@ -332,22 +337,27 @@
if verbosity >= 1:
print '# Some tools have problematic functional tests in changeset revision %s of repository %s owned by %s.' % ( changeset_revision, name, owner )
if verbosity >= 2:
- for invalid_test in repository_status[ 'invalid_tests' ]:
- if 'reason_test_is_invalid' in invalid_test:
- print '# %s' % invalid_test[ 'reason_test_is_invalid' ]
+ for invalid_test in repository_status[ 'missing_test_components' ]:
+ if 'missing_components' in invalid_test:
+ print '# %s' % invalid_test[ 'missing_components' ]
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.
- if repository_status[ 'invalid_tests' ]:
- # If functional test definitions or test data are missing, set do_not_test = True if and only if:
+ if repository_status[ 'missing_test_components' ]:
+ # If functional test definitions or test data are missing, set do_not_test = True if no tool with valid tests has been
+ # found in this revision, and:
# a) There are multiple downloadable revisions, and the revision being tested is not the most recent downloadable revision.
- # In this case, the revision will never be updated with correct data, and re-testing it would be redundant.
- # b) There are one or more downloadable revisions, and the revision being tested is the most recent downloadable revision.
- # In this case, if the repository is updated with test data or functional tests, the downloadable changeset revision
- # that was tested will be replaced with the new changeset revision, which will be automatically tested.
- if should_set_do_not_test_flag( app, metadata_record.repository, changeset_revision ):
+ # In this case, the revision will never be updated with the missing components, and re-testing it would be redundant.
+ # b) There are one or more downloadable revisions, and the provided changeset revision is the most recent downloadable
+ # revision. In this case, if the repository is updated with test data or functional tests, the downloadable
+ # changeset revision that was tested will either be replaced with the new changeset revision, or a new downloadable
+ # changeset revision will be created, either of which will be automatically checked and flagged as appropriate.
+ # In the install and test script, this behavior is slightly different, since we do want to always run functional
+ # tests on the most recent downloadable changeset revision.
+ if should_set_do_not_test_flag( app, metadata_record.repository, changeset_revision ) and not testable_revision_found:
metadata_record.do_not_test = True
metadata_record.tools_functionally_correct = False
+ metadata_record.missing_test_components = True
metadata_record.tool_test_results = repository_status
metadata_record.time_last_tested = datetime.utcnow()
app.sa_session.add( metadata_record )
diff -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 -r 41d8cdde47297746aa82ce4858006bd2632331db 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
@@ -174,9 +174,9 @@
def getTestStatus( self, test_identifier ):
if test_identifier in self.passed:
- tests_passed = self.passed[ test_identifier ]
+ passed_tests = self.passed[ test_identifier ]
del self.passed[ test_identifier ]
- return tests_passed
+ return passed_tests
return []
def execute_uninstall_method( repository_dict ):
@@ -278,13 +278,13 @@
url_contents = url_handle.read()
return from_json_string( url_contents )
-def register_test_result( url, metadata_id, test_results_dict, tests_passed=False ):
+def register_test_result( url, metadata_id, test_results_dict, passed_tests=False ):
'''
This script should never set do_not_test = True, because the repositories should always be re-tested
against the most recent code.
'''
params = {}
- if tests_passed:
+ if passed_tests:
params[ 'tools_functionally_correct' ] = 'true'
params[ 'do_not_test' ] = 'false'
else:
@@ -599,7 +599,15 @@
# "architecture": "x86_64",
# "system": "Darwin 12.2.0"
# },
- # "test_errors":
+ # "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",
+ # },
+ # ]
+ # "failed_tests":
# [
# {
# "test_id": "The test ID, generated by twill",
@@ -609,22 +617,13 @@
# "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":
+ # "missing_test_components":
# [
# {
# "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.
+ # "missing_components": "A short explanation of what is invalid.
# },
# ]
# }
@@ -635,17 +634,17 @@
test_environment[ 'galaxy_database_version' ] = get_database_version( app )
test_environment[ 'galaxy_revision'] = get_repository_current_revision( os.getcwd() )
repository_status[ 'test_environment' ] = test_environment
- repository_status[ 'tests_passed' ] = []
- repository_status[ 'test_errors' ] = []
- repository_status[ 'invalid_tests' ] = []
+ repository_status[ 'passed_tests' ] = []
+ repository_status[ 'failed_tests' ] = []
+ repository_status[ 'missing_test_components' ] = []
if not has_test_data:
log.error( 'Test data is missing for this repository. Updating repository and skipping functional tests.' )
# Record the lack of test data.
- 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 )
+ failed_tests = dict( tool_id=None, tool_version=None, tool_guid=None,
+ missing_components="Repository %s is missing a test-data directory." % name )
+ repository_status[ 'missing_test_components' ].append( failed_tests )
# Record the status of this repository in the tool shed.
- register_test_result( galaxy_tool_shed_url, metadata_revision_id, repository_status, tests_passed=False )
+ register_test_result( galaxy_tool_shed_url, metadata_revision_id, repository_status, passed_tests=False )
# Run the cleanup method. This removes tool functional test methods from the test_toolbox module and uninstalls the
# repository using Twill.
execute_uninstall_method( repository_info_dict )
@@ -677,20 +676,20 @@
for plugin in test_plugins:
if hasattr( plugin, 'getTestStatus' ):
test_identifier = '%s/%s' % ( owner, name )
- tests_passed = plugin.getTestStatus( test_identifier )
+ passed_tests = plugin.getTestStatus( test_identifier )
break
- repository_status[ 'tests_passed' ] = []
- for test_id in tests_passed:
+ repository_status[ 'passed_tests' ] = []
+ for test_id in passed_tests:
tool_id, tool_version = get_tool_info_from_test_id( test_id )
test_result = dict( test_id=test_id, tool_id=tool_id, tool_version=tool_version )
- repository_status[ 'tests_passed' ].append( test_result )
+ repository_status[ 'passed_tests' ].append( test_result )
if success:
# This repository's tools passed all functional tests. Update the repository_metadata table in the tool shed's database
# to reflect that. Call the register_test_result method, which executes a PUT request to the repository_revisions API
# controller with the status of the test. This also sets the do_not_test and tools_functionally correct flags, and
# updates the time_last_tested field to today's date.
repositories_passed.append( dict( name=name, owner=owner, changeset_revision=changeset_revision ) )
- register_test_result( galaxy_tool_shed_url, metadata_revision_id, repository_status, tests_passed=True )
+ register_test_result( galaxy_tool_shed_url, metadata_revision_id, repository_status, passed_tests=True )
log.debug( 'Revision %s of repository %s installed and passed functional tests.' % ( changeset_revision, name ) )
else:
# If the functional tests fail, log the output and update the failed changeset revision's metadata record in the tool shed via the API.
@@ -729,13 +728,13 @@
for output_type in [ 'stderr', 'traceback' ]:
if output_type in tmp_output:
test_status[ output_type ] = '\n'.join( tmp_output[ output_type ] )
- repository_status[ 'test_errors' ].append( test_status )
+ repository_status[ 'failed_tests' ].append( test_status )
# Call the register_test_result method, which executes a PUT request to the repository_revisions API controller with the outcome
# of the tests, and updates tool_test_results with the relevant log data.
# This also sets the do_not_test and tools_functionally correct flags to the appropriate values, and updates the time_last_tested
# field to today's date.
repositories_failed.append( dict( name=name, owner=owner, changeset_revision=changeset_revision ) )
- register_test_result( galaxy_tool_shed_url, metadata_revision_id, repository_status, tests_passed=False )
+ register_test_result( galaxy_tool_shed_url, metadata_revision_id, repository_status, passed_tests=False )
log.debug( 'Revision %s of repository %s installed successfully, but did not pass functional tests.' % \
( changeset_revision, name ) )
# Run the cleanup method. This removes tool functional test methods from the test_toolbox module and uninstalls the
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: Tool shed database migration script to alter the repository_metadata table by dropping the tool_test_errors column and adding columns tool_test_results, missing_test_components.
by commits-noreply@bitbucket.org 25 Apr '13
by commits-noreply@bitbucket.org 25 Apr '13
25 Apr '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f11a2c7a7d32/
Changeset: f11a2c7a7d32
User: greg
Date: 2013-04-25 15:36:52
Summary: Tool shed database migration script to alter the repository_metadata table by dropping the tool_test_errors column and adding columns tool_test_results, missing_test_components.
Affected #: 17 files
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 lib/galaxy/webapps/tool_shed/api/repository_revisions.py
--- a/lib/galaxy/webapps/tool_shed/api/repository_revisions.py
+++ b/lib/galaxy/webapps/tool_shed/api/repository_revisions.py
@@ -42,6 +42,10 @@
tools_functionally_correct = kwd.get( 'tools_functionally_correct', None )
if tools_functionally_correct is not None:
clause_list.append( trans.model.RepositoryMetadata.table.c.tools_functionally_correct == util.string_as_bool( tools_functionally_correct ) )
+ # Filter by missing_test_components if received.
+ missing_test_components = kwd.get( 'missing_test_components', None )
+ if missing_test_components is not None:
+ clause_list.append( trans.model.RepositoryMetadata.table.c.missing_test_components == util.string_as_bool( missing_test_components ) )
# Filter by do_not_test if received.
do_not_test = kwd.get( 'do_not_test', None )
if do_not_test is not None:
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 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
@@ -738,12 +738,7 @@
"""
The test framework in ~/test/install_and_test_tool_shed_repositories can be executed on a regularly defined schedule (e.g., via cron) to install appropriate
repositories from a tool shed into a Galaxy instance and run defined functional tests for the tools included in the repository. This process affects the values
- if these columns in the repository_metadata table: tools_functionally_correct, do_not_test, time_last_tested and tool_test_errors. The tool_test_errors is
- slightly mis-named (it should have been named tool_test_results) it will contain a dictionary that includes information about the test environment even if all
- tests passed and the tools_functionally_correct column is set to True.
- The value of the tool_test_errors column will be a dictionary with the key / value pairs:
- "test_environment", {"architecture": "i386", "python_version": "2.5.4", "system": "Darwin 10.8.0"}
- "test_errors" [ { "test_id":<some test id>, "stdout":<stdout of running the test>, "stderr":<stderr of running the test>, "traceback":<traceback of running the test>]
+ if these columns in the repository_metadata table: do_not_test, missing_test_components, time_last_tested, tools_functionally_correct and tool_test_results.
"""
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
@@ -1162,7 +1157,7 @@
trans.model.Repository.table.c.private == False,
trans.model.Repository.table.c.deprecated == False,
trans.model.Repository.table.c.user_id == user.id ) ):
- if not metadata_row.tool_test_errors:
+ if not metadata_row.tool_test_results:
continue
# Per the RSS 2.0 specification, all dates in RSS feeds must be formatted as specified in RFC 822
# section 5.1, e.g. Sat, 07 Sep 2002 00:00:01 UT
@@ -1171,9 +1166,9 @@
# Generate a citable URL for this repository with owner and changeset revision.
repository_citable_url = suc.url_join( tool_shed_url, 'view', user.username, repository.name, metadata_row.changeset_revision )
title = 'Functional test results for changeset revision %s of %s' % ( metadata_row.changeset_revision, repository.name )
- tests_passed = len( metadata_row.tool_test_errors.get( 'tests_passed', [] ) )
- tests_failed = len( metadata_row.tool_test_errors.get( 'test_errors', [] ) )
- invalid_tests = len( metadata_row.tool_test_errors.get( 'invalid_tests', [] ) )
+ tests_passed = len( metadata_row.tool_test_results.get( 'tests_passed', [] ) )
+ tests_failed = len( metadata_row.tool_test_results.get( 'test_errors', [] ) )
+ invalid_tests = len( metadata_row.tool_test_results.get( 'invalid_tests', [] ) )
description = '%d tests passed, %d tests failed, %d tests determined to be invalid.' % ( tests_passed, tests_failed, invalid_tests )
# The guid attribute in an RSS feed's list of items allows a feed reader to choose not to show an item as updated
# if the guid is unchanged. For functional test results, the citable URL is sufficiently unique to enable
@@ -2674,10 +2669,10 @@
if repository_metadata:
repository_metadata_id = trans.security.encode_id( repository_metadata.id )
# TODO: Fix this when the install and test framework is completed.
- # if repository_metadata.tool_test_errors:
- # tool_test_errors = json.from_json_string( repository_metadata.tool_test_errors )
+ # if repository_metadata.tool_test_results:
+ # tool_test_results = json.from_json_string( repository_metadata.tool_test_results )
# else:
- # tool_test_errors = None
+ # tool_test_results = None
metadata = repository_metadata.metadata
if metadata:
if 'tools' in metadata:
@@ -2713,7 +2708,7 @@
else:
repository_metadata_id = None
metadata = None
- #tool_test_errors = None
+ #tool_test_results = None
is_malicious = suc.changeset_is_malicious( trans, repository_id, repository.tip( trans.app ) )
changeset_revision_select_field = grids_util.build_changeset_revision_select_field( trans,
repository,
@@ -2737,7 +2732,7 @@
tool=tool,
tool_metadata_dict=tool_metadata_dict,
tool_lineage=tool_lineage,
- #tool_test_errors=tool_test_errors,
+ #tool_test_results=tool_test_results,
changeset_revision=changeset_revision,
revision_label=revision_label,
changeset_revision_select_field=changeset_revision_select_field,
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 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
@@ -28,7 +28,7 @@
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()
+ repositories_with_no_tool_tests_grid = repository_review_grids.RepositoriesWithNoToolTestsGrid()
@web.expose
@web.require_login( "approve repository review" )
@@ -417,7 +417,10 @@
@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."""
+ """
+ Display a list of repositories that contain tools, have not yet been reviewed, and have invalid functional tests. Tests are defined as
+ invalid if they are missing from the tool config or if defined test data is not included in the repository.
+ """
if 'operation' in kwd:
operation = kwd['operation'].lower()
if operation == "inspect repository revisions":
@@ -428,10 +431,10 @@
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). '
+ message = 'These repositories contain tools with missing functional tests or test data. '
kwd[ 'message' ] = message
kwd[ 'status' ] = 'warning'
- return self.repositories_with_invalid_tests_grid( trans, **kwd )
+ return self.repositories_with_no_tool_tests_grid( trans, **kwd )
@web.expose
@web.require_login( "manage repositories with reviews" )
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 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
@@ -1,28 +1,27 @@
-"""
-Galaxy Tool Shed data model classes
-
-Naming: try to use class names that have a distinct plural form so that
-the relationship cardinalities are obvious (e.g. prefer Dataset to Data)
-"""
-import os.path, os, errno, sys, codecs, operator, logging, tarfile, mimetypes, ConfigParser
+import logging
+import operator
+import os
from galaxy import util
from galaxy.util.bunch import Bunch
from galaxy.util.hash_util import new_secure_hash
-from galaxy.web.form_builder import *
from galaxy.model.item_attrs import APIItem
from galaxy import eggs
-eggs.require('mercurial')
-from mercurial import hg, ui
+eggs.require( 'mercurial' )
+from mercurial import hg
+from mercurial import ui
log = logging.getLogger( __name__ )
+
class APIKeys( object ):
pass
+
class User( object, APIItem ):
api_collection_visible_keys = ( 'id', 'email' )
api_element_visible_keys = ( 'id', 'email', 'username' )
+
def __init__( self, email=None, password=None ):
self.email = email
self.password = password
@@ -31,6 +30,7 @@
self.purged = False
self.username = None
self.new_repo_alert = False
+
def all_roles( self ):
roles = [ ura.role for ura in self.roles ]
for group in [ uga.group for uga in self.groups ]:
@@ -38,28 +38,37 @@
if role not in roles:
roles.append( role )
return roles
+
def set_password_cleartext( self, cleartext ):
"""Set 'self.password' to the digest of 'cleartext'."""
self.password = new_secure_hash( text_type=cleartext )
+
def check_password( self, cleartext ):
"""Check if 'cleartext' matches 'self.password' when hashed."""
return self.password == new_secure_hash( text_type=cleartext )
+
def get_disk_usage( self, nice_size=False ):
return 0
+
def set_disk_usage( self, bytes ):
pass
+
total_disk_usage = property( get_disk_usage, set_disk_usage )
+
@property
def nice_total_disk_usage( self ):
return 0
+
class Group( object, APIItem ):
api_collection_visible_keys = ( 'id', 'name' )
api_element_visible_keys = ( 'id', 'name' )
+
def __init__( self, name = None ):
self.name = name
self.deleted = False
+
class Role( object, APIItem ):
api_collection_visible_keys = ( 'id', 'name' )
api_element_visible_keys = ( 'id', 'name', 'description', 'type' )
@@ -71,28 +80,34 @@
ADMIN = 'admin',
SHARING = 'sharing'
)
+
def __init__( self, name="", description="", type="system", deleted=False ):
self.name = name
self.description = description
self.type = type
self.deleted = deleted
+
class UserGroupAssociation( object ):
def __init__( self, user, group ):
self.user = user
self.group = group
+
class UserRoleAssociation( object ):
def __init__( self, user, role ):
self.user = user
self.role = role
+
class GroupRoleAssociation( object ):
def __init__( self, group, role ):
self.group = group
self.role = role
+
class GalaxySession( object ):
+
def __init__( self,
id=None,
user=None,
@@ -113,6 +128,7 @@
self.is_valid = is_valid
self.prev_session_id = prev_session_id
+
class Repository( object, APIItem ):
api_collection_visible_keys = ( 'id', 'name', 'description', 'user_id', 'private', 'deleted', 'times_downloaded', 'deprecated' )
api_element_visible_keys = ( 'id', 'name', 'description', 'long_description', 'user_id', 'private', 'deleted', 'times_downloaded', 'deprecated' )
@@ -121,6 +137,7 @@
MARKED_FOR_REMOVAL = 'r',
MARKED_FOR_ADDITION = 'a',
NOT_TRACKED = '?' )
+
def __init__( self, id=None, name=None, description=None, long_description=None, user_id=None, private=False, deleted=None, email_alerts=None,
times_downloaded=0, deprecated=False ):
self.id = id
@@ -133,8 +150,10 @@
self.email_alerts = email_alerts
self.times_downloaded = times_downloaded
self.deprecated = deprecated
+
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 ):
if value_mapper is None:
value_mapper = {}
@@ -153,22 +172,28 @@
if 'user_id' in rval:
rval[ 'owner' ] = self.user.username
return rval
+
def repo_path( self, app ):
return app.hgweb_config_manager.get_entry( os.path.join( "repos", self.user.username, self.name ) )
+
def revision( self, app ):
repo = hg.repository( ui.ui(), self.repo_path( app ) )
tip_ctx = repo.changectx( repo.changelog.tip() )
return "%s:%s" % ( str( tip_ctx.rev() ), str( repo.changectx( repo.changelog.tip() ) ) )
+
def tip( self, app ):
repo = hg.repository( ui.ui(), self.repo_path( app ) )
return str( repo.changectx( repo.changelog.tip() ) )
+
def is_new( self, app ):
repo = hg.repository( ui.ui(), self.repo_path( app ) )
tip_ctx = repo.changectx( repo.changelog.tip() )
return tip_ctx.rev() < 0
+
def allow_push( self, app ):
repo = hg.repository( ui.ui(), self.repo_path( app ) )
return repo.ui.config( 'web', 'allow_push' )
+
def set_allow_push( self, app, usernames, remove_auth='' ):
allow_push = util.listify( self.allow_push( app ) )
if remove_auth:
@@ -190,15 +215,17 @@
fp.write( line )
fp.close()
+
class RepositoryMetadata( object, APIItem ):
api_collection_visible_keys = ( 'id', 'repository_id', 'changeset_revision', 'malicious', 'downloadable', 'has_repository_dependencies', 'includes_datatypes',
'includes_tools', 'includes_tool_dependencies', 'includes_tools_for_display_in_tool_panel', 'includes_workflows' )
api_element_visible_keys = ( 'id', 'repository_id', 'changeset_revision', 'malicious', 'downloadable', 'tools_functionally_correct',
- 'do_not_test', 'time_last_tested', 'tool_test_errors', 'has_repository_dependencies', 'includes_datatypes', 'includes_tools',
+ 'do_not_test', 'time_last_tested', 'tool_test_results', 'has_repository_dependencies', 'includes_datatypes', 'includes_tools',
'includes_tool_dependencies', 'includes_tools_for_display_in_tool_panel', 'includes_workflows' )
+
def __init__( self, id=None, repository_id=None, changeset_revision=None, metadata=None, tool_versions=None, malicious=False, downloadable=False,
- tools_functionally_correct=False, do_not_test=False, time_last_tested=None, tool_test_errors=None, has_repository_dependencies=False,
- includes_datatypes=False, includes_tools=False, includes_tool_dependencies=False, includes_workflows=False ):
+ missing_test_components=None, tools_functionally_correct=False, do_not_test=False, time_last_tested=None, tool_test_results=None,
+ has_repository_dependencies=False, includes_datatypes=False, includes_tools=False, includes_tool_dependencies=False, includes_workflows=False ):
self.id = id
self.repository_id = repository_id
self.changeset_revision = changeset_revision
@@ -206,15 +233,17 @@
self.tool_versions = tool_versions or dict()
self.malicious = malicious
self.downloadable = downloadable
+ self.missing_test_components = missing_test_components
self.tools_functionally_correct = tools_functionally_correct
self.do_not_test = do_not_test
self.time_last_tested = time_last_tested
- self.tool_test_errors = tool_test_errors
+ self.tool_test_results = tool_test_results
self.has_repository_dependencies = has_repository_dependencies
self.includes_datatypes = includes_datatypes
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:
@@ -223,8 +252,10 @@
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 ):
if value_mapper is None:
value_mapper = {}
@@ -242,10 +273,12 @@
rval[ key ] = None
return rval
+
class RepositoryReview( object, APIItem ):
api_collection_visible_keys = ( 'id', 'repository_id', 'changeset_revision', 'user_id', 'rating', 'deleted' )
api_element_visible_keys = ( 'id', 'repository_id', 'changeset_revision', 'user_id', 'rating', 'deleted' )
approved_states = Bunch( NO='no', YES='yes' )
+
def __init__( self, repository_id=None, changeset_revision=None, user_id=None, rating=None, deleted=False ):
self.repository_id = repository_id
self.changeset_revision = changeset_revision
@@ -257,6 +290,7 @@
api_collection_visible_keys = ( 'id', 'repository_review_id', 'component_id', 'private', 'approved', 'rating', 'deleted' )
api_element_visible_keys = ( 'id', 'repository_review_id', 'component_id', 'private', 'approved', 'rating', 'deleted' )
approved_states = Bunch( NO='no', YES='yes', NA='not_applicable' )
+
def __init__( self, repository_review_id=None, component_id=None, comment=None, private=False, approved=False, rating=None, deleted=False ):
self.repository_review_id = repository_review_id
self.component_id = component_id
@@ -266,49 +300,65 @@
self.rating = rating
self.deleted = deleted
+
class Component( object ):
+
def __init__( self, name=None, description=None ):
self.name = name
self.description = description
+
class ItemRatingAssociation( object ):
+
def __init__( self, id=None, user=None, item=None, rating=0, comment='' ):
self.id = id
self.user = user
self.item = item
self.rating = rating
self.comment = comment
+
def set_item( self, item ):
""" Set association's item. """
pass
+
class RepositoryRatingAssociation( ItemRatingAssociation ):
+
def set_item( self, repository ):
self.repository = repository
+
class Category( object, APIItem ):
api_collection_visible_keys = ( 'id', 'name', 'description', 'deleted' )
api_element_visible_keys = ( 'id', 'name', 'description', 'deleted' )
+
def __init__( self, name=None, description=None, deleted=False ):
self.name = name
self.description = description
self.deleted = deleted
+
class RepositoryCategoryAssociation( object ):
+
def __init__( self, repository=None, category=None ):
self.repository = repository
self.category = category
+
class Tag( object ):
+
def __init__( self, id=None, type=None, parent_id=None, name=None ):
self.id = id
self.type = type
self.parent_id = parent_id
self.name = name
+
def __str__ ( self ):
return "Tag(id=%s, type=%i, parent_id=%s, name=%s)" % ( self.id, self.type, self.parent_id, self.name )
+
class ItemTagAssociation( object ):
+
def __init__( self, id=None, user=None, item_id=None, tag_id=None, user_tname=None, value=None ):
self.id = id
self.user = user
@@ -318,7 +368,9 @@
self.value = None
self.user_value = None
+
class Workflow( object ):
+
def __init__( self ):
self.user = None
self.name = None
@@ -326,7 +378,9 @@
self.has_errors = None
self.steps = []
+
class WorkflowStep( object ):
+
def __init__( self ):
self.id = None
self.type = None
@@ -336,17 +390,20 @@
self.tool_errors = None
self.position = None
self.input_connections = []
- #self.output_connections = []
self.config = None
+
class WorkflowStepConnection( object ):
+
def __init__( self ):
self.output_step = None
self.output_name = None
self.input_step = None
self.input_name = None
+
## ---- Utility methods -------------------------------------------------------
+
def sort_by_attr( seq, attr ):
"""
Sort the sequence of objects by object's attribute
@@ -362,6 +419,7 @@
intermed = map( None, map( getattr, seq, ( attr, ) * len( seq ) ), xrange( len( seq ) ), seq )
intermed.sort()
return map( operator.getitem, intermed, ( -1, ) * len( intermed ) )
+
def directory_hash_id( id ):
s = str( id )
l = len( s )
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 lib/galaxy/webapps/tool_shed/model/mapping.py
--- a/lib/galaxy/webapps/tool_shed/model/mapping.py
+++ b/lib/galaxy/webapps/tool_shed/model/mapping.py
@@ -134,7 +134,8 @@
Column( "tools_functionally_correct", Boolean, default=False, index=True ),
Column( "do_not_test", Boolean, default=False, index=True ),
Column( "time_last_tested", DateTime, default=None, nullable=True ),
- Column( "tool_test_errors", JSONType, nullable=True ),
+ Column( "missing_test_components", Boolean, default=False, index=True ),
+ Column( "tool_test_results", JSONType, nullable=True ),
Column( "has_repository_dependencies", Boolean, default=False, index=True ),
Column( "includes_datatypes", Boolean, default=False, index=True ),
Column( "includes_tools", Boolean, default=False, index=True ),
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 lib/galaxy/webapps/tool_shed/model/migrate/versions/0018_add_repository_metadata_flag_columns.py
--- /dev/null
+++ b/lib/galaxy/webapps/tool_shed/model/migrate/versions/0018_add_repository_metadata_flag_columns.py
@@ -0,0 +1,90 @@
+"""
+Migration script to alter the repository_metadata table by dropping the tool_test_errors column and adding columns
+tool_test_results, missing_test_components.
+"""
+
+from sqlalchemy import *
+from sqlalchemy.orm import *
+from migrate import *
+from migrate.changeset import *
+
+# Need our custom types, but don't import anything else from model
+from galaxy.model.custom_types import *
+
+import sys, logging
+log = logging.getLogger( __name__ )
+log.setLevel(logging.DEBUG)
+handler = logging.StreamHandler( sys.stdout )
+format = "%(name)s %(levelname)s %(asctime)s %(message)s"
+formatter = logging.Formatter( format )
+handler.setFormatter( formatter )
+log.addHandler( handler )
+
+metadata = MetaData( migrate_engine )
+db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) )
+
+def upgrade():
+ print __doc__
+ metadata.reflect()
+ # Initialize.
+ if migrate_engine.name == 'mysql' or migrate_engine.name == 'sqlite':
+ default_false = "0"
+ elif migrate_engine.name == 'postgres':
+ default_false = "false"
+
+ try:
+ RepositoryMetadata_table = Table( "repository_metadata", metadata, autoload=True )
+ except NoSuchTableError:
+ RepositoryMetadata_table = None
+ log.debug( "Failed loading table repository_metadata." )
+
+ if RepositoryMetadata_table:
+ # Drop the tool_test_errors column from the repository_metadata table as it is poorly named. It will be replaced with the new
+ # tool_test_results column.
+ try:
+ col = RepositoryMetadata_table.c.tool_test_errors
+ col.drop()
+ except Exception, e:
+ log.debug( "Dropping column 'tool_test_errors' from repository_metadata table failed: %s" % ( str( e ) ) )
+
+ # Create the tool_test_results column to replace the ill-named tool_test_errors column just dropped above.
+ c = Column( "tool_test_results", JSONType, nullable=True )
+ try:
+ c.create( RepositoryMetadata_table )
+ assert c is RepositoryMetadata_table.c.tool_test_results
+ except Exception, e:
+ print "Adding tool_test_results column to the repository_metadata table failed: %s" % str( e )
+
+ # Create the missing_test_components column.
+ c = Column( "missing_test_components", Boolean, default=False, index=True )
+ try:
+ c.create( RepositoryMetadata_table )
+ assert c is RepositoryMetadata_table.c.missing_test_components
+ db_session.execute( "UPDATE repository_metadata SET missing_test_components=%s" % default_false )
+ except Exception, e:
+ print "Adding missing_test_components column to the repository_metadata table failed: %s" % str( e )
+
+def downgrade():
+ metadata.reflect()
+ # Drop missing_test_components and tool_test_results from the repository_metadata table and add tool_test_errors to the repository_metadata table.
+ RepositoryMetadata_table = Table( "repository_metadata", metadata, autoload=True )
+
+ # Drop the missing_test_components column.
+ try:
+ RepositoryMetadata_table.c.missing_test_components.drop()
+ except Exception, e:
+ print "Dropping column missing_test_components from the repository_metadata table failed: %s" % str( e )
+
+ # Drop the tool_test_results column.
+ try:
+ RepositoryMetadata_table.c.tool_test_results.drop()
+ except Exception, e:
+ print "Dropping column tool_test_results from the repository_metadata table failed: %s" % str( e )
+
+ # Create the tool_test_errors column.
+ c = Column( "tool_test_errors", JSONType, nullable=True )
+ try:
+ c.create( RepositoryMetadata_table )
+ assert c is RepositoryMetadata_table.c.tool_test_errors
+ except Exception, e:
+ print "Adding tool_test_errors column to the repository_metadata table failed: %s" % str( e )
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 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
@@ -395,12 +395,12 @@
.outerjoin( ( model.Component.table, model.Component.table.c.id == model.ComponentReview.table.c.component_id ) )
-class RepositoriesWithInvalidTestsGrid( RepositoriesWithoutReviewsGrid ):
+class RepositoriesWithNoToolTestsGrid( 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"
+ title = "Repositories that contain tools with no tests or test data"
columns = [
RepositoriesWithoutReviewsGrid.NameColumn( "Repository name",
key="name",
@@ -428,8 +428,7 @@
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 ) ) \
+ model.Repository.table.c.deprecated == False ) ) \
.join( model.RepositoryMetadata.table ) \
.filter( and_( model.RepositoryMetadata.table.c.downloadable == True,
model.RepositoryMetadata.table.c.includes_tools == True,
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 lib/tool_shed/scripts/api/tool_shed_repository_revision_update.py
--- a/lib/tool_shed/scripts/api/tool_shed_repository_revision_update.py
+++ b/lib/tool_shed/scripts/api/tool_shed_repository_revision_update.py
@@ -21,14 +21,14 @@
for key, value in [ kwarg.split( '=', 1 ) for kwarg in sys.argv[ 3: ] ]:
"""
This example script will properly handle updating the value of one or more of the following RepositoryMetadata attributes:
- tools_functionally_correct, do_not_test, tool_test_errors
+ tools_functionally_correct, do_not_test, tool_test_results
"""
if key in [ 'tools_functionally_correct', 'do_not_test' ]:
if str( value ).lower() in [ 'true', 'yes', 'on' ]:
new_value = True
else:
new_value = False
- elif key in [ 'tool_test_errors' ]:
+ elif key in [ 'tool_test_results' ]:
new_value = from_json_string( value )
else:
new_value = str( value )
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 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
@@ -117,7 +117,7 @@
and test repositories script to process. If the tested changeset revision does not have a test-data directory, this script will also mark the revision
not to be tested.
- If any error is encountered, the script will update the repository_metadata.tool_test_errors attribute following this structure:
+ If any error is encountered, the script will update the repository_metadata.tool_test_results attribute following this structure:
{
"test_environment":
{
@@ -178,8 +178,8 @@
for metadata_record in metadata_records_to_check:
# Initialize the repository_status dict with the test environment, but leave the test_errors empty.
repository_status = {}
- if metadata_record.tool_test_errors:
- repository_status = metadata_record.tool_test_errors
+ if metadata_record.tool_test_results:
+ repository_status = metadata_record.tool_test_results
# Clear any old invalid tests for this metadata revision, since this could lead to duplication of invalid test rows,
# or tests incorrectly labeled as invalid.
repository_status[ 'invalid_tests' ] = []
@@ -271,7 +271,7 @@
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:
+ # The repository_metadata.tool_test_results attribute should always have the following structure:
# {
# "test_environment":
# {
@@ -348,7 +348,7 @@
if should_set_do_not_test_flag( app, metadata_record.repository, changeset_revision ):
metadata_record.do_not_test = True
metadata_record.tools_functionally_correct = False
- metadata_record.tool_test_errors = repository_status
+ metadata_record.tool_test_results = repository_status
metadata_record.time_last_tested = datetime.utcnow()
app.sa_session.add( metadata_record )
app.sa_session.flush()
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 lib/tool_shed/util/metadata_util.py
--- a/lib/tool_shed/util/metadata_util.py
+++ b/lib/tool_shed/util/metadata_util.py
@@ -277,9 +277,10 @@
includes_workflows=includes_workflows )
# Always set the default values for the following columns. When resetting all metadata on a repository, this will reset the values.
repository_metadata.tools_functionally_correct = False
+ repository_metadata.missing_test_components = False
repository_metadata.do_not_test = False
repository_metadata.time_last_tested = None
- repository_metadata.tool_test_errors = None
+ repository_metadata.tool_test_results = None
trans.sa_session.add( repository_metadata )
trans.sa_session.flush()
return repository_metadata
@@ -1722,7 +1723,8 @@
repository_metadata.do_not_test = False
repository_metadata.time_last_tested = None
repository_metadata.tools_functionally_correct = False
- repository_metadata.tool_test_errors = None
+ repository_metadata.missing_test_components = False
+ repository_metadata.tool_test_results = None
trans.sa_session.add( repository_metadata )
trans.sa_session.flush()
else:
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 templates/webapps/tool_shed/admin/index.mako
--- a/templates/webapps/tool_shed/admin/index.mako
+++ b/templates/webapps/tool_shed/admin/index.mako
@@ -76,9 +76,6 @@
<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:
@@ -94,6 +91,17 @@
</div></div></div>
+ <div class="toolSectionPad"></div>
+ <div class="toolSectionTitle">
+ Reviewing Repositories With Tools
+ </div>
+ <div class="toolSectionBody">
+ <div class="toolSectionBg">
+ <div class="toolTitle">
+ <a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_with_invalid_tests' )}">Repositories missing tests or data</a>
+ </div>
+ </div>
+ </div>
%endif
<div class="toolSectionPad"></div><div class="toolSectionTitle">
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 templates/webapps/tool_shed/index.mako
--- a/templates/webapps/tool_shed/index.mako
+++ b/templates/webapps/tool_shed/index.mako
@@ -133,9 +133,6 @@
<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:
@@ -151,6 +148,17 @@
</div></div></div>
+ <div class="toolSectionPad"></div>
+ <div class="toolSectionTitle">
+ Reviewing Repositories With Tools
+ </div>
+ <div class="toolSectionBody">
+ <div class="toolSectionBg">
+ <div class="toolTitle">
+ <a target="galaxy_main" href="${h.url_for( controller='repository_review', action='manage_repositories_with_invalid_tests' )}">Repositories missing tests or data</a>
+ </div>
+ </div>
+ </div>
%endif
%else:
<div class="toolSectionPad"></div>
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 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
@@ -51,16 +51,16 @@
can_review_repository = has_metadata and not is_deprecated and trans.app.security_agent.user_can_review_repositories( trans.user )
can_upload = can_push
can_view_change_log = trans.webapp.name == 'tool_shed' and not is_new
- if repository_metadata.tool_test_errors:
- # The tool_test_errors is mis-named (it should have been named tool_test_results) it will contain a dictionary that includes information
- # 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', [] )
+ if repository_metadata.tool_test_results:
+ # The tool_test_results will contain a dictionary that includes information about the test environment even if all tests passed and the
+ # repository_metadata.tools_functionally_correct column is set to True.
+ tool_test_results = repository_metadata.tool_test_results
+ test_environment_dict = tool_test_results.get( 'test_environment', None )
+ invalid_tests = tool_test_results.get( 'invalid_tests', [] )
+ test_errors = tool_test_results.get( 'test_errors', [] )
+ tests_passed = tool_test_results.get( 'tests_passed', [] )
else:
- tool_test_errors = None
+ tool_test_results = None
test_environment_dict = {}
invalid_tests = []
test_errors = []
@@ -144,7 +144,7 @@
<b>Repository name:</b><br/>
${repository.name}
%endif
-%if invalid_tests or tool_test_errors or tests_passed:
+%if invalid_tests or tool_test_results or tests_passed:
<p/><div class="toolForm"><div class="toolFormTitle">Tool functional test results</div>
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 templates/webapps/tool_shed/repository/manage_repository.mako
--- a/templates/webapps/tool_shed/repository/manage_repository.mako
+++ b/templates/webapps/tool_shed/repository/manage_repository.mako
@@ -27,7 +27,7 @@
can_upload = can_push
can_view_change_log = not is_new
if repository_metadata:
- if repository_metadata.includes_tools and repository_metadata.tool_test_errors is not None:
+ if repository_metadata.includes_tools and repository_metadata.tool_test_results is not None:
can_display_tool_functional_test_results = True
else:
can_display_tool_functional_test_results = False
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 templates/webapps/tool_shed/repository/view_repository.mako
--- a/templates/webapps/tool_shed/repository/view_repository.mako
+++ b/templates/webapps/tool_shed/repository/view_repository.mako
@@ -26,7 +26,7 @@
changeset_revision_is_repository_tip = changeset_revision == repository.tip( trans.app )
if repository_metadata:
- if repository_metadata.includes_tools and repository_metadata.tool_test_errors is not None:
+ if repository_metadata.includes_tools and repository_metadata.tool_test_results is not None:
can_display_tool_functional_test_results = True
else:
can_display_tool_functional_test_results = False
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 templates/webapps/tool_shed/repository/view_tool_metadata.mako
--- a/templates/webapps/tool_shed/repository/view_tool_metadata.mako
+++ b/templates/webapps/tool_shed/repository/view_tool_metadata.mako
@@ -23,7 +23,7 @@
can_upload = can_push
can_view_change_log = trans.webapp.name == 'tool_shed' and not is_new
# TODO: fix the following when the install and test buildbot is functional.
- #can_view_tool_test_errors = tool_test_errors is not None
+ #can_view_tool_test_results = tool_test_results is not None
if can_push:
browse_label = 'Browse or delete repository tip files'
diff -r a599aba4d18c634c51d40c68c64148e45f4e083b -r f11a2c7a7d325deaf5cf2c2f05a513b1e1b4a2a6 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
@@ -265,13 +265,13 @@
tool_id = parts[ -2 ]
return tool_id, tool_version
-def get_tool_test_errors_from_api( tool_shed_url, metadata_revision_id ):
+def get_tool_test_results_from_api( tool_shed_url, metadata_revision_id ):
api_path = [ 'api', 'repository_revisions', metadata_revision_id ]
api_url = get_api_url( base=tool_shed_url, parts=api_path )
repository_metadata = json_from_url( api_url )
- if repository_metadata[ 'tool_test_errors' ] is None:
+ if repository_metadata[ 'tool_test_results' ] is None:
return {}
- return repository_metadata[ 'tool_test_errors' ]
+ return repository_metadata[ 'tool_test_results' ]
def json_from_url( url ):
url_handle = urllib.urlopen( url )
@@ -290,7 +290,7 @@
else:
params[ 'tools_functionally_correct' ] = 'false'
params[ 'do_not_test' ] = 'false'
- params[ 'tool_test_errors' ] = test_results_dict
+ params[ 'tool_test_results' ] = test_results_dict
if '-info_only' in sys.argv:
return {}
else:
@@ -583,7 +583,7 @@
log.debug( 'Installation of %s succeeded, running all defined functional tests.' % name )
# Generate the shed_tools_dict that specifies the location of test data contained within this repository. If the repository
# does not have a test-data directory, this will return has_test_data = False, and we will set the do_not_test flag to True,
- # and the tools_functionally_correct flag to False, as well as updating tool_test_errors.
+ # and the tools_functionally_correct flag to False, as well as updating tool_test_results.
file( galaxy_shed_tools_dict, 'w' ).write( to_json_string( dict() ) )
has_test_data, shed_tools_dict = parse_tool_panel_config( galaxy_shed_tool_conf_file, from_json_string( file( galaxy_shed_tools_dict, 'r' ).read() ) )
# The repository_status dict should always have the following structure:
@@ -628,7 +628,7 @@
# },
# ]
# }
- repository_status = get_tool_test_errors_from_api( galaxy_tool_shed_url, metadata_revision_id )
+ repository_status = get_tool_test_results_from_api( galaxy_tool_shed_url, metadata_revision_id )
if 'test_environment' not in repository_status:
repository_status[ 'test_environment' ] = {}
test_environment = get_test_environment( repository_status[ 'test_environment' ] )
@@ -731,7 +731,7 @@
test_status[ output_type ] = '\n'.join( tmp_output[ output_type ] )
repository_status[ 'test_errors' ].append( test_status )
# Call the register_test_result method, which executes a PUT request to the repository_revisions API controller with the outcome
- # of the tests, and updates tool_test_errors with the relevant log data.
+ # of the tests, and updates tool_test_results with the relevant log data.
# This also sets the do_not_test and tools_functionally correct flags to the appropriate values, and updates the time_last_tested
# field to today's date.
repositories_failed.append( dict( name=name, owner=owner, changeset_revision=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
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/33bec3cae5b7/
Changeset: 33bec3cae5b7
User: dannon
Date: 2013-04-25 14:13:16
Summary: Organize multi.py imports.
Affected #: 1 file
diff -r 75c5ab4e924192528a6d250d61109c05d16f0118 -r 33bec3cae5b7731916349977918c847f7b255267 lib/galaxy/jobs/splitters/multi.py
--- a/lib/galaxy/jobs/splitters/multi.py
+++ b/lib/galaxy/jobs/splitters/multi.py
@@ -1,5 +1,8 @@
-import os, logging, shutil
+import os
+import logging
+import shutil
import inspect
+
from galaxy import model, util
https://bitbucket.org/galaxy/galaxy-central/commits/a599aba4d18c/
Changeset: a599aba4d18c
User: dannon
Date: 2013-04-25 14:19:33
Summary: Patch from Peter Cock to ensure stdout/stderr are separated in dataset info.
Affected #: 1 file
diff -r 33bec3cae5b7731916349977918c847f7b255267 -r a599aba4d18c634c51d40c68c64148e45f4e083b lib/galaxy/jobs/__init__.py
--- a/lib/galaxy/jobs/__init__.py
+++ b/lib/galaxy/jobs/__init__.py
@@ -924,7 +924,13 @@
for dataset in dataset_assoc.dataset.dataset.history_associations + dataset_assoc.dataset.dataset.library_associations: #need to update all associated output hdas, i.e. history was shared with job running
dataset.blurb = 'done'
dataset.peek = 'no peek'
- dataset.info = ( dataset.info or '' ) + context['stdout'] + context['stderr']
+ dataset.info = (dataset.info or '')
+ if context['stdout'].strip():
+ #Ensure white space between entries
+ dataset.info = dataset.info.rstrip() + "\n" + context['stdout'].strip()
+ if context['stderr'].strip():
+ #Ensure white space between entries
+ dataset.info = dataset.info.rstrip() + "\n" + context['stderr'].strip()
dataset.tool_version = self.version_string
dataset.set_size()
if 'uuid' in context:
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/1191f246a22b/
Changeset: 1191f246a22b
User: dannon
Date: 2013-04-25 14:09:52
Summary: Add shutil to binary.py as pointed out by Peter.
Affected #: 1 file
diff -r 8b9ca63f9128fbe9c7f01805db64da3ec2916332 -r 1191f246a22b122bfdc27fe6f0488d1b0d3f0dbb lib/galaxy/datatypes/binary.py
--- a/lib/galaxy/datatypes/binary.py
+++ b/lib/galaxy/datatypes/binary.py
@@ -2,18 +2,26 @@
Binary classes
"""
-import data, logging, binascii
-from galaxy.datatypes.metadata import MetadataElement
-from galaxy.datatypes import metadata
-from galaxy.datatypes.sniff import *
+import binascii
+import data
+import gzip
+import logging
+import os
+import shutil
+import struct
+import subprocess
+import tempfile
+import zipfile
+
+from urllib import urlencode, quote_plus
from galaxy import eggs
import pkg_resources
pkg_resources.require( "bx-python" )
from bx.seq.twobit import TWOBIT_MAGIC_NUMBER, TWOBIT_MAGIC_NUMBER_SWAP, TWOBIT_MAGIC_SIZE
-from urllib import urlencode, quote_plus
-import zipfile, gzip
-import os, subprocess, tempfile
-import struct
+
+from galaxy.datatypes.metadata import MetadataElement
+from galaxy.datatypes import metadata
+from galaxy.datatypes.sniff import *
log = logging.getLogger(__name__)
https://bitbucket.org/galaxy/galaxy-central/commits/75c5ab4e9241/
Changeset: 75c5ab4e9241
User: dannon
Date: 2013-04-25 14:10:46
Summary: Add missing shutil import to data.py as pointed out by Peter.
Affected #: 1 file
diff -r 1191f246a22b122bfdc27fe6f0488d1b0d3f0dbb -r 75c5ab4e924192528a6d250d61109c05d16f0118 lib/galaxy/datatypes/data.py
--- a/lib/galaxy/datatypes/data.py
+++ b/lib/galaxy/datatypes/data.py
@@ -2,6 +2,7 @@
import metadata
import mimetypes
import os
+import shutil
import sys
import tempfile
import zipfile
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