galaxy-dev
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
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
January 2010
- 29 participants
- 156 discussions
22 Jan '10
details: http://www.bx.psu.edu/hg/galaxy/rev/ad5219e97c2f
changeset: 3259:ad5219e97c2f
user: Greg Von Kuster <greg(a)bx.psu.edu>
date: Fri Jan 22 15:09:26 2010 -0500
description:
Fix for tool_runner - a new history is now created for a user that is visiting Galaxy from an external application ( e.g., UCSC ) for the very first time.
diffstat:
lib/galaxy/web/controllers/tool_runner.py | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diffs (14 lines):
diff -r 29a8cc301cc5 -r ad5219e97c2f lib/galaxy/web/controllers/tool_runner.py
--- a/lib/galaxy/web/controllers/tool_runner.py Fri Jan 22 13:51:56 2010 -0500
+++ b/lib/galaxy/web/controllers/tool_runner.py Fri Jan 22 15:09:26 2010 -0500
@@ -47,7 +47,9 @@
#do param translation here, used by datasource tools
if tool.input_translator:
tool.input_translator.translate( params )
- history = trans.get_history()
+ # We may be visiting Galaxy for the first time ( e.g., sending data from UCSC ),
+ # so make sure to create a new history if we've never had one before.
+ history = trans.get_history( create=True )
template, vars = tool.handle_input( trans, params.__dict__ )
if len(params) > 0:
trans.log_event( "Tool params: %s" % (str(params)), tool_id=tool_id )
1
0
22 Jan '10
details: http://www.bx.psu.edu/hg/galaxy/rev/29a8cc301cc5
changeset: 3258:29a8cc301cc5
user: Greg Von Kuster <greg(a)bx.psu.edu>
date: Fri Jan 22 13:51:56 2010 -0500
description:
Fix for the general functional test tool failures.
diffstat:
test/functional/test_toolbox.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diffs (12 lines):
diff -r 8916a67cc639 -r 29a8cc301cc5 test/functional/test_toolbox.py
--- a/test/functional/test_toolbox.py Fri Jan 22 11:24:28 2010 -0500
+++ b/test/functional/test_toolbox.py Fri Jan 22 13:51:56 2010 -0500
@@ -69,7 +69,7 @@
name, file, sort = output_tuple
# Get the correct hid
elem = data_list[ elem_index ]
- self.assertTrue( elem )
+ self.assertTrue( elem is not None )
elem_hid = elem.get( 'hid' )
elem_index += 1
self.verify_dataset_correctness( file, hid=elem_hid, maxseconds=testdef.maxseconds, sort=sort )
1
0
22 Jan '10
details: http://www.bx.psu.edu/hg/galaxy/rev/8916a67cc639
changeset: 3257:8916a67cc639
user: Greg Von Kuster <greg(a)bx.psu.edu>
date: Fri Jan 22 11:24:28 2010 -0500
description:
If a library is not public, ensure that the roles displayed on the upload form or any permission form for a contained folder or dataset are derived from the set of users that have access to the library.  Add error checks to the upload tool to display appropriate error messages if ill-legitimate roles were selected ( shouldn't happen since they are filtered out ) or if roles are selected such that the dataset would be in-accessible to everyone.
diffstat:
lib/galaxy/model/__init__.py | 53 ++-
lib/galaxy/security/__init__.py | 99 +++-
lib/galaxy/tools/actions/__init__.py | 8 +-
lib/galaxy/tools/actions/upload_common.py | 10 +-
lib/galaxy/tools/parameters/basic.py | 6 +-
lib/galaxy/web/controllers/dataset.py | 8 +-
lib/galaxy/web/controllers/library.py | 4 +-
lib/galaxy/web/controllers/library_common.py | 364 ++++++-------
lib/galaxy/web/controllers/requests.py | 6 +-
lib/galaxy/web/controllers/root.py | 23 +-
lib/galaxy/web/controllers/tool_runner.py | 12 +
templates/admin/center.mako | 67 +-
templates/base_panels.mako | 23 +-
templates/dataset/edit_attributes.mako | 5 +-
templates/library/common/browse_library.mako | 27 +-
templates/library/common/common.mako | 4 +-
templates/library/common/folder_info.mako | 7 +-
templates/library/common/folder_permissions.mako | 4 +-
templates/library/common/ldda_edit_info.mako | 7 +-
templates/library/common/ldda_info.mako | 8 +-
templates/library/common/ldda_permissions.mako | 5 -
templates/library/common/library_dataset_info.mako | 7 +-
templates/library/common/library_dataset_permissions.mako | 12 +-
templates/library/common/library_info.mako | 7 +-
templates/library/common/library_permissions.mako | 12 +-
templates/mobile/history/detail.mako | 4 +-
templates/mobile/manage_library.mako | 12 +-
templates/root/history_common.mako | 6 +-
test/base/twilltestcase.py | 3 +-
test/functional/test_security_and_libraries.py | 185 +++++-
test/functional/test_toolbox.py | 1 +
31 files changed, 624 insertions(+), 375 deletions(-)
diffs (2062 lines):
diff -r 4cd66d01aaf0 -r 8916a67cc639 lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py Fri Jan 22 10:49:38 2010 -0500
+++ b/lib/galaxy/model/__init__.py Fri Jan 22 11:24:28 2010 -0500
@@ -5,7 +5,7 @@
the relationship cardinalities are obvious (e.g. prefer Dataset to Data)
"""
-import os.path, os, errno, sys, codecs
+import os.path, os, errno, sys, codecs, operator
import galaxy.datatypes
from galaxy.util.bunch import Bunch
from galaxy import util
@@ -435,6 +435,12 @@
os.remove(self.data.file_name)
except OSError, e:
log.critical('%s delete error %s' % (self.__class__.__name__, e))
+ def get_access_roles( self, trans ):
+ roles = []
+ for dp in self.actions:
+ if dp.action == trans.app.security_agent.permitted_actions.DATASET_ACCESS.action:
+ roles.append( dp.role )
+ return roles
class DatasetInstance( object ):
"""A base class for all 'dataset instances', HDAs, LDAs, etc"""
@@ -747,6 +753,49 @@
return template.get_widgets( trans.user, contents=info.content )
return template.get_widgets( trans.user )
return []
+ def get_access_roles( self, trans ):
+ roles = []
+ for lp in self.actions:
+ if lp.action == trans.app.security_agent.permitted_actions.LIBRARY_ACCESS.action:
+ roles.append( lp.role )
+ return roles
+ def get_legitimate_roles( self, trans ):
+ if trans.app.security_agent.library_is_public( self ):
+ return trans.sa_session.query( trans.app.model.Role ) \
+ .filter( trans.app.model.Role.table.c.deleted==False ) \
+ .order_by( trans.app.model.Role.table.c.name )
+ def sort_by_attr( seq, attr ):
+ """
+ Sort the sequence of objects by object's attribute
+ Arguments:
+ seq - the list or any sequence (including immutable one) of objects to sort.
+ attr - the name of attribute to sort by
+ """
+ # Use the "Schwartzian transform"
+ # Create the auxiliary list of tuples where every i-th tuple has form
+ # (seq[i].attr, i, seq[i]) and sort it. The second item of tuple is needed not
+ # only to provide stable sorting, but mainly to eliminate comparison of objects
+ # (which can be expensive or prohibited) in case of equal attribute values.
+ intermed = map( None, map( getattr, seq, ( attr, ) * len( seq ) ), xrange( len( seq ) ), seq )
+ intermed.sort()
+ return map( operator.getitem, intermed, ( -1, ) * len( intermed ) )
+ roles = set()
+ # If a library has roles associated with the LIBRARY_ACCESS permission, we need to start with them.
+ access_roles = self.get_access_roles( trans )
+ for role in access_roles:
+ roles.add( role )
+ # Each role potentially has users. We need to find all roles that each of those users have.
+ for ura in role.users:
+ roles.add( ura.role )
+ # Each role also potentially has groups which, in turn, have members ( users ). We need to
+ # find all roles that each group's members have.
+ for gra in role.groups:
+ group = gra.group
+ for uga in group.users:
+ user = uga.user
+ for ura in user.roles:
+ roles.add( ura.role )
+ return sort_by_attr( [ role for role in roles ], 'name' )
def get_display_name( self ):
# Library name can be either a string or a unicode object. If string,
# convert to unicode object assuming 'utf-8' format.
@@ -937,6 +986,8 @@
return ldda
def clear_associated_files( self, metadata_safe = False, purge = False ):
return
+ def get_access_roles( self, trans ):
+ return self.dataset.get_access_roles( trans )
def get_info_association( self, restrict=False, inherited=False ):
# If restrict is True, we will return this ldda's info_association whether it
# exists or not. If restrict is False, we'll return the next available info_association
diff -r 4cd66d01aaf0 -r 8916a67cc639 lib/galaxy/security/__init__.py
--- a/lib/galaxy/security/__init__.py Fri Jan 22 10:49:38 2010 -0500
+++ b/lib/galaxy/security/__init__.py Fri Jan 22 11:24:28 2010 -0500
@@ -5,6 +5,7 @@
import logging, socket
from datetime import datetime, timedelta
from galaxy.util.bunch import Bunch
+from galaxy.util import listify
from galaxy.model.orm import *
log = logging.getLogger(__name__)
@@ -17,6 +18,8 @@
class RBACAgent:
"""Class that handles galaxy security"""
+ IN_ACCESSIBLE = 'access_error'
+ ILL_LEGITIMATE = 'legitimate_error'
permitted_actions = Bunch(
DATASET_MANAGE_PERMISSIONS = Action( "manage permissions", "Role members can manage the roles associated with this dataset", "grant" ),
DATASET_ACCESS = Action( "access", "Role members can import this dataset into their history for analysis", "restrict" ),
@@ -74,6 +77,10 @@
raise "Unimplemented Method"
def make_library_public( self, library ):
raise "Unimplemented Method"
+ def get_library_dataset_permissions( self, library_dataset ):
+ raise "Unimplemented Method"
+ def check_library_dataset_access( self, trans, library_id, **kwd ):
+ raise "Unimplemented Method"
def get_component_associations( self, **kwd ):
raise "Unimplemented Method"
def components_are_associated( self, **kwd ):
@@ -283,8 +290,6 @@
permissions looks like: { Action : [ Role, Role ] }
"""
# Delete all of the current permissions on the dataset
- # TODO: If setting ACCESS permission, at least 1 user must have every role associated with this dataset,
- # or the dataset is inaccessible. See admin/library_dataset_dataset_association()
for dp in dataset.actions:
self.sa_session.delete( dp )
# Add the new permissions on the dataset
@@ -299,8 +304,6 @@
Set a specific permission on a dataset, leaving all other current permissions on the dataset alone
permissions looks like: { Action : [ Role, Role ] }
"""
- # TODO: If setting ACCESS permission, at least 1 user must have every role associated with this dataset,
- # or the dataset is inaccessible. See admin/library_dataset_dataset_association()
for action, roles in permission.items():
if isinstance( action, Action ):
action = action.action
@@ -405,18 +408,92 @@
else:
permissions[ action ] = [ library_dataset_permission.role ]
return permissions
+ def check_library_dataset_access( self, trans, library_id, **kwd ):
+ # library_id must be decoded before being sent
+ msg = ''
+ permissions = {}
+ # accessible will be True only if at least 1 user has every role in DATASET_ACCESS_in
+ accessible = False
+ # legitimate will be True only if all roles in DATASET_ACCESS_in are in the set
+ # of roles returned from library.get_legitimate_roles()
+ legitimate = False
+ error = None
+ for k, v in get_permitted_actions( filter='DATASET' ).items():
+ in_roles = [ self.sa_session.query( self.model.Role ).get( x ) for x in listify( kwd.get( k + '_in', [] ) ) ]
+ if v == self.permitted_actions.DATASET_ACCESS and in_roles:
+ library = self.model.Library.get( library_id )
+ if not self.library_is_public( library ):
+ # Ensure that roles being associated with DATASET_ACCESS are a subset of the legitimate roles
+ # derived from the roles associated with the LIBRARY_ACCESS permission on the library if it's
+ # not public. This will keep ill-legitimate roles from being associated with the DATASET_ACCESS
+ # permission on the dataset (i.e., if Role1 is associated with LIBRARY_ACCESS, then only those users
+ # that have Role1 should be associated with DATASET_ACCESS.
+ legitimate_roles = library.get_legitimate_roles( trans )
+ ill_legitimate_roles = []
+ for role in in_roles:
+ if role not in legitimate_roles:
+ ill_legitimate_roles.append( role )
+ if ill_legitimate_roles:
+ error = self.ILL_LEGITIMATE
+ msg += "The following roles are not associated with users that have the 'access library' permission on this "
+ msg += "library, so they cannot be associated with the 'access' permission on the datasets: "
+ for role in ill_legitimate_roles:
+ msg += "%s, " % role.name
+ msg = msg.rstrip( ", " )
+ new_in_roles = []
+ for role in in_roles:
+ if role in legitimate_roles:
+ new_in_roles.append( role )
+ in_roles = new_in_roles
+ else:
+ legitimate = True
+ if len( in_roles ) == 1:
+ accessible = True
+ else:
+ # At least 1 user must have every role associated with the access
+ # permission on this dataset, or the dataset is not accessible.
+ in_roles_set = set()
+ for role in in_roles:
+ in_roles_set.add( role )
+ users_set = set()
+ for role in in_roles:
+ for ura in role.users:
+ users_set.add( ura.user )
+ for gra in role.groups:
+ group = gra.group
+ for uga in group.users:
+ users_set.add( uga.user )
+ # Make sure that at least 1 user has every role being associated with the dataset
+ for user in users_set:
+ user_roles_set = set()
+ for ura in user.roles:
+ user_roles_set.add( ura.role )
+ if in_roles_set.issubset( user_roles_set ):
+ accessible = True
+ break
+ if not accessible:
+ error = self.IN_ACCESSIBLE
+ # Don't set the permissions for DATASET_ACCESS if inaccessible, but set all other permissions
+ permissions[ self.get_action( v.action ) ] = []
+ msg += "At least 1 user must have every role associated with accessing datasets. The roles you "
+ msg += "attempted to associate for access would make the datasets in-accessible by everyone, "
+ msg += "so access permissions were left in their original state (or not set). All other "
+ msg += "permissions were updated for the datasets."
+ else:
+ permissions[ self.get_action( v.action ) ] = in_roles
+ else:
+ permissions[ self.get_action( v.action ) ] = in_roles
+ return permissions, in_roles, error, msg
def copy_library_permissions( self, source_library_item, target_library_item, user=None ):
# Copy all relevant permissions from source.
permissions = {}
for role_assoc in source_library_item.actions:
- if role_assoc.action == self.permitted_actions.LIBRARY_ACCESS and \
- not( isinstance( source_library_item, galaxy.model.Libary ) and isinstance( target_library_item, galaxy.model.Libary ) ):
+ if role_assoc.action != self.permitted_actions.LIBRARY_ACCESS.action:
# LIBRARY_ACCESS is a special permission that is set only at the library level.
- continue
- if role_assoc.action in permissions:
- permissions[role_assoc.action].append( role_assoc.role )
- else:
- permissions[role_assoc.action] = [ role_assoc.role ]
+ if role_assoc.action in permissions:
+ permissions[role_assoc.action].append( role_assoc.role )
+ else:
+ permissions[role_assoc.action] = [ role_assoc.role ]
self.set_all_library_permissions( target_library_item, permissions )
if user:
item_class = None
diff -r 4cd66d01aaf0 -r 8916a67cc639 lib/galaxy/tools/actions/__init__.py
--- a/lib/galaxy/tools/actions/__init__.py Fri Jan 22 10:49:38 2010 -0500
+++ b/lib/galaxy/tools/actions/__init__.py Fri Jan 22 11:24:28 2010 -0500
@@ -51,8 +51,8 @@
trans.sa_session.add( assoc )
trans.sa_session.flush()
data = new_data
- roles = trans.get_current_user_roles()
- if data and not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
+ current_user_roles = trans.get_current_user_roles()
+ if data and not trans.app.security_agent.can_access_dataset( current_user_roles, data.dataset ):
raise "User does not have permission to use a dataset (%s) provided for input." % data.id
return data
if isinstance( input, DataToolParameter ):
@@ -269,10 +269,10 @@
# parameters to the command as a special case.
for name, value in tool.params_to_strings( incoming, trans.app ).iteritems():
job.add_parameter( name, value )
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
for name, dataset in inp_data.iteritems():
if dataset:
- if not trans.app.security_agent.can_access_dataset( roles, dataset.dataset ):
+ if not trans.app.security_agent.can_access_dataset( current_user_roles, dataset.dataset ):
raise "User does not have permission to use a dataset (%s) provided for input." % data.id
job.add_input_dataset( name, dataset )
else:
diff -r 4cd66d01aaf0 -r 8916a67cc639 lib/galaxy/tools/actions/upload_common.py
--- a/lib/galaxy/tools/actions/upload_common.py Fri Jan 22 10:49:38 2010 -0500
+++ b/lib/galaxy/tools/actions/upload_common.py Fri Jan 22 11:24:28 2010 -0500
@@ -59,7 +59,7 @@
role = trans.sa_session.query( trans.app.model.Role ).get( role_id )
library_bunch.roles.append( role )
return library_bunch
-def get_precreated_datasets( trans, params, data_obj, controller='root' ):
+def get_precreated_datasets( trans, params, data_obj, controller='root' ):
"""
Get any precreated datasets (when using asynchronous uploads).
"""
@@ -67,7 +67,7 @@
async_datasets = []
if params.get( 'async_datasets', None ) not in ["None", "", None]:
async_datasets = params['async_datasets'].split(',')
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
for id in async_datasets:
try:
data = trans.sa_session.query( data_obj ).get( int( id ) )
@@ -82,7 +82,7 @@
else:
rval.append( data )
elif data_obj is trans.app.model.LibraryDatasetDatasetAssociation:
- if controller == 'library' and not trans.app.security_agent.can_add_library_item( roles, data.library_dataset.folder ):
+ if controller == 'library' and not trans.app.security_agent.can_add_library_item( current_user_roles, data.library_dataset.folder ):
log.error( 'Got a precreated dataset (%s) but this user (%s) is not allowed to write to it' % ( data.id, trans.user.id ) )
else:
rval.append( data )
@@ -122,8 +122,8 @@
trans.sa_session.flush()
return hda
def new_library_upload( trans, uploaded_dataset, library_bunch, state=None ):
- roles = trans.get_current_user_roles()
- if not ( trans.app.security_agent.can_add_library_item( roles, library_bunch.folder ) \
+ current_user_roles = trans.get_current_user_roles()
+ if not ( trans.app.security_agent.can_add_library_item( current_user_roles, library_bunch.folder ) \
or trans.user.email in trans.app.config.get( "admin_users", "" ).split( "," ) ):
# This doesn't have to be pretty - the only time this should happen is if someone's being malicious.
raise Exception( "User is not authorized to add datasets to this library." )
diff -r 4cd66d01aaf0 -r 8916a67cc639 lib/galaxy/tools/parameters/basic.py
--- a/lib/galaxy/tools/parameters/basic.py Fri Jan 22 10:49:38 2010 -0500
+++ b/lib/galaxy/tools/parameters/basic.py Fri Jan 22 11:24:28 2010 -0500
@@ -1177,7 +1177,7 @@
field = form_builder.SelectField( self.name, self.multiple, None, self.refresh_on_change, refresh_on_change_values = self.refresh_on_change_values )
# CRUCIAL: the dataset_collector function needs to be local to DataToolParameter.get_html_field()
def dataset_collector( hdas, parent_hid ):
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
for i, hda in enumerate( hdas ):
if len( hda.name ) > 30:
hda_name = '%s..%s' % ( hda.name[:17], hda.name[-11:] )
@@ -1189,7 +1189,7 @@
hid = str( hda.hid )
if not hda.dataset.state in [galaxy.model.Dataset.states.ERROR, galaxy.model.Dataset.states.DISCARDED] and \
hda.visible and \
- trans.app.security_agent.can_access_dataset( roles, hda.dataset ):
+ trans.app.security_agent.can_access_dataset( current_user_roles, hda.dataset ):
# If we are sending data to an external application, then we need to make sure there are no roles
# associated with the dataset that restrict it's access from "public".
if self.tool and self.tool.tool_type == 'data_destination' and not trans.app.security_agent.dataset_is_public( hda.dataset ):
@@ -1204,7 +1204,7 @@
if target_ext:
if converted_dataset:
hda = converted_dataset
- if not trans.app.security_agent.can_access_dataset( roles, hda.dataset ):
+ if not trans.app.security_agent.can_access_dataset( current_user_roles, hda.dataset ):
continue
selected = ( value and ( hda in value ) )
field.add_option( "%s: (as %s) %s" % ( hid, target_ext, hda_name ), hda.id, selected )
diff -r 4cd66d01aaf0 -r 8916a67cc639 lib/galaxy/web/controllers/dataset.py
--- a/lib/galaxy/web/controllers/dataset.py Fri Jan 22 10:49:38 2010 -0500
+++ b/lib/galaxy/web/controllers/dataset.py Fri Jan 22 11:24:28 2010 -0500
@@ -192,8 +192,8 @@
data = data = trans.sa_session.query( trans.app.model.HistoryDatasetAssociation ).get( dataset_id )
if not data:
raise paste.httpexceptions.HTTPRequestRangeNotSatisfiable( "Invalid reference dataset id: %s." % str( dataset_id ) )
- roles = trans.get_current_user_roles()
- if trans.app.security_agent.can_access_dataset( roles, data.dataset ):
+ current_user_roles = trans.get_current_user_roles()
+ if trans.app.security_agent.can_access_dataset( current_user_roles, data.dataset ):
if data.state == trans.model.Dataset.states.UPLOAD:
return trans.show_error_message( "Please wait until this dataset finishes uploading before attempting to view it." )
@@ -298,10 +298,10 @@
if 'display_url' not in kwd or 'redirect_url' not in kwd:
return trans.show_error_message( 'Invalid parameters specified for "display at" link, please contact a Galaxy administrator' )
redirect_url = kwd['redirect_url'] % urllib.quote_plus( kwd['display_url'] )
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
if trans.app.security_agent.dataset_is_public( data.dataset ):
return trans.response.send_redirect( redirect_url ) # anon access already permitted by rbac
- if trans.app.security_agent.can_access_dataset( roles, data.dataset ):
+ if trans.app.security_agent.can_access_dataset( current_user_roles, data.dataset ):
trans.app.host_security_agent.set_dataset_permissions( data, trans.user, site )
return trans.response.send_redirect( redirect_url )
else:
diff -r 4cd66d01aaf0 -r 8916a67cc639 lib/galaxy/web/controllers/library.py
--- a/lib/galaxy/web/controllers/library.py Fri Jan 22 10:49:38 2010 -0500
+++ b/lib/galaxy/web/controllers/library.py Fri Jan 22 11:24:28 2010 -0500
@@ -21,13 +21,13 @@
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
all_libraries = trans.sa_session.query( trans.app.model.Library ) \
.filter( trans.app.model.Library.table.c.deleted==False ) \
.order_by( trans.app.model.Library.name )
authorized_libraries = []
for library in all_libraries:
- if trans.app.security_agent.library_is_public( library ) or trans.app.security_agent.can_access_library( roles, library ):
+ if trans.app.security_agent.can_access_library( current_user_roles, library ):
authorized_libraries.append( library )
return trans.fill_template( '/library/browse_libraries.mako',
libraries=authorized_libraries,
diff -r 4cd66d01aaf0 -r 8916a67cc639 lib/galaxy/web/controllers/library_common.py
--- a/lib/galaxy/web/controllers/library_common.py Fri Jan 22 10:49:38 2010 -0500
+++ b/lib/galaxy/web/controllers/library_common.py Fri Jan 22 11:24:28 2010 -0500
@@ -101,6 +101,7 @@
show_deleted = util.string_as_bool( params.get( 'show_deleted', False ) )
created_ldda_ids = params.get( 'created_ldda_ids', '' )
hidden_folder_ids = util.listify( params.get( 'hidden_folder_ids', '' ) )
+ current_user_roles = trans.get_current_user_roles()
if created_ldda_ids and not msg:
msg = "%d datasets are uploading in the background to the library '%s' (each is selected). " % \
( len( created_ldda_ids.split( ',' ) ), library.name )
@@ -115,6 +116,7 @@
default_action=params.get( 'default_action', None ),
show_deleted=show_deleted,
comptypes=comptypes,
+ current_user_roles=current_user_roles,
msg=msg,
messagetype=messagetype )
@web.expose
@@ -126,18 +128,14 @@
library = trans.sa_session.query( trans.app.model.Library ).get( trans.security.decode_id( library_id ) )
# See if we have any associated templates
widgets = library.get_template_widgets( trans )
+ current_user_roles = trans.get_current_user_roles()
if params.get( 'rename_library_button', False ):
old_name = library.name
new_name = util.restore_text( params.name )
new_description = util.restore_text( params.description )
if not new_name:
msg = 'Enter a valid name'
- return trans.fill_template( '/library/common/library_info.mako',
- cntrller=cntrller,
- library=library,
- widgets=widgets,
- msg=msg,
- messagetype='error' )
+ messagetype='error'
else:
library.name = new_name
library.description = new_description
@@ -157,6 +155,7 @@
cntrller=cntrller,
library=library,
widgets=widgets,
+ current_user_roles=current_user_roles,
msg=msg,
messagetype=messagetype )
@web.expose
@@ -166,6 +165,7 @@
messagetype = params.get( 'messagetype', 'done' )
library_id = params.get( 'id', None )
library = trans.sa_session.query( trans.app.model.Library ).get( trans.security.decode_id( library_id ) )
+ current_user_roles = trans.get_current_user_roles()
if params.get( 'update_roles_button', False ):
# The user clicked the Save button on the 'Associate With Roles' form
permissions = {}
@@ -183,9 +183,12 @@
id=trans.security.encode_id( library.id ),
msg=util.sanitize_text( msg ),
messagetype='done' ) )
+ roles = library.get_legitimate_roles( trans )
return trans.fill_template( '/library/common/library_permissions.mako',
cntrller=cntrller,
library=library,
+ current_user_roles=current_user_roles,
+ roles=roles,
msg=msg,
messagetype=messagetype )
@web.expose
@@ -233,52 +236,34 @@
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
folder = trans.sa_session.query( trans.app.model.LibraryFolder ).get( trans.security.decode_id( id ) )
- if cntrller != 'library_admin':
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
# See if we have any associated templates
widgets = folder.get_template_widgets( trans )
if params.get( 'rename_folder_button', False ):
- if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, folder ):
+ if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, folder ):
old_name = folder.name
new_name = util.restore_text( params.name )
new_description = util.restore_text( params.description )
if not new_name:
msg = 'Enter a valid name'
- return trans.fill_template( "/library/common/folder_info.mako",
- cntrller=cntrller,
- folder=folder,
- library_id=library_id,
- widgets=widgets,
- msg=msg,
- messagetype='error' )
+ messagetype='error'
else:
folder.name = new_name
folder.description = new_description
trans.sa_session.add( folder )
trans.sa_session.flush()
msg = "Folder '%s' has been renamed to '%s'" % ( old_name, new_name )
- return trans.response.send_redirect( web.url_for( controller='library_common',
- action='folder_info',
- cntrller=cntrller,
- id=id,
- library_id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='done' ) )
+ messagetype='done'
else:
msg = "You are not authorized to edit this folder"
- return trans.fill_template( "/library/common/folder_info.mako",
- cntrller=cntrller,
- folder=folder,
- library_id=library_id,
- widgets=widgets,
- msg=msg,
- messagetype='error' )
+ messagetype='error'
return trans.fill_template( '/library/common/folder_info.mako',
cntrller=cntrller,
folder=folder,
library_id=library_id,
widgets=widgets,
- msg=msg,
+ current_user_roles=current_user_roles,
+ msg=util.sanitize_text( msg ),
messagetype=messagetype )
@web.expose
def folder_permissions( self, trans, cntrller, id, library_id, **kwd ):
@@ -294,36 +279,40 @@
id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- if cntrller == 'library':
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
if params.get( 'update_roles_button', False ):
# The user clicked the Save button on the 'Associate With Roles' form
- if cntrller == 'library_admin' or trans.app.security_agent.can_manage_library_item( roles, folder ):
+ if cntrller == 'library_admin' or trans.app.security_agent.can_manage_library_item( current_user_roles, folder ):
permissions = {}
for k, v in trans.app.model.Library.permitted_actions.items():
- in_roles = [ trans.sa_session.query( trans.app.model.Role ).get( int( x ) ) for x in util.listify( params.get( k + '_in', [] ) ) ]
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
+ if k != 'LIBRARY_ACCESS':
+ # LIBRARY_ACCESS is a special permission set only at the library level
+ # and it is not inherited.
+ in_roles = [ trans.sa_session.query( trans.app.model.Role ).get( int( x ) ) for x in util.listify( params.get( k + '_in', [] ) ) ]
+ permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
trans.app.security_agent.set_all_library_permissions( folder, permissions )
trans.sa_session.refresh( folder )
msg = 'Permissions updated for folder %s' % folder.name
- return trans.response.send_redirect( web.url_for( controller='library_common',
- action='folder_permissions',
- id=trans.security.encode_id( folder.id ),
- library_id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='done' ) )
+ messagetype='done'
else:
msg = "You are not authorized to manage permissions on this folder"
- return trans.response.send_redirect( web.url_for( controller='library_common',
- action='folder_permissions',
- id=trans.security.encode_id( folder.id ),
- library_id=library_id,
- msg=util.sanitize_text( msg ),
- messagetype='error' ) )
+ messagetype = "error"
+ return trans.response.send_redirect( web.url_for( controller='library_common',
+ action='folder_permissions',
+ id=trans.security.encode_id( folder.id ),
+ library_id=library_id,
+ msg=util.sanitize_text( msg ),
+ messagetype=messagetype ) )
+ # If the library is public all roles are legitimate, but if the library is restricted, only those
+ # roles associated with the LIBRARY_ACCESS permission are legitimate.
+ library = trans.sa_session.query( trans.app.model.Library ).get( trans.security.decode_id( library_id ) )
+ roles = library.get_legitimate_roles( trans )
return trans.fill_template( '/library/common/folder_permissions.mako',
cntrller=cntrller,
folder=folder,
library_id=library_id,
+ current_user_roles=current_user_roles,
+ roles=roles,
msg=msg,
messagetype=messagetype )
@web.expose
@@ -343,15 +332,14 @@
dbkey = params.get( 'dbkey', '?' )
if isinstance( dbkey, list ):
dbkey = dbkey[0]
- if cntrller == 'library':
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
file_formats = [ dtype_name for dtype_name, dtype_value in trans.app.datatypes_registry.datatypes_by_extension.iteritems() if dtype_value.allow_datatype_change ]
file_formats.sort()
# See if we have any associated templates
widgets = ldda.get_template_widgets( trans )
if params.get( 'change', False ):
# The user clicked the Save button on the 'Change data type' form
- if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, ldda ):
+ if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, ldda ):
if ldda.datatype.allow_datatype_change and trans.app.datatypes_registry.get_datatype_by_extension( params.datatype ).allow_datatype_change:
trans.app.datatypes_registry.change_datatype( ldda, params.datatype )
trans.sa_session.flush()
@@ -369,11 +357,12 @@
library_id=library_id,
file_formats=file_formats,
widgets=widgets,
+ current_user_roles=current_user_roles,
msg=msg,
messagetype=messagetype )
elif params.get( 'save', False ):
# The user clicked the Save button on the 'Edit Attributes' form
- if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, ldda ):
+ if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, ldda ):
old_name = ldda.name
new_name = util.restore_text( params.get( 'name', '' ) )
new_info = util.restore_text( params.get( 'info', '' ) )
@@ -409,11 +398,12 @@
library_id=library_id,
file_formats=file_formats,
widgets=widgets,
+ current_user_roles=current_user_roles,
msg=msg,
messagetype=messagetype )
elif params.get( 'detect', False ):
# The user clicked the Auto-detect button on the 'Edit Attributes' form
- if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, ldda ):
+ if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, ldda ):
for name, spec in ldda.datatype.metadata_spec.items():
# We need to be careful about the attributes we are resetting
if name not in [ 'name', 'info', 'dbkey' ]:
@@ -433,9 +423,10 @@
library_id=library_id,
file_formats=file_formats,
widgets=widgets,
+ current_user_roles=current_user_roles,
msg=msg,
messagetype=messagetype )
- if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, ldda ):
+ if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, ldda ):
if "dbkey" in ldda.datatype.metadata_spec and not ldda.metadata.dbkey:
# Copy dbkey into metadata, for backwards compatability
# This looks like it does nothing, but getting the dbkey
@@ -449,6 +440,7 @@
library_id=library_id,
file_formats=file_formats,
widgets=widgets,
+ current_user_roles=current_user_roles,
msg=msg,
messagetype=messagetype )
@web.expose
@@ -469,6 +461,7 @@
library = trans.sa_session.query( trans.app.model.Library ).get( trans.security.decode_id( library_id ) )
# See if we have any associated templates
widgets = ldda.get_template_widgets( trans )
+ current_user_roles = trans.get_current_user_roles()
return trans.fill_template( '/library/common/ldda_info.mako',
cntrller=cntrller,
ldda=ldda,
@@ -483,7 +476,6 @@
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
ids = util.listify( id )
- # Display permission form, permissions will be updated for all lddas simultaneously.
lddas = []
for id in [ trans.security.decode_id( id ) for id in ids ]:
ldda = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ).get( id )
@@ -496,63 +488,44 @@
msg=util.sanitize_text( msg ),
messagetype='error' ) )
lddas.append( ldda )
+ # If the library is public all roles are legitimate, but if the library is restricted, only those
+ # roles associated with the LIBRARY_ACCESS permission are legitimate.
+ library = trans.sa_session.query( trans.app.model.Library ).get( trans.security.decode_id( library_id ) )
+ roles = library.get_legitimate_roles( trans )
if params.get( 'update_roles_button', False ):
- if cntrller=='library_admin' or ( trans.app.security_agent.can_manage_library_item( roles, ldda ) and \
- trans.app.security_agent.can_manage_dataset( roles, ldda.dataset ) ):
+ current_user_roles = trans.get_current_user_roles()
+ if cntrller=='library_admin' or ( trans.app.security_agent.can_manage_library_item( current_user_roles, ldda ) and \
+ trans.app.security_agent.can_manage_dataset( current_user_roles, ldda.dataset ) ):
+ permissions, in_roles, error, msg = \
+ trans.app.security_agent.check_library_dataset_access( trans, trans.app.security.decode_id( library_id ), **kwd )
+ for ldda in lddas:
+ # Set the DATASET permissions on the Dataset.
+ if error == trans.app.security_agent.IN_ACCESSIBLE:
+ # If the check_library_dataset_access() returned a "in_accessible" error, then we keep the original role
+ # associations for the DATASET_ACCESS permission on each ldda.
+ a = trans.app.security_agent.get_action( trans.app.security_agent.permitted_actions.DATASET_ACCESS.action )
+ permissions[ a ] = ldda.get_access_roles( trans )
+ trans.app.security_agent.set_all_dataset_permissions( ldda.dataset, permissions )
+ trans.sa_session.refresh( ldda.dataset )
+ # Set the LIBRARY permissions on the LibraryDataset
+ # NOTE: the LibraryDataset and LibraryDatasetDatasetAssociation will be set with the same permissions
permissions = {}
- accessible = False
- for k, v in trans.app.model.Dataset.permitted_actions.items():
- in_roles = [ trans.sa_session.query( trans.app.model.Role ).get( x ) for x in util.listify( params.get( k + '_in', [] ) ) ]
- # At least 1 user must have every role associated with this dataset, or the dataset is inaccessible
- if v == trans.app.security_agent.permitted_actions.DATASET_ACCESS:
- if len( in_roles ) > 1:
- # Get the set of all users that are being associated with the dataset
- in_roles_set = set()
- for role in in_roles:
- in_roles_set.add( role )
- users_set = set()
- for role in in_roles:
- for ura in role.users:
- users_set.add( ura.user )
- # Make sure that at least 1 user has every role being associated with the dataset
- for user in users_set:
- user_roles_set = set()
- for ura in user.roles:
- user_roles_set.add( ura.role )
- if in_roles_set.issubset( user_roles_set ):
- accessible = True
- break
- else:
- accessible = True
- if not accessible and v == trans.app.security_agent.permitted_actions.DATASET_ACCESS:
- # Don't set the permissions for DATASET_ACCESS if inaccessbile, but set all other permissions
- # TODO: keep access permissions as they originally were, rather than automatically making public
- permissions[ trans.app.security_agent.get_action( v.action ) ] = []
- else:
+ for k, v in trans.app.model.Library.permitted_actions.items():
+ if k != 'LIBRARY_ACCESS':
+ # LIBRARY_ACCESS is a special permission set only at the library level and it is not inherited.
+ in_roles = [ trans.sa_session.query( trans.app.model.Role ).get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
for ldda in lddas:
- # Set the DATASET permissions on the Dataset
- trans.app.security_agent.set_all_dataset_permissions( ldda.dataset, permissions )
- trans.sa_session.refresh( ldda.dataset )
- permissions = {}
- for k, v in trans.app.model.Library.permitted_actions.items():
- in_roles = [ trans.sa_session.query( trans.app.model.Role ).get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
- for ldda in lddas:
- # Set the LIBRARY permissions on the LibraryDataset
- # NOTE: the LibraryDataset and LibraryDatasetDatasetAssociation will be set with the same permissions
trans.app.security_agent.set_all_library_permissions( ldda.library_dataset, permissions )
trans.sa_session.refresh( ldda.library_dataset )
# Set the LIBRARY permissions on the LibraryDatasetDatasetAssociation
trans.app.security_agent.set_all_library_permissions( ldda, permissions )
trans.sa_session.refresh( ldda )
- if not accessible:
- msg = "At least 1 user must have every role associated with accessing these %d datasets. " % len( lddas )
- msg += "The roles you attempted to associate for access would make these datasets inaccessible by everyone, "
- msg += "so access permissions were not set. All other permissions were updated for the datasets."
+ if error:
messagetype = 'error'
else:
- msg = "Permissions have been updated on %d datasets" % len( lddas )
+ msg = 'Permissions have been updated on %d datasets.' % len( lddas )
+ messagetype= 'done'
else:
msg = "You are not authorized to change the permissions of dataset '%s'" % ldda.name
messagetype = 'error'
@@ -560,6 +533,7 @@
cntrller=cntrller,
lddas=lddas,
library_id=library_id,
+ roles=roles,
msg=msg,
messagetype=messagetype )
if len( ids ) > 1:
@@ -587,10 +561,12 @@
id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
+ # Display permission form, permissions will be updated for all lddas simultaneously.
return trans.fill_template( "/library/common/ldda_permissions.mako",
cntrller=cntrller,
lddas=lddas,
library_id=library_id,
+ roles=roles,
msg=msg,
messagetype=messagetype )
@web.expose
@@ -623,72 +599,86 @@
replace_dataset = None
upload_option = params.get( 'upload_option', 'upload_file' )
if cntrller == 'library':
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
if cntrller == 'library_admin' or \
- ( trans.app.security_agent.can_add_library_item( roles, folder ) or \
- ( replace_dataset and trans.app.security_agent.can_modify_library_item( roles, replace_dataset ) ) ):
+ ( trans.app.security_agent.can_add_library_item( current_user_roles, folder ) or \
+ ( replace_dataset and trans.app.security_agent.can_modify_library_item( current_user_roles, replace_dataset ) ) ):
if params.get( 'runtool_btn', False ) or params.get( 'ajax_upload', False ):
- # See if we have any inherited templates, but do not inherit contents.
- info_association, inherited = folder.get_info_association( inherited=True )
- if info_association:
- template_id = str( info_association.template.id )
- widgets = folder.get_template_widgets( trans, get_contents=False )
- else:
- template_id = 'None'
- widgets = []
- created_outputs = trans.webapp.controllers[ 'library_common' ].upload_dataset( trans,
- cntrller=cntrller,
- library_id=library_id,
- folder_id=folder_id,
- template_id=template_id,
- widgets=widgets,
- replace_dataset=replace_dataset,
- **kwd )
- if created_outputs:
- total_added = len( created_outputs.values() )
- ldda_id_list = [ str( v.id ) for v in created_outputs.values() ]
- if replace_dataset:
- msg = "Added %d dataset versions to the library dataset '%s' in the folder '%s'." % ( total_added, replace_dataset_name, folder.name )
+ # Check to see if the user selected roles to associate with the DATASET_ACCESS permission
+ # on the dataset that would make the dataset in-accessible to everyone.
+ roles = params.get( 'roles', False )
+ error = None
+ if roles:
+ vars = dict( DATASET_ACCESS_in=roles )
+ permissions, in_roles, error, msg = \
+ trans.app.security_agent.check_library_dataset_access( trans, trans.app.security.decode_id( library_id ), **vars )
+ if error:
+ if error == trans.app.security_agent.IN_ACCESSIBLE:
+ msg = "At least 1 user must have every role associated with accessing datasets. The roles you "
+ msg += "attempted to associate for access would make the datasets in-accessible by everyone."
+ messagetype = 'error'
+ if not error:
+ # See if we have any inherited templates, but do not inherit contents.
+ info_association, inherited = folder.get_info_association( inherited=True )
+ if info_association:
+ template_id = str( info_association.template.id )
+ widgets = folder.get_template_widgets( trans, get_contents=False )
else:
- if not folder.parent:
- # Libraries have the same name as their root_folder
- msg = "Added %d datasets to the library '%s' (each is selected). " % ( total_added, folder.name )
+ template_id = 'None'
+ widgets = []
+ created_outputs = trans.webapp.controllers[ 'library_common' ].upload_dataset( trans,
+ cntrller=cntrller,
+ library_id=library_id,
+ folder_id=folder_id,
+ template_id=template_id,
+ widgets=widgets,
+ replace_dataset=replace_dataset,
+ **kwd )
+ if created_outputs:
+ total_added = len( created_outputs.values() )
+ ldda_id_list = [ str( v.id ) for v in created_outputs.values() ]
+ if replace_dataset:
+ msg = "Added %d dataset versions to the library dataset '%s' in the folder '%s'." % ( total_added, replace_dataset_name, folder.name )
else:
- msg = "Added %d datasets to the folder '%s' (each is selected). " % ( total_added, folder.name )
- if cntrller == 'library_admin':
- msg += "Click the Go button at the bottom of this page to edit the permissions on these datasets if necessary."
- messagetype='done'
- else:
- # Since permissions on all LibraryDatasetDatasetAssociations must be the same at this point, we only need
- # to check one of them to see if the current user can manage permissions on them.
- check_ldda = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ).get( ldda_id_list[0] )
- if trans.app.security_agent.can_manage_library_item( roles, check_ldda ):
- if replace_dataset:
- default_action = ''
+ if not folder.parent:
+ # Libraries have the same name as their root_folder
+ msg = "Added %d datasets to the library '%s' (each is selected). " % ( total_added, folder.name )
+ else:
+ msg = "Added %d datasets to the folder '%s' (each is selected). " % ( total_added, folder.name )
+ if cntrller == 'library_admin':
+ msg += "Click the Go button at the bottom of this page to edit the permissions on these datasets if necessary."
+ messagetype='done'
+ else:
+ # Since permissions on all LibraryDatasetDatasetAssociations must be the same at this point, we only need
+ # to check one of them to see if the current user can manage permissions on them.
+ check_ldda = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ).get( ldda_id_list[0] )
+ if trans.app.security_agent.can_manage_library_item( current_user_roles, check_ldda ):
+ if replace_dataset:
+ default_action = ''
+ else:
+ msg += "Click the Go button at the bottom of this page to edit the permissions on these datasets if necessary."
+ default_action = 'manage_permissions'
else:
- msg += "Click the Go button at the bottom of this page to edit the permissions on these datasets if necessary."
- default_action = 'manage_permissions'
- else:
- default_action = 'add'
- trans.response.send_redirect( web.url_for( controller='library_common',
- action='browse_library',
- cntrller=cntrller,
- id=library_id,
- default_action=default_action,
- created_ldda_ids=",".join( ldda_id_list ),
- msg=util.sanitize_text( msg ),
- messagetype='done' ) )
-
- else:
- msg = "Upload failed"
- messagetype='error'
- trans.response.send_redirect( web.url_for( controller='library_common',
- action='browse_library',
- cntrller=cntrller,
- id=library_id,
- created_ldda_ids=",".join( [ str( v.id ) for v in created_outputs.values() ] ),
- msg=util.sanitize_text( msg ),
- messagetype=messagetype ) )
+ default_action = 'add'
+ trans.response.send_redirect( web.url_for( controller='library_common',
+ action='browse_library',
+ cntrller=cntrller,
+ id=library_id,
+ default_action=default_action,
+ created_ldda_ids=",".join( ldda_id_list ),
+ msg=util.sanitize_text( msg ),
+ messagetype='done' ) )
+
+ else:
+ msg = "Upload failed"
+ messagetype='error'
+ trans.response.send_redirect( web.url_for( controller='library_common',
+ action='browse_library',
+ cntrller=cntrller,
+ id=library_id,
+ created_ldda_ids=",".join( [ str( v.id ) for v in created_outputs.values() ] ),
+ msg=util.sanitize_text( msg ),
+ messagetype=messagetype ) )
# See if we have any inherited templates, but do not inherit contents.
widgets = folder.get_template_widgets( trans, get_contents=False )
upload_option = params.get( 'upload_option', 'upload_file' )
@@ -700,10 +690,11 @@
for dbkey, build_name in util.dbnames:
yield build_name, dbkey, ( dbkey==last_used_build )
dbkeys = get_dbkey_options( last_used_build )
- # Send list of roles to the form so the dataset can be associated with 1 or more of them.
- roles = trans.sa_session.query( trans.app.model.Role ) \
- .filter( trans.app.model.Role.table.c.deleted==False ) \
- .order_by( trans.app.model.Role.table.c.name )
+ # Send list of legitimate roles to the form so the dataset can be associated with 1 or more of them.
+ # If the library is public, all active roles are legitimate. If the library is restricted by the
+ # LIBRARY_ACCESS permission, only those roles associated with that permission are legitimate.
+ library = trans.sa_session.query( trans.app.model.Library ).get( trans.security.decode_id( library_id ) )
+ roles = library.get_legitimate_roles( trans )
# Send the current history to the form to enable importing datasets from history to library
history = trans.get_history()
trans.sa_session.refresh( history )
@@ -949,8 +940,8 @@
# Since permissions on all LibraryDatasetDatasetAssociations must be the same at this point, we only need
# to check one of them to see if the current user can manage permissions on them.
check_ldda = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ).get( trans.security.decode_id( ldda_id_list[0] ) )
- roles = trans.get_current_user_roles()
- if trans.app.security_agent.can_manage_library_item( roles, check_ldda ):
+ current_user_roles = trans.get_current_user_roles()
+ if trans.app.security_agent.can_manage_library_item( current_user_roles, check_ldda ):
if replace_dataset:
default_action = ''
else:
@@ -977,10 +968,9 @@
for dbkey, build_name in util.dbnames:
yield build_name, dbkey, ( dbkey==last_used_build )
dbkeys = get_dbkey_options( last_used_build )
- # Send list of roles to the form so the dataset can be associated with 1 or more of them.
- roles = trans.sa_session.query( trans.app.model.Role ) \
- .filter( trans.app.model.Role.table.c.deleted==False ) \
- .order_by( trans.app.model.Role.table.c.name )
+ # Send list of legitimate roles to the form so the dataset can be associated with 1 or more of them.
+ library = trans.sa_session.query( trans.app.model.Library ).get( trans.security.decode_id( library_id ) )
+ roles = library.get_legitimate_roles( trans )
return trans.fill_template( "/library/common/upload.mako",
upload_option=upload_option,
library_id=library_id,
@@ -1039,10 +1029,9 @@
id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- if cntrller == 'library':
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
if params.get( 'edit_attributes_button', False ):
- if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, library_dataset ):
+ if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, library_dataset ):
if params.get( 'edit_attributes_button', False ):
old_name = library_dataset.name
new_name = util.restore_text( params.get( 'name', '' ) )
@@ -1064,6 +1053,7 @@
cntrller=cntrller,
library_dataset=library_dataset,
library_id=library_id,
+ current_user_roles=current_user_roles,
msg=msg,
messagetype=messagetype )
@web.expose
@@ -1080,15 +1070,17 @@
id=library_id,
msg=util.sanitize_text( msg ),
messagetype='error' ) )
- if cntrller == 'library':
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
if params.get( 'update_roles_button', False ):
- if cntrller == 'library_admin' or trans.app.security_agent.can_manage_library_item( roles, library_dataset ):
+ if cntrller == 'library_admin' or trans.app.security_agent.can_manage_library_item( current_user_roles, library_dataset ):
# The user clicked the Save button on the 'Associate With Roles' form
permissions = {}
for k, v in trans.app.model.Library.permitted_actions.items():
- in_roles = [ trans.sa_session.query( trans.app.model.Role ).get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
- permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
+ if k != 'LIBRARY_ACCESS':
+ # LIBRARY_ACCESS is a special permission set only at the library level
+ # and it is not inherited.
+ in_roles = [ trans.sa_session.query( trans.app.model.Role ).get( x ) for x in util.listify( kwd.get( k + '_in', [] ) ) ]
+ permissions[ trans.app.security_agent.get_action( v.action ) ] = in_roles
# Set the LIBRARY permissions on the LibraryDataset
# NOTE: the LibraryDataset and LibraryDatasetDatasetAssociation will be set with the same permissions
trans.app.security_agent.set_all_library_permissions( library_dataset, permissions )
@@ -1101,16 +1093,20 @@
else:
msg = "You are not authorized to managed the permissions of this dataset"
messagetype = "error"
+ library = trans.sa_session.query( trans.app.model.Library ).get( trans.security.decode_id( library_id ) )
+ roles = library.get_legitimate_roles( trans )
return trans.fill_template( '/library/common/library_dataset_permissions.mako',
cntrller=cntrller,
library_dataset=library_dataset,
library_id=library_id,
+ roles=roles,
+ current_user_roles=current_user_roles,
msg=msg,
messagetype=messagetype )
@web.expose
def act_on_multiple_datasets( self, trans, cntrller, library_id, ldda_ids='', **kwd ):
# This method is used by the select list labeled "Perform action on selected datasets"
- # on the analysis library browser.
+ # on the analysis library browser
params = util.Params( kwd )
msg = util.restore_text( params.get( 'msg', '' ) )
messagetype = params.get( 'messagetype', 'done' )
@@ -1204,11 +1200,11 @@
msg=util.sanitize_text( msg ),
messagetype='error' ) )
seen = []
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
for ldda_id in ldda_ids:
ldda = trans.sa_session.query( trans.app.model.LibraryDatasetDatasetAssociation ).get( trans.security.decode_id( ldda_id ) )
if not ldda \
- or not trans.app.security_agent.can_access_dataset( roles, ldda.dataset ) \
+ or not trans.app.security_agent.can_access_dataset( current_user_roles, ldda.dataset ) \
or ldda.dataset.state in [ 'new', 'upload', 'queued', 'running', 'empty', 'discarded' ]:
continue
path = ""
@@ -1318,7 +1314,7 @@
id=response_id,
library_id=library_id,
msg=msg,
- message_type='done' ) )
+ messagetype='done' ) )
return trans.fill_template( '/library/common/select_info_template.mako',
cntrller=cntrller,
library_item_name=library_item.name,
diff -r 4cd66d01aaf0 -r 8916a67cc639 lib/galaxy/web/controllers/requests.py
--- a/lib/galaxy/web/controllers/requests.py Fri Jan 22 10:49:38 2010 -0500
+++ b/lib/galaxy/web/controllers/requests.py Fri Jan 22 11:24:28 2010 -0500
@@ -604,11 +604,11 @@
all_libraries = trans.sa_session.query( trans.app.model.Library ) \
.filter( trans.app.model.Library.table.c.deleted == False ) \
.order_by( trans.app.model.Library.name )
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
actions_to_check = [ trans.app.security_agent.permitted_actions.LIBRARY_ADD ]
libraries = odict()
for library in all_libraries:
- can_show, hidden_folder_ids = trans.app.security_agent.show_library_item( trans.user, roles, library, actions_to_check )
+ can_show, hidden_folder_ids = trans.app.security_agent.show_library_item( trans.user, current_user_roles, library, actions_to_check )
if can_show:
libraries[ library ] = hidden_folder_ids
# create data library selectbox with refresh on change enabled
@@ -662,7 +662,7 @@
folder_list.add_option('Select one', 'none')
# get all show-able folders for the selected library
showable_folders = trans.app.security_agent.get_showable_folders( trans.user,
- roles,
+ current_user_roles,
selected_lib,
actions_to_check,
selected_hidden_folder_ids )
diff -r 4cd66d01aaf0 -r 8916a67cc639 lib/galaxy/web/controllers/root.py
--- a/lib/galaxy/web/controllers/root.py Fri Jan 22 10:49:38 2010 -0500
+++ b/lib/galaxy/web/controllers/root.py Fri Jan 22 11:24:28 2010 -0500
@@ -161,8 +161,8 @@
except:
return "Dataset id '%s' is invalid" %str( id )
if data:
- roles = trans.get_current_user_roles()
- if trans.app.security_agent.can_access_dataset( roles, data.dataset ):
+ current_user_roles = trans.get_current_user_roles()
+ if trans.app.security_agent.can_access_dataset( current_user_roles, data.dataset ):
mime = trans.app.datatypes_registry.get_mimetype_by_extension( data.extension.lower() )
trans.response.set_content_type(mime)
if tofile:
@@ -194,8 +194,8 @@
if data:
child = data.get_child_by_designation( designation )
if child:
- roles = trans.get_current_user_roles()
- if trans.app.security_agent.can_access_dataset( roles, child ):
+ current_user_roles = trans.get_current_user_roles()
+ if trans.app.security_agent.can_access_dataset( current_user_roles, child ):
return self.display( trans, id=child.id, tofile=tofile, toext=toext )
else:
return "You are not privileged to access this dataset."
@@ -211,8 +211,8 @@
if 'authz_method' in kwd:
authz_method = kwd['authz_method']
if data:
- roles = trans.get_current_user_roles()
- if authz_method == 'rbac' and trans.app.security_agent.can_access_dataset( roles, data ):
+ current_user_roles = trans.get_current_user_roles()
+ if authz_method == 'rbac' and trans.app.security_agent.can_access_dataset( current_user_roles, data ):
trans.response.set_content_type( data.get_mime() )
trans.log_event( "Formatted dataset id %s for display at %s" % ( str( id ), display_app ) )
return data.as_display_type( display_app, **kwd )
@@ -266,8 +266,8 @@
return trans.show_error_message( "Problem retrieving dataset." )
if id is not None and data.history.user is not None and data.history.user != trans.user:
return trans.show_error_message( "This instance of a dataset (%s) in a history does not belong to you." % ( data.id ) )
- roles = trans.get_current_user_roles()
- if trans.app.security_agent.can_access_dataset( roles, data.dataset ):
+ current_user_roles = trans.get_current_user_roles()
+ if trans.app.security_agent.can_access_dataset( current_user_roles, data.dataset ):
if data.state == trans.model.Dataset.states.UPLOAD:
return trans.show_error_message( "Please wait until this dataset finishes uploading before attempting to edit its metadata." )
params = util.Params( kwd, sanitize=False )
@@ -333,7 +333,7 @@
elif params.update_roles_button:
if not trans.user:
return trans.show_error_message( "You must be logged in if you want to change permissions." )
- if trans.app.security_agent.can_manage_dataset( roles, data.dataset ):
+ if trans.app.security_agent.can_manage_dataset( current_user_roles, data.dataset ):
permissions = {}
for k, v in trans.app.model.Dataset.permitted_actions.items():
in_roles = params.get( k + '_in', [] )
@@ -358,7 +358,10 @@
ldatatypes = [ dtype_name for dtype_name, dtype_value in trans.app.datatypes_registry.datatypes_by_extension.iteritems() if dtype_value.allow_datatype_change ]
ldatatypes.sort()
trans.log_event( "Opened edit view on dataset %s" % str(id) )
- return trans.fill_template( "/dataset/edit_attributes.mako", data=data, datatypes=ldatatypes )
+ return trans.fill_template( "/dataset/edit_attributes.mako",
+ data=data,
+ datatypes=ldatatypes,
+ current_user_roles=current_user_roles )
else:
return trans.show_error_message( "You do not have permission to edit this dataset's ( id: %s ) information." % str( id ) )
diff -r 4cd66d01aaf0 -r 8916a67cc639 lib/galaxy/web/controllers/tool_runner.py
--- a/lib/galaxy/web/controllers/tool_runner.py Fri Jan 22 10:49:38 2010 -0500
+++ b/lib/galaxy/web/controllers/tool_runner.py Fri Jan 22 11:24:28 2010 -0500
@@ -140,6 +140,18 @@
"""
Precreate datasets for asynchronous uploading.
"""
+ roles = kwd.get( 'roles', False )
+ if roles:
+ # The user associated the DATASET_ACCESS permission on the uploaded datasets with 1 or more roles.
+ # We need to ensure that the roles are legitimately derived from the roles associated with the LIBRARY_ACCESS
+ # permission if the library is not public ( this should always be the case since any ill-legitimate roles
+ # were filtered out of the roles displayed on the upload form. In addition, we need to ensure that the user
+ # did not associated roles that would make the dataset in-accessible by everyone.
+ library_id = trans.app.security.decode_id( kwd.get( 'library_id', '' ) )
+ vars = dict( DATASET_ACCESS_in=roles )
+ permissions, in_roles, error, msg = trans.app.security_agent.check_library_dataset_access( trans, library_id, **vars )
+ if error:
+ return [ 'error', msg ]
permissions = trans.app.security_agent.history_get_default_permissions( trans.history )
def create_dataset( name ):
ud = Bunch( name=name, file_type=None, dbkey=None )
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/admin/center.mako
--- a/templates/admin/center.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/admin/center.mako Fri Jan 22 11:24:28 2010 -0500
@@ -6,7 +6,7 @@
<p>The menu on the left provides the following features</p>
<ul>
- <li><strong>Security</strong>
+ <li><strong>Security</strong> - see the <strong>Data Security and Data Libraries</strong> section below for details
<p/>
<ul>
<li>
@@ -16,14 +16,15 @@
<p/>
<li>
<strong>Manage groups</strong> - provides a view of all groups along with the members of the group and the roles associated with
- each group (both private and non-private roles). Non-private roles include a link to a page that allows you to manage the users
- and groups that are associated with the role. The page also includes a view of the data library datasets that are associated with the
- role and the permissions applied to each dataset.
+ each group (both private and non-private roles). The group names include a link to a page that allows you to manage the users and
+ roles that are associated with the group.
</li>
<p/>
<li>
<strong>Manage roles</strong> - provides a view of all non-private roles along with the role type, and the users and groups that
- are associated with the role.
+ are associated with the role. The role names include a link to a page that allows you to manage the users and groups that are associated
+ with the role. The page also includes a view of the data library datasets that are associated with the role and the permissions applied
+ to each dataset.
</li>
</ul>
</li>
@@ -33,8 +34,21 @@
<ul>
<li>
<strong>Manage data libraries</strong> - Data libraries enable a Galaxy administrator to upload datasets into a data library. Currently,
- only administrators can create data libraries, but permission to perform the following functions on the data library can be granted to
- users (a library item is one of: a data library, a library folder, a library dataset).
+ only administrators can create data libraries.
+ <p/>
+ When a data library is first created, it is considered "public" since it will be displayed in the "Data Libraries" view for any user, even
+ those that are not logged in. The Galaxy administrator can restrict access to a data library by associating roles with the data library's
+ "access library" permission. This permission will conservatively override the [dataset] "access" permission for the data library's contained
+ datasets.
+ <p/>
+ For example, if a data library's "access library" permission is associated with Role1 and the data library contains "public" datasets, the
+ data library will still only be displayed to those users that have Role1. However, if the data library's "access library" permission is
+ associated with both Role1 and Role2 and the data library contains datasets whose [dataset] "access" permission is associated with only Role1,
+ then users that have Role2 will be able to access the library, but will not see those contained datasets whose [dataset] "access" permission
+ is associated with only Role1.
+ <p/>
+ In addition to the "access library" permission, permission to perform the following functions on the data library (and it's contents) can
+ be granted to users (a library item is one of: a data library, a library folder, a library dataset).
<p/>
<ul>
<li><strong>add library item</strong> - Role members can add library items to this data library or folder</li>
@@ -42,10 +56,10 @@
<li><strong>manage library permissions</strong> - Role members can manage permissions applied to this library item</li>
</ul>
<p/>
- The default behavior is for no permissions to be applied to a data library item, but applied permissions are inherited downward, so it is
- important to set desired permissions on a new data library when it is created. When this is done, new folders and datasets added to the
- data library will automatically inherit those permissions. In the same way, permissions can be applied to a folder, which will be
- automatically inherited by all contained datasets and sub-folders.
+ The default behavior is for no permissions to be applied to a data library item, but applied permissions are inherited downward (with the exception
+ of the "access library" permission, which is only available on the data library itself). Because of this, it is important to set desired permissions
+ on a new data library when it is created. When this is done, new folders and datasets added to the data library will automatically inherit those
+ permissions. In the same way, permissions can be applied to a folder, which will be automatically inherited by all contained datasets and sub-folders.
<p/>
The "Data Libraries" menu item allows users to access the datasets in a data library as long as they are not restricted from accessing them.
Importing a library dataset into a history will not make a copy of the dataset, but will be a "pointer" to the dataset on disk. This
@@ -71,7 +85,20 @@
</li>
</ul>
</li>
+ <p/>
+ <li><strong>Forms</strong>
+ <p/>To be completed
+ </li>
+ <p/>
+ <li><strong>Sequencing Requests</strong>
+ <p/>To be completed
+ </li>
+ <p/>
+ <li><strong>Cloud</strong>
+ <p/>To be completed
+ </li>
</ul>
+<p/>
<p><strong>Data Security and Data Libraries</strong></p>
<p/>
<strong>Security</strong> - Data security in Galaxy is a new feature, so familiarize yourself with the details which can be found
@@ -120,9 +147,10 @@
<li>
<strong>access</strong> - users associated with the role can import this dataset into their history for analysis.
<p>
- If no roles with the "access" permission are associated with a dataset, the dataset is "public" and may be accessed by
- anyone. Public data library datasets will be accessible to all users (as well as anyone not logged in during a Galaxy session)
- from the list of data libraries displayed when the "Data Libraries" menu item is selected.
+ If no roles with the "access" permission are associated with a dataset, the dataset is "public" and may be accessed by anyone
+ that can access the data library in which it is contained. See the <strong>Manage data libraries</strong> section above for
+ details. Public datasets contained in public data libraries will be accessible to all users (as well as anyone not logged in
+ during a Galaxy session) from the list of data libraries displayed when the "Data Libraries" menu item is selected.
</p>
<p>
Associating a dataset with a role that includes the "access" permission restricts the set of users that can access it.
@@ -139,11 +167,11 @@
<p>
In order for a user to make a dataset private (i.e., only they can access it), they should associate the dataset with
their private role (the role identical to their Galaxy user name / email address). Associating additional roles that
- include the "access" permission is not possible, since it would render the dataset inaccessible to everyone. To make
- a dataset private to themselves and one or more other users, the user can create a new role and associate the dataset
- with that role, not their "private role". Galaxy makes this easy by telling the user they are about to share a private
- dataset and giving them the option of doing so. If they respond positively, the sharing role is automatically created
- for them.
+ include the "access" permission is not possible, since it would render the dataset inaccessible to everyone.
+ <p>
+ To make a dataset private to themselves and one or more other users, the user can create a new role and associate the dataset
+ with that role, not their "private role". Galaxy makes this easy by telling the user they are about to share a private dataset
+ and giving them the option of doing so. If they respond positively, the sharing role is automatically created for them.
</p>
<p>
Private data (data associated with roles that include the "access" permission) must be made public in order to be used
@@ -156,3 +184,4 @@
</ul>
</li>
</ul>
+<br/>
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/base_panels.mako
--- a/templates/base_panels.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/base_panels.mako Fri Jan 22 11:24:28 2010 -0500
@@ -95,16 +95,33 @@
}
// Make a synchronous request to create the datasets first
var async_datasets;
+ var upload_error = false;
$.ajax( {
async: false,
type: "POST",
url: "${h.url_for(controller='/tool_runner', action='upload_async_create')}",
data: $(this).formSerialize(),
dataType: "json",
- success: function( d, s ) { async_datasets = d.join() }
+ success: function(array_obj, status) {
+ if (array_obj.length > 0) {
+ if (array_obj[0] == 'error') {
+ upload_error = true;
+ upload_form_error(array_obj[1]);
+ } else {
+ async_datasets = array_obj.join();
+ }
+ } else {
+ // ( gvk 1/22/10 ) FIXME: this block is never entered, so there may be a bug somewhere
+ // I've done some debugging like checking to see if array_obj is undefined, but have not
+ // tracked down the behavior that will result in this block being entered. I believe the
+ // intent was to have this block entered if the upload button is clicked on the upload
+ // form but no file was selected.
+ upload_error = true;
+ upload_form_error( 'No data was entered in the upload form. You may choose to upload a file, paste some data directly in the data box, or enter URL(s) to fetch data.' );
+ }
+ }
} );
- if (async_datasets == '') {
- upload_form_error( 'No data was entered in the upload form. You may choose to upload a file, paste some data directly in the data box, or enter URL(s) to fetch from.' );
+ if (upload_error == true) {
return false;
} else {
$(this).find("input[name=async_datasets]").val( async_datasets );
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/dataset/edit_attributes.mako
--- a/templates/dataset/edit_attributes.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/dataset/edit_attributes.mako Fri Jan 22 11:24:28 2010 -0500
@@ -6,7 +6,6 @@
<%def name="stylesheets()">
${h.css( "base", "autocomplete_tagging" )}
</%def>
-<% user_roles = trans.get_current_user_roles() %>
<%def name="javascripts()">
${parent.javascripts()}
@@ -163,9 +162,9 @@
</div>
<p />
-%if trans.app.security_agent.can_manage_dataset( user_roles, data.dataset ):
+%if trans.app.security_agent.can_manage_dataset( current_user_roles, data.dataset ):
<%namespace file="/dataset/security_common.mako" import="render_permission_form" />
- ${render_permission_form( data.dataset, data.get_display_name(), h.url_for( controller='root', action='edit', id=data.id ), user_roles )}
+ ${render_permission_form( data.dataset, data.get_display_name(), h.url_for( controller='root', action='edit', id=data.id ), current_user_roles )}
%elif trans.user:
<div class="toolForm">
<div class="toolFormTitle">View Permissions</div>
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/library/common/browse_library.mako
--- a/templates/library/common/browse_library.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/library/common/browse_library.mako Fri Jan 22 11:24:28 2010 -0500
@@ -16,12 +16,11 @@
<%
if cntrller in [ 'library', 'requests' ]:
- roles = trans.get_current_user_roles()
- can_add = trans.app.security_agent.can_add_library_item( roles, library )
+ can_add = trans.app.security_agent.can_add_library_item( current_user_roles, library )
if can_add:
info_association, inherited = library.get_info_association()
- can_modify = trans.app.security_agent.can_modify_library_item( roles, library )
- can_manage = trans.app.security_agent.can_manage_library_item( roles, library )
+ can_modify = trans.app.security_agent.can_modify_library_item( current_user_roles, library )
+ can_manage = trans.app.security_agent.can_manage_library_item( current_user_roles, library )
elif cntrller in [ 'library_admin', 'requests_admin' ]:
info_association, inherited = library.get_info_association()
@@ -162,8 +161,8 @@
if ldda == library_dataset.library_dataset_dataset_association:
current_version = True
if cntrller in [ 'library', 'requests' ]:
- can_modify_library_dataset = trans.app.security_agent.can_modify_library_item( roles, library_dataset )
- can_manage_library_dataset = trans.app.security_agent.can_manage_library_item( roles, library_dataset )
+ can_modify_library_dataset = trans.app.security_agent.can_modify_library_item( current_user_roles, library_dataset )
+ can_manage_library_dataset = trans.app.security_agent.can_manage_library_item( current_user_roles, library_dataset )
else:
current_version = False
if current_version and ldda.state not in ( 'ok', 'error', 'empty', 'deleted', 'discarded' ):
@@ -191,7 +190,7 @@
<a class="action-button" href="${h.url_for( controller='library_common', action='ldda_display_info', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), id=trans.security.encode_id( ldda.id ) )}">View this dataset's information</a>
%endif
%if cntrller in [ 'library_admin', 'requests_admin' ] or can_manage_library_dataset:
- <a class="action-button" href="${h.url_for( controller='library_common', action='ldda_permissions', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), id=trans.security.encode_id( ldda.id ), permissions=True )}">Edit this dataset's permissions</a>
+ <a class="action-button" href="${h.url_for( controller='library_common', action='ldda_permissions', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), id=trans.security.encode_id( ldda.id ) )}">Edit this dataset's permissions</a>
%endif
%if cntrller in [ 'library_admin', 'requests_admin' ] or can_modify_library_dataset:
<a class="action-button" href="${h.url_for( controller='library_common', action='upload_library_dataset', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), replace_id=trans.security.encode_id( library_dataset.id ) )}">Upload a new version of this dataset</a>
@@ -236,22 +235,22 @@
return ""
my_row = None
if cntrller in [ 'library', 'requests' ]:
- can_access, folder_ids = trans.app.security_agent.check_folder_contents( user, roles, folder )
+ can_access, folder_ids = trans.app.security_agent.check_folder_contents( trans.user, current_user_roles, folder )
if not can_access:
can_show, folder_ids = \
- trans.app.security_agent.show_library_item( user,
- roles,
+ trans.app.security_agent.show_library_item( trans.user,
+ current_user_roles,
folder,
[ trans.app.security_agent.permitted_actions.LIBRARY_ADD,
trans.app.security_agent.permitted_actions.LIBRARY_MODIFY,
trans.app.security_agent.permitted_actions.LIBRARY_MANAGE ] )
if not can_show:
return ""
- can_add = trans.app.security_agent.can_add_library_item( roles, folder )
+ can_add = trans.app.security_agent.can_add_library_item( current_user_roles, folder )
if can_add:
info_association, inherited = folder.get_info_association( restrict=True )
- can_modify = trans.app.security_agent.can_modify_library_item( roles, folder )
- can_manage = trans.app.security_agent.can_manage_library_item( roles, folder )
+ can_modify = trans.app.security_agent.can_modify_library_item( current_user_roles, folder )
+ can_manage = trans.app.security_agent.can_manage_library_item( current_user_roles, folder )
elif cntrller in [ 'library_admin', 'requests_admin' ]:
info_association, inherited = folder.get_info_association( restrict=True )
%>
@@ -311,7 +310,7 @@
%for library_dataset in folder.active_library_datasets:
<%
ldda = library_dataset.library_dataset_dataset_association
- can_access = trans.app.security_agent.can_access_dataset( roles, ldda.dataset )
+ can_access = trans.app.security_agent.can_access_dataset( current_user_roles, ldda.dataset )
selected = created_ldda_ids and str( ldda.id ) in created_ldda_ids
%>
%if can_access:
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/library/common/common.mako
--- a/templates/library/common/common.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/library/common/common.mako Fri Jan 22 11:24:28 2010 -0500
@@ -15,14 +15,14 @@
library_item_type = 'library_dataset_dataset_association'
library_item_desc = 'library dataset'
if cntrller == 'library':
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
%>
%if widgets:
<p/>
<div class="toolForm">
<div class="toolFormTitle">Other information about ${library_item_desc} ${library_item.name}</div>
<div class="toolFormBody">
- %if editable and ( cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, library_item ) ):
+ %if editable and ( cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, library_item ) ):
<form name="edit_info" action="${h.url_for( controller='library_common', action='edit_template_info', cntrller=cntrller, library_id=library_id, response_action=response_action, num_widgets=len( widgets ) )}" method="post">
<input type="hidden" name="library_item_id" value="${trans.security.encode_id( library_item.id )}"/>
<input type="hidden" name="library_item_type" value="${library_item_type}"/>
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/library/common/folder_info.mako
--- a/templates/library/common/folder_info.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/library/common/folder_info.mako Fri Jan 22 11:24:28 2010 -0500
@@ -2,11 +2,6 @@
<%namespace file="/message.mako" import="render_msg" />
<%namespace file="/library/common/common.mako" import="render_template_info" />
-<%
- if cntrller != 'library_admin':
- roles = trans.get_current_user_roles()
-%>
-
<br/><br/>
<ul class="manage-table-actions">
<li>
@@ -21,7 +16,7 @@
<div class="toolForm">
<div class="toolFormTitle">Edit folder name and description</div>
<div class="toolFormBody">
- %if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, folder ):
+ %if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, folder ):
<form name="folder" action="${h.url_for( controller='library_common', action='folder_info', cntrller=cntrller, id=trans.security.encode_id( folder.id ), library_id=library_id )}" method="post" >
<div class="form-row">
<label>Name:</label>
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/library/common/folder_permissions.mako
--- a/templates/library/common/folder_permissions.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/library/common/folder_permissions.mako Fri Jan 22 11:24:28 2010 -0500
@@ -13,9 +13,7 @@
${render_msg( msg, messagetype )}
%endif
-<% roles = trans.get_current_user_roles() %>
-
-%if cntrller=='library_admin' or trans.app.security_agent.can_manage_library_item( roles, folder ):
+%if cntrller in [ 'library_admin', 'requests_admin' ] or trans.app.security_agent.can_manage_library_item( current_user_roles, folder ):
## LIBRARY_ACCESS is a special permission that is set only at the library level.
${render_permission_form( folder, folder.name, h.url_for( controller='library_common', action='folder_permissions', cntrller=cntrller, id=trans.security.encode_id( folder.id ), library_id=library_id ), roles, do_not_render=[ 'LIBRARY_ACCESS' ] )}
%endif
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/library/common/ldda_edit_info.mako
--- a/templates/library/common/ldda_edit_info.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/library/common/ldda_edit_info.mako Fri Jan 22 11:24:28 2010 -0500
@@ -20,11 +20,6 @@
${h.css( "autocomplete_tagging" )}
</%def>
-<%
- if cntrller == 'library':
- roles = trans.get_current_user_roles()
-%>
-
%if ldda == ldda.library_dataset.library_dataset_dataset_association:
<b><i>This is the latest version of this library dataset</i></b>
%else:
@@ -54,7 +49,7 @@
</select>
</%def>
-%if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, ldda.library_dataset ):
+%if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, ldda.library_dataset ):
<div class="toolForm">
<div class="toolFormTitle">Edit attributes of ${ldda.name}</div>
<div class="toolFormBody">
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/library/common/ldda_info.mako
--- a/templates/library/common/ldda_info.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/library/common/ldda_info.mako Fri Jan 22 11:24:28 2010 -0500
@@ -8,8 +8,6 @@
current_version = True
else:
current_version = False
- if cntrller == 'library':
- roles = trans.get_current_user_roles()
%>
%if current_version:
@@ -42,15 +40,15 @@
%if not library.deleted and not ldda.library_dataset.folder.deleted and not ldda.deleted:
<a id="dataset-${ldda.id}-popup" class="popup-arrow" style="display: none;">▼</a>
<div popupmenu="dataset-${ldda.id}-popup">
- %if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, ldda.library_dataset ):
+ %if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, ldda.library_dataset ):
<a class="action-button" href="${h.url_for( controller='library_common', action='ldda_edit_info', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( ldda.library_dataset.folder.id ), id=trans.security.encode_id( ldda.id ) )}">Edit this dataset's information</a>
%else:
<a class="action-button" href="${h.url_for( controller='library_common', action='ldda_display_info', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( ldda.library_dataset.folder.id ), id=trans.security.encode_id( ldda.id ) )}">View this dataset's information</a>
%endif
- %if cntrller=='library_admin' or trans.app.security_agent.can_manage_dataset( roles, ldda.dataset ) and trans.app.security_agent.can_manage_library_item( roles, ldda.library_dataset ):
+ %if cntrller=='library_admin' or trans.app.security_agent.can_manage_dataset( current_user_roles, ldda.dataset ) and trans.app.security_agent.can_manage_library_item( current_user_roles, ldda.library_dataset ):
<a class="action-button" href="${h.url_for( controller='library_common', action='ldda_permissions', library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( ldda.library_dataset.folder.id ), id=trans.security.encode_id( ldda.id ) )}">Edit this dataset's permissions</a>
%endif
- %if current_version and ( cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, ldda.library_dataset ) ):
+ %if current_version and ( cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, ldda.library_dataset ) ):
<a class="action-button" href="${h.url_for( controller='library_common', action='upload_library_dataset', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( ldda.library_dataset.folder.id ), replace_id=trans.security.encode_id( ldda.library_dataset.id ) )}">Upload a new version of this dataset</a>
%endif
%if cntrller=='library' and ldda.has_data:
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/library/common/ldda_permissions.mako
--- a/templates/library/common/ldda_permissions.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/library/common/ldda_permissions.mako Fri Jan 22 11:24:28 2010 -0500
@@ -3,11 +3,6 @@
<%namespace file="/dataset/security_common.mako" import="render_permission_form" />
<%
- from galaxy import util
-
- roles = trans.sa_session.query( trans.app.model.Role ) \
- .filter( trans.app.model.Role.table.c.deleted==False ) \
- .order_by( trans.app.model.Role.table.c.name )
if len( lddas ) > 1:
name_str = '%d selected datasets' % len( lddas )
else:
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/library/common/library_dataset_info.mako
--- a/templates/library/common/library_dataset_info.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/library/common/library_dataset_info.mako Fri Jan 22 11:24:28 2010 -0500
@@ -2,11 +2,6 @@
<%namespace file="/message.mako" import="render_msg" />
<%namespace file="/library/common/common.mako" import="render_template_info" />
-<%
- if cntrller=='library':
- roles = trans.get_current_user_roles()
-%>
-
%if library_dataset == library_dataset.library_dataset_dataset_association.library_dataset:
<b><i>This is the latest version of this library dataset</i></b>
%else:
@@ -24,7 +19,7 @@
${render_msg( msg, messagetype )}
%endif
-%if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( roles, library_dataset ):
+%if cntrller=='library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, library_dataset ):
<div class="toolForm">
<div class="toolFormTitle">Edit attributes of ${library_dataset.name}</div>
<div class="toolFormBody">
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/library/common/library_dataset_permissions.mako
--- a/templates/library/common/library_dataset_permissions.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/library/common/library_dataset_permissions.mako Fri Jan 22 11:24:28 2010 -0500
@@ -2,11 +2,6 @@
<%namespace file="/message.mako" import="render_msg" />
<%namespace file="/dataset/security_common.mako" import="render_permission_form" />>
-<%
- if cntrller == 'library':
- roles = trans.get_current_user_roles()
-%>
-
%if library_dataset == library_dataset.library_dataset_dataset_association.library_dataset:
<b><i>This is the latest version of this library dataset</i></b>
%else:
@@ -24,12 +19,7 @@
${render_msg( msg, messagetype )}
%endif
-%if trans.app.security_agent.can_manage_library_item( user_roles, library_dataset ):
- <%
- roles = trans.sa_session.query( trans.app.model.Role ) \
- .filter( trans.app.model.Role.table.c.deleted==False ) \
- .order_by( trans.app.model.Role.table.c.name )
- %>
+%if cntrller == 'library_admin' or trans.app.security_agent.can_manage_library_item( current_user_roles, library_dataset ):
## LIBRARY_ACCESS is a special permission that is set only at the library level.
${render_permission_form( library_dataset, library_dataset.name, h.url_for( controller='library_common', action='library_dataset_permissions', cntrller=cntrller, id=trans.security.encode_id( library_dataset.id ), library_id=library_id ), roles, do_not_render=[ 'LIBRARY_ACCESS' ] )}
%endif
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/library/common/library_info.mako
--- a/templates/library/common/library_info.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/library/common/library_info.mako Fri Jan 22 11:24:28 2010 -0500
@@ -2,11 +2,6 @@
<%namespace file="/message.mako" import="render_msg" />
<%namespace file="/library/common/common.mako" import="render_template_info" />
-<%
- if not trans.user_is_admin():
- roles = trans.get_current_user_roles()
-%>
-
<br/><br/>
<ul class="manage-table-actions">
<li>
@@ -18,7 +13,7 @@
${render_msg( msg, messagetype )}
%endif
-%if cntrller == 'library_admin' or trans.app.security_agent.can_modify_library_item( roles, library ):
+%if cntrller == 'library_admin' or trans.app.security_agent.can_modify_library_item( current_user_roles, library ):
<div class="toolForm">
<div class="toolFormTitle">Change library name and description</div>
<div class="toolFormBody">
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/library/common/library_permissions.mako
--- a/templates/library/common/library_permissions.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/library/common/library_permissions.mako Fri Jan 22 11:24:28 2010 -0500
@@ -2,11 +2,6 @@
<%namespace file="/message.mako" import="render_msg" />
<%namespace file="/dataset/security_common.mako" import="render_permission_form" />
-<%
- if not trans.user_is_admin():
- roles = trans.get_current_user_roles()
-%>
-
<br/><br/>
<ul class="manage-table-actions">
<li>
@@ -18,11 +13,6 @@
${render_msg( msg, messagetype )}
%endif
-%if trans.user_is_admin or trans.app.security_agent.can_manage_library_item( user_roles, library ):
- <%
- roles = trans.sa_session.query( trans.app.model.Role ) \
- .filter( trans.app.model.Role.table.c.deleted==False ) \
- .order_by( trans.app.model.Role.table.c.name )
- %>
+%if cntrller == 'library_admin' or trans.app.security_agent.can_manage_library_item( current_user_roles, library ):
${render_permission_form( library, library.name, h.url_for( controller='library_common', action='library_permissions', cntrller=cntrller, id=trans.security.encode_id( library.id ), cntrller=cntrller ), roles )}
%endif
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/mobile/history/detail.mako
--- a/templates/mobile/history/detail.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/mobile/history/detail.mako Fri Jan 22 11:24:28 2010 -0500
@@ -36,8 +36,8 @@
<div class="secondary">
## Body for history items, extra info and actions, data "peek"
- <% roles = trans.get_current_user_roles() %>
- %if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
+ <% current_user_roles = trans.get_current_user_roles() %>
+ %if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( current_user_roles, data.dataset ):
<div>You do not have permission to view this dataset.</div>
%elif data_state == "queued":
<div>Job is waiting to run</div>
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/mobile/manage_library.mako
--- a/templates/mobile/manage_library.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/mobile/manage_library.mako Fri Jan 22 11:24:28 2010 -0500
@@ -3,13 +3,13 @@
<%namespace file="/dataset/security_common.mako" import="render_permission_form" />
<%namespace file="/library/common/common.mako" import="render_template_info" />
-<% roles = trans.get_current_user_roles() %>
+<% current_user_roles = trans.get_current_user_roles() %>
%if msg:
${render_msg( msg, messagetype )}
%endif
-%if trans.app.security_agent.can_modify_library_item( roles, library ):
+%if trans.app.security_agent.can_modify_library_item( current_user_roles, library ):
<div class="toolForm">
<div class="toolFormTitle">Change library name and description</div>
<div class="toolFormBody">
@@ -49,12 +49,8 @@
</div>
</div>
%endif
-%if trans.app.security_agent.can_manage_library_item( roles, library ):
- <%
- roles = trans.sa_session.query( trans.app.model.Role ) \
- .filter( trans.app.model.Role.table.c.deleted==False ) \
- .order_by( trans.app.model.Role.table.c.name )
- %>
+%if trans.app.security_agent.can_manage_library_item( current_user_roles, library ):
+ <% roles = library.get_legitimate_roles( trans ) %>
${render_permission_form( library, library.name, h.url_for( controller='library_common', cntrller='mobile', action='library_permissions', id=trans.security.encode_id( library.id ) ), roles )}
%endif
diff -r 4cd66d01aaf0 -r 8916a67cc639 templates/root/history_common.mako
--- a/templates/root/history_common.mako Fri Jan 22 10:49:38 2010 -0500
+++ b/templates/root/history_common.mako Fri Jan 22 11:24:28 2010 -0500
@@ -7,9 +7,9 @@
data_state = "queued"
else:
data_state = data.state
- roles = trans.get_current_user_roles()
+ current_user_roles = trans.get_current_user_roles()
%>
- %if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
+ %if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( current_user_roles, data.dataset ):
<div class="historyItemWrapper historyItem historyItem-${data_state} historyItem-noPermission" id="historyItem-${data.id}">
%else:
<div class="historyItemWrapper historyItem historyItem-${data_state}" id="historyItem-${data.id}">
@@ -49,7 +49,7 @@
## Body for history items, extra info and actions, data "peek"
<div id="info${data.id}" class="historyItemBody">
- %if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( roles, data.dataset ):
+ %if not trans.user_is_admin() and not trans.app.security_agent.can_access_dataset( current_user_roles, data.dataset ):
<div>You do not have permission to view this dataset.</div>
%elif data_state == "upload":
<div>Dataset is uploading</div>
diff -r 4cd66d01aaf0 -r 8916a67cc639 test/base/twilltestcase.py
--- a/test/base/twilltestcase.py Fri Jan 22 10:49:38 2010 -0500
+++ b/test/base/twilltestcase.py Fri Jan 22 11:24:28 2010 -0500
@@ -1454,7 +1454,7 @@
tc.fv( "1", "dbkey", dbkey )
tc.fv( "1", "message", message.replace( '+', ' ' ) )
for role_id in roles:
- tc.fv( "1", "roles", role_id ) # form field 7 is the select list named out_groups, note the buttons...
+ tc.fv( "1", "roles", role_id )
# Add template field contents, if any...
if template_field_name1:
tc.fv( "1", template_field_name1, template_field_contents1 )
@@ -1463,7 +1463,6 @@
check_str = "Added 1 datasets to the library '%s' (each is selected)." % folder_name
else:
check_str = "Added 1 datasets to the folder '%s' (each is selected)." % folder_name
- data = self.last_page()
self.library_wait( library_id )
self.home()
def set_library_dataset_permissions( self, cntrller, library_id, folder_id, ldda_id, ldda_name, role_ids_str, permissions_in, permissions_out ):
diff -r 4cd66d01aaf0 -r 8916a67cc639 test/functional/test_security_and_libraries.py
--- a/test/functional/test_security_and_libraries.py Fri Jan 22 10:49:38 2010 -0500
+++ b/test/functional/test_security_and_libraries.py Fri Jan 22 11:24:28 2010 -0500
@@ -243,6 +243,14 @@
global regular_user3
regular_user3 = sa_session.query( galaxy.model.User ).filter( galaxy.model.User.table.c.email==email ).first()
assert regular_user3 is not None, 'Problem retrieving user with email "%s" from the database' % email
+ global regular_user3_private_role
+ regular_user3_private_role = None
+ for role in regular_user3.all_roles():
+ if role.name == regular_user3.email and role.description == 'Private Role for %s' % regular_user3.email:
+ regular_user3_private_role = role
+ break
+ if not regular_user3_private_role:
+ raise AssertionError( "Private role not found for user '%s'" % regular_user3.email )
# Make sure DefaultUserPermissions were created
if not regular_user3.default_permissions:
raise AssertionError( 'No DefaultUserPermissions were created for user %s when the admin created the account' % email )
@@ -510,16 +518,32 @@
galaxy.model.Library.table.c.deleted==False ) ) \
.first()
assert library_one is not None, 'Problem retrieving library named "%s" from the database' % name
- # Set permissions on the library, sort for later testing
+ # Make sure library_one is public
+ assert 'access library' not in [ a.action for a in library_one.actions ], 'Library %s is not public when first created' % library_one.name
+ # Set permissions on the library, sort for later testing.
permissions_in = [ k for k, v in galaxy.model.Library.permitted_actions.items() ]
permissions_out = []
- # Role one members are: admin_user, regular_user1, regular_user3. Each of these users will be permitted to
- # LIBRARY_ADD, LIBRARY_MODIFY, LIBRARY_MANAGE for library items.
+ # Role one members are: admin_user, regular_user1, regular_user3. Each of these users will be permitted for
+ # LIBRARY_ACCESS, LIBRARY_ADD, LIBRARY_MODIFY, LIBRARY_MANAGE on this library and it's contents.
self.library_permissions( self.security.encode_id( library_one.id ),
library_one.name,
str( role_one.id ),
permissions_in,
- permissions_out )
+ permissions_out )
+ # Make sure the library is accessible by admin_user
+ self.visit_url( '%s/library/browse_libraries' % self.url )
+ self.check_page_for_string( library_one.name )
+ # Make sure the library is not accessible by regular_user2 since regular_user2 does not have Role1.
+ self.logout()
+ self.login( email=regular_user2.email )
+ self.visit_url( '%s/library/browse_libraries' % self.url )
+ try:
+ self.check_page_for_string( library_one.name )
+ raise AssertionError, 'Library %s is accessible by %s when it should be restricted' % ( library_one.name, regular_user2.email )
+ except:
+ pass
+ self.logout()
+ self.login( email=admin_user.email )
# Rename the library
rename = "Library One's been Renamed"
redescription = "This is Library One's Re-described"
@@ -593,7 +617,11 @@
def test_085_add_public_dataset_to_root_folder( self ):
"""Testing adding a public dataset to the root folder, making sure library template is inherited"""
# Logged in as admin_user
- actions = [ v.action for k, v in galaxy.model.Library.permitted_actions.items() ]
+ #actions = [ v.action for k, v in galaxy.model.Library.permitted_actions.items() ]
+ actions = []
+ for k, v in galaxy.model.Library.permitted_actions.items():
+ if k != 'LIBRARY_ACCESS':
+ actions.append( v.action )
actions.sort()
message = 'Testing adding a public dataset to the root folder'
# The form_one template should be inherited to the library dataset upload form.
@@ -625,8 +653,8 @@
.all()
ldda_permissions = [ lddap_obj.action for lddap_obj in ldda_permissions ]
ldda_permissions.sort()
- assert actions == ldda_permissions, "Permissions for ldda id %s not correctly inherited from library %s" \
- % ( ldda_one.id, library_one.name )
+ assert actions == ldda_permissions, "Permissions (%s) for ldda id %s not correctly inherited from library %s which has permissions (%s)." \
+ % ( str( ldda_permissions ), ldda_one.id, library_one.name, str( actions ) )
# Make sure DatasetPermissions are correct - default is 'manage permissions'
if len( ldda_one.dataset.actions ) > 1:
raise AssertionError( '%d DatasetPermissionss were created for dataset id %d when it was created ( should have been 1 )' \
@@ -640,15 +668,56 @@
self.visit_url( "%s/library_common/ldda_edit_info?cntrller=library_admin&library_id=%s&folder_id=%s&id=%s" % \
( self.url, self.security.encode_id( library_one.id ), self.security.encode_id( library_one.root_folder.id ), self.security.encode_id( ldda_one.id ) ) )
self.check_page_for_string( template_contents )
- # Make sure other users can access the dataset from the Libraries view
+ # Make sure only users that have Role1 can access library_one even though it now contains a public dataset
self.logout()
+ # regular_user2 does not have Role1
self.login( email=regular_user2.email )
- self.home()
- self.visit_url( '%s/library_common/browse_library?cntrller=library_admin&id=%s' % ( self.url, self.security.encode_id( library_one.id ) ) )
- self.check_page_for_string( "1.bed" )
+ self.visit_url( '%s/library/browse_libraries' % self.url )
+ try:
+ self.check_page_for_string( library_one.name )
+ raise AssertionError, 'Library %s is accessible by %s when it should be restricted' % ( library_one.name, regular_user2.email )
+ except:
+ pass
self.logout()
self.login( email=admin_user.email )
self.home()
+ # Make sure only legitimate roles are displayed on the permissions form for the public dataset.
+ # Legitimate roles are as follows:
+ # 'Role One' since the LIBRARY_ACCESS permission is associated with Role One. # Role one members are: admin_user, regular_user1, regular_user3.
+ # 'test(a)bx.psu.edu' ( admin_user's private role ) since admin_user has Role One
+ # 'Role Two' since admin_user has Role Two
+ # 'Role Three' since admin_user has Role Three
+ # 'test1(a)bx.psu.edu' ( regular_user1's private role ) since regular_user1 has Role One
+ # 'test3(a)bx.psu.edu' ( regular_user3's private role ) since regular_user3 has Role One
+ library_id = self.security.encode_id( library_one.id )
+ folder_id = self.security.encode_id( library_one.root_folder.id )
+ id = self.security.encode_id( ldda_one.id )
+ self.visit_url( '%s/library_common/ldda_permissions?cntrller=library_admin&library_id=%s&folder_id=%s&id=%s' % \
+ ( self.url, library_id, folder_id, id ) )
+ self.check_page_for_string( role_one.name )
+ self.check_page_for_string( admin_user_private_role.name )
+ self.check_page_for_string( role_two.name )
+ self.check_page_for_string( role_three.name )
+ self.check_page_for_string( regular_user1_private_role.name )
+ self.check_page_for_string( regular_user3_private_role.name )
+ try:
+ self.check_page_for_string( regular_user2_private_role.name )
+ raise AssertionError, "Role (%s) incorrectly displayed on permission form for library dataset (%s)." % \
+ ( regular_user2_private_role.name, ldda_one.name )
+ except:
+ pass
+ # Even though the dataset is public, only users with Role1 should be able to see the library_one
+ # from the Data Libraries view. Role one members are: admin_user, regular_user1, regular_user3.
+ self.logout()
+ self.login( email=regular_user1.email )
+ self.visit_url( '%s/library/browse_libraries' % self.url )
+ self.check_page_for_string( library_one.name )
+ self.logout()
+ self.login( email=regular_user2.email )
+ self.visit_url( '%s/library/browse_libraries' % self.url )
+ self.check_page_for_string( "You are not authorized to access any libraries" )
+ self.logout()
+ self.login( email=admin_user.email )
def test_090_add_new_folder_to_root_folder( self ):
"""Testing adding a folder to a library root folder"""
# logged in as admin_user
@@ -696,7 +765,11 @@
# logged in as admin_user
name = "Folder One's Subfolder"
description = "This is the Folder One's subfolder"
- self.add_folder( 'library_admin', self.security.encode_id( library_one.id ), self.security.encode_id( folder_one.id ), name=name, description=description )
+ self.add_folder( 'library_admin',
+ self.security.encode_id( library_one.id ),
+ self.security.encode_id( folder_one.id ),
+ name=name,
+ description=description )
global subfolder_one
subfolder_one = sa_session.query( galaxy.model.LibraryFolder ) \
.filter( and_( galaxy.model.LibraryFolder.table.c.parent_id==folder_one.id,
@@ -728,6 +801,18 @@
tc.submit( 'edit_info_button' )
self.check_page_for_string( 'The information has been updated.' )
self.check_page_for_string( template_contents )
+ # Make sure no roles except Role1 are displayed on the permissions form for the sub-folder.
+ library_id = self.security.encode_id( library_one.id )
+ id = self.security.encode_id( subfolder_one.id )
+ self.visit_url( '%s/library_common/folder_permissions?cntrller=library_admin&id=%s&library_id=%s' % \
+ ( self.url, id, library_id ) )
+ self.check_page_for_string( role_one.name )
+ try:
+ self.check_page_for_string( role_two.name )
+ raise AssertionError, "Role (%s) incorrectly displayed on permission form for library dataset (%s)." % \
+ ( role_two.name, ldda_one.name )
+ except:
+ pass
def test_100_add_2nd_new_folder_to_root_folder( self ):
"""Testing adding a 2nd folder to a library root folder"""
# logged in as admin_user
@@ -762,7 +847,11 @@
def test_105_add_public_dataset_to_root_folders_2nd_subfolder( self ):
"""Testing adding a public dataset to the root folder's 2nd sub-folder"""
# Logged in as admin_user
- actions = [ v.action for k, v in galaxy.model.Library.permitted_actions.items() ]
+ #actions = [ v.action for k, v in galaxy.model.Library.permitted_actions.items() ]
+ actions = []
+ for k, v in galaxy.model.Library.permitted_actions.items():
+ if k != 'LIBRARY_ACCESS':
+ actions.append( v.action )
actions.sort()
message = "Testing adding a public dataset to the folder named %s" % folder_two.name
# The form_one template should be inherited to the library dataset upload form.
@@ -796,7 +885,11 @@
def test_110_add_2nd_public_dataset_to_root_folders_2nd_subfolder( self ):
"""Testing adding a 2nd public dataset to the root folder's 2nd sub-folder"""
# Logged in as admin_user
- actions = [ v.action for k, v in galaxy.model.Library.permitted_actions.items() ]
+ #actions = [ v.action for k, v in galaxy.model.Library.permitted_actions.items() ]
+ actions = []
+ for k, v in galaxy.model.Library.permitted_actions.items():
+ if k != 'LIBRARY_ACCESS':
+ actions.append( v.action )
actions.sort()
message = "Testing adding a 2nd public dataset to the folder named %s" % folder_two.name
# The form_one template should be inherited to the library dataset upload form.
@@ -830,6 +923,9 @@
def test_115_add_dataset_with_private_role_restriction_to_folder( self ):
"""Testing adding a dataset with a private role restriction to a folder"""
# Logged in as admin_user
+ #
+ # Keep in mind that # LIBRARY_ACCESS = "Role One" on the whole library
+ #
# Add a dataset restricted by the following:
# DATASET_MANAGE_PERMISSIONS = "test(a)bx.psu.edu" via DefaultUserPermissions
# DATASET_ACCESS = "regular_user1" private role via this test method
@@ -877,7 +973,20 @@
def test_120_accessing_dataset_with_private_role_restriction( self ):
"""Testing accessing a dataset with a private role restriction"""
# Logged in as admin_user
- # admin_user should not be able to see 2.bed from the analysis view's access libraries
+ #
+ # Keep in mind that # LIBRARY_ACCESS = "Role One" on the whole library
+ # Role one members are: admin_user, regular_user1, regular_user3. Each of these users will be permitted for
+ # LIBRARY_ACCESS, LIBRARY_ADD, LIBRARY_MODIFY, LIBRARY_MANAGE on this library and it's contents.
+ #
+ # Legitimate roles displayed on the permission form are as follows:
+ # 'Role One' since the LIBRARY_ACCESS permission is associated with Role One. # Role one members are: admin_user, regular_user1, regular_user3.
+ # 'test(a)bx.psu.edu' ( admin_user's private role ) since admin_user has Role One
+ # 'Role Two' since admin_user has Role Two
+ # 'Role Three' since admin_user has Role Three
+ # 'test1(a)bx.psu.edu' ( regular_user1's private role ) since regular_user1 has Role One
+ # 'test3(a)bx.psu.edu' ( regular_user3's private role ) since regular_user3 has Role One
+ #
+ # admin_user should not be able to see 4.bed from the analysis view's access libraries
self.home()
self.visit_url( '%s/library_common/browse_library?cntrller=library&id=%s' % ( self.url, self.security.encode_id( library_one.id ) ) )
try:
@@ -901,23 +1010,15 @@
self.check_page_for_string( folder_one.name )
self.check_page_for_string( '4.bed' )
self.logout()
- # regular_user2 should not be able to see 1.bed from the analysis view's access librarys
+ # regular_user2 should not be to see the library since they do not have
+ # Role One which is associated with the LIBRARY_ACCESS permission
self.login( email='test2(a)bx.psu.edu' )
- try:
- self.check_page_for_string( folder_one.name )
- raise AssertionError( '%s can see library folder %s when it contains only datasets restricted by role %s' \
- % ( regular_user2.email, folder_one.name, regular_user1_private_role.description ) )
- except:
- pass
- try:
- self.check_page_for_string( '4.bed' )
- raise AssertionError( '%s can see dataset 4.bed in library folder %s when it was restricted by role %s' \
- % ( regular_user2.email, folder_one.name, regular_user1_private_role.description ) )
- except:
- pass
+ self.visit_url( '%s/library/browse_libraries' % self.url )
+ self.check_page_for_string( "You are not authorized to access any libraries" )
self.logout()
- # regular_user3 should not be able to see 2.bed from the analysis view's access librarys
+ # regular_user3 should not be able to see 4.bed from the analysis view's access librarys
self.login( email='test3(a)bx.psu.edu' )
+ self.visit_url( '%s/library_common/browse_library?cntrller=library&id=%s' % ( self.url, self.security.encode_id( library_one.id ) ) )
try:
self.check_page_for_string( folder_one.name )
raise AssertionError( '%s can see library folder %s when it contains only datasets restricted by role %s' \
@@ -929,16 +1030,18 @@
raise AssertionError( '%s can see dataset 4.bed in library folder %s when it was restricted by role %s' \
% ( regular_user3.email, folder_one.name, regular_user1_private_role.description ) )
except:
- pass # This is the behavior we want
+ pass
self.logout()
self.login( email=admin_user.email )
self.home()
def test_125_change_dataset_access_permission( self ):
"""Testing changing the access permission on a dataset with a private role restriction"""
# Logged in as admin_user
- # We need admin_user to be able to access 2.bed
- permissions_in = [ k for k, v in galaxy.model.Dataset.permitted_actions.items() ] + \
- [ k for k, v in galaxy.model.Library.permitted_actions.items() ]
+ # We need admin_user to be able to access 4.bed
+ permissions_in = [ k for k, v in galaxy.model.Dataset.permitted_actions.items() ]
+ for k, v in galaxy.model.Library.permitted_actions.items():
+ if k != 'LIBRARY_ACCESS':
+ permissions_in.append( k )
permissions_out = []
role_ids_str = '%s,%s' % ( str( role_one.id ), str( admin_user_private_role.id ) )
self.set_library_dataset_permissions( 'library_admin',
@@ -960,6 +1063,22 @@
# Add a dataset restricted by role_two, which is currently associated as follows:
# groups: group_two
# users: test(a)bx.psu.edu, test1(a)bx.psu.edu via group_two
+ #
+ # We first need to make library_one public
+ permissions_in = []
+ for k, v in galaxy.model.Library.permitted_actions.items():
+ if k != 'LIBRARY_ACCESS':
+ permissions_in.append( k )
+ permissions_out = []
+ # Role one members are: admin_user, regular_user1, regular_user3. Each of these users will now be permitted for
+ # LIBRARY_ADD, LIBRARY_MODIFY, LIBRARY_MANAGE on this library and it's contents. The library will be public from
+ # this point on.
+ self.library_permissions( self.security.encode_id( library_one.id ),
+ library_one.name,
+ str( role_one.id ),
+ permissions_in,
+ permissions_out )
+ sa_session.refresh( library_one )
message = 'Testing adding a dataset with a role that is associated with a group and users'
# The form_one template should be inherited to the library dataset upload form.
template_contents = "%s contents for %s 5.bed" % ( form_one_field_label, folder_one.name )
diff -r 4cd66d01aaf0 -r 8916a67cc639 test/functional/test_toolbox.py
--- a/test/functional/test_toolbox.py Fri Jan 22 10:49:38 2010 -0500
+++ b/test/functional/test_toolbox.py Fri Jan 22 11:24:28 2010 -0500
@@ -69,6 +69,7 @@
name, file, sort = output_tuple
# Get the correct hid
elem = data_list[ elem_index ]
+ self.assertTrue( elem )
elem_hid = elem.get( 'hid' )
elem_index += 1
self.verify_dataset_correctness( file, hid=elem_hid, maxseconds=testdef.maxseconds, sort=sort )
1
0
22 Jan '10
details: http://www.bx.psu.edu/hg/galaxy/rev/4cd66d01aaf0
changeset: 3256:4cd66d01aaf0
user: Kelly Vincent <kpvincent(a)bx.psu.edu>
date: Fri Jan 22 10:49:38 2010 -0500
description:
Removed SOLiD option from BWA, cleaned up Bowtie and BWA wrapper interfaces, and changed name of BWA index loc file
diffstat:
buildbot_setup.sh | 3 +-
test-data/bwa_phiX_sanger.fastq | 4 -
test-data/bwa_phiX_sanger_f.fastq | 4 -
test-data/bwa_phiX_sanger_r.fastq | 4 -
test-data/bwa_sanger.fastq | 76 ---
test-data/bwa_sanger_f.fastq | 76 ---
test-data/bwa_sanger_r.fastq | 76 ---
test-data/bwa_solid.fastq | 576 -----------------------------
test-data/bwa_solid_f.fastq | 192 ---------
test-data/bwa_solid_r.fastq | 192 ---------
test-data/bwa_wrapper_in0.fastq | 576 -----------------------------
test-data/bwa_wrapper_in2.fastq | 580 +-----------------------------
test-data/bwa_wrapper_in3.fastq | 196 +---------
test-data/bwa_wrapper_in4.fastq | 192 ---------
test-data/bwa_wrapper_in5.fastq | 4 -
test-data/bwa_wrapper_in6.fastq | 4 -
test-data/bwa_wrapper_out0.sam | 1 -
test-data/bwa_wrapper_out0b.sam | 144 -------
test-data/bwa_wrapper_out1.sam | 145 +-------
test-data/bwa_wrapper_out2.sam | 97 +----
test-data/bwa_wrapper_out3.sam | 3 +-
test-data/bwa_wrapper_out4.sam | 2 -
tool-data/bwa_index.loc.sample | 29 +
tools/sr_mapping/bowtie_color_wrapper.xml | 149 ++++--
tools/sr_mapping/bowtie_wrapper.py | 10 +-
tools/sr_mapping/bowtie_wrapper.xml | 145 ++++--
tools/sr_mapping/bwa_wrapper.py | 196 +++++----
tools/sr_mapping/bwa_wrapper.xml | 353 ++++++-----------
28 files changed, 470 insertions(+), 3559 deletions(-)
diffs (truncated from 4465 to 3000 lines):
diff -r ea652508497a -r 4cd66d01aaf0 buildbot_setup.sh
--- a/buildbot_setup.sh Fri Jan 22 08:47:05 2010 -0500
+++ b/buildbot_setup.sh Fri Jan 22 10:49:38 2010 -0500
@@ -21,6 +21,7 @@
/depot/data2/galaxy/blastdb.loc
/depot/data2/galaxy/bowtie_indices.loc
/depot/data2/galaxy/bowtie_indices_color.loc
+/depot/data2/galaxy/bwa_index.loc
/depot/data2/galaxy/encode_datasets.loc
/galaxy/home/universe/encode_feature_partitions
/depot/data2/galaxy/lastz_seqs.loc
@@ -32,8 +33,6 @@
/depot/data2/galaxy/quality_scores.loc
/depot/data2/galaxy/regions.loc
/depot/data2/galaxy/sam_fa_indices.loc
-/depot/data2/galaxy/sequence_index_base.loc
-/depot/data2/galaxy/sequence_index_color.loc
/depot/data2/galaxy/taxonomy
/depot/data2/galaxy/twobit.loc
"
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_phiX_sanger.fastq
--- a/test-data/bwa_phiX_sanger.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-@081017-and-081020:1:1:1715:1759
-GGACTCAGATAGTAATCCACGCTCCTTTAAAATATC
-+
-II#IIIIIII$5+.(9IIIIIII$%*$G$A31I&&B
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_phiX_sanger_f.fastq
--- a/test-data/bwa_phiX_sanger_f.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-@081017-and-081020:1:1:1715:1759/2
-ACGCTCCTTTAAAATATC
-+/2
-IIIII$%*$G$A31I&&B
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_phiX_sanger_r.fastq
--- a/test-data/bwa_phiX_sanger_r.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-@081017-and-081020:1:1:1715:1759/1
-GGACTCAGATAGTAATCC
-+/1
-II#IIIIIII$5+.(9II
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_sanger.fastq
--- a/test-data/bwa_sanger.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-@HWI-EAS91_1_30788AAXX:1:1:1761:343
-AAAAAAANNAAAAAAAAAAAAAAAAAAAAAAAAAAACNNANNGAGTNGNNNNNNNGCTTCCCACAGNNCTGG
-+
-IIIIIII""IIIIIIIIIII?I0IIIIHIIIGIIIHI""I""IIII"I"""""""IIIIIIHIIII""1III
-@HWI-EAS91_1_30788AAXX:1:1:1578:331
-GTATAGANNAATAAGAAAAAAAAAAATGAAGACTTTCNNANNTCTGNANNNNNNNTCTTTTTTCAGNNGTAG
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIIII""I""IIII"I"""""""IIIIIIIIIII""II7I
-@HWI-EAS91_1_30788AAXX:1:1:1647:512
-GTTCCATNNATCTGTGTGTCTATTTTTGTGCAAGTAANNCNNTGTTNANNNNNNNTGAAGAAGACANNAAGA
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIIII""I""IIII"I"""""""IIIIIIIIGII""IIII
-@HWI-EAS91_1_30788AAXX:1:1:1570:620
-GAGGTGTNNAAAATGAGAAAGGTCAAGGAGCATGTGCNNGNNTCAGNGNNNNNNNCACTGTACTGCNNGCTA
-+
-IIIIIII""IIIIIIIIIIIIIBIIIIIIIIIIIIII""I""IIII"I"""""""IIII@4EIII:""I?E6
-@HWI-EAS91_1_30788AAXX:1:1:1599:330
-GTTGGAGNNTGTCAAATGCCTTCTCTGCATCTATTGCNNANNGCTTNCNNNNNNNATCCTACCAAANNTTCA
-+
-IIIIIII""IIIIIIIIIIIIIIIIIII<III@IIII""I""IIII"I"""""""@IIHI16IF51""I:A<
-@HWI-EAS91_1_30788AAXX:1:1:1652:270
-GCCAAGCNNAGCAAATGTTTGAAGTCTCTAGGAGTGANNANNTTCANTNNNNNNNTCTTCTCTCTTNNGTAT
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIII6IIII""I""IIII"I"""""""IIIIIIIIIII""<D9I
-@HWI-EAS91_1_30788AAXX:1:1:1746:351
-GCCTTCGNNAGGTCTCAGCGCTTTCTCTGTGTTCTTTNNANNATACNANNNNNNNAAACTAAAAAANNCAAA
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIIII""I""IIII"I"""""""BIIIH:7IIII""I0>I
-@HWI-EAS91_1_30788AAXX:1:1:1582:633
-GGATGTGNNGAAAGGAGAACCCTCATACACTGCTGGGNNTNNTCTGNTNNNNNNNATACCCTCAAGNNCCAT
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIIII""I""IIII"I"""""""IIFIIIIIC3I""IIII
-@HWI-EAS91_1_30788AAXX:1:1:1598:534
-GAATCATNNAATCCGCTTGGTTTGACACTTTGGATTTNNANNTCCANANNNNNNNGACTAAGAAACNNAGAT
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIIII""I""IIII"I"""""""II.IIIICIII""IIII
-@HWI-EAS91_1_30788AAXX:1:1:1572:324
-GGTGGTGNNGTCAGATCAGACAGGCTCCCAAGAAGCTNNTNNGCTTNGNNNNNNNTCAGTAAAGCGNNACAA
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIII+7I05III""I""IIII"I"""""""II3II-/EIGI""A84;
-@HWI-EAS91_1_30788AAXX:1:1:1749:466
-GTTGTGTNNTTTCTTTCAATATTGTGATCTGGTTTAANNTNNATCCNCNNNNNNNGAGGCTTTTGTNNGGAC
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIIII""I""IIII"I"""""""ICIIIIIGII@""EI1:
-@HWI-EAS91_1_30788AAXX:1:1:1629:446
-GCAAAGGNNATGGGCAAAACAGTTCTTTGGTTAATGTNNTNNTAAANANNNNNNNTAAATCTTTCTNNAATG
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIIII""I""IIII"I"""""""IIIII?H<EII""I:I?
-@HWI-EAS91_1_30788AAXX:1:1:1763:587
-GATACAGNNCTGTTTTCCTTATTAATTTCCAGTAGCTNNANNTTGTNTNNNNNNNAATCTTGAGTTNNGCCA
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIIII""I""IIII"I"""""""IIIIIIIIIII"")II?
-@HWI-EAS91_1_30788AAXX:1:1:1616:363
-GATGAAANNCGGAAGCGATTGAAAAAATAGAAGGGGANNANNGAAANCNNNNNNNTGAACGATTTTNNATTT
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIDIIIII""I""IIII"I"""""""FI@7II1IIII""-III
-@HWI-EAS91_1_30788AAXX:1:1:1768:715
-GTATCATNNCAGAAACACCATAAGTAGCTGCTTTTTANNANNTTAANANNNNNNNAACCCTTTATTNNTGAC
-+
-IIIIIII""IIIIIIIIIIIIIDIIIIIIIIIIIIII""I""IIII"I"""""""IIIIIIIIIII""I9F<
-@HWI-EAS91_1_30788AAXX:1:1:1572:270
-GATTAGGNNTGCAAAGAAACTGCGTTTCACAGGCCTCNNGNNGGCTNCNNNNNNNAGGGCGAGTTGNNCCCC
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIIII""I""IIII":"""""""IIII5IIIBII""IIII
-@HWI-EAS91_1_30788AAXX:1:1:1785:1272
-GTTNNNNNNATGCACATTNNATNAAATNNTTGCAGTGNNANNTGGGNCNNNNNNNCAAGTGAACTTNNACGT
-+
-III""""""IIIIIIIII""FI"IIII""II+ICIII""I""IIII"I"""""""IIIIIIIIGII""I;I@
-@HWI-EAS91_1_30788AAXX:1:1:1673:514
-GTTTTGANNATGGTTTCTCTTCTGTTGTAACTCCATANNANNAAAANTNNNNNNNCGAACTGGTTCNNGAAC
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIII1II""I""IIII"I"""""""II%I'$+ACI/""3(.I
-@HWI-EAS91_1_30788AAXX:1:1:1634:330
-GCTCTGCNNAGTGCTCTTACAGCCTAGTGGGAACATANNANNTGGANGNNNNNNNCTGTGGGGCACNNCTCG
-+
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIII8IIII""I""IIII"I"""""""IIIEIIIII8I""@7>I
\ No newline at end of file
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_sanger_f.fastq
--- a/test-data/bwa_sanger_f.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-@HWI-EAS91_1_30788AAXX:1:1:1761:343/2
-CNNANNGAGTNGNNNNNNNGCTTCCCACAGNNCTGG
-+/2
-I""I""IIII"I"""""""IIIIIIHIIII""1III
-@HWI-EAS91_1_30788AAXX:1:1:1578:331/2
-CNNANNTCTGNANNNNNNNTCTTTTTTCAGNNGTAG
-+/2
-I""I""IIII"I"""""""IIIIIIIIIII""II7I
-@HWI-EAS91_1_30788AAXX:1:1:1647:512/2
-ANNCNNTGTTNANNNNNNNTGAAGAAGACANNAAGA
-+/2
-I""I""IIII"I"""""""IIIIIIIIGII""IIII
-@HWI-EAS91_1_30788AAXX:1:1:1570:620/2
-CNNGNNTCAGNGNNNNNNNCACTGTACTGCNNGCTA
-+/2
-I""I""IIII"I"""""""IIII@4EIII:""I?E6
-@HWI-EAS91_1_30788AAXX:1:1:1599:330/2
-CNNANNGCTTNCNNNNNNNATCCTACCAAANNTTCA
-+/2
-I""I""IIII"I"""""""@IIHI16IF51""I:A<
-@HWI-EAS91_1_30788AAXX:1:1:1652:270/2
-ANNANNTTCANTNNNNNNNTCTTCTCTCTTNNGTAT
-+/2
-I""I""IIII"I"""""""IIIIIIIIIII""<D9I
-@HWI-EAS91_1_30788AAXX:1:1:1746:351/2
-TNNANNATACNANNNNNNNAAACTAAAAAANNCAAA
-+/2
-I""I""IIII"I"""""""BIIIH:7IIII""I0>I
-@HWI-EAS91_1_30788AAXX:1:1:1582:633/2
-GNNTNNTCTGNTNNNNNNNATACCCTCAAGNNCCAT
-+/2
-I""I""IIII"I"""""""IIFIIIIIC3I""IIII
-@HWI-EAS91_1_30788AAXX:1:1:1598:534/2
-TNNANNTCCANANNNNNNNGACTAAGAAACNNAGAT
-+/2
-I""I""IIII"I"""""""II.IIIICIII""IIII
-@HWI-EAS91_1_30788AAXX:1:1:1572:324/2
-TNNTNNGCTTNGNNNNNNNTCAGTAAAGCGNNACAA
-+/2
-I""I""IIII"I"""""""II3II-/EIGI""A84;
-@HWI-EAS91_1_30788AAXX:1:1:1749:466/2
-ANNTNNATCCNCNNNNNNNGAGGCTTTTGTNNGGAC
-+/2
-I""I""IIII"I"""""""ICIIIIIGII@""EI1:
-@HWI-EAS91_1_30788AAXX:1:1:1629:446/2
-TNNTNNTAAANANNNNNNNTAAATCTTTCTNNAATG
-+/2
-I""I""IIII"I"""""""IIIII?H<EII""I:I?
-@HWI-EAS91_1_30788AAXX:1:1:1763:587/2
-TNNANNTTGTNTNNNNNNNAATCTTGAGTTNNGCCA
-+/2
-I""I""IIII"I"""""""IIIIIIIIIII"")II?
-@HWI-EAS91_1_30788AAXX:1:1:1616:363/2
-ANNANNGAAANCNNNNNNNTGAACGATTTTNNATTT
-+/2
-I""I""IIII"I"""""""FI@7II1IIII""-III
-@HWI-EAS91_1_30788AAXX:1:1:1768:715/2
-ANNANNTTAANANNNNNNNAACCCTTTATTNNTGAC
-+/2
-I""I""IIII"I"""""""IIIIIIIIIII""I9F<
-@HWI-EAS91_1_30788AAXX:1:1:1572:270/2
-CNNGNNGGCTNCNNNNNNNAGGGCGAGTTGNNCCCC
-+/2
-I""I""IIII":"""""""IIII5IIIBII""IIII
-@HWI-EAS91_1_30788AAXX:1:1:1785:1272/2
-GNNANNTGGGNCNNNNNNNCAAGTGAACTTNNACGT
-+/2
-I""I""IIII"I"""""""IIIIIIIIGII""I;I@
-@HWI-EAS91_1_30788AAXX:1:1:1673:514/2
-ANNANNAAAANTNNNNNNNCGAACTGGTTCNNGAAC
-+/2
-I""I""IIII"I"""""""II%I'$+ACI/""3(.I
-@HWI-EAS91_1_30788AAXX:1:1:1634:330/2
-ANNANNTGGANGNNNNNNNCTGTGGGGCACNNCTCG
-+/2
-I""I""IIII"I"""""""IIIEIIIII8I""@7>I
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_sanger_r.fastq
--- a/test-data/bwa_sanger_r.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,76 +0,0 @@
-@HWI-EAS91_1_30788AAXX:1:1:1761:343/1
-AAAAAAANNAAAAAAAAAAAAAAAAAAAAAAAAAAA
-+/1
-IIIIIII""IIIIIIIIIII?I0IIIIHIIIGIIIH
-@HWI-EAS91_1_30788AAXX:1:1:1578:331/1
-GTATAGANNAATAAGAAAAAAAAAAATGAAGACTTT
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIII
-@HWI-EAS91_1_30788AAXX:1:1:1647:512/1
-GTTCCATNNATCTGTGTGTCTATTTTTGTGCAAGTA
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIII
-@HWI-EAS91_1_30788AAXX:1:1:1570:620/1
-GAGGTGTNNAAAATGAGAAAGGTCAAGGAGCATGTG
-+/1
-IIIIIII""IIIIIIIIIIIIIBIIIIIIIIIIIII
-@HWI-EAS91_1_30788AAXX:1:1:1599:330/1
-GTTGGAGNNTGTCAAATGCCTTCTCTGCATCTATTG
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIII<III@III
-@HWI-EAS91_1_30788AAXX:1:1:1652:270/1
-GCCAAGCNNAGCAAATGTTTGAAGTCTCTAGGAGTG
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIII6III
-@HWI-EAS91_1_30788AAXX:1:1:1746:351/1
-GCCTTCGNNAGGTCTCAGCGCTTTCTCTGTGTTCTT
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIII
-@HWI-EAS91_1_30788AAXX:1:1:1582:633/1
-GGATGTGNNGAAAGGAGAACCCTCATACACTGCTGG
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIII
-@HWI-EAS91_1_30788AAXX:1:1:1598:534/1
-GAATCATNNAATCCGCTTGGTTTGACACTTTGGATT
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIII
-@HWI-EAS91_1_30788AAXX:1:1:1572:324/1
-GGTGGTGNNGTCAGATCAGACAGGCTCCCAAGAAGC
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIII+7I05II
-@HWI-EAS91_1_30788AAXX:1:1:1749:466/1
-GTTGTGTNNTTTCTTTCAATATTGTGATCTGGTTTA
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIII
-@HWI-EAS91_1_30788AAXX:1:1:1629:446/1
-GCAAAGGNNATGGGCAAAACAGTTCTTTGGTTAATG
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIII
-@HWI-EAS91_1_30788AAXX:1:1:1763:587/1
-GATACAGNNCTGTTTTCCTTATTAATTTCCAGTAGC
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIII
-@HWI-EAS91_1_30788AAXX:1:1:1616:363/1
-GATGAAANNCGGAAGCGATTGAAAAAATAGAAGGGG
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIDIIII
-@HWI-EAS91_1_30788AAXX:1:1:1768:715/1
-GTATCATNNCAGAAACACCATAAGTAGCTGCTTTTT
-+/1
-IIIIIII""IIIIIIIIIIIIIDIIIIIIIIIIIII
-@HWI-EAS91_1_30788AAXX:1:1:1572:270/1
-GATTAGGNNTGCAAAGAAACTGCGTTTCACAGGCCT
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIIIII
-@HWI-EAS91_1_30788AAXX:1:1:1785:1272/1
-GTTNNNNNNATGCACATTNNATNAAATNNTTGCAGT
-+/1
-III""""""IIIIIIIII""FI"IIII""II+ICII
-@HWI-EAS91_1_30788AAXX:1:1:1673:514/1
-GTTTTGANNATGGTTTCTCTTCTGTTGTAACTCCAT
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIIIII1I
-@HWI-EAS91_1_30788AAXX:1:1:1634:330/1
-GCTCTGCNNAGTGCTCTTACAGCCTAGTGGGAACAT
-+/1
-IIIIIII""IIIIIIIIIIIIIIIIIIIIIII8III
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_solid.fastq
--- a/test-data/bwa_solid.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,576 +0,0 @@
-@1831_573_1004/1
-AATACTTTCGGCGCCCTAAACCAGCTCACTGGGG
-+
-><C&&9952+C>5<.?<79,=42<292:<(9/-7
-@1831_573_1050/1
-TTTATGGGTATGGCCGCTCACAGGCCAGCGGCCT
-+
-;@@17?@=>7??@A8?==@4A?A4)&+.'&+'1,
-@1831_573_1067/1
-AAGTATGAGTCATTTACCGGGATGCGAAGAAAAG
-+
-++#%(',%/$,+&1#&),)&+'*'*%#$&#%('$
-@1831_573_1219/1
-CGCCCTATAATAATACAGCGCGTTAGACCGCTCA
-+
-@@=4/+)5)408?'665>*/5?<61';<3,:,5-
-@1831_573_1242/1
-GCTGAATCGCACCTAGCAACTATAGCCGGGCCGC
-+
->>::>17=A5?@@=;7A=;2.60>82<8=74+;;
-@1831_573_1333/1
-AGAATCGTTACCACACACTGCGTCTGGGTATCCG
-+
-='@#%3=.>)/34*117,,/6-4+.9742456<)
-@1831_573_1362/1
-CGATCTCAACCAGGTCCGCGCCCACCCCTGCCTC
-+
-B@@?@@?@C@BA?@>@<@8A@?@'.8'?17:,+?
-@1831_573_1448/1
-TCACGCCGGTCCTTGACTGGCGTTCTCTTCGAGG
-+
-7=A)?,.@A@@:@@<=/7)@<-#8662%9613&+
-@1831_573_1490/1
-CTCGTCATGTTACGCAAAGGCACGTCACAGCACC
-+
-@@@?,@??@$><=>+%/*>*1,)?26&12'9%7.
-@1831_573_1523/1
-ATGGAACGGAACGGGTGAGGAGGGGAACGTAGGG
-+
-,//*,#8''.6''6'2&27/80)%�'%#*,2'
-@1831_573_1578/1
-CGAGTAGCAAACAAGACGCCAATCCAGGCGACCC
-+
-?=@<@C@?@@??=>@;7<<8<694)3511(+1<.
-@1831_573_1647/1
-AGGGGTTTACACTATTCGACTGGGTGAGAGGCGT
-+
-?@@<@@???;A==@@;9?@?3=;6.4/;6:=/;4
-@1831_573_1684/1
-TTCAACTGCGTCGACGTAGCGCACAGGCGTCCGT
-+
->1:8<@39@@??9=;@@<>?@@<;<?7>76?9>?
-@1831_573_1769/1
-TGGACGTATAGTGGCGATGAGCATGTAGGTTCTC
-+
-54749&&767%/7;3$-7;3#,3//#,45/#&06
-@1831_573_1853/1
-CAAAACGCCCGGGGCCTCACATGCGCGGCAGTTC
-+
-4./B@@72B+/4?@?7?+@9/+99.')2<2&)2&
-@1831_573_1943/1
-ATAACGTATGGCAGTGAACGGGCGGAACCTGCCC
-+
->/*1,),@-)'0*>5'$/?6(a)/.&?8/(')A43,
-@1831_573_1977/1
-GGCGTAGGGCTCATTGTGCAAGTATCCGACCTCC
-+
-@?6@8@@9A@=4633A7?9?<3:+7>'@%@?%32
-@1831_574_109/1
-TCGGTTGCGTTACTTCATGGGAGGGCTTTACATT
-+
-7651#4817>@65<2:84716=788<1995.7?6
-@1831_574_148/1
-CGAACCTCGTATAACGGAGTAGTCGGAAACAGTC
-+
-;->3;;3>//>0;;7=,=4-4/+>029<9<624;
-@1831_574_185/1
-CCGTTTTGCCTAGTAATGCTCGGCGCAGCGTCGC
-+
-<4;%%@7>#*>97%6;+8$#<07%1372$%<54#
-@1831_574_243/1
-AGGCACCGTAACTCAGGACATTCTCGATTAGTTA
-+
-@@@95@=9?*><45$<@<4%@9?7#=?>7&>?97
-@1831_574_257/1
-ATACCTTCCAAAGCAATAGAATAAAAAACAGTAC
-+
->>B>)@?>B@B?@1%*%,#+00.'(+&5&%#$3&
-@1831_574_293/1
-TGCTGCAAATAAACATACAGCCTTCTAATGACTA
-+
-')7'.*%#&$'/.$##$.$&*)+*$#8%&%#&&%
-@1831_574_389/1
-CATGGCTATGCACCGGTTTGTAGCGTACTCGAGA
-+
-)$>/>8):2@:213;;.1)@3%64%+)<7)+$92
-@1831_574_575/1
-TTCTTGGCAAGCGCAGATTATGCGTTCCGCCTAG
-+
-?@>=?@>8@@@=@6*%&<='5@<<',0<=4*5/<
-@1831_574_592/1
-TCATTTACCACGTCAGGGTCGGAGTCATTCATTA
-+
-3-5)19,,<@>4067<2.-864346;9<1/;212
-@1831_574_617/1
-AAGCATCGGCGGGAGCGCAAGCTGGGAAGGTGCC
-+
->@?;>?=@==@>@=5?@+@:@40@><:0)')64-
-@1831_574_725/1
-GACAAGATGGCTATTATTTACAATCCGATCTGCA
-+
-'>?52+5=;4$6;<8.1<47*9+?7(+5;-).)4
-@1831_574_734/1
-CCTGTACGAAAGAACGTAGGCATGGGCTGGGGGG
-+
--&.$2&<*(-%):/)%5:)/%7+,9034*A.?70
-@1831_574_824/1
-AGCGCAAATTATGCGTTCCGCCTAGCGGAGAACT
-+
-@@@;;),+@<-<7;<&89??&29?<$2:A<);8?
-@1831_574_959/1
-CGCGCTAGGACTCGGCCCCAAGAGACGTTCCGCC
-+
-A=;+?@9;/<@;<8#&&/*%(%.0$0$2)+1$-1
-@1831_574_1062/1
-ACCGGTAATATAAGGCAACATGATTACGGCCACG
-+
-@821<//:136/8<1/5.427.;>288/0<1$)/
-@1831_574_1092/1
-GACTGGCGAAATCATCGCGGAAAAACCCCTATCA
-+
-8?.,98)03%#,,,(,++$'69'#9'7#';6.%2
-@1831_574_1103/1
-ATCTCCTGATTAGACATATCTCCGTAGCTCACGC
-+
-??>?@=>@@A<>?=@==<:?<;58'&&):+35'1
-@1831_574_1116/1
-CACCTCACGTGAGTATAGCAGCCCGAGCGTCACC
-+
-(a)++,)/)?./)%<)2>.==:8?&;44&/&,)/*4
-@1831_574_1194/1
-TTATCACATTTGGGGATCGGAAGGGACTACTTCG
-+
-5>;,??9@9@?@1@@=@3=@>@4?@@94?75/,6
-@1831_574_1204/1
-CTTACTGGTCTGCTGGACATATAGTGGCGATGAA
-+
-A5A5B@5:;@@,.9?A1?#.?;3),>82%)='7*
-@1831_574_1306/1
-ATTGCTTAGATCCAGTGGCGCTCAATACAACGGA
-+
-2.7&%''.$&#'%##$#'#%')')$'$%$,)'.1
-@1831_574_1387/1
-GTACTTCTCAATGCTGCACTACTATGTACGCCCC
-+
-?A??:@?@@9?@@?9C;:>&).,,);&'<&7(/'
-@1831_574_1431/1
-GACCAGTTTCAGGGCTAACCGTCCCTACTCGACC
-+
-7?>9BA897;+8*=6#6.+5&-#26$0.,5&'$1
-@1831_574_1560/1
-GGCGTCTTAGGATTGAAGAGGGCCTCCCACCCCC
-+
-))&65<4=>99@:597(1&;+&(%&4#,#&&&*$
-@1831_574_1591/1
-TGAGCACTTATGGCTAGGCGTAGGGGACCGTGAG
-+
-=<A><?@78@<=;@&@6>8:?,><&&<7>8(8+9
-@1831_574_1624/1
-ACGGGAAGGGCTGGAATCTACCCAGTAGGCATTG
-+
-<6.&(,7-+))7..'/;43.)927.(<85&13-)
-@1831_574_1826/1
-TACGTCGCGACCGAGCGTTATATAGTCTGACCCC
-+
-@<<,))459<?.+57'-'&6?1)(;1;0&%4,#$
-@1831_574_1903/1
-AGTGCAACATCTGCTTTGCTTATCAGCACACGGC
-+
-956?@>;7@@@8:@>8><=9>9>@2=71?1:6;/
-@1831_574_1961/1
-GTTTCACTTCGGTTATTAAGAAACCCAAATGGAA
-+
->-07-@>(2'@<#064@%5%@@6.&<<(9)=:47
-@1831_575_54/1
-TTTCTTATGGGTAGAACAGCTGCCACTGACTGAA
-+
-=@@68<2;<8;?@<>+9>7,,6972&57:4&9<8
-@1831_575_80/1
-TCTTTGGGTTTGGGGCAATTTGGTATGTTCGTCT
-+
-?5><@?/=5%(&.5)+#/0'/'>#$/'37#()6&
-@1831_575_192/1
-AACTACGCCCCTTAATTACACAGCGCGTTAGACC
-+
-:8<,9(.=/)#%8$,4'<,:)3/.'.5<,>-;7'
-@1831_575_197/1
-TTCGCCTACACTTAGATACCTCTTAAACTCAATG
-+
--:?463@A:88?6?437<=.2&1.;@67.4@%2,
-@1831_575_223/1
-ACGCACAAAGGAGCTCGGCGCATAGCAACGCAGA
-+
-?>?8?@:?;>+$'%&,+#$.--#%$1'&#-7$&'
-@1831_575_420/1
-CCCACATGGAAAACACTCACCGCCGAACAGAGCG
-+
-2?.>?(-''2+..@),$%1@;')1)?+)7.')..
-@1831_575_434/1
-ATCGCTGCGAGGTCACCCTGGTTACGCCCCTTCC
-+
-@@><@B@>=@@?>><@?;)@?;6.?=4,'';/3)
-@1831_575_444/1
-TAGGCGACCGTGAGGACAAGAGCTGTTGCCTTGA
-+
-2@@;<.=?@<+=:A<<@?<</>@><(<8>4&5;>
-@1831_575_459/1
-CTTATCAGCACACGGTTTACCAGTCCGACTCCAA
-+
-@@C@?A@@A@??A@@'6@@B'=;C@'4<=9,@1.
-@1831_575_506/1
-CGCAGAACCCGCACGCTTGTGCTCACCACTGTAC
-+
-?)2*5@3+.7=?A:8@,/&):@37/<89'+4*)*
-@1831_575_569/1
-AGCAGACTGCTGTAACACGGTGTGGTGTAAGGAT
-+
-'9-,@29+479%&>9#&08=>7#9>,69/+'*3)
-@1831_575_622/1
-CCAAATCCGGCCCAGTAAGTGTCCTGTCGCACCC
-+
-A8B=@@?<@?<>>=?96<497)<4/<':4+;74+
-@1831_575_644/1
-CTTGAATGGCGATCTCGTCGAGGAAATACCACTA
-+
-<8>.>&,+)8.10':5(/-62&*.=/%(.<&&18
-@1831_575_663/1
-GGCAACTTATCCGCATTGGTCCCACTGGAGCGCA
-+
-@@@@A</;A>@6>0792<5966:?;25+:><1,+
-@1831_575_681/1
-TCTCCTGATTAGACATATCACTGTTGAACACAGC
-+
-72?.)25;96-14'*.03'#4#++$)/8+%/((&
-@1831_575_711/1
-TATGTTCGTCCACGTCAGACGCGCAAAGTTGCGC
-+
-%+:2(#'1+.)&*45-#,<A-%4;>+))<;##*&
-@1831_575_730/1
-CACACAGGAACCATAGCGTATGTTATTCACCCCC
-+
-%8<%-')5,*1&=#)(1*1)->7$.,4'4'&'*&
-@1831_575_904/1
-ACCCGCTTAAAGACGTGAATTTTGCCTCCGCGCC
-+
-<><.689@@7@<54:4=@>69=:+6-=42;8<:#
-@1831_575_938/1
-TCATCAGGGAAGGCTAGGGGTTTACACTATTCGA
-+
-:@@:?@;=8;>=;;:=<93<4.;<6:2<9;4)87
-@1831_575_970/1
-TGACTCCTACAGTCTTTATAGTACCGAGGGAGGC
-+
-@=@=;@@><@@:9<:=?;>@=?9>>?@:2===<5
-@1831_575_991/1
-TTCGGCGATCCCCCCCACGGCGCGATGCCGCGCA
-+
->>;7???/4<:::,#&*%'$--5-#(7)&&,-)%
-@1831_575_1138/1
-TTGAAAGACCTGAACGCGATTTCATGTTTACTGC
-+
-=0;%1936+?96?,?5<:2>@6@<:;4>.7;*:1
-@1831_575_1157/1
-TCGCTGTTTAGATTTCGGGAGGGTACTTCAGTGC
-+
-B@B>?A?A@?9'?;?&8?@@6;<@=+<:99+965
-@1831_575_1180/1
-GAATTCACGGCAGTGTTATCACCGTTTCCTTCCA
-+
-<B>5?':/78?;1;55:997@@>94=7<186->7
-@1831_575_1283/1
-GGTGGAATACTAAGGACTAATGTGCTGTCTCTTT
-+
-C@A54><?A78@<?2>:#>=?@2>80:'?69.'7
-@1831_575_1302/1
-CGACTATTCGTTTCGTCTAGAACGTGACACTAGC
-+
-12>/#2'&-2&%'7+$%*#$/1(&&12/$,2,,*
-@1831_575_1310/1
-CTTGCTCTCGAGCTATGCCTCAGGACACGCCCTT
-+
-<<>663?99@(@7=11@:@@/7??<@<;>'3-7;
-@1831_575_1321/1
-CAACACAGTTGAACGGCGGAGGAGTAAAGATGCG
-+
-;B@?@>=A@<A?>@>?6>@5>'4@9?)7@7?/89
-@1831_575_1373/1
-CGCTACCGGTTCCAACGGCTGCCTGACTCGCGGA
-+
-@@@>@;=9<@??7@>@:@;@;17?630/7=4,2<
-@1831_575_1419/1
-TGGGGAATATAACAGCGTAGCGTTGAACACTAGA
-+
-//3->&-.->%11/@&/&7:<,-1=,+2<6'%&<
-@1831_575_1436/1
-TGCATCTAGCGCGTATTGCGAGCCTTACGGATTC
-+
-2@=;39*3<*4<:>52>>9'7:<='0=>1'136<
-@1831_575_1442/1
-TCTGACAAGGTTCCTGCACCTGCGTCTGAGAGGG
-+
->58<?7>+1B6-/9<<:5?>A:1@?539.@4/1>
-@1831_575_1454/1
-CCTCCTAACCACGAGCCGAGGGGTCTCTGCCCCT
-+
-4=?8=6589=0:A=:?>6<;@/,4+-6+/'.,(,
-@1831_575_1500/1
-CACAAAAGGTCCCTACCTGTCTACCCTACATAGC
-+
-?@@?A@?8<6<:985=99999==B3<5<<,7?>9
-@1831_575_1535/1
-CTCGACGATATGACCGCCAGCCACTTAACTCCGC
-+
-B=@<@@B?:A@@=>@?68@=?@5?7;:6<<;>5<
-@1831_575_1724/1
-TCGTAAGTGTTAAGGAGCTGTGTACAAAACAACA
-+
-<B.+@),2*.%)))4%2@;7#%(%+$8))85%&5
-@1831_575_1829/1
-CATTTGCTGACCCTGCGTAGTTTAGTCTCACAGC
-+
-2(*'%.3$+7)@&%$'3*+*#/#/*+0.=&#)+0
-@1831_575_1898/1
-CTTACCATATCATCTCAACCCATAACAGCACTTA
-+
-B>@@&1/))'40)%#8/.%#8$((#;4'$'63,,
-@1831_575_1964/1
-GACAGACCATGAGGCTGAAGACTACTAAGTGCGT
-+
->39)@2<2/@+9?2=&)>>@*62=5&2<42.'?+
-@1831_576_32/1
-TACGCAACGATTTATGGCCTTATAATTGAGGCCA
-+
-<>?>?=7<2)522;><<@40@>704<>5=23@+&
-@1831_576_74/1
-ACATTCTGCAGTGGGACAGAGCGGTACGCCGCAA
-+
-=@@?@>(??<B5?@@@9<@><+><;@';>6961?
-@1831_576_86/1
-ATGAAAACGCATTAGGACAACCATAATGGCCTCA
-+
-811)2:*.++5</:3+43924*))/:,6&29)2/
-@1831_576_89/1
-GCTGTTTGATTTGAGAAGAGGAATTAAGCGCCGA
-+
-)69+,'.4=-,>/>(*$#)3030*'(,%)2##$,
-@1831_576_266/1
-ATGGGGTCACTCGACCTAATCCCGCGGCTTTGGT
-+
-@@?=;<?7=@>9,>@1$&&89$/:>7'3178%&6
-@1831_576_327/1
-GCCGTTCTACTCTAGCTGCAACTTGCGATTGCTA
-+
-@?@6@@;<@?><@>==3@:==<3@@>53<9><6=
-@1831_576_331/1
-GACGCTTTACTCCGGTAGTACCGTGCCGTTTATA
-+
--2)+(*.*1/;5%.-9&#/1'+($*$##()%/$.
-@1831_576_387/1
-ACACGCCATGATCCGATAAGAAGGGAACGTAAGG
-+
-8).$5#1#*%.$##.*#$%##-%,+,1#&%.%))
-@1831_576_406/1
-AGGTCTTACAGCACGGGGCTGAGCGCATCTGACC
-+
-4<>%%14:*4656)&<251&2+3#&19,6&4>5(
-@1831_576_449/1
-CTCGAACCGCGGGGTCCAAAGACTGCTGCAAGGA
-+
-+'&'.,,$/+.)$$8&%#+?&,#)-&###7,+#*
-@1831_576_519/1
-TACCTGCCTACTACTTGCTCTCGAGCTATGCCTC
-+
-=46<97@>2/6?;2<4A881>9121+<1/4.9+7
-@1831_576_603/1
-CAATATGTCTTAGTCGTGACTCGGCAACTTATCC
-+
-@46=@C.??<A79@@;-<@@>29B?>55<B7598
-@1831_576_655/1
-GAACAGTCTATAGTGGCGGGAATCTCGTCGTCAG
-+
-@AA9@@<6*>@@5/<@>9'=;>7+@?9>/9;+,%
-@1831_576_677/1
-TTTACTCAGTTGATACATCACTGTAGCACATAGG
-+
-290&/*0#&'&,.2'#&*$&('#-%($*#%$)#%
-@1831_576_718/1
-CGTGCCTTTCAGGGTCTTTTCTGGTCTGGTCGCT
-+
-4###$0###%(#########,####%####$###
-@1831_576_722/1
-CGTATGATGGCGAGTCTTTATAATCCAATCTGAA
-+
-*,-,##.)*&(*1%*(%(-2#+)-#.&-#%%$')
-@1831_576_754/1
-AGGCGTCCTGCATCGACCGTTCTATCCGCTTAGA
-+
-4//#(.$)'',>($<,##%((,#5?#0*%1*
-@1831_576_815/1
-TAGGCCTGATATGACACGATCACAGTGCAACATC
-+
-3>@?9>@?B=>=;>A???=>:25=4.25?6<57.
-@1831_576_882/1
-TGTAAGACGGTGAGGTGTAAGGATCAGACCACGG
-+
-26?8?@:4>@>96??<<=5'1<>9846=<9<1>8
-@1831_576_898/1
-AGTACTGTCGCGCATTGGGGTCCTGGTCGTTGCT
-+
-@@C2?C>?<>@886B?;?.??87=B<8<15??=.
-@1831_576_923/1
-CTGGACATGAGAGACTGCACGCGGTACACGTCGG
-+
-6.51=;.699<96>;;49<;;11;<@59:9=647
-@1831_576_930/1
-CTGGCATGTACGTCCATGTCAGACGAGCAGAACT
-+
-#*0.2&.:((#'14'##-)#%$$2%#$/1&#%/#
-@1831_576_1019/1
-GATGCGCGCTGTCATGGCATCGAACCATCGGTCG
-+
-<$>$,1,&++&@,.)'+/+#9'69/6'2(+-'9-
-@1831_576_1068/1
-AAGAGTGACTCACTTACCGGGATGCGATGGAGCC
-+
->><=4?;@7=??9?;9>5@9?:8@:=5';7;'#4
-@1831_576_1131/1
-AGTTCGGGAAGGGCTGGAATCTACCCAGTAGGCA
-+
-04@#@/@,4>9?2+?1571@',>=;(759;*92<
-@1831_576_1168/1
-CACTTAACTCCGCTGTCGGAAGCCTTACAAGACA
-+
-@CC6@@2?9=>7?;76<;467@;9,0%26'',4$
-@1831_576_1207/1
-CAACCTGACTAAACGGGGATACGCTGGCGCTACA
-+
-$>2,(&?4?(,@:<&,@>?$&:8A%%=0.%,597
-@1831_576_1289/1
-TAGCGCAAGTCCAGAATGTTCATAGACTCGCGAT
-+
-9<>1B@@;7@@663==28,5':8<<,.=2>>.50
-@1831_576_1329/1
-CCAATAGCAGAGACCTAATAGGAAACGAAAGCAA
-+
->&0,870/A@@/5.;=;:'&@3'&$$%,+#($&2
-@1831_576_1367/1
-GGTCTCATCCGTTCCAATCGGGACTTTGACCAGT
-+
-?@@<>@@=@<@<=@>@??9:?<=>=<8;59@787
-@1831_576_1416/1
-TAGCGTTCAACGTCGATCTCATCTTGCCGATGGC
-+
-';?..1.<@'.=+6.5?7<0-?7;(%=>56.98@
-@1831_576_1461/1
-GAGGGGCGGCCCGGTTCAAGCAGGTAAGCAACAA
-+
-1&74#(#(&##$#,'###%#%%#*#&%%##%%%'
-@1831_576_1605/1
-AGTGCAACATCTGCTTTGCTTATCAGCACACGGC
-+
-<@C@@>1;@:;<<@@9@???9<3?5-21=4877,
-@1831_576_1664/1
-CGCGCACAACTCGCCATGATACGACAAGACCCGA
-+
-@?>?@=A:@@>@='=<>=).>=9*8)(7#/++;)
-@1831_576_1671/1
-GTCTTTGTAAGCCTGGCCTGGTCAGGTCTGGTCT
-+
-@?@5>@@8&8?25#&)&5&&)15&&,&4%&,&6%
-@1831_576_1729/1
-CGTTTCGTCTACAACGTGACACTAGCACAGTATA
-+
-?@?<?<@>A?/==?>?7>?@8<?@>99;><+0=>
-@1831_576_1880/1
-TATGCGCTGTTGAGCTTACAACTCACTAGCGAAT
-+
-515/792,:,7/%/05,%$):+#8%2(1754))3
-@1831_576_1982/1
-AATGTCGTCAGACGACTTTGGCGCGAAAACCATA
-+
-@@?@,A><@9@=?@9B=8<6@@6@2<A?>.7<+@
-@1831_576_1987/1
-AAGGTCTTCTGTCGGCGCTGGACTGAACACCTGA
-+
-##()(#&##)%)/-#%$11#%3>'##&$,#$$'+
-@1831_576_2014/1
-CCGTGACACACAATGCCGGCCCCAGCCTAGCAAT
-+
-@@9,B29-5>'?,+?79+/A';'2@'5&/9,6&1
-@1831_576_2028/1
-ACTCGCCGCATCCCCGAGTGACGCTCGAGACCAA
-+
-<>9>5'2(&707.8#&&39,0%7/#(#,*%&5*+
-@1831_577_40/1
-CCCCGCGTTACGAACGAGAGAAATCTCTTATAAT
-+
-2/4('.')(<*?#$)%&<,/39<(.2,+<=@611
-@1831_577_119/1
-TCCCACAAGCCATTGACATGCTCGCTCTAAACAG
-+
->?C11)-1/)#;#/,850*+.+$$5550+%-.40
-@1831_577_133/1
-TGCTTGTACGGTCTAACGGGGTATGGGTTTCTGG
-+
-4@>>?=1?:+>@07@@><>@*<+1@15)96'2$)
-@1831_577_255/1
-ATTGAGGCCAAGATAATTGAGGAGAGAGAAGGTG
-+
-<=87@>69%**#&#-+$.#&&#+$-+%&%.,%5#
-@1831_577_281/1
-TATGTACGTCGCGTACACTCCGGGGCCCGCAAAA
-+
--:B;8@=;>7@>4?=?+659?;5<7?;9@8(>:?
-@1831_577_288/1
-CATCCGAGGCTATCAAGGCGTAAGCACTGACCTA
-+
-;/79??&=B::298*6.7/+4&21,7,6?.7#'6
-@1831_577_322/1
-GAATGCTGGAGTACATTATGACAAACTATCGGAG
-+
-=;>4506;255464-<#7+194&2<?65968)7/
-@1831_577_362/1
-CGATTAGTTACCACTCGTATTCGCACGCCCAGGA
-+
-2B?:@?@<?958=,3:,90:&'-99,6<5.($+6
-@1831_577_382/1
-GTCGCGTATTCCCCGATGCTATGTAGACTTGCAA
-+
-2957/:1))=76(*24;,3+:<.&.&-=1=2/5*
-@1831_577_464/1
-TAGAGGCACCCTAACTCAGGGCTTTCTCGATTAG
-+
-=<7/<826)>#.'&4204+5#/041.7*91&756
-@1831_577_488/1
-TGAATAGTTATGGCCAGAATGTCTGCACCGATAC
-+
-48.,*>6566<?8=<=<2>6;94>;=9>@8924@
-@1831_577_511/1
-GGTGCTTATCAGTTCTTTCTCGGGACTTGTATTT
-+
-7/+&$:<7%6,$$%'%/+)#$7((&*3>16'0/+
-@1831_577_545/1
-ACCGCTCTTTGGGTATGGGGCAATCTGGCATGTT
-+
-><<9?<>?A<481@<@8==@76/61<95.5988-
-@1831_577_559/1
-GTGCCACTATGTTCGACAGACCCTAAGGCGGAAG
-+
-<@;??@>@?/2<.@1=>12=61/;=?.&2+92)'
-@1831_577_562/1
-GTTCCACTACGTTCCACGCAAAGGAATCCGAATC
-+
-((&*&0%)1%)#($2-,***%/-,,))&,-.1'*
-@1831_577_637/1
-GCCTTCGCGGGAGCATATCAGTCGATACATCCCA
-+
--,4#>:-6+:8,&(5;3=0>7=68&1/9&'?;4,
-@1831_577_641/1
-TATCTACCACCGCGGTGGCGCGAGAATGCTCCCT
-+
-47;/':A;;5?:72,(=),#*?+.#&7$8#%7/'
-@1831_577_692/1
-CCGGTGAGAATTACATCGCGAGTACGCCCAAGGA
-+
-B,@?@B(@A?@+@@>@+?=>@'=<@<=<9=?75<
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_solid_f.fastq
--- a/test-data/bwa_solid_f.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-@1378_11_329/2
-GTTCGTGGCCGGTGGGTGTTTGGG
-+
-###$$#$#$&#####$'$#$###$
-@1378_17_1788/2
-TGGGTGGATGTGTTGTCGTTCATG
-+
-#$#$###$#$#######$#$####
-@1378_25_2035/2
-GTGCGTCGGGGAGGGTGCTGTCGG
-+
-######%#$%#$$###($###&&%
-@1378_28_770/2
-GGTTGGGAGTTGGCGCGCGTGGTT
-+
-###$##%%$####%#%$#%%#($$
-@1378_33_1945/2
-GGGGGGGGGGGGGGGGGGGGGGGG
-+
-.6;?;55697>8779457986264
-@1378_34_789/2
-GGGCTTGCGTTAGTGAGAGGTTGT
-+
-###%$%$%%###$####$###$#&
-@1378_35_263/2
-GGCGGGGGGGGGGGGGGGGGGGGG
-+
-$%%&,)3/)%$-6'$&5&#$''5.
-@1378_43_186/2
-GCTAGGGTTTGGGTTTGCGGTGGG
-+
-$%#$########%##%#$###'#'
-@1378_51_1671/2
-GGTGTTGTTCGGATGTAGCGTGGG
-+
-##%$$####$########$##0##
-@1378_56_324/2
-GCTGGGTGATCTAAGGAATGTAAT
-+
-#$#####$$$#$$$$##%###*(#
-@1378_56_773/2
-TCTGGTCGGTTTCGGGGAGTGGAA
-+
-##%%#&$###$#$##%$####%%$
-@1378_62_2027/2
-GTTGGCCTGGCCTGCCGTGCTGCG
-+
-*##),/%##$)#%##1$#'%.#&#
-@1378_62_2029/2
-GGCGGTGTGTGGTGCGGCTGTGCG
-+
-/$$$=(####%####)$$%$-&%#
-@1378_67_1795/2
-CGTGCCAACGACCGTCCTACGGAG
-+
-@@.?7@@@.@:@A<<>>=>70<@7
-@1378_68_466/2
-GTGTCATCTGAGGTAAAGCATTGT
-+
-/##$09#$#.=$#$76+$%1'###
-@1378_68_1692/2
-TGTTCGATTTAGGTCTTGCCTCGC
-+
-###%%$%%##%$#$##$###$$#$
-@1378_80_664/2
-TGTCTGCGTTGTATCTCTGGTGTA
-+
-%##%,%$$#&$$###$#$%##'%#
-@1378_85_1786/2
-CCCTAGGAGCGTATACCGGACGAG
-+
-,'&/%/@,&1,&'/)&,6&&1)((
-@1378_86_1011/2
-AGGCGATGGGATATTATTTTACTT
-+
-:$###)%##$9$###1$$#$2###
-@1378_86_1789/2
-GGCCAGGTACTAATAAATTCAACA
-+
-1.51/&%#'$,*?%#6&0$$5,20
-@1378_91_1596/2
-GCTTTTTCATTCGGTGCCTTTGGA
-+
-'>%/3%=()8'#.%?50$&5>%)%
-@1378_94_1595/2
-GCGGGTTAACCCAGTACCTCTGGC
-+
-,8@6'>8<76>@@(->9)7'*941
-@1378_95_1039/2
-GTTCTGTGCCAGGTGAGGTACGGA
-+
-&##,./#$&)6##+,'#$$0(##$
-@1378_95_1767/2
-CTAATTGACCGGGCAAGCTATTAA
-+
-',,2'(10/>:=/7).3&%6&)&6
-@1378_96_1037/2
-CTGCTGGGCCATTTGACTTACTCA
-+
-'$#+#(##-%5##+*&###-.$$$
-@1378_96_1764/2
-TCTTTGTAACCCACTTAGTATTTC
-+
-4='28>.@4881B807:822>%)1
-@1378_98_1574/2
-AGGCGAGTGTGGGGGTTGTTTGAG
-+
-+%%$#)##%##$####%###$%$#
-@1378_107_1647/2
-GGTCTGGTTCTATGTTGGTCGACT
-+
-###'$$#$$$(#%###(#$##$%#
-@1378_111_829/2
-GGTCTTCTATGGTGCTAAATTAGT
-+
-$##'&###$##)#%($#$%#$'%#
-@1378_111_1900/2
-GCACGCCTTTGGGCTAAGCCGTAA
-+
-)$)'#%$########$'#&%$#(#
-@1378_112_1483/2
-TGGAGTGGTGTGTTTGCTGAGCCA
-+
-#$#)#############$#%#%'%
-@1378_125_1287/2
-TGACGTGGGTTGTCCCGTGAGATT
-+
-##$%%#$###$##$$#&%##$(%%
-@1378_126_468/2
-AAAAAACGGGCCGGGCGGACTAGG
-+
-@@B@@@>@2>1+?:92)>@8&&<+
-@1378_127_664/2
-TCGCTTTGCCTATGTTTGTTCGGA
-+
-#%$%#&##$%#%%###$$###)-'
-@1378_129_463/2
-AAAAAAAAAAAAAAAAAAAAAAAA
-+
-,)&20%8'(&35-***1-2&+510
-@1378_129_875/2
-GACCTTTACGTATTGGGGGTTGGC
-+
-###)###+###$##$#&%##$,#$
-@1378_140_1251/2
-TTTCCTTCGTGTGCGTGCGGAGTG
-+
-#%#%$##$$$######.$$$%#%(
-@1378_141_809/2
-TCTCGTGGTTTCTTTTTTATGTGT
-+
-##%)##$$#####%$#$#%%#'##
-@1378_144_983/2
-GTTCGTTCGTGGTGTACGAGGGTG
-+
-#(#%#####($#%##$$#%##%#)
-@1378_153_270/2
-GGCCGTGTGCGGGTGTAGATTGGA
-+
-%$##($######&##$&$$$$%##
-@1378_155_1689/2
-CGCGTTCGGACAAAGCTAGCACCT
-+
-@4@@=6=@@<4:@@681@@@.24.
-@1378_157_1580/2
-GGGATTGAAGGGATGTATGCTAGG
-+
-#%$&%#$$'%$%#$##*#%$$$$#
-@1378_161_317/2
-AATCCATACCCACAAAAGCAGGCC
-+
-.&%','(@''?7//+&)+2.+)0)
-@1378_177_735/2
-CGAGCCCTAAACCATGAGATCGGA
-+
-@@B>@AC9@A<B8@=9>7@5)>,0
-@1378_181_1684/2
-TTTCTGTTGTGGTTTTGTTGGGGT
-+
-$##'$%'##%##$%$#$$####$*
-@1378_187_1407/2
-TTGGGTGAAATCTTGTCGAGTGGA
-+
-####&##$$###$#####%##%%)
-@1378_203_721/2
-CCTTTACGATCATAAACCATGACC
-+
-9<&./1&@;12')?<1',?/)&/.
-@1378_206_2039/2
-CCCCCCCCCCCCCCCCCCCCCCCC
-+
-?=>>?=:;<>>4::<=56199(05
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_solid_r.fastq
--- a/test-data/bwa_solid_r.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-@1378_11_329/1
-AGACCGGGCGGGGTGGCGTTCGGT
-+
-%##+'#######%###$#$##$(#
-@1378_17_1788/1
-TGCCGTGTCTTGCTAACGCCGATT
-+
-#'#$$#$###%%##$$$$######
-@1378_25_2035/1
-CTGCGTGTTGGTGTCTACTGGGGT
-+
-#%#'##$#$##&%#%$$$%#%#'#
-@1378_28_770/1
-CTGCTATGCCGGCCGCCTGCCCCT
-+
-%##(#$$#%$#$%###$%%$##$#
-@1378_33_1945/1
-GGGGGGGGGGGGGGGGGGGGGGGG
-+
-+9;64287788752796/576352
-@1378_34_789/1
-ATGGTGGCTGACGCGTTTGACTGT
-+
-#$##%#$##$&$#%##$##$###$
-@1378_35_263/1
-GGGCGGGGGGCGGCGGGGGGGGGG
-+
-),,#%'$)'-(%&%'%',%%&&(&
-@1378_43_186/1
-ATACTAGTTGGGACGCGTTGTGCT
-+
-#$(4%$########$#$###$$$#
-@1378_51_1671/1
-TGGGTAGGTGCGGCTCTTGCGGTC
-+
-##$#$%###%%#%#$##$$#####
-@1378_56_324/1
-AGGCTTGGATTGTTGCGCTGACCT
-+
-/+#**###%%##%#####$$$#$#
-@1378_56_773/1
-TGTCGTGAGGTCACTTATCCCCAT
-+
-&%#%##%%#####&#$%##$%##$
-@1378_62_2027/1
-CTTCCACGATCTGCTCGCTGTGGT
-+
-(#&&$##$$#$%#%$$$#$###'#
-@1378_62_2029/1
-TCTGGGCTGTCTTCGGGTCGGTGT
-+
-$%$$####$##$$#)##%%#$###
-@1378_67_1795/1
-TAGTGGGCTAGTCCGGGATCTACC
-+
-B@C2@@?;-@@1>'A@@91@.@1'
-@1378_68_466/1
-GTGATCGTCGGTGCCAGTCCCTGT
-+
-#(%)+##$#$#%#+$%##$#####
-@1378_68_1692/1
-GGTCTTCTGGGCACGGGCCAAGTT
-+
-###)%'&%##$###%#######$#
-@1378_80_664/1
-CTGCTTTGATCCCCGGTGGAGCAC
-+
-7#%###$$6#######$##$$$##
-@1378_85_1786/1
-ATACTATGTCGATCTGTAAAAAAA
-+
-)&.)#3%(a)$&%-,2#&+.-%0&./
-@1378_86_1011/1
-CTACGTTATTGCTCTGTTTGTCCT
-+
-######$%##$$$%###%#$####
-@1378_86_1789/1
-CGAATATCCCCTGGTTTAGAAGTA
-+
-61?1;@/>@<=/(.7'(<5@=%$=
-@1378_91_1596/1
-TTAGCGGTTGACTATCTGCTGACA
-+
-*&+'#9'(%*'#//,&<),/)'*#
-@1378_94_1595/1
-CGTGCGACAGCCCATGTTTTCAGA
-+
--=..5,3826&*+.+#+#%%6;%#
-@1378_95_1039/1
-CGGCGTCCATCTTCGCCTTGAGAT
-+
-$##.#$##$$#%$#$%%$###$)$
-@1378_95_1767/1
-ACACGCACCATCTGGCGGCTAACC
-+
-86<65<4<C27/$5+#;-$+#2%$
-@1378_96_1037/1
-ATCCCCCAAGATGCCTGTTGATTG
-+
-$#$'##$$$#%$$#%###+##$#$
-@1378_96_1764/1
-TACACCGGAACCTTGCACTAAAGC
-+
-6-9'<#+81?+*<8-=69&6;*3)
-@1378_98_1574/1
-GTTCTGCCGGTGTCTGTGGCGGGC
-+
-$$#+&$$####%$$$###$%#%%#
-@1378_107_1647/1
-AGGCCTACTACGCGTCATTGATAG
-+
-&#$$#$(.#%#$$####&$%##($
-@1378_111_829/1
-TGCGGCACTTGCTTCTTCGTATTT
-+
-%#%##%#$%#$#%###$$##&#$$
-@1378_111_1900/1
-TCCCCTCGCTCGGCTCTGTGCTGT
-+
-$&%*$#(#)##$#'##%(##$#$%
-@1378_112_1483/1
-TGTCCAGCTATGCGGCTTCCTCCT
-+
-%#$+#%#&#$#####%####%$##
-@1378_125_1287/1
-TGTCTCTGGGGGGCCTGGTTAGGT
-+
-$##13$'%#$###$$###$$$#&#
-@1378_126_468/1
-TCTCCTGATTAGACATATCTCCGT
-+
-7>@318?=,=8@49579?..7,7)
-@1378_127_664/1
-AGAGGTTGGTGTCTTGTCGCAGCT
-+
-##'#$######$$%######$$$#
-@1378_129_463/1
-CCTGTGGGCCAAGCCCAATGAAAG
-+
-8),,<6(--)<()5&.&/8+;.2+
-@1378_129_875/1
-TTTCTATGGCTTACGCTGTCTGCC
-+
-#$($##%####%$#$#####$###
-@1378_140_1251/1
-ATCCTAGCGCGGTGTCTTGGGGAC
-+
-#$%1#$$$##$##$#$#$##$%$$
-@1378_141_809/1
-TGTCCTCCAGTGTCTGTTGGGTGT
-+
-%&,-##$$#(%###$#$$'###'#
-@1378_144_983/1
-AGCGCCCGGTTGGTGCGGCTCGTC
-+
--$(&%*$#*#))#$$$#%%$#$##
-@1378_153_270/1
-AGTCCTTGTCCCCTGGGTTTTCCC
-+
-+''$#&%$%#$##&$$($#&#$$#
-@1378_155_1689/1
-TTGGGAGGGAGAGAGACTAGACCG
-+
-?4@@4<<??<?-@4@=4<5<?:/>
-@1378_157_1580/1
-TGGGCCTCGGTGCCCTTGGTCTGT
-+
-#%)$##'#$$$&#####%#$#$##
-@1378_161_317/1
-TTGGCCGGCAACCCCGGTACCTAA
-+
-7<,<'@)@>.)2@/')'&(?/-<(
-@1378_177_735/1
-AGTACGCCATGTATTTGCGACCAG
-+
-=?@?C<88@=>:7>@55/.,416,
-@1378_181_1684/1
-CGACTCCCGCATTCACGGTCAAGT
-+
-&*#,##$#&$*$$#$#$$$#%$##
-@1378_187_1407/1
-TGGCGTCCACTCGTGGGTCTATCG
-+
-$#$'%#$%$%&$%#####$#$#%#
-@1378_203_721/1
-CCTAAATAACCCAGGGTAAAAGAT
-+
-9<1+2+1@=259@+;2.71&@+2&
-@1378_206_2039/1
-CCCCCCCCCCCCCCCCCCCCCCCC
-+
-9@?8>;>>><<994;=895895-8
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_wrapper_in0.fastq
--- a/test-data/bwa_wrapper_in0.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,576 +0,0 @@
-@1831_573_1004/1
-AATACTTTCGGCGCCCTAAACCAGCTCACTGGGG
-+
-><C&&9952+C>5<.?<79,=42<292:<(9/-7
-@1831_573_1050/1
-TTTATGGGTATGGCCGCTCACAGGCCAGCGGCCT
-+
-;@@17?@=>7??@A8?==@4A?A4)&+.'&+'1,
-@1831_573_1067/1
-AAGTATGAGTCATTTACCGGGATGCGAAGAAAAG
-+
-++#%(',%/$,+&1#&),)&+'*'*%#$&#%('$
-@1831_573_1219/1
-CGCCCTATAATAATACAGCGCGTTAGACCGCTCA
-+
-@@=4/+)5)408?'665>*/5?<61';<3,:,5-
-@1831_573_1242/1
-GCTGAATCGCACCTAGCAACTATAGCCGGGCCGC
-+
->>::>17=A5?@@=;7A=;2.60>82<8=74+;;
-@1831_573_1333/1
-AGAATCGTTACCACACACTGCGTCTGGGTATCCG
-+
-='@#%3=.>)/34*117,,/6-4+.9742456<)
-@1831_573_1362/1
-CGATCTCAACCAGGTCCGCGCCCACCCCTGCCTC
-+
-B@@?@@?@C@BA?@>@<@8A@?@'.8'?17:,+?
-@1831_573_1448/1
-TCACGCCGGTCCTTGACTGGCGTTCTCTTCGAGG
-+
-7=A)?,.@A@@:@@<=/7)@<-#8662%9613&+
-@1831_573_1490/1
-CTCGTCATGTTACGCAAAGGCACGTCACAGCACC
-+
-@@@?,@??@$><=>+%/*>*1,)?26&12'9%7.
-@1831_573_1523/1
-ATGGAACGGAACGGGTGAGGAGGGGAACGTAGGG
-+
-,//*,#8''.6''6'2&27/80)%�'%#*,2'
-@1831_573_1578/1
-CGAGTAGCAAACAAGACGCCAATCCAGGCGACCC
-+
-?=@<@C@?@@??=>@;7<<8<694)3511(+1<.
-@1831_573_1647/1
-AGGGGTTTACACTATTCGACTGGGTGAGAGGCGT
-+
-?@@<@@???;A==@@;9?@?3=;6.4/;6:=/;4
-@1831_573_1684/1
-TTCAACTGCGTCGACGTAGCGCACAGGCGTCCGT
-+
->1:8<@39@@??9=;@@<>?@@<;<?7>76?9>?
-@1831_573_1769/1
-TGGACGTATAGTGGCGATGAGCATGTAGGTTCTC
-+
-54749&&767%/7;3$-7;3#,3//#,45/#&06
-@1831_573_1853/1
-CAAAACGCCCGGGGCCTCACATGCGCGGCAGTTC
-+
-4./B@@72B+/4?@?7?+@9/+99.')2<2&)2&
-@1831_573_1943/1
-ATAACGTATGGCAGTGAACGGGCGGAACCTGCCC
-+
->/*1,),@-)'0*>5'$/?6(a)/.&?8/(')A43,
-@1831_573_1977/1
-GGCGTAGGGCTCATTGTGCAAGTATCCGACCTCC
-+
-@?6@8@@9A@=4633A7?9?<3:+7>'@%@?%32
-@1831_574_109/1
-TCGGTTGCGTTACTTCATGGGAGGGCTTTACATT
-+
-7651#4817>@65<2:84716=788<1995.7?6
-@1831_574_148/1
-CGAACCTCGTATAACGGAGTAGTCGGAAACAGTC
-+
-;->3;;3>//>0;;7=,=4-4/+>029<9<624;
-@1831_574_185/1
-CCGTTTTGCCTAGTAATGCTCGGCGCAGCGTCGC
-+
-<4;%%@7>#*>97%6;+8$#<07%1372$%<54#
-@1831_574_243/1
-AGGCACCGTAACTCAGGACATTCTCGATTAGTTA
-+
-@@@95@=9?*><45$<@<4%@9?7#=?>7&>?97
-@1831_574_257/1
-ATACCTTCCAAAGCAATAGAATAAAAAACAGTAC
-+
->>B>)@?>B@B?@1%*%,#+00.'(+&5&%#$3&
-@1831_574_293/1
-TGCTGCAAATAAACATACAGCCTTCTAATGACTA
-+
-')7'.*%#&$'/.$##$.$&*)+*$#8%&%#&&%
-@1831_574_389/1
-CATGGCTATGCACCGGTTTGTAGCGTACTCGAGA
-+
-)$>/>8):2@:213;;.1)@3%64%+)<7)+$92
-@1831_574_575/1
-TTCTTGGCAAGCGCAGATTATGCGTTCCGCCTAG
-+
-?@>=?@>8@@@=@6*%&<='5@<<',0<=4*5/<
-@1831_574_592/1
-TCATTTACCACGTCAGGGTCGGAGTCATTCATTA
-+
-3-5)19,,<@>4067<2.-864346;9<1/;212
-@1831_574_617/1
-AAGCATCGGCGGGAGCGCAAGCTGGGAAGGTGCC
-+
->@?;>?=@==@>@=5?@+@:@40@><:0)')64-
-@1831_574_725/1
-GACAAGATGGCTATTATTTACAATCCGATCTGCA
-+
-'>?52+5=;4$6;<8.1<47*9+?7(+5;-).)4
-@1831_574_734/1
-CCTGTACGAAAGAACGTAGGCATGGGCTGGGGGG
-+
--&.$2&<*(-%):/)%5:)/%7+,9034*A.?70
-@1831_574_824/1
-AGCGCAAATTATGCGTTCCGCCTAGCGGAGAACT
-+
-@@@;;),+@<-<7;<&89??&29?<$2:A<);8?
-@1831_574_959/1
-CGCGCTAGGACTCGGCCCCAAGAGACGTTCCGCC
-+
-A=;+?@9;/<@;<8#&&/*%(%.0$0$2)+1$-1
-@1831_574_1062/1
-ACCGGTAATATAAGGCAACATGATTACGGCCACG
-+
-@821<//:136/8<1/5.427.;>288/0<1$)/
-@1831_574_1092/1
-GACTGGCGAAATCATCGCGGAAAAACCCCTATCA
-+
-8?.,98)03%#,,,(,++$'69'#9'7#';6.%2
-@1831_574_1103/1
-ATCTCCTGATTAGACATATCTCCGTAGCTCACGC
-+
-??>?@=>@@A<>?=@==<:?<;58'&&):+35'1
-@1831_574_1116/1
-CACCTCACGTGAGTATAGCAGCCCGAGCGTCACC
-+
-(a)++,)/)?./)%<)2>.==:8?&;44&/&,)/*4
-@1831_574_1194/1
-TTATCACATTTGGGGATCGGAAGGGACTACTTCG
-+
-5>;,??9@9@?@1@@=@3=@>@4?@@94?75/,6
-@1831_574_1204/1
-CTTACTGGTCTGCTGGACATATAGTGGCGATGAA
-+
-A5A5B@5:;@@,.9?A1?#.?;3),>82%)='7*
-@1831_574_1306/1
-ATTGCTTAGATCCAGTGGCGCTCAATACAACGGA
-+
-2.7&%''.$&#'%##$#'#%')')$'$%$,)'.1
-@1831_574_1387/1
-GTACTTCTCAATGCTGCACTACTATGTACGCCCC
-+
-?A??:@?@@9?@@?9C;:>&).,,);&'<&7(/'
-@1831_574_1431/1
-GACCAGTTTCAGGGCTAACCGTCCCTACTCGACC
-+
-7?>9BA897;+8*=6#6.+5&-#26$0.,5&'$1
-@1831_574_1560/1
-GGCGTCTTAGGATTGAAGAGGGCCTCCCACCCCC
-+
-))&65<4=>99@:597(1&;+&(%&4#,#&&&*$
-@1831_574_1591/1
-TGAGCACTTATGGCTAGGCGTAGGGGACCGTGAG
-+
-=<A><?@78@<=;@&@6>8:?,><&&<7>8(8+9
-@1831_574_1624/1
-ACGGGAAGGGCTGGAATCTACCCAGTAGGCATTG
-+
-<6.&(,7-+))7..'/;43.)927.(<85&13-)
-@1831_574_1826/1
-TACGTCGCGACCGAGCGTTATATAGTCTGACCCC
-+
-@<<,))459<?.+57'-'&6?1)(;1;0&%4,#$
-@1831_574_1903/1
-AGTGCAACATCTGCTTTGCTTATCAGCACACGGC
-+
-956?@>;7@@@8:@>8><=9>9>@2=71?1:6;/
-@1831_574_1961/1
-GTTTCACTTCGGTTATTAAGAAACCCAAATGGAA
-+
->-07-@>(2'@<#064@%5%@@6.&<<(9)=:47
-@1831_575_54/1
-TTTCTTATGGGTAGAACAGCTGCCACTGACTGAA
-+
-=@@68<2;<8;?@<>+9>7,,6972&57:4&9<8
-@1831_575_80/1
-TCTTTGGGTTTGGGGCAATTTGGTATGTTCGTCT
-+
-?5><@?/=5%(&.5)+#/0'/'>#$/'37#()6&
-@1831_575_192/1
-AACTACGCCCCTTAATTACACAGCGCGTTAGACC
-+
-:8<,9(.=/)#%8$,4'<,:)3/.'.5<,>-;7'
-@1831_575_197/1
-TTCGCCTACACTTAGATACCTCTTAAACTCAATG
-+
--:?463@A:88?6?437<=.2&1.;@67.4@%2,
-@1831_575_223/1
-ACGCACAAAGGAGCTCGGCGCATAGCAACGCAGA
-+
-?>?8?@:?;>+$'%&,+#$.--#%$1'&#-7$&'
-@1831_575_420/1
-CCCACATGGAAAACACTCACCGCCGAACAGAGCG
-+
-2?.>?(-''2+..@),$%1@;')1)?+)7.')..
-@1831_575_434/1
-ATCGCTGCGAGGTCACCCTGGTTACGCCCCTTCC
-+
-@@><@B@>=@@?>><@?;)@?;6.?=4,'';/3)
-@1831_575_444/1
-TAGGCGACCGTGAGGACAAGAGCTGTTGCCTTGA
-+
-2@@;<.=?@<+=:A<<@?<</>@><(<8>4&5;>
-@1831_575_459/1
-CTTATCAGCACACGGTTTACCAGTCCGACTCCAA
-+
-@@C@?A@@A@??A@@'6@@B'=;C@'4<=9,@1.
-@1831_575_506/1
-CGCAGAACCCGCACGCTTGTGCTCACCACTGTAC
-+
-?)2*5@3+.7=?A:8@,/&):@37/<89'+4*)*
-@1831_575_569/1
-AGCAGACTGCTGTAACACGGTGTGGTGTAAGGAT
-+
-'9-,@29+479%&>9#&08=>7#9>,69/+'*3)
-@1831_575_622/1
-CCAAATCCGGCCCAGTAAGTGTCCTGTCGCACCC
-+
-A8B=@@?<@?<>>=?96<497)<4/<':4+;74+
-@1831_575_644/1
-CTTGAATGGCGATCTCGTCGAGGAAATACCACTA
-+
-<8>.>&,+)8.10':5(/-62&*.=/%(.<&&18
-@1831_575_663/1
-GGCAACTTATCCGCATTGGTCCCACTGGAGCGCA
-+
-@@@@A</;A>@6>0792<5966:?;25+:><1,+
-@1831_575_681/1
-TCTCCTGATTAGACATATCACTGTTGAACACAGC
-+
-72?.)25;96-14'*.03'#4#++$)/8+%/((&
-@1831_575_711/1
-TATGTTCGTCCACGTCAGACGCGCAAAGTTGCGC
-+
-%+:2(#'1+.)&*45-#,<A-%4;>+))<;##*&
-@1831_575_730/1
-CACACAGGAACCATAGCGTATGTTATTCACCCCC
-+
-%8<%-')5,*1&=#)(1*1)->7$.,4'4'&'*&
-@1831_575_904/1
-ACCCGCTTAAAGACGTGAATTTTGCCTCCGCGCC
-+
-<><.689@@7@<54:4=@>69=:+6-=42;8<:#
-@1831_575_938/1
-TCATCAGGGAAGGCTAGGGGTTTACACTATTCGA
-+
-:@@:?@;=8;>=;;:=<93<4.;<6:2<9;4)87
-@1831_575_970/1
-TGACTCCTACAGTCTTTATAGTACCGAGGGAGGC
-+
-@=@=;@@><@@:9<:=?;>@=?9>>?@:2===<5
-@1831_575_991/1
-TTCGGCGATCCCCCCCACGGCGCGATGCCGCGCA
-+
->>;7???/4<:::,#&*%'$--5-#(7)&&,-)%
-@1831_575_1138/1
-TTGAAAGACCTGAACGCGATTTCATGTTTACTGC
-+
-=0;%1936+?96?,?5<:2>@6@<:;4>.7;*:1
-@1831_575_1157/1
-TCGCTGTTTAGATTTCGGGAGGGTACTTCAGTGC
-+
-B@B>?A?A@?9'?;?&8?@@6;<@=+<:99+965
-@1831_575_1180/1
-GAATTCACGGCAGTGTTATCACCGTTTCCTTCCA
-+
-<B>5?':/78?;1;55:997@@>94=7<186->7
-@1831_575_1283/1
-GGTGGAATACTAAGGACTAATGTGCTGTCTCTTT
-+
-C@A54><?A78@<?2>:#>=?@2>80:'?69.'7
-@1831_575_1302/1
-CGACTATTCGTTTCGTCTAGAACGTGACACTAGC
-+
-12>/#2'&-2&%'7+$%*#$/1(&&12/$,2,,*
-@1831_575_1310/1
-CTTGCTCTCGAGCTATGCCTCAGGACACGCCCTT
-+
-<<>663?99@(@7=11@:@@/7??<@<;>'3-7;
-@1831_575_1321/1
-CAACACAGTTGAACGGCGGAGGAGTAAAGATGCG
-+
-;B@?@>=A@<A?>@>?6>@5>'4@9?)7@7?/89
-@1831_575_1373/1
-CGCTACCGGTTCCAACGGCTGCCTGACTCGCGGA
-+
-@@@>@;=9<@??7@>@:@;@;17?630/7=4,2<
-@1831_575_1419/1
-TGGGGAATATAACAGCGTAGCGTTGAACACTAGA
-+
-//3->&-.->%11/@&/&7:<,-1=,+2<6'%&<
-@1831_575_1436/1
-TGCATCTAGCGCGTATTGCGAGCCTTACGGATTC
-+
-2@=;39*3<*4<:>52>>9'7:<='0=>1'136<
-@1831_575_1442/1
-TCTGACAAGGTTCCTGCACCTGCGTCTGAGAGGG
-+
->58<?7>+1B6-/9<<:5?>A:1@?539.@4/1>
-@1831_575_1454/1
-CCTCCTAACCACGAGCCGAGGGGTCTCTGCCCCT
-+
-4=?8=6589=0:A=:?>6<;@/,4+-6+/'.,(,
-@1831_575_1500/1
-CACAAAAGGTCCCTACCTGTCTACCCTACATAGC
-+
-?@@?A@?8<6<:985=99999==B3<5<<,7?>9
-@1831_575_1535/1
-CTCGACGATATGACCGCCAGCCACTTAACTCCGC
-+
-B=@<@@B?:A@@=>@?68@=?@5?7;:6<<;>5<
-@1831_575_1724/1
-TCGTAAGTGTTAAGGAGCTGTGTACAAAACAACA
-+
-<B.+@),2*.%)))4%2@;7#%(%+$8))85%&5
-@1831_575_1829/1
-CATTTGCTGACCCTGCGTAGTTTAGTCTCACAGC
-+
-2(*'%.3$+7)@&%$'3*+*#/#/*+0.=&#)+0
-@1831_575_1898/1
-CTTACCATATCATCTCAACCCATAACAGCACTTA
-+
-B>@@&1/))'40)%#8/.%#8$((#;4'$'63,,
-@1831_575_1964/1
-GACAGACCATGAGGCTGAAGACTACTAAGTGCGT
-+
->39)@2<2/@+9?2=&)>>@*62=5&2<42.'?+
-@1831_576_32/1
-TACGCAACGATTTATGGCCTTATAATTGAGGCCA
-+
-<>?>?=7<2)522;><<@40@>704<>5=23@+&
-@1831_576_74/1
-ACATTCTGCAGTGGGACAGAGCGGTACGCCGCAA
-+
-=@@?@>(??<B5?@@@9<@><+><;@';>6961?
-@1831_576_86/1
-ATGAAAACGCATTAGGACAACCATAATGGCCTCA
-+
-811)2:*.++5</:3+43924*))/:,6&29)2/
-@1831_576_89/1
-GCTGTTTGATTTGAGAAGAGGAATTAAGCGCCGA
-+
-)69+,'.4=-,>/>(*$#)3030*'(,%)2##$,
-@1831_576_266/1
-ATGGGGTCACTCGACCTAATCCCGCGGCTTTGGT
-+
-@@?=;<?7=@>9,>@1$&&89$/:>7'3178%&6
-@1831_576_327/1
-GCCGTTCTACTCTAGCTGCAACTTGCGATTGCTA
-+
-@?@6@@;<@?><@>==3@:==<3@@>53<9><6=
-@1831_576_331/1
-GACGCTTTACTCCGGTAGTACCGTGCCGTTTATA
-+
--2)+(*.*1/;5%.-9&#/1'+($*$##()%/$.
-@1831_576_387/1
-ACACGCCATGATCCGATAAGAAGGGAACGTAAGG
-+
-8).$5#1#*%.$##.*#$%##-%,+,1#&%.%))
-@1831_576_406/1
-AGGTCTTACAGCACGGGGCTGAGCGCATCTGACC
-+
-4<>%%14:*4656)&<251&2+3#&19,6&4>5(
-@1831_576_449/1
-CTCGAACCGCGGGGTCCAAAGACTGCTGCAAGGA
-+
-+'&'.,,$/+.)$$8&%#+?&,#)-&###7,+#*
-@1831_576_519/1
-TACCTGCCTACTACTTGCTCTCGAGCTATGCCTC
-+
-=46<97@>2/6?;2<4A881>9121+<1/4.9+7
-@1831_576_603/1
-CAATATGTCTTAGTCGTGACTCGGCAACTTATCC
-+
-@46=@C.??<A79@@;-<@@>29B?>55<B7598
-@1831_576_655/1
-GAACAGTCTATAGTGGCGGGAATCTCGTCGTCAG
-+
-@AA9@@<6*>@@5/<@>9'=;>7+@?9>/9;+,%
-@1831_576_677/1
-TTTACTCAGTTGATACATCACTGTAGCACATAGG
-+
-290&/*0#&'&,.2'#&*$&('#-%($*#%$)#%
-@1831_576_718/1
-CGTGCCTTTCAGGGTCTTTTCTGGTCTGGTCGCT
-+
-4###$0###%(#########,####%####$###
-@1831_576_722/1
-CGTATGATGGCGAGTCTTTATAATCCAATCTGAA
-+
-*,-,##.)*&(*1%*(%(-2#+)-#.&-#%%$')
-@1831_576_754/1
-AGGCGTCCTGCATCGACCGTTCTATCCGCTTAGA
-+
-4//#(.$)'',>($<,##%((,#5?#0*%1*
-@1831_576_815/1
-TAGGCCTGATATGACACGATCACAGTGCAACATC
-+
-3>@?9>@?B=>=;>A???=>:25=4.25?6<57.
-@1831_576_882/1
-TGTAAGACGGTGAGGTGTAAGGATCAGACCACGG
-+
-26?8?@:4>@>96??<<=5'1<>9846=<9<1>8
-@1831_576_898/1
-AGTACTGTCGCGCATTGGGGTCCTGGTCGTTGCT
-+
-@@C2?C>?<>@886B?;?.??87=B<8<15??=.
-@1831_576_923/1
-CTGGACATGAGAGACTGCACGCGGTACACGTCGG
-+
-6.51=;.699<96>;;49<;;11;<@59:9=647
-@1831_576_930/1
-CTGGCATGTACGTCCATGTCAGACGAGCAGAACT
-+
-#*0.2&.:((#'14'##-)#%$$2%#$/1&#%/#
-@1831_576_1019/1
-GATGCGCGCTGTCATGGCATCGAACCATCGGTCG
-+
-<$>$,1,&++&@,.)'+/+#9'69/6'2(+-'9-
-@1831_576_1068/1
-AAGAGTGACTCACTTACCGGGATGCGATGGAGCC
-+
->><=4?;@7=??9?;9>5@9?:8@:=5';7;'#4
-@1831_576_1131/1
-AGTTCGGGAAGGGCTGGAATCTACCCAGTAGGCA
-+
-04@#@/@,4>9?2+?1571@',>=;(759;*92<
-@1831_576_1168/1
-CACTTAACTCCGCTGTCGGAAGCCTTACAAGACA
-+
-@CC6@@2?9=>7?;76<;467@;9,0%26'',4$
-@1831_576_1207/1
-CAACCTGACTAAACGGGGATACGCTGGCGCTACA
-+
-$>2,(&?4?(,@:<&,@>?$&:8A%%=0.%,597
-@1831_576_1289/1
-TAGCGCAAGTCCAGAATGTTCATAGACTCGCGAT
-+
-9<>1B@@;7@@663==28,5':8<<,.=2>>.50
-@1831_576_1329/1
-CCAATAGCAGAGACCTAATAGGAAACGAAAGCAA
-+
->&0,870/A@@/5.;=;:'&@3'&$$%,+#($&2
-@1831_576_1367/1
-GGTCTCATCCGTTCCAATCGGGACTTTGACCAGT
-+
-?@@<>@@=@<@<=@>@??9:?<=>=<8;59@787
-@1831_576_1416/1
-TAGCGTTCAACGTCGATCTCATCTTGCCGATGGC
-+
-';?..1.<@'.=+6.5?7<0-?7;(%=>56.98@
-@1831_576_1461/1
-GAGGGGCGGCCCGGTTCAAGCAGGTAAGCAACAA
-+
-1&74#(#(&##$#,'###%#%%#*#&%%##%%%'
-@1831_576_1605/1
-AGTGCAACATCTGCTTTGCTTATCAGCACACGGC
-+
-<@C@@>1;@:;<<@@9@???9<3?5-21=4877,
-@1831_576_1664/1
-CGCGCACAACTCGCCATGATACGACAAGACCCGA
-+
-@?>?@=A:@@>@='=<>=).>=9*8)(7#/++;)
-@1831_576_1671/1
-GTCTTTGTAAGCCTGGCCTGGTCAGGTCTGGTCT
-+
-@?@5>@@8&8?25#&)&5&&)15&&,&4%&,&6%
-@1831_576_1729/1
-CGTTTCGTCTACAACGTGACACTAGCACAGTATA
-+
-?@?<?<@>A?/==?>?7>?@8<?@>99;><+0=>
-@1831_576_1880/1
-TATGCGCTGTTGAGCTTACAACTCACTAGCGAAT
-+
-515/792,:,7/%/05,%$):+#8%2(1754))3
-@1831_576_1982/1
-AATGTCGTCAGACGACTTTGGCGCGAAAACCATA
-+
-@@?@,A><@9@=?@9B=8<6@@6@2<A?>.7<+@
-@1831_576_1987/1
-AAGGTCTTCTGTCGGCGCTGGACTGAACACCTGA
-+
-##()(#&##)%)/-#%$11#%3>'##&$,#$$'+
-@1831_576_2014/1
-CCGTGACACACAATGCCGGCCCCAGCCTAGCAAT
-+
-@@9,B29-5>'?,+?79+/A';'2@'5&/9,6&1
-@1831_576_2028/1
-ACTCGCCGCATCCCCGAGTGACGCTCGAGACCAA
-+
-<>9>5'2(&707.8#&&39,0%7/#(#,*%&5*+
-@1831_577_40/1
-CCCCGCGTTACGAACGAGAGAAATCTCTTATAAT
-+
-2/4('.')(<*?#$)%&<,/39<(.2,+<=@611
-@1831_577_119/1
-TCCCACAAGCCATTGACATGCTCGCTCTAAACAG
-+
->?C11)-1/)#;#/,850*+.+$$5550+%-.40
-@1831_577_133/1
-TGCTTGTACGGTCTAACGGGGTATGGGTTTCTGG
-+
-4@>>?=1?:+>@07@@><>@*<+1@15)96'2$)
-@1831_577_255/1
-ATTGAGGCCAAGATAATTGAGGAGAGAGAAGGTG
-+
-<=87@>69%**#&#-+$.#&&#+$-+%&%.,%5#
-@1831_577_281/1
-TATGTACGTCGCGTACACTCCGGGGCCCGCAAAA
-+
--:B;8@=;>7@>4?=?+659?;5<7?;9@8(>:?
-@1831_577_288/1
-CATCCGAGGCTATCAAGGCGTAAGCACTGACCTA
-+
-;/79??&=B::298*6.7/+4&21,7,6?.7#'6
-@1831_577_322/1
-GAATGCTGGAGTACATTATGACAAACTATCGGAG
-+
-=;>4506;255464-<#7+194&2<?65968)7/
-@1831_577_362/1
-CGATTAGTTACCACTCGTATTCGCACGCCCAGGA
-+
-2B?:@?@<?958=,3:,90:&'-99,6<5.($+6
-@1831_577_382/1
-GTCGCGTATTCCCCGATGCTATGTAGACTTGCAA
-+
-2957/:1))=76(*24;,3+:<.&.&-=1=2/5*
-@1831_577_464/1
-TAGAGGCACCCTAACTCAGGGCTTTCTCGATTAG
-+
-=<7/<826)>#.'&4204+5#/041.7*91&756
-@1831_577_488/1
-TGAATAGTTATGGCCAGAATGTCTGCACCGATAC
-+
-48.,*>6566<?8=<=<2>6;94>;=9>@8924@
-@1831_577_511/1
-GGTGCTTATCAGTTCTTTCTCGGGACTTGTATTT
-+
-7/+&$:<7%6,$$%'%/+)#$7((&*3>16'0/+
-@1831_577_545/1
-ACCGCTCTTTGGGTATGGGGCAATCTGGCATGTT
-+
-><<9?<>?A<481@<@8==@76/61<95.5988-
-@1831_577_559/1
-GTGCCACTATGTTCGACAGACCCTAAGGCGGAAG
-+
-<@;??@>@?/2<.@1=>12=61/;=?.&2+92)'
-@1831_577_562/1
-GTTCCACTACGTTCCACGCAAAGGAATCCGAATC
-+
-((&*&0%)1%)#($2-,***%/-,,))&,-.1'*
-@1831_577_637/1
-GCCTTCGCGGGAGCATATCAGTCGATACATCCCA
-+
--,4#>:-6+:8,&(5;3=0>7=68&1/9&'?;4,
-@1831_577_641/1
-TATCTACCACCGCGGTGGCGCGAGAATGCTCCCT
-+
-47;/':A;;5?:72,(=),#*?+.#&7$8#%7/'
-@1831_577_692/1
-CCGGTGAGAATTACATCGCGAGTACGCCCAAGGA
-+
-B,@?@B(@A?@+@@>@+?=>@'=<@<=<9=?75<
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_wrapper_in2.fastq
--- a/test-data/bwa_wrapper_in2.fastq Fri Jan 22 08:47:05 2010 -0500
+++ b/test-data/bwa_wrapper_in2.fastq Fri Jan 22 10:49:38 2010 -0500
@@ -1,576 +1,4 @@
-@1831_573_1004/1
-AATACTTTCGGCGCCCTAAACCAGCTCACTGGGG
-+
-><C&&9952+C>5<.?<79,=42<292:<(9/-7
-@1831_573_1050/1
-TTTATGGGTATGGCCGCTCACAGGCCAGCGGCCT
-+
-;@@17?@=>7??@A8?==@4A?A4)&+.'&+'1,
-@1831_573_1067/1
-AAGTATGAGTCATTTACCGGGATGCGAAGAAAAG
-+
-++#%(',%/$,+&1#&),)&+'*'*%#$&#%('$
-@1831_573_1219/1
-CGCCCTATAATAATACAGCGCGTTAGACCGCTCA
-+
-@@=4/+)5)408?'665>*/5?<61';<3,:,5-
-@1831_573_1242/1
-GCTGAATCGCACCTAGCAACTATAGCCGGGCCGC
-+
->>::>17=A5?@@=;7A=;2.60>82<8=74+;;
-@1831_573_1333/1
-AGAATCGTTACCACACACTGCGTCTGGGTATCCG
-+
-='@#%3=.>)/34*117,,/6-4+.9742456<)
-@1831_573_1362/1
-CGATCTCAACCAGGTCCGCGCCCACCCCTGCCTC
-+
-B@@?@@?@C@BA?@>@<@8A@?@'.8'?17:,+?
-@1831_573_1448/1
-TCACGCCGGTCCTTGACTGGCGTTCTCTTCGAGG
-+
-7=A)?,.@A@@:@@<=/7)@<-#8662%9613&+
-@1831_573_1490/1
-CTCGTCATGTTACGCAAAGGCACGTCACAGCACC
-+
-@@@?,@??@$><=>+%/*>*1,)?26&12'9%7.
-@1831_573_1523/1
-ATGGAACGGAACGGGTGAGGAGGGGAACGTAGGG
-+
-,//*,#8''.6''6'2&27/80)%�'%#*,2'
-@1831_573_1578/1
-CGAGTAGCAAACAAGACGCCAATCCAGGCGACCC
-+
-?=@<@C@?@@??=>@;7<<8<694)3511(+1<.
-@1831_573_1647/1
-AGGGGTTTACACTATTCGACTGGGTGAGAGGCGT
-+
-?@@<@@???;A==@@;9?@?3=;6.4/;6:=/;4
-@1831_573_1684/1
-TTCAACTGCGTCGACGTAGCGCACAGGCGTCCGT
-+
->1:8<@39@@??9=;@@<>?@@<;<?7>76?9>?
-@1831_573_1769/1
-TGGACGTATAGTGGCGATGAGCATGTAGGTTCTC
-+
-54749&&767%/7;3$-7;3#,3//#,45/#&06
-@1831_573_1853/1
-CAAAACGCCCGGGGCCTCACATGCGCGGCAGTTC
-+
-4./B@@72B+/4?@?7?+@9/+99.')2<2&)2&
-@1831_573_1943/1
-ATAACGTATGGCAGTGAACGGGCGGAACCTGCCC
-+
->/*1,),@-)'0*>5'$/?6(a)/.&?8/(')A43,
-@1831_573_1977/1
-GGCGTAGGGCTCATTGTGCAAGTATCCGACCTCC
-+
-@?6@8@@9A@=4633A7?9?<3:+7>'@%@?%32
-@1831_574_109/1
-TCGGTTGCGTTACTTCATGGGAGGGCTTTACATT
-+
-7651#4817>@65<2:84716=788<1995.7?6
-@1831_574_148/1
-CGAACCTCGTATAACGGAGTAGTCGGAAACAGTC
-+
-;->3;;3>//>0;;7=,=4-4/+>029<9<624;
-@1831_574_185/1
-CCGTTTTGCCTAGTAATGCTCGGCGCAGCGTCGC
-+
-<4;%%@7>#*>97%6;+8$#<07%1372$%<54#
-@1831_574_243/1
-AGGCACCGTAACTCAGGACATTCTCGATTAGTTA
-+
-@@@95@=9?*><45$<@<4%@9?7#=?>7&>?97
-@1831_574_257/1
-ATACCTTCCAAAGCAATAGAATAAAAAACAGTAC
-+
->>B>)@?>B@B?@1%*%,#+00.'(+&5&%#$3&
-@1831_574_293/1
-TGCTGCAAATAAACATACAGCCTTCTAATGACTA
-+
-')7'.*%#&$'/.$##$.$&*)+*$#8%&%#&&%
-@1831_574_389/1
-CATGGCTATGCACCGGTTTGTAGCGTACTCGAGA
-+
-)$>/>8):2@:213;;.1)@3%64%+)<7)+$92
-@1831_574_575/1
-TTCTTGGCAAGCGCAGATTATGCGTTCCGCCTAG
-+
-?@>=?@>8@@@=@6*%&<='5@<<',0<=4*5/<
-@1831_574_592/1
-TCATTTACCACGTCAGGGTCGGAGTCATTCATTA
-+
-3-5)19,,<@>4067<2.-864346;9<1/;212
-@1831_574_617/1
-AAGCATCGGCGGGAGCGCAAGCTGGGAAGGTGCC
-+
->@?;>?=@==@>@=5?@+@:@40@><:0)')64-
-@1831_574_725/1
-GACAAGATGGCTATTATTTACAATCCGATCTGCA
-+
-'>?52+5=;4$6;<8.1<47*9+?7(+5;-).)4
-@1831_574_734/1
-CCTGTACGAAAGAACGTAGGCATGGGCTGGGGGG
-+
--&.$2&<*(-%):/)%5:)/%7+,9034*A.?70
-@1831_574_824/1
-AGCGCAAATTATGCGTTCCGCCTAGCGGAGAACT
-+
-@@@;;),+@<-<7;<&89??&29?<$2:A<);8?
-@1831_574_959/1
-CGCGCTAGGACTCGGCCCCAAGAGACGTTCCGCC
-+
-A=;+?@9;/<@;<8#&&/*%(%.0$0$2)+1$-1
-@1831_574_1062/1
-ACCGGTAATATAAGGCAACATGATTACGGCCACG
-+
-@821<//:136/8<1/5.427.;>288/0<1$)/
-@1831_574_1092/1
-GACTGGCGAAATCATCGCGGAAAAACCCCTATCA
-+
-8?.,98)03%#,,,(,++$'69'#9'7#';6.%2
-@1831_574_1103/1
-ATCTCCTGATTAGACATATCTCCGTAGCTCACGC
-+
-??>?@=>@@A<>?=@==<:?<;58'&&):+35'1
-@1831_574_1116/1
-CACCTCACGTGAGTATAGCAGCCCGAGCGTCACC
-+
-(a)++,)/)?./)%<)2>.==:8?&;44&/&,)/*4
-@1831_574_1194/1
-TTATCACATTTGGGGATCGGAAGGGACTACTTCG
-+
-5>;,??9@9@?@1@@=@3=@>@4?@@94?75/,6
-@1831_574_1204/1
-CTTACTGGTCTGCTGGACATATAGTGGCGATGAA
-+
-A5A5B@5:;@@,.9?A1?#.?;3),>82%)='7*
-@1831_574_1306/1
-ATTGCTTAGATCCAGTGGCGCTCAATACAACGGA
-+
-2.7&%''.$&#'%##$#'#%')')$'$%$,)'.1
-@1831_574_1387/1
-GTACTTCTCAATGCTGCACTACTATGTACGCCCC
-+
-?A??:@?@@9?@@?9C;:>&).,,);&'<&7(/'
-@1831_574_1431/1
-GACCAGTTTCAGGGCTAACCGTCCCTACTCGACC
-+
-7?>9BA897;+8*=6#6.+5&-#26$0.,5&'$1
-@1831_574_1560/1
-GGCGTCTTAGGATTGAAGAGGGCCTCCCACCCCC
-+
-))&65<4=>99@:597(1&;+&(%&4#,#&&&*$
-@1831_574_1591/1
-TGAGCACTTATGGCTAGGCGTAGGGGACCGTGAG
-+
-=<A><?@78@<=;@&@6>8:?,><&&<7>8(8+9
-@1831_574_1624/1
-ACGGGAAGGGCTGGAATCTACCCAGTAGGCATTG
-+
-<6.&(,7-+))7..'/;43.)927.(<85&13-)
-@1831_574_1826/1
-TACGTCGCGACCGAGCGTTATATAGTCTGACCCC
-+
-@<<,))459<?.+57'-'&6?1)(;1;0&%4,#$
-@1831_574_1903/1
-AGTGCAACATCTGCTTTGCTTATCAGCACACGGC
-+
-956?@>;7@@@8:@>8><=9>9>@2=71?1:6;/
-@1831_574_1961/1
-GTTTCACTTCGGTTATTAAGAAACCCAAATGGAA
-+
->-07-@>(2'@<#064@%5%@@6.&<<(9)=:47
-@1831_575_54/1
-TTTCTTATGGGTAGAACAGCTGCCACTGACTGAA
-+
-=@@68<2;<8;?@<>+9>7,,6972&57:4&9<8
-@1831_575_80/1
-TCTTTGGGTTTGGGGCAATTTGGTATGTTCGTCT
-+
-?5><@?/=5%(&.5)+#/0'/'>#$/'37#()6&
-@1831_575_192/1
-AACTACGCCCCTTAATTACACAGCGCGTTAGACC
-+
-:8<,9(.=/)#%8$,4'<,:)3/.'.5<,>-;7'
-@1831_575_197/1
-TTCGCCTACACTTAGATACCTCTTAAACTCAATG
-+
--:?463@A:88?6?437<=.2&1.;@67.4@%2,
-@1831_575_223/1
-ACGCACAAAGGAGCTCGGCGCATAGCAACGCAGA
-+
-?>?8?@:?;>+$'%&,+#$.--#%$1'&#-7$&'
-@1831_575_420/1
-CCCACATGGAAAACACTCACCGCCGAACAGAGCG
-+
-2?.>?(-''2+..@),$%1@;')1)?+)7.')..
-@1831_575_434/1
-ATCGCTGCGAGGTCACCCTGGTTACGCCCCTTCC
-+
-@@><@B@>=@@?>><@?;)@?;6.?=4,'';/3)
-@1831_575_444/1
-TAGGCGACCGTGAGGACAAGAGCTGTTGCCTTGA
-+
-2@@;<.=?@<+=:A<<@?<</>@><(<8>4&5;>
-@1831_575_459/1
-CTTATCAGCACACGGTTTACCAGTCCGACTCCAA
-+
-@@C@?A@@A@??A@@'6@@B'=;C@'4<=9,@1.
-@1831_575_506/1
-CGCAGAACCCGCACGCTTGTGCTCACCACTGTAC
-+
-?)2*5@3+.7=?A:8@,/&):@37/<89'+4*)*
-@1831_575_569/1
-AGCAGACTGCTGTAACACGGTGTGGTGTAAGGAT
-+
-'9-,@29+479%&>9#&08=>7#9>,69/+'*3)
-@1831_575_622/1
-CCAAATCCGGCCCAGTAAGTGTCCTGTCGCACCC
-+
-A8B=@@?<@?<>>=?96<497)<4/<':4+;74+
-@1831_575_644/1
-CTTGAATGGCGATCTCGTCGAGGAAATACCACTA
-+
-<8>.>&,+)8.10':5(/-62&*.=/%(.<&&18
-@1831_575_663/1
-GGCAACTTATCCGCATTGGTCCCACTGGAGCGCA
-+
-@@@@A</;A>@6>0792<5966:?;25+:><1,+
-@1831_575_681/1
-TCTCCTGATTAGACATATCACTGTTGAACACAGC
-+
-72?.)25;96-14'*.03'#4#++$)/8+%/((&
-@1831_575_711/1
-TATGTTCGTCCACGTCAGACGCGCAAAGTTGCGC
-+
-%+:2(#'1+.)&*45-#,<A-%4;>+))<;##*&
-@1831_575_730/1
-CACACAGGAACCATAGCGTATGTTATTCACCCCC
-+
-%8<%-')5,*1&=#)(1*1)->7$.,4'4'&'*&
-@1831_575_904/1
-ACCCGCTTAAAGACGTGAATTTTGCCTCCGCGCC
-+
-<><.689@@7@<54:4=@>69=:+6-=42;8<:#
-@1831_575_938/1
-TCATCAGGGAAGGCTAGGGGTTTACACTATTCGA
-+
-:@@:?@;=8;>=;;:=<93<4.;<6:2<9;4)87
-@1831_575_970/1
-TGACTCCTACAGTCTTTATAGTACCGAGGGAGGC
-+
-@=@=;@@><@@:9<:=?;>@=?9>>?@:2===<5
-@1831_575_991/1
-TTCGGCGATCCCCCCCACGGCGCGATGCCGCGCA
-+
->>;7???/4<:::,#&*%'$--5-#(7)&&,-)%
-@1831_575_1138/1
-TTGAAAGACCTGAACGCGATTTCATGTTTACTGC
-+
-=0;%1936+?96?,?5<:2>@6@<:;4>.7;*:1
-@1831_575_1157/1
-TCGCTGTTTAGATTTCGGGAGGGTACTTCAGTGC
-+
-B@B>?A?A@?9'?;?&8?@@6;<@=+<:99+965
-@1831_575_1180/1
-GAATTCACGGCAGTGTTATCACCGTTTCCTTCCA
-+
-<B>5?':/78?;1;55:997@@>94=7<186->7
-@1831_575_1283/1
-GGTGGAATACTAAGGACTAATGTGCTGTCTCTTT
-+
-C@A54><?A78@<?2>:#>=?@2>80:'?69.'7
-@1831_575_1302/1
-CGACTATTCGTTTCGTCTAGAACGTGACACTAGC
-+
-12>/#2'&-2&%'7+$%*#$/1(&&12/$,2,,*
-@1831_575_1310/1
-CTTGCTCTCGAGCTATGCCTCAGGACACGCCCTT
-+
-<<>663?99@(@7=11@:@@/7??<@<;>'3-7;
-@1831_575_1321/1
-CAACACAGTTGAACGGCGGAGGAGTAAAGATGCG
-+
-;B@?@>=A@<A?>@>?6>@5>'4@9?)7@7?/89
-@1831_575_1373/1
-CGCTACCGGTTCCAACGGCTGCCTGACTCGCGGA
-+
-@@@>@;=9<@??7@>@:@;@;17?630/7=4,2<
-@1831_575_1419/1
-TGGGGAATATAACAGCGTAGCGTTGAACACTAGA
-+
-//3->&-.->%11/@&/&7:<,-1=,+2<6'%&<
-@1831_575_1436/1
-TGCATCTAGCGCGTATTGCGAGCCTTACGGATTC
-+
-2@=;39*3<*4<:>52>>9'7:<='0=>1'136<
-@1831_575_1442/1
-TCTGACAAGGTTCCTGCACCTGCGTCTGAGAGGG
-+
->58<?7>+1B6-/9<<:5?>A:1@?539.@4/1>
-@1831_575_1454/1
-CCTCCTAACCACGAGCCGAGGGGTCTCTGCCCCT
-+
-4=?8=6589=0:A=:?>6<;@/,4+-6+/'.,(,
-@1831_575_1500/1
-CACAAAAGGTCCCTACCTGTCTACCCTACATAGC
-+
-?@@?A@?8<6<:985=99999==B3<5<<,7?>9
-@1831_575_1535/1
-CTCGACGATATGACCGCCAGCCACTTAACTCCGC
-+
-B=@<@@B?:A@@=>@?68@=?@5?7;:6<<;>5<
-@1831_575_1724/1
-TCGTAAGTGTTAAGGAGCTGTGTACAAAACAACA
-+
-<B.+@),2*.%)))4%2@;7#%(%+$8))85%&5
-@1831_575_1829/1
-CATTTGCTGACCCTGCGTAGTTTAGTCTCACAGC
-+
-2(*'%.3$+7)@&%$'3*+*#/#/*+0.=&#)+0
-@1831_575_1898/1
-CTTACCATATCATCTCAACCCATAACAGCACTTA
-+
-B>@@&1/))'40)%#8/.%#8$((#;4'$'63,,
-@1831_575_1964/1
-GACAGACCATGAGGCTGAAGACTACTAAGTGCGT
-+
->39)@2<2/@+9?2=&)>>@*62=5&2<42.'?+
-@1831_576_32/1
-TACGCAACGATTTATGGCCTTATAATTGAGGCCA
-+
-<>?>?=7<2)522;><<@40@>704<>5=23@+&
-@1831_576_74/1
-ACATTCTGCAGTGGGACAGAGCGGTACGCCGCAA
-+
-=@@?@>(??<B5?@@@9<@><+><;@';>6961?
-@1831_576_86/1
-ATGAAAACGCATTAGGACAACCATAATGGCCTCA
-+
-811)2:*.++5</:3+43924*))/:,6&29)2/
-@1831_576_89/1
-GCTGTTTGATTTGAGAAGAGGAATTAAGCGCCGA
-+
-)69+,'.4=-,>/>(*$#)3030*'(,%)2##$,
-@1831_576_266/1
-ATGGGGTCACTCGACCTAATCCCGCGGCTTTGGT
-+
-@@?=;<?7=@>9,>@1$&&89$/:>7'3178%&6
-@1831_576_327/1
-GCCGTTCTACTCTAGCTGCAACTTGCGATTGCTA
-+
-@?@6@@;<@?><@>==3@:==<3@@>53<9><6=
-@1831_576_331/1
-GACGCTTTACTCCGGTAGTACCGTGCCGTTTATA
-+
--2)+(*.*1/;5%.-9&#/1'+($*$##()%/$.
-@1831_576_387/1
-ACACGCCATGATCCGATAAGAAGGGAACGTAAGG
-+
-8).$5#1#*%.$##.*#$%##-%,+,1#&%.%))
-@1831_576_406/1
-AGGTCTTACAGCACGGGGCTGAGCGCATCTGACC
-+
-4<>%%14:*4656)&<251&2+3#&19,6&4>5(
-@1831_576_449/1
-CTCGAACCGCGGGGTCCAAAGACTGCTGCAAGGA
-+
-+'&'.,,$/+.)$$8&%#+?&,#)-&###7,+#*
-@1831_576_519/1
-TACCTGCCTACTACTTGCTCTCGAGCTATGCCTC
-+
-=46<97@>2/6?;2<4A881>9121+<1/4.9+7
-@1831_576_603/1
-CAATATGTCTTAGTCGTGACTCGGCAACTTATCC
-+
-@46=@C.??<A79@@;-<@@>29B?>55<B7598
-@1831_576_655/1
-GAACAGTCTATAGTGGCGGGAATCTCGTCGTCAG
-+
-@AA9@@<6*>@@5/<@>9'=;>7+@?9>/9;+,%
-@1831_576_677/1
-TTTACTCAGTTGATACATCACTGTAGCACATAGG
-+
-290&/*0#&'&,.2'#&*$&('#-%($*#%$)#%
-@1831_576_718/1
-CGTGCCTTTCAGGGTCTTTTCTGGTCTGGTCGCT
-+
-4###$0###%(#########,####%####$###
-@1831_576_722/1
-CGTATGATGGCGAGTCTTTATAATCCAATCTGAA
-+
-*,-,##.)*&(*1%*(%(-2#+)-#.&-#%%$')
-@1831_576_754/1
-AGGCGTCCTGCATCGACCGTTCTATCCGCTTAGA
-+
-4//#(.$)'',>($<,##%((,#5?#0*%1*
-@1831_576_815/1
-TAGGCCTGATATGACACGATCACAGTGCAACATC
-+
-3>@?9>@?B=>=;>A???=>:25=4.25?6<57.
-@1831_576_882/1
-TGTAAGACGGTGAGGTGTAAGGATCAGACCACGG
-+
-26?8?@:4>@>96??<<=5'1<>9846=<9<1>8
-@1831_576_898/1
-AGTACTGTCGCGCATTGGGGTCCTGGTCGTTGCT
-+
-@@C2?C>?<>@886B?;?.??87=B<8<15??=.
-@1831_576_923/1
-CTGGACATGAGAGACTGCACGCGGTACACGTCGG
-+
-6.51=;.699<96>;;49<;;11;<@59:9=647
-@1831_576_930/1
-CTGGCATGTACGTCCATGTCAGACGAGCAGAACT
-+
-#*0.2&.:((#'14'##-)#%$$2%#$/1&#%/#
-@1831_576_1019/1
-GATGCGCGCTGTCATGGCATCGAACCATCGGTCG
-+
-<$>$,1,&++&@,.)'+/+#9'69/6'2(+-'9-
-@1831_576_1068/1
-AAGAGTGACTCACTTACCGGGATGCGATGGAGCC
-+
->><=4?;@7=??9?;9>5@9?:8@:=5';7;'#4
-@1831_576_1131/1
-AGTTCGGGAAGGGCTGGAATCTACCCAGTAGGCA
-+
-04@#@/@,4>9?2+?1571@',>=;(759;*92<
-@1831_576_1168/1
-CACTTAACTCCGCTGTCGGAAGCCTTACAAGACA
-+
-@CC6@@2?9=>7?;76<;467@;9,0%26'',4$
-@1831_576_1207/1
-CAACCTGACTAAACGGGGATACGCTGGCGCTACA
-+
-$>2,(&?4?(,@:<&,@>?$&:8A%%=0.%,597
-@1831_576_1289/1
-TAGCGCAAGTCCAGAATGTTCATAGACTCGCGAT
-+
-9<>1B@@;7@@663==28,5':8<<,.=2>>.50
-@1831_576_1329/1
-CCAATAGCAGAGACCTAATAGGAAACGAAAGCAA
-+
->&0,870/A@@/5.;=;:'&@3'&$$%,+#($&2
-@1831_576_1367/1
-GGTCTCATCCGTTCCAATCGGGACTTTGACCAGT
-+
-?@@<>@@=@<@<=@>@??9:?<=>=<8;59@787
-@1831_576_1416/1
-TAGCGTTCAACGTCGATCTCATCTTGCCGATGGC
-+
-';?..1.<@'.=+6.5?7<0-?7;(%=>56.98@
-@1831_576_1461/1
-GAGGGGCGGCCCGGTTCAAGCAGGTAAGCAACAA
-+
-1&74#(#(&##$#,'###%#%%#*#&%%##%%%'
-@1831_576_1605/1
-AGTGCAACATCTGCTTTGCTTATCAGCACACGGC
-+
-<@C@@>1;@:;<<@@9@???9<3?5-21=4877,
-@1831_576_1664/1
-CGCGCACAACTCGCCATGATACGACAAGACCCGA
-+
-@?>?@=A:@@>@='=<>=).>=9*8)(7#/++;)
-@1831_576_1671/1
-GTCTTTGTAAGCCTGGCCTGGTCAGGTCTGGTCT
-+
-@?@5>@@8&8?25#&)&5&&)15&&,&4%&,&6%
-@1831_576_1729/1
-CGTTTCGTCTACAACGTGACACTAGCACAGTATA
-+
-?@?<?<@>A?/==?>?7>?@8<?@>99;><+0=>
-@1831_576_1880/1
-TATGCGCTGTTGAGCTTACAACTCACTAGCGAAT
-+
-515/792,:,7/%/05,%$):+#8%2(1754))3
-@1831_576_1982/1
-AATGTCGTCAGACGACTTTGGCGCGAAAACCATA
-+
-@@?@,A><@9@=?@9B=8<6@@6@2<A?>.7<+@
-@1831_576_1987/1
-AAGGTCTTCTGTCGGCGCTGGACTGAACACCTGA
-+
-##()(#&##)%)/-#%$11#%3>'##&$,#$$'+
-@1831_576_2014/1
-CCGTGACACACAATGCCGGCCCCAGCCTAGCAAT
-+
-@@9,B29-5>'?,+?79+/A';'2@'5&/9,6&1
-@1831_576_2028/1
-ACTCGCCGCATCCCCGAGTGACGCTCGAGACCAA
-+
-<>9>5'2(&707.8#&&39,0%7/#(#,*%&5*+
-@1831_577_40/1
-CCCCGCGTTACGAACGAGAGAAATCTCTTATAAT
-+
-2/4('.')(<*?#$)%&<,/39<(.2,+<=@611
-@1831_577_119/1
-TCCCACAAGCCATTGACATGCTCGCTCTAAACAG
-+
->?C11)-1/)#;#/,850*+.+$$5550+%-.40
-@1831_577_133/1
-TGCTTGTACGGTCTAACGGGGTATGGGTTTCTGG
-+
-4@>>?=1?:+>@07@@><>@*<+1@15)96'2$)
-@1831_577_255/1
-ATTGAGGCCAAGATAATTGAGGAGAGAGAAGGTG
-+
-<=87@>69%**#&#-+$.#&&#+$-+%&%.,%5#
-@1831_577_281/1
-TATGTACGTCGCGTACACTCCGGGGCCCGCAAAA
-+
--:B;8@=;>7@>4?=?+659?;5<7?;9@8(>:?
-@1831_577_288/1
-CATCCGAGGCTATCAAGGCGTAAGCACTGACCTA
-+
-;/79??&=B::298*6.7/+4&21,7,6?.7#'6
-@1831_577_322/1
-GAATGCTGGAGTACATTATGACAAACTATCGGAG
-+
-=;>4506;255464-<#7+194&2<?65968)7/
-@1831_577_362/1
-CGATTAGTTACCACTCGTATTCGCACGCCCAGGA
-+
-2B?:@?@<?958=,3:,90:&'-99,6<5.($+6
-@1831_577_382/1
-GTCGCGTATTCCCCGATGCTATGTAGACTTGCAA
-+
-2957/:1))=76(*24;,3+:<.&.&-=1=2/5*
-@1831_577_464/1
-TAGAGGCACCCTAACTCAGGGCTTTCTCGATTAG
-+
-=<7/<826)>#.'&4204+5#/041.7*91&756
-@1831_577_488/1
-TGAATAGTTATGGCCAGAATGTCTGCACCGATAC
-+
-48.,*>6566<?8=<=<2>6;94>;=9>@8924@
-@1831_577_511/1
-GGTGCTTATCAGTTCTTTCTCGGGACTTGTATTT
-+
-7/+&$:<7%6,$$%'%/+)#$7((&*3>16'0/+
-@1831_577_545/1
-ACCGCTCTTTGGGTATGGGGCAATCTGGCATGTT
-+
-><<9?<>?A<481@<@8==@76/61<95.5988-
-@1831_577_559/1
-GTGCCACTATGTTCGACAGACCCTAAGGCGGAAG
-+
-<@;??@>@?/2<.@1=>12=61/;=?.&2+92)'
-@1831_577_562/1
-GTTCCACTACGTTCCACGCAAAGGAATCCGAATC
-+
-((&*&0%)1%)#($2-,***%/-,,))&,-.1'*
-@1831_577_637/1
-GCCTTCGCGGGAGCATATCAGTCGATACATCCCA
-+
--,4#>:-6+:8,&(5;3=0>7=68&1/9&'?;4,
-@1831_577_641/1
-TATCTACCACCGCGGTGGCGCGAGAATGCTCCCT
-+
-47;/':A;;5?:72,(=),#*?+.#&7$8#%7/'
-@1831_577_692/1
-CCGGTGAGAATTACATCGCGAGTACGCCCAAGGA
-+
-B,@?@B(@A?@+@@>@+?=>@'=<@<=<9=?75<
+@081017-and-081020:1:1:1715:1759/2
+ACGCTCCTTTAAAATATC
++/2
+IIIII$%*$G$A31I&&B
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_wrapper_in3.fastq
--- a/test-data/bwa_wrapper_in3.fastq Fri Jan 22 08:47:05 2010 -0500
+++ b/test-data/bwa_wrapper_in3.fastq Fri Jan 22 10:49:38 2010 -0500
@@ -1,192 +1,4 @@
-@1378_11_329/2
-GTTCGTGGCCGGTGGGTGTTTGGG
-+
-###$$#$#$&#####$'$#$###$
-@1378_17_1788/2
-TGGGTGGATGTGTTGTCGTTCATG
-+
-#$#$###$#$#######$#$####
-@1378_25_2035/2
-GTGCGTCGGGGAGGGTGCTGTCGG
-+
-######%#$%#$$###($###&&%
-@1378_28_770/2
-GGTTGGGAGTTGGCGCGCGTGGTT
-+
-###$##%%$####%#%$#%%#($$
-@1378_33_1945/2
-GGGGGGGGGGGGGGGGGGGGGGGG
-+
-.6;?;55697>8779457986264
-@1378_34_789/2
-GGGCTTGCGTTAGTGAGAGGTTGT
-+
-###%$%$%%###$####$###$#&
-@1378_35_263/2
-GGCGGGGGGGGGGGGGGGGGGGGG
-+
-$%%&,)3/)%$-6'$&5&#$''5.
-@1378_43_186/2
-GCTAGGGTTTGGGTTTGCGGTGGG
-+
-$%#$########%##%#$###'#'
-@1378_51_1671/2
-GGTGTTGTTCGGATGTAGCGTGGG
-+
-##%$$####$########$##0##
-@1378_56_324/2
-GCTGGGTGATCTAAGGAATGTAAT
-+
-#$#####$$$#$$$$##%###*(#
-@1378_56_773/2
-TCTGGTCGGTTTCGGGGAGTGGAA
-+
-##%%#&$###$#$##%$####%%$
-@1378_62_2027/2
-GTTGGCCTGGCCTGCCGTGCTGCG
-+
-*##),/%##$)#%##1$#'%.#&#
-@1378_62_2029/2
-GGCGGTGTGTGGTGCGGCTGTGCG
-+
-/$$$=(####%####)$$%$-&%#
-@1378_67_1795/2
-CGTGCCAACGACCGTCCTACGGAG
-+
-@@.?7@@@.@:@A<<>>=>70<@7
-@1378_68_466/2
-GTGTCATCTGAGGTAAAGCATTGT
-+
-/##$09#$#.=$#$76+$%1'###
-@1378_68_1692/2
-TGTTCGATTTAGGTCTTGCCTCGC
-+
-###%%$%%##%$#$##$###$$#$
-@1378_80_664/2
-TGTCTGCGTTGTATCTCTGGTGTA
-+
-%##%,%$$#&$$###$#$%##'%#
-@1378_85_1786/2
-CCCTAGGAGCGTATACCGGACGAG
-+
-,'&/%/@,&1,&'/)&,6&&1)((
-@1378_86_1011/2
-AGGCGATGGGATATTATTTTACTT
-+
-:$###)%##$9$###1$$#$2###
-@1378_86_1789/2
-GGCCAGGTACTAATAAATTCAACA
-+
-1.51/&%#'$,*?%#6&0$$5,20
-@1378_91_1596/2
-GCTTTTTCATTCGGTGCCTTTGGA
-+
-'>%/3%=()8'#.%?50$&5>%)%
-@1378_94_1595/2
-GCGGGTTAACCCAGTACCTCTGGC
-+
-,8@6'>8<76>@@(->9)7'*941
-@1378_95_1039/2
-GTTCTGTGCCAGGTGAGGTACGGA
-+
-&##,./#$&)6##+,'#$$0(##$
-@1378_95_1767/2
-CTAATTGACCGGGCAAGCTATTAA
-+
-',,2'(10/>:=/7).3&%6&)&6
-@1378_96_1037/2
-CTGCTGGGCCATTTGACTTACTCA
-+
-'$#+#(##-%5##+*&###-.$$$
-@1378_96_1764/2
-TCTTTGTAACCCACTTAGTATTTC
-+
-4='28>.@4881B807:822>%)1
-@1378_98_1574/2
-AGGCGAGTGTGGGGGTTGTTTGAG
-+
-+%%$#)##%##$####%###$%$#
-@1378_107_1647/2
-GGTCTGGTTCTATGTTGGTCGACT
-+
-###'$$#$$$(#%###(#$##$%#
-@1378_111_829/2
-GGTCTTCTATGGTGCTAAATTAGT
-+
-$##'&###$##)#%($#$%#$'%#
-@1378_111_1900/2
-GCACGCCTTTGGGCTAAGCCGTAA
-+
-)$)'#%$########$'#&%$#(#
-@1378_112_1483/2
-TGGAGTGGTGTGTTTGCTGAGCCA
-+
-#$#)#############$#%#%'%
-@1378_125_1287/2
-TGACGTGGGTTGTCCCGTGAGATT
-+
-##$%%#$###$##$$#&%##$(%%
-@1378_126_468/2
-AAAAAACGGGCCGGGCGGACTAGG
-+
-@@B@@@>@2>1+?:92)>@8&&<+
-@1378_127_664/2
-TCGCTTTGCCTATGTTTGTTCGGA
-+
-#%$%#&##$%#%%###$$###)-'
-@1378_129_463/2
-AAAAAAAAAAAAAAAAAAAAAAAA
-+
-,)&20%8'(&35-***1-2&+510
-@1378_129_875/2
-GACCTTTACGTATTGGGGGTTGGC
-+
-###)###+###$##$#&%##$,#$
-@1378_140_1251/2
-TTTCCTTCGTGTGCGTGCGGAGTG
-+
-#%#%$##$$$######.$$$%#%(
-@1378_141_809/2
-TCTCGTGGTTTCTTTTTTATGTGT
-+
-##%)##$$#####%$#$#%%#'##
-@1378_144_983/2
-GTTCGTTCGTGGTGTACGAGGGTG
-+
-#(#%#####($#%##$$#%##%#)
-@1378_153_270/2
-GGCCGTGTGCGGGTGTAGATTGGA
-+
-%$##($######&##$&$$$$%##
-@1378_155_1689/2
-CGCGTTCGGACAAAGCTAGCACCT
-+
-@4@@=6=@@<4:@@681@@@.24.
-@1378_157_1580/2
-GGGATTGAAGGGATGTATGCTAGG
-+
-#%$&%#$$'%$%#$##*#%$$$$#
-@1378_161_317/2
-AATCCATACCCACAAAAGCAGGCC
-+
-.&%','(@''?7//+&)+2.+)0)
-@1378_177_735/2
-CGAGCCCTAAACCATGAGATCGGA
-+
-@@B>@AC9@A<B8@=9>7@5)>,0
-@1378_181_1684/2
-TTTCTGTTGTGGTTTTGTTGGGGT
-+
-$##'$%'##%##$%$#$$####$*
-@1378_187_1407/2
-TTGGGTGAAATCTTGTCGAGTGGA
-+
-####&##$$###$#####%##%%)
-@1378_203_721/2
-CCTTTACGATCATAAACCATGACC
-+
-9<&./1&@;12')?<1',?/)&/.
-@1378_206_2039/2
-CCCCCCCCCCCCCCCCCCCCCCCC
-+
-?=>>?=:;<>>4::<=56199(05
+@081017-and-081020:1:1:1715:1759/1
+GGACTCAGATAGTAATCC
++/1
+II#IIIIIII$5+.(9II
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_wrapper_in4.fastq
--- a/test-data/bwa_wrapper_in4.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,192 +0,0 @@
-@1378_11_329/1
-AGACCGGGCGGGGTGGCGTTCGGT
-+
-%##+'#######%###$#$##$(#
-@1378_17_1788/1
-TGCCGTGTCTTGCTAACGCCGATT
-+
-#'#$$#$###%%##$$$$######
-@1378_25_2035/1
-CTGCGTGTTGGTGTCTACTGGGGT
-+
-#%#'##$#$##&%#%$$$%#%#'#
-@1378_28_770/1
-CTGCTATGCCGGCCGCCTGCCCCT
-+
-%##(#$$#%$#$%###$%%$##$#
-@1378_33_1945/1
-GGGGGGGGGGGGGGGGGGGGGGGG
-+
-+9;64287788752796/576352
-@1378_34_789/1
-ATGGTGGCTGACGCGTTTGACTGT
-+
-#$##%#$##$&$#%##$##$###$
-@1378_35_263/1
-GGGCGGGGGGCGGCGGGGGGGGGG
-+
-),,#%'$)'-(%&%'%',%%&&(&
-@1378_43_186/1
-ATACTAGTTGGGACGCGTTGTGCT
-+
-#$(4%$########$#$###$$$#
-@1378_51_1671/1
-TGGGTAGGTGCGGCTCTTGCGGTC
-+
-##$#$%###%%#%#$##$$#####
-@1378_56_324/1
-AGGCTTGGATTGTTGCGCTGACCT
-+
-/+#**###%%##%#####$$$#$#
-@1378_56_773/1
-TGTCGTGAGGTCACTTATCCCCAT
-+
-&%#%##%%#####&#$%##$%##$
-@1378_62_2027/1
-CTTCCACGATCTGCTCGCTGTGGT
-+
-(#&&$##$$#$%#%$$$#$###'#
-@1378_62_2029/1
-TCTGGGCTGTCTTCGGGTCGGTGT
-+
-$%$$####$##$$#)##%%#$###
-@1378_67_1795/1
-TAGTGGGCTAGTCCGGGATCTACC
-+
-B@C2@@?;-@@1>'A@@91@.@1'
-@1378_68_466/1
-GTGATCGTCGGTGCCAGTCCCTGT
-+
-#(%)+##$#$#%#+$%##$#####
-@1378_68_1692/1
-GGTCTTCTGGGCACGGGCCAAGTT
-+
-###)%'&%##$###%#######$#
-@1378_80_664/1
-CTGCTTTGATCCCCGGTGGAGCAC
-+
-7#%###$$6#######$##$$$##
-@1378_85_1786/1
-ATACTATGTCGATCTGTAAAAAAA
-+
-)&.)#3%(a)$&%-,2#&+.-%0&./
-@1378_86_1011/1
-CTACGTTATTGCTCTGTTTGTCCT
-+
-######$%##$$$%###%#$####
-@1378_86_1789/1
-CGAATATCCCCTGGTTTAGAAGTA
-+
-61?1;@/>@<=/(.7'(<5@=%$=
-@1378_91_1596/1
-TTAGCGGTTGACTATCTGCTGACA
-+
-*&+'#9'(%*'#//,&<),/)'*#
-@1378_94_1595/1
-CGTGCGACAGCCCATGTTTTCAGA
-+
--=..5,3826&*+.+#+#%%6;%#
-@1378_95_1039/1
-CGGCGTCCATCTTCGCCTTGAGAT
-+
-$##.#$##$$#%$#$%%$###$)$
-@1378_95_1767/1
-ACACGCACCATCTGGCGGCTAACC
-+
-86<65<4<C27/$5+#;-$+#2%$
-@1378_96_1037/1
-ATCCCCCAAGATGCCTGTTGATTG
-+
-$#$'##$$$#%$$#%###+##$#$
-@1378_96_1764/1
-TACACCGGAACCTTGCACTAAAGC
-+
-6-9'<#+81?+*<8-=69&6;*3)
-@1378_98_1574/1
-GTTCTGCCGGTGTCTGTGGCGGGC
-+
-$$#+&$$####%$$$###$%#%%#
-@1378_107_1647/1
-AGGCCTACTACGCGTCATTGATAG
-+
-&#$$#$(.#%#$$####&$%##($
-@1378_111_829/1
-TGCGGCACTTGCTTCTTCGTATTT
-+
-%#%##%#$%#$#%###$$##&#$$
-@1378_111_1900/1
-TCCCCTCGCTCGGCTCTGTGCTGT
-+
-$&%*$#(#)##$#'##%(##$#$%
-@1378_112_1483/1
-TGTCCAGCTATGCGGCTTCCTCCT
-+
-%#$+#%#&#$#####%####%$##
-@1378_125_1287/1
-TGTCTCTGGGGGGCCTGGTTAGGT
-+
-$##13$'%#$###$$###$$$#&#
-@1378_126_468/1
-TCTCCTGATTAGACATATCTCCGT
-+
-7>@318?=,=8@49579?..7,7)
-@1378_127_664/1
-AGAGGTTGGTGTCTTGTCGCAGCT
-+
-##'#$######$$%######$$$#
-@1378_129_463/1
-CCTGTGGGCCAAGCCCAATGAAAG
-+
-8),,<6(--)<()5&.&/8+;.2+
-@1378_129_875/1
-TTTCTATGGCTTACGCTGTCTGCC
-+
-#$($##%####%$#$#####$###
-@1378_140_1251/1
-ATCCTAGCGCGGTGTCTTGGGGAC
-+
-#$%1#$$$##$##$#$#$##$%$$
-@1378_141_809/1
-TGTCCTCCAGTGTCTGTTGGGTGT
-+
-%&,-##$$#(%###$#$$'###'#
-@1378_144_983/1
-AGCGCCCGGTTGGTGCGGCTCGTC
-+
--$(&%*$#*#))#$$$#%%$#$##
-@1378_153_270/1
-AGTCCTTGTCCCCTGGGTTTTCCC
-+
-+''$#&%$%#$##&$$($#&#$$#
-@1378_155_1689/1
-TTGGGAGGGAGAGAGACTAGACCG
-+
-?4@@4<<??<?-@4@=4<5<?:/>
-@1378_157_1580/1
-TGGGCCTCGGTGCCCTTGGTCTGT
-+
-#%)$##'#$$$&#####%#$#$##
-@1378_161_317/1
-TTGGCCGGCAACCCCGGTACCTAA
-+
-7<,<'@)@>.)2@/')'&(?/-<(
-@1378_177_735/1
-AGTACGCCATGTATTTGCGACCAG
-+
-=?@?C<88@=>:7>@55/.,416,
-@1378_181_1684/1
-CGACTCCCGCATTCACGGTCAAGT
-+
-&*#,##$#&$*$$#$#$$$#%$##
-@1378_187_1407/1
-TGGCGTCCACTCGTGGGTCTATCG
-+
-$#$'%#$%$%&$%#####$#$#%#
-@1378_203_721/1
-CCTAAATAACCCAGGGTAAAAGAT
-+
-9<1+2+1@=259@+;2.71&@+2&
-@1378_206_2039/1
-CCCCCCCCCCCCCCCCCCCCCCCC
-+
-9@?8>;>>><<994;=895895-8
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_wrapper_in5.fastq
--- a/test-data/bwa_wrapper_in5.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-@081017-and-081020:1:1:1715:1759/2
-ACGCTCCTTTAAAATATC
-+/2
-IIIII$%*$G$A31I&&B
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_wrapper_in6.fastq
--- a/test-data/bwa_wrapper_in6.fastq Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,4 +0,0 @@
-@081017-and-081020:1:1:1715:1759/1
-GGACTCAGATAGTAATCC
-+/1
-II#IIIIIII$5+.(9II
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_wrapper_out0.sam
--- a/test-data/bwa_wrapper_out0.sam Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-081017-and-081020:1:1:1715:1759 16 PHIX174 322 25 36M * 0 0 GATATTTTAAAGGAGCGTGGATTACTATCTGAGTCC B&&I13A$G$*%$IIIIIII9(.+5$IIIIIII#II XT:A:U NM:i:2 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:2C8A24
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_wrapper_out0b.sam
--- a/test-data/bwa_wrapper_out0b.sam Fri Jan 22 08:47:05 2010 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,144 +0,0 @@
-1831_573_1004 0 phiX 278 25 33M1S * 0 0 TTAGATATGAGTCACATTTTGTTCATGGTAGAGG ]]>!4[WPFW]\ZSV]\YNRZOWWTTU]MJQEM XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1050 4 * 0 0 * * 0 0 TTTATGGGTATGGCCGCTCACAGGCCAGCGGCCT ;@@17?@=>7??@A8?==@4A?A4)&+.'&+'1,
-1831_573_1067 4 * 0 0 * * 0 0 AAGTATGAGTCATTTACCGGGATGCGAAGAAAAG ++#%(',%/$,+&1#&),)&+'*'*%#$&#%('$
-1831_573_1219 16 phiX 2202 37 1S33M * 0 0 TACGTCACCTTATCAGTCCAATTTAAATTACACT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1242 0 phiX 648 37 33M1S * 0 0 CATCCCGTCAACATTCAAACGGCCTGTCTCATCC ]]]]XQ]]]]]]]][]]]VIMOW]SW]]]T*1] XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1333 4 * 0 0 * * 0 0 AGAATCGTTACCACACACTGCGTCTGGGTATCCG ='@#%3=.>)/34*117,,/6-4+.9742456<)
-1831_573_1362 4 * 0 0 * * 0 0 CGATCTCAACCAGGTCCGCGCCCACCCCTGCCTC B@@?@@?@C@BA?@>@<@8A@?@'.8'?17:,+?
-1831_573_1448 16 phiX 2563 25 1S33M * 0 0 CGAAGTAACGTAAGTCTACCTATGTAGACAGTTG XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1490 0 phiX 1767 25 33M1S * 0 0 CGTCGTTAGGCCAGTTTTCTGGTCGTGTTCAACC ]]]TU]]]=;]]]R9=BQQDF>QZQ1,LBIGEN XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1523 4 * 0 0 * * 0 0 ATGGAACGGAACGGGTGAGGAGGGGAACGTAGGG ,//*,#8''.6''6'2&27/80)%�'%#*,2'
-1831_573_1578 4 * 0 0 * * 0 0 CGAGTAGCAAACAAGACGCCAATCCAGGCGACCC ?=@<@C@?@@??=>@;7<<8<694)3511(+1<.
-1831_573_1647 16 phiX 1118 37 1S33M * 0 0 ACTGAGGAAGCTCTACCTGCGGCAACCGCGAGAG XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1684 16 phiX 3696 37 1S33M * 0 0 ATCACGACTCCAACTGAATCAAGTAGTCGTTTGC XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1769 4 * 0 0 * * 0 0 TGGACGTATAGTGGCGATGAGCATGTAGGTTCTC 54749&&767%/7;3$-7;3#,3//#,45/#&06
-1831_573_1853 4 * 0 0 * * 0 0 CAAAACGCCCGGGGCCTCACATGCGCGGCAGTTC 4./B@@72B+/4?@?7?+@9/+99.')2<2&)2&
-1831_573_1943 4 * 0 0 * * 0 0 ATAACGTATGGCAGTGAACGGGCGGAACCTGCCC >/*1,),@-)'0*>5'$/?6(a)/.&?8/(')A43,
-1831_573_1977 4 * 0 0 * * 0 0 GGCGTAGGGCTCATTGTGCAAGTATCCGACCTCC @?6@8@@9A@=4633A7?9?<3:+7>'@%@?%32
-1831_574_109 0 phiX 3729 37 33M1S * 0 0 CAGAATCAGCGGTATGGCTCTTCTCATATTGGCT VTO/2URQ]]]TZWU[UTQP\]XY]VS[WLN]] XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_574_148 16 phiX 2369 37 1S33M * 0 0 GATCCAAAAGACGAATCCTCAAATTAGTACAAAG XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_574_185 4 * 0 0 * * 0 0 CCGTTTTGCCTAGTAATGCTCGGCGCAGCGTCGC <4;%%@7>#*>97%6;+8$#<07%1372$%<54#
-1831_574_243 0 phiX 2129 37 33M1S * 0 0 TCTGGTGATTTGCAAGAACGCGTACTTATTCGCA ]]]W]]]]RQ]YRBI]]Y0<]]]CI]]]FM]]Y XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_574_257 4 * 0 0 * * 0 0 ATACCTTCCAAAGCAATAGAATAAAAAACAGTAC >>B>)@?>B@B?@1%*%,#+00.'(+&5&%#$3&
-1831_574_293 4 * 0 0 * * 0 0 TGCTGCAAATAAACATACAGCCTTCTAATGACTA ')7'.*%#&$'/.$##$.$&*)+*$#8%&%#&&%
-1831_574_389 4 * 0 0 * * 0 0 CATGGCTATGCACCGGTTTGTAGCGTACTCGAGA )$>/>8):2@:213;;.1)@3%64%+)<7)+$92
-1831_574_575 16 phiX 4006 37 1S33M * 0 0 CTTACAGTGCGACTAATAAAACTGAAACTCGCAT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_574_592 16 phiX 2950 37 1S33M * 0 0 TCGCCATAACGAAGACGAGAACGACCACCGCGGT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_574_617 4 * 0 0 * * 0 0 AAGCATCGGCGGGAGCGCAAGCTGGGAAGGTGCC >@?;>?=@==@>@=5?@+@:@40@><:0)')64-
-1831_574_725 4 * 0 0 * * 0 0 GACAAGATGGCTATTATTTACAATCCGATCTGCA '>?52+5=;4$6;<8.1<47*9+?7(+5;-).)4
-1831_574_734 16 phiX 5263 25 1S33M * 0 0 CCTCTCTACTCTAACTCCGACCCTTTTCAATGAC XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_574_824 16 phiX 3997 37 1S33M * 0 0 ATGGGAAGACTTACAGTGCGACTAATAAAACTGA XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_574_959 4 * 0 0 * * 0 0 CGCGCTAGGACTCGGCCCCAAGAGACGTTCCGCC A=;+?@9;/<@;<8#&&/*%(%.0$0$2)+1$-1
-1831_574_1062 4 * 0 0 * * 0 0 ACCGGTAATATAAGGCAACATGATTACGGCCACG @821<//:136/8<1/5.427.;>288/0<1$)/
-1831_574_1092 4 * 0 0 * * 0 0 GACTGGCGAAATCATCGCGGAAAAACCCCTATCA 8?.,98)03%#,,,(,++$'69'#9'7#';6.%2
-1831_574_1103 4 * 0 0 * * 0 0 ATCTCCTGATTAGACATATCTCCGTAGCTCACGC ??>?@=>@@A<>?=@==<:?<;58'&&):+35'1
-1831_574_1116 4 * 0 0 * * 0 0 CACCTCACGTGAGTATAGCAGCCCGAGCGTCACC @++,)/)?./)%<)2>.==:8?&;44&/&,)/*4
-1831_574_1194 0 phiX 1136 37 33M1S * 0 0 GCCGTTGGCGCTCTCCGTCTTTCTCCATTGCGTG \]PT]]]]]]]ZZ]]]\Y]]]]\]]]V\]UMDK XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_574_1204 16 phiX 1445 25 1S33M * 0 0 TGGATTACTCGAATTAGTTCTACTACGAGCAATA XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_574_1306 4 * 0 0 * * 0 0 ATTGCTTAGATCCAGTGGCGCTCAATACAACGGA 2.7&%''.$&#'%##$#'#%')')$'$%$,)'.1
-1831_574_1387 4 * 0 0 * * 0 0 GTACTTCTCAATGCTGCACTACTATGTACGCCCC ?A??:@?@@9?@@?9C;:>&).,,);&'<&7(/'
-1831_574_1431 4 * 0 0 * * 0 0 GACCAGTTTCAGGGCTAACCGTCCCTACTCGACC 7?>9BA897;+8*=6#6.+5&-#26$0.,5&'$1
-1831_574_1560 4 * 0 0 * * 0 0 GGCGTCTTAGGATTGAAGAGGGCCTCCCACCCCC ))&65<4=>99@:597(1&;+&(%&4#,#&&&*$
-1831_574_1591 16 phiX 5118 37 1S33M * 0 0 CTTCGACAAGTCTTAGTCTTACTCGGCGTTGAAG XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_574_1624 16 phiX 4058 37 1S33M * 0 0 CATAACTCCGAACACCGTAAAGATGAGAAAGAGT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_574_1826 4 * 0 0 * * 0 0 TACGTCGCGACCGAGCGTTATATAGTCTGACCCC @<<,))459<?.+57'-'&6?1)(;1;0&%4,#$
-1831_574_1903 0 phiX 5209 37 33M1S * 0 0 AGCTGGGTTACGACGCGACGCCGTTCAACCAGAC WT]]]][]]]][]]]]]]]]]]][X]QYYTYZ- XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_574_1961 0 phiX 3555 25 33M1S * 0 0 CGCGTTGCGTCTATTATGGAAAACACCAATCTTA TFPMV]OCBP]H<OS]<1CN]]M=K]52KO]WT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_575_54 16 phiX 3587 37 1S33M * 0 0 TAAGGTTCGTTGTCGTCCAAAGGCTCTAATACGC XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_575_80 4 * 0 0 * * 0 0 TCTTTGGGTTTGGGGCAATTTGGTATGTTCGTCT ?5><@?/=5%(&.5)+#/0'/'>#$/'37#()6&
-1831_575_192 4 * 0 0 * * 0 0 AACTACGCCCCTTAATTACACAGCGCGTTAGACC :8<,9(.=/)#%8$,4'<,:)3/.'.5<,>-;7'
-1831_575_197 16 phiX 4861 37 1S33M * 0 0 CCGAACGTTTTATGCACCGGAATACCAATGTCAT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_575_223 4 * 0 0 * * 0 0 ACGCACAAAGGAGCTCGGCGCATAGCAACGCAGA ?>?8?@:?;>+$'%&,+#$.--#%$1'&#-7$&'
-1831_575_420 4 * 0 0 * * 0 0 CCCACATGGAAAACACTCACCGCCGAACAGAGCG 2?.>?(-''2+..@),$%1@;')1)?+)7.')..
-1831_575_434 4 * 0 0 * * 0 0 ATCGCTGCGAGGTCACCCTGGTTACGCCCCTTCC @@><@B@>=@@?>><@?;)@?;6.?=4,'';/3)
-1831_575_444 16 phiX 5098 37 1S33M * 0 0 TTCGACAGCGATGAAGGGTTCTTCGACAAGTCTT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_575_459 4 * 0 0 * * 0 0 CTTATCAGCACACGGTTTACCAGTCCGACTCCAA @@C@?A@@A@??A@@'6@@B'=;C@'4<=9,@1.
-1831_575_506 4 * 0 0 * * 0 0 CGCAGAACCCGCACGCTTGTGCTCACCACTGTAC ?)2*5@3+.7=?A:8@,/&):@37/<89'+4*)*
-1831_575_569 0 phiX 5043 25 33M1S * 0 0 GACCTTGCTGCTAAAGGTCTAGGAGCTAAAGAAT IOBU[TMHTYG4M]7$?Q]]]57]SKXQC;:FE XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_575_622 0 phiX 2485 37 33M1S * 0 0 GTTTTACAGACACCTAAAGCTACATCGTCAACGC ]]]]]]]]]]]]]]]X[YVYINYLTLJWHO[$! XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_575_644 4 * 0 0 * * 0 0 CTTGAATGGCGATCTCGTCGAGGAAATACCACTA <8>.>&,+)8.10':5(/-62&*.=/%(.<&&18
-1831_575_663 16 phiX 1554 25 1S33M * 0 0 TGCTGAAGATGGTGTAGATAACTGTAATACCCAG XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_575_681 4 * 0 0 * * 0 0 TCTCCTGATTAGACATATCACTGTTGAACACAGC 72?.)25;96-14'*.03'#4#++$)/8+%/((&
-1831_575_711 4 * 0 0 * * 0 0 TATGTTCGTCCACGTCAGACGCGCAAAGTTGCGC %+:2(#'1+.)&*45-#,<A-%4;>+))<;##*&
-1831_575_730 4 * 0 0 * * 0 0 CACACAGGAACCATAGCGTATGTTATTCACCCCC %8<%-')5,*1&=#)(1*1)->7$.,4'4'&'*&
-1831_575_904 4 * 0 0 * * 0 0 ACCCGCTTAAAGACGTGAATTTTGCCTCCGCGCC <><.689@@7@<54:4=@>69=:+6-=42;8<:#
-1831_575_938 16 phiX 1133 37 1S33M * 0 0 TCTGCGGCAACCGCGAGAGGCAGAAAGAGGTAAC XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_575_970 16 phiX 232 37 1S33M * 0 0 GCTCCTCTTCACCGAATTATACGAACCGTGCAAG XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_575_991 4 * 0 0 * * 0 0 TTCGGCGATCCCCCCCACGGCGCGATGCCGCGCA >>;7???/4<:::,#&*%'$--5-#(7)&&,-)%
-1831_575_1138 0 phiX 1913 37 33M1S * 0 0 GCTAAAGGTGCTTTGACTTATACCGATATTGCTC VT7-SURJS]X]TT]Z]UY]]]]]]X[UN[NMT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_575_1157 16 phiX 3736 25 1S33M * 0 0 GTCGCCATACCGAGAAGAGTATAACCGCGATGAC XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_575_1180 0 phiX 4169 37 33M1S * 0 0 GGGCGTTGAGTTCGATAATGGTGATATGTATGTA ]]\]OJROX]]UUYSX\[Y]]]]VZ]\VRWLT] XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_575_1283 4 * 0 0 * * 0 0 GGTGGAATACTAAGGACTAATGTGCTGTCTCTTT C@A54><?A78@<?2>:#>=?@2>80:'?69.'7
-1831_575_1302 16 phiX 5202 37 1S33M * 0 0 GGAATGGTTCGACCCAATGCTGCGCTGCGGCAAG XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_575_1310 16 phiX 1612 37 1S33M * 0 0 AATGACTGGTTCTTGCACTAATGAAGTACGTCGC XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_575_1321 0 phiX 2664 37 33M1S * 0 0 TTTGGTTCGCTTTGAGTCTTCTTCGGTTCCGACG ]]]]]]]]]]]]]]]]]]]\ND]]]7/]]]WPZ XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_575_1373 16 phiX 4221 37 1S33M * 0 0 TAGACTGCAAGCACTACTCAAACATAGACAATGA XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_575_1419 4 * 0 0 * * 0 0 TGGGGAATATAACAGCGTAGCGTTGAACACTAGA //3->&-.->%11/@&/&7:<,-1=,+2<6'%&<
-1831_575_1436 0 phiX 3460 37 33M1S * 0 0 CTGGCATTCAGTCGGCGACTTCACGCCAGAATAC []]WULFXOGY]]\PY]]IGZ]]M@V]XAAMR[ XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_575_1442 0 phiX 3317 37 33M1S * 0 0 TGCTTGGGAGCGTGCTGGTGCTGATGCTTCCTCG \V]]]]RE\]LEQ]]]X]]]]TZ]]QUPW]LIX XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_575_1454 4 * 0 0 * * 0 0 CCTCCTAACCACGAGCCGAGGGGTCTCTGCCCCT 4=?8=6589=0:A=:?>6<;@/,4+-6+/'.,(,
-1831_575_1500 16 phiX 4269 37 1S33M * 0 0 GCTTAACCGTGTTACGATGTTACACGAGGGGGTT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_575_1535 16 phiX 1225 37 1S33M * 0 0 GAGTGCAAATACCACTTGTCACCTAATTCAAGTA XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_575_1724 4 * 0 0 * * 0 0 TCGTAAGTGTTAAGGAGCTGTGTACAAAACAACA <B.+@),2*.%)))4%2@;7#%(%+$8))85%&5
-1831_575_1829 4 * 0 0 * * 0 0 CATTTGCTGACCCTGCGTAGTTTAGTCTCACAGC 2(*'%.3$+7)@&%$'3*+*#/#/*+0.=&#)+0
-1831_575_1898 4 * 0 0 * * 0 0 CTTACCATATCATCTCAACCCATAACAGCACTTA B>@@&1/))'40)%#8/.%#8$((#;4'$'63,,
-1831_575_1964 4 * 0 0 * * 0 0 GACAGACCATGAGGCTGAAGACTACTAAGTGCGT >39)@2<2/@+9?2=&)>>@*62=5&2<42.'?+
-1831_576_32 16 phiX 988 25 1S33M * 0 0 TAACTCCTATTTAATACAGATTATAAGTTTGACC XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_576_74 4 * 0 0 * * 0 0 ACATTCTGCAGTGGGACAGAGCGGTACGCCGCAA =@@?@>(??<B5?@@@9<@><+><;@';>6961?
-1831_576_86 16 phiX 2981 37 1S33M * 0 0 TGTACAGATTTAACAAACCTCCGCCAGTTTTTCG XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_576_89 4 * 0 0 * * 0 0 GCTGTTTGATTTGAGAAGAGGAATTAAGCGCCGA )69+,'.4=-,>/>(*$#)3030*'(,%)2##$,
-1831_576_266 16 phiX 280 37 1S33M * 0 0 ATCTATACTCAGTGTAAAACAAGTACCATCTCTA XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_576_327 16 phiX 4517 25 1S33M * 0 0 TATGATAAGTCGCAAACTACTTACGTTACGCTGT XT:A:U CM:i:1 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:1G31
-1831_576_331 4 * 0 0 * * 0 0 GACGCTTTACTCCGGTAGTACCGTGCCGTTTATA -2)+(*.*1/;5%.-9&#/1'+($*$##()%/$.
-1831_576_387 4 * 0 0 * * 0 0 ACACGCCATGATCCGATAAGAAGGGAACGTAAGG 8).$5#1#*%.$##.*#$%##-%,+,1#&%.%))
-1831_576_406 4 * 0 0 * * 0 0 AGGTCTTACAGCACGGGGCTGAGCGCATCTGACC 4<>%%14:*4656)&<251&2+3#&19,6&4>5(
-1831_576_449 4 * 0 0 * * 0 0 CTCGAACCGCGGGGTCCAAAGACTGCTGCAAGGA +'&'.,,$/+.)$$8&%#+?&,#)-&###7,+#*
-1831_576_519 16 phiX 1625 25 1S33M * 0 0 GGCACTAATGAAGTACGTCGCAATGGCACTACAA XT:A:U CM:i:1 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:25A7
-1831_576_603 16 phiX 1576 37 1S33M * 0 0 GGTAATACCCAGACGTTCGACGAATACGATTAAA XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_576_655 16 phiX 3292 37 1S33M * 0 0 CAACGACGACGTAAAGGACTCGAATTACGAACCC XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_576_677 4 * 0 0 * * 0 0 TTTACTCAGTTGATACATCACTGTAGCACATAGG 290&/*0#&'&,.2'#&*$&('#-%($*#%$)#%
-1831_576_718 4 * 0 0 * * 0 0 CGTGCCTTTCAGGGTCTTTTCTGGTCTGGTCGCT 4###$0###%(#########,####%####$###
-1831_576_722 4 * 0 0 * * 0 0 CGTATGATGGCGAGTCTTTATAATCCAATCTGAA *,-,##.)*&(*1%*(%(-2#+)-#.&-#%%$')
-1831_576_754 4 * 0 0 * * 0 0 AGGCGTCCTGCATCGACCGTTCTATCCGCTTAGA 4//#(.$)'',>($<,##%((,#5?#0*%1*
-1831_576_815 0 phiX 5186 37 33M1S * 0 0 GGAGTGCTTAATCCAACTTACCAAGCTGGGTTAC Z]]]]]]]]]]]]]]]]]]]UP[ZKIP]][ZUN XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_576_882 0 phiX 5053 37 33M1S * 0 0 CTAAAGGTCTAGGAGCTAAAGAATGGAACAACTG Q]]]]]W[]]]X]]]]][EAV]]ZUS\]]]VX] XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_576_898 0 phiX 518 37 33M1S * 0 0 GATTGCTACTGACCGCTCTCGTGCTCGTCGCTGT ]]]Z]]]]]]]YW]]]]VV]]X]]]]]VO]]]T XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_576_923 0 phiX 1050 37 33M1S * 0 0 ATCTTGGCTTCCTTGCTGGTCAGATTGGTCGTCG MLOW]RMX[]]X]]]XV]]]UKU]]]W\\]\ST XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_576_930 4 * 0 0 * * 0 0 CTGGCATGTACGTCCATGTCAGACGAGCAGAACT #*0.2&.:((#'14'##-)#%$$2%#$/1&#%/#
-1831_576_1019 4 * 0 0 * * 0 0 GATGCGCGCTGTCATGGCATCGAACCATCGGTCG <$>$,1,&++&@,.)'+/+#9'69/6'2(+-'9-
-1831_576_1068 4 * 0 0 * * 0 0 AAGAGTGACTCACTTACCGGGATGCGATGGAGCC >><=4?;@7=??9?;9>5@9?:8@:=5';7;'#4
-1831_576_1131 16 phiX 4061 37 1S33M * 0 0 TACTCCGAACACCGTAAAGATGAGAAAGAGTTAG XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_576_1168 4 * 0 0 * * 0 0 CACTTAACTCCGCTGTCGGAAGCCTTACAAGACA @CC6@@2?9=>7?;76<;467@;9,0%26'',4$
-1831_576_1207 4 * 0 0 * * 0 0 CAACCTGACTAAACGGGGATACGCTGGCGCTACA $>2,(&?4?(,@:<&,@>?$&:8A%%=0.%,597
-1831_576_1289 16 phiX 1899 37 1S33M * 0 0 AAAGTCATGGAATTGCGATTTCCACGAAACTGAA XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_576_1329 4 * 0 0 * * 0 0 CCAATAGCAGAGACCTAATAGGAAACGAAAGCAA >&0,870/A@@/5.;=;:'&@3'&$$%,+#($&2
-1831_576_1367 0 phiX 1839 37 33M1S * 0 0 AGCATGGCACTATGTTTACTCTTGCGCTTGTTCT ]]]]]]]]]]]]]]]]]]\]]]]]]]\YW]]XX XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_576_1416 0 phiX 4522 37 33M1S * 0 0 TTCAGCGTTTGATGAATGCAATGCGACAGGCTCC K]VEHHS]P>TQJML]]\UFU][L6K]\TMPZ] XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_576_1461 4 * 0 0 * * 0 0 GAGGGGCGGCCCGGTTCAAGCAGGTAAGCAACAA 1&74#(#(&##$#,'###%#%%#*#&%%##%%%'
-1831_576_1605 0 phiX 5209 37 33M1S * 0 0 AGCTGGGTTACGACGCGACGCCGTTCAACCAGAC ]]]]]XU]]]]]]]]]]]]]]X[]KHLWZUXW, XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_576_1664 4 * 0 0 * * 0 0 CGCGCACAACTCGCCATGATACGACAAGACCCGA @?>?@=A:@@>@='=<>=).>=9*8)(7#/++;)
-1831_576_1671 4 * 0 0 * * 0 0 GTCTTTGTAAGCCTGGCCTGGTCAGGTCTGGTCT @?@5>@@8&8?25#&)&5&&)15&&,&4%&,&6%
-1831_576_1729 16 phiX 5194 37 1S33M * 0 0 TATTAGGTTGAATGGTTCGACCCAATGCTGCGCT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_576_1880 4 * 0 0 * * 0 0 TATGCGCTGTTGAGCTTACAACTCACTAGCGAAT 515/792,:,7/%/05,%$):+#8%2(1754))3
-1831_576_1982 16 phiX 5024 37 1S33M * 0 0 TATTGTTTTTCAGTCTATACCTGGAACGACGATT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_576_1987 4 * 0 0 * * 0 0 AAGGTCTTCTGTCGGCGCTGGACTGAACACCTGA ##()(#&##)%)/-#%$11#%3>'##&$,#$$'+
-1831_576_2014 4 * 0 0 * * 0 0 CCGTGACACACAATGCCGGCCCCAGCCTAGCAAT @@9,B29-5>'?,+?79+/A';'2@'5&/9,6&1
-1831_576_2028 4 * 0 0 * * 0 0 ACTCGCCGCATCCCCGAGTGACGCTCGAGACCAA <>9>5'2(&707.8#&&39,0%7/#(#,*%&5*+
-1831_577_40 0 phiX 2772 25 33M1S * 0 0 TGTGACTATTGACGTCCTTCCCCGTACGCCGGGT JLE8>>9:MOR=!&74KQDKU]M?IG@P]]]PK XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_577_119 4 * 0 0 * * 0 0 TCCCACAAGCCATTGACATGCTCGCTCTAAACAG >?C11)-1/)#;#/,850*+.+$$5550+%-.40
-1831_577_133 16 phiX 1714 37 1S33M * 0 0 CGTACGCGAGATTAGAGACCCGTAGACCGATACT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_577_255 4 * 0 0 * * 0 0 ATTGAGGCCAAGATAATTGAGGAGAGAGAAGGTG <=87@>69%**#&#-+$.#&&#+$-+%&%.,%5#
-1831_577_281 16 phiX 4577 37 1S33M * 0 0 TAAAACTGTGAGAGTGCAACCGACTGCTGGCTAA XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_577_288 0 phiX 3201 25 33M1S * 0 0 GGCACTTCTGCCGTTTCTGATAAGTTGCTTGATA SOY]]NL]]]UTZKIMNOCH/-LFLLK]VN5%F XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_577_322 16 phiX 458 37 1S33M * 0 0 CAAGACGGCAAAACCTAAATTGGCTTCTACTAAA XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_577_362 0 phiX 2153 37 33M1S * 0 0 CTTATTCGCCACCATGATTATGACCAGTGTTTCA ]]]]]]]]]WV]RHVONRSI6=O[NK[ZL?%(J XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_577_382 16 phiX 4686 37 1S33M * 0 0 TCCAGCGTTCCGATTACTAAGTGTGCGGCTGACG XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_577_464 0 phiX 2126 25 33M1S * 0 0 CCTTCTGGTGATTTGCAAGAACGCGTACTTATTG ]\OT]SQHP<,>6COKMHI3-HMNHNJLS@FUT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_577_488 16 phiX 4948 37 1S33M * 0 0 GCCGGACAACTACGATTTCCACTCGGCGAATTTC XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_577_511 4 * 0 0 * * 0 0 GGTGCTTATCAGTTCTTTCTCGGGACTTGTATTT 7/+&$:<7%6,$$%'%/+)#$7((&*3>16'0/+
-1831_577_545 0 phiX 1711 37 33M1S * 0 0 TGTCATGCGCTCTAATCTCTGGGCATCTGGCTAT ]]]]]]]]]YURZ]]]]]]]VNNPV]WLLWZYN XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_577_559 0 phiX 3840 25 33M1S * 0 0 GCTGTTGCCGATACTTGGAACAATTTCTGGAAAG ]]]]]]]]WJWSWZW]XLX\P#-]]V=A(/TD9 XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_577_562 4 * 0 0 * * 0 0 GTTCCACTACGTTCCACGCAAAGGAATCCGAATC ((&*&0%)1%)#($2-,***%/-,,))&,-.1'*
-1831_577_637 0 phiX 4247 37 33M1S * 0 0 TGTTACTGAGAAGTTAATGGATGAATTGGCACAA BI2<]PLJN[M;7FYWYVW]]\WG@IQH6O]XI XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_577_641 4 * 0 0 * * 0 0 TATCTACCACCGCGGTGGCGCGAGAATGCTCCCT 47;/':A;;5?:72,(=),#*?+.#&7$8#%7/'
-1831_577_692 0 phiX 3905 37 33M1S * 0 0 GTCTAGGAAATAACCGTCAGGATTGACACCCTCA WU]]]SQ]]]TT]]]TS]]]PM]]]]]]]]]UZ XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
diff -r ea652508497a -r 4cd66d01aaf0 test-data/bwa_wrapper_out1.sam
--- a/test-data/bwa_wrapper_out1.sam Fri Jan 22 08:47:05 2010 -0500
+++ b/test-data/bwa_wrapper_out1.sam Fri Jan 22 10:49:38 2010 -0500
@@ -1,144 +1,1 @@
-1831_573_1004 0 PHIX174 278 25 33M1S * 0 0 TTAGATATGAGTCACATTTTGTTCATGGTAGAGG ]]>!4[WPFW]\ZSV]\YNRZOWWTTU]MJQEM XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1050 4 * 0 0 * * 0 0 TTTATGGGTATGGCCGCTCACAGGCCAGCGGCCT ;@@17?@=>7??@A8?==@4A?A4)&+.'&+'1,
-1831_573_1067 4 * 0 0 * * 0 0 AAGTATGAGTCATTTACCGGGATGCGAAGAAAAG ++#%(',%/$,+&1#&),)&+'*'*%#$&#%('$
-1831_573_1219 16 PHIX174 2202 37 1S33M * 0 0 TACGTCACCTTATCAGTCCAATTTAAATTACACT XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:0 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1242 0 PHIX174 648 37 33M1S * 0 0 CATCCCGTCAACATTCAAACGGCCTGTCTCATCC ]]]]XQ]]]]]]]][]]]VIMOW]SW]]]T*1] XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:1 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1333 4 * 0 0 * * 0 0 AGAATCGTTACCACACACTGCGTCTGGGTATCCG ='@#%3=.>)/34*117,,/6-4+.9742456<)
-1831_573_1362 4 * 0 0 * * 0 0 CGATCTCAACCAGGTCCGCGCCCACCCCTGCCTC B@@?@@?@C@BA?@>@<@8A@?@'.8'?17:,+?
-1831_573_1448 16 PHIX174 2563 25 1S33M * 0 0 CGAAGTAACGTAAGTCTACCTATGTAGACAGTTG XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1490 0 PHIX174 1767 25 33M1S * 0 0 CGTCGTTAGGCCAGTTTTCTGGTCGTGTTCAACC ]]]TU]]]=;]]]R9=BQQDF>QZQ1,LBIGEN XT:A:U CM:i:0 X0:i:1 X1:i:0 XM:i:2 XO:i:0 XG:i:0 MD:Z:33
-1831_573_1523 4 * 0 0 * * 0 0 ATGGAACGGAACGGGTGAGGAGGGGAACGTAGGG ,//*,#8''.6''6'2&27/80)%�'%#*,2'
1
0
22 Jan '10
details: http://www.bx.psu.edu/hg/galaxy/rev/ea652508497a
changeset: 3255:ea652508497a
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Fri Jan 22 08:47:05 2010 -0500
description:
Require that users set a public username before making items accessible via link or publishing.
diffstat:
lib/galaxy/web/base/controller.py | 9 ++
lib/galaxy/web/controllers/history.py | 2 +-
templates/sharing_base.mako | 124 +++++++++++++++++++--------------
3 files changed, 81 insertions(+), 54 deletions(-)
diffs (170 lines):
diff -r 4dfbf68c8c7e -r ea652508497a lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py Wed Jan 20 13:19:05 2010 -0500
+++ b/lib/galaxy/web/base/controller.py Fri Jan 22 08:47:05 2010 -0500
@@ -115,6 +115,15 @@
class Sharable:
""" Mixin for a controller that manages and item that can be shared. """
+
+ # Implemented methods.
+ @web.expose
+ @web.require_login( "share Galaxy items" )
+ def set_public_username( self, trans, id, username, **kwargs ):
+ """ Set user's public username and delegate to sharing() """
+ trans.get_user().username = username
+ trans.sa_session.flush
+ return self.sharing( trans, id, **kwargs )
# Abstract methods.
diff -r 4dfbf68c8c7e -r ea652508497a lib/galaxy/web/controllers/history.py
--- a/lib/galaxy/web/controllers/history.py Wed Jan 20 13:19:05 2010 -0500
+++ b/lib/galaxy/web/controllers/history.py Fri Jan 22 08:47:05 2010 -0500
@@ -542,7 +542,7 @@
elif 'unpublish' in kwargs:
history.published = False
elif 'disable_link_access_and_unpubish' in kwargs:
- history.importable = stored.published = False
+ history.importable = history.published = False
elif 'unshare_user' in kwargs:
user = trans.sa_session.query( trans.app.model.User ).get( trans.security.decode_id( kwargs[ 'unshare_user' ] ) )
if not user:
diff -r 4dfbf68c8c7e -r ea652508497a templates/sharing_base.mako
--- a/templates/sharing_base.mako Wed Jan 20 13:19:05 2010 -0500
+++ b/templates/sharing_base.mako Fri Jan 22 08:47:05 2010 -0500
@@ -71,64 +71,82 @@
<h3>Making ${item_class_name} Accessible via Link and Publishing It</h3>
<div class="indent">
- %if item.importable:
- <%
- item_status = "accessible via link"
- if item.published:
- item_status = item_status + " and published"
- %>
- This ${item_class_name_lc} <strong>${item_status}</strong>.
- <div class="indent">
- <p>Anyone can view and import this ${item_class_name_lc} by visiting the following URL:
- <% url = h.url_for( action='display_by_username_and_slug', username=trans.get_user().username, slug=item.slug, qualified=True ) %>
- <blockquote>
- <a href="${url}" target="_top">${url}</a>
- </blockquote>
+ %if trans.get_user().username is None or trans.get_user().username is "":
+ To make a ${item_class_name_lc} accessible via link or publish it, you must create a public username:
+ <p>
+ <form action="${h.url_for( action='set_public_username', id=trans.security.encode_id( item.id ) )}"
+ method="POST">
+ <div class="form-row">
+ <label>Public Username:</label>
+ <div class="form-row-input">
+ <input type="text" name="username" size="40"/>
+ </div>
+ </div>
+ <div style="clear: both"></div>
+ <div class="form-row">
+ <input class="action-button" type="submit" name="Set Username" value="Set Username"/>
+ </div>
+ </form>
+ %else:
+ %if item.importable:
+ <%
+ item_status = "accessible via link"
+ if item.published:
+ item_status = item_status + " and published"
+ %>
+ This ${item_class_name_lc} <strong>${item_status}</strong>.
+ <div class="indent">
+ <p>Anyone can view and import this ${item_class_name_lc} by visiting the following URL:
+ <% url = h.url_for( action='display_by_username_and_slug', username=trans.get_user().username, slug=item.slug, qualified=True ) %>
+ <blockquote>
+ <a href="${url}" target="_top">${url}</a>
+ </blockquote>
- %if item.published:
- This ${item_class_name_lc} is publicly listed and searchable in Galaxy's <a href='${h.url_for( action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section.
- %endif
- </div>
+ %if item.published:
+ This ${item_class_name_lc} is publicly listed and searchable in Galaxy's <a href='${h.url_for( action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section.
+ %endif
+ </div>
- <p>You can:
- <div class="indent">
- <form action="${h.url_for( action='sharing', id=trans.security.encode_id( item.id ) )}"
- method="POST">
- %if not item.published:
- ## Item is importable but not published. User can disable importable or publish.
- <input class="action-button" type="submit" name="disable_link_access" value="Disable Access to ${item_class_name} Link">
- <div class="toolParamHelp">Disables ${item_class_name_lc}'s link so that it is not accessible.</div>
+ <p>You can:
+ <div class="indent">
+ <form action="${h.url_for( action='sharing', id=trans.security.encode_id( item.id ) )}"
+ method="POST">
+ %if not item.published:
+ ## Item is importable but not published. User can disable importable or publish.
+ <input class="action-button" type="submit" name="disable_link_access" value="Disable Access to ${item_class_name} Link">
+ <div class="toolParamHelp">Disables ${item_class_name_lc}'s link so that it is not accessible.</div>
+ <br>
+ <input class="action-button" type="submit" name="publish" value="Publish ${item_class_name}" method="POST">
+ <div class="toolParamHelp">Publishes the ${item_class_name_lc} to Galaxy's <a href='${h.url_for( action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section, where it is publicly listed and searchable.</div>
+
<br>
- <input class="action-button" type="submit" name="publish" value="Publish ${item_class_name}" method="POST">
- <div class="toolParamHelp">Publishes the ${item_class_name_lc} to Galaxy's <a href='${h.url_for( action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section, where it is publicly listed and searchable.</div>
-
+ %else: ## item.published == True
+ ## Item is importable and published. User can unpublish or disable import and unpublish.
+ <input class="action-button" type="submit" name="unpublish" value="Unpublish ${item_class_name}">
+ <div class="toolParamHelp">Removes ${item_class_name_lc} from Galaxy's <a href='${h.url_for( action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section so that it is not publicly listed or searchable.</div>
+ <br>
+ <input class="action-button" type="submit" name="disable_link_access_and_unpubish" value="Disable Access to ${item_class_name} via Link and Unpublish">
+ <div class="toolParamHelp">Disables ${item_class_name_lc}'s link so that it is not accessible and removes ${item_class_name_lc} from Galaxy's <a href='${h.url_for( action='list_published' )}' target='_top'>Published ${item_class_plural_name}</a> section so that it is not publicly listed or searchable.</div>
+ %endif
+
+ </form>
+ </div>
+
+ %else:
+
+ This ${item_class_name_lc} is currently restricted so that only you and the users listed below can access it. You can:
+ <p>
+ <form action="${h.url_for( action='sharing', id=trans.security.encode_id(item.id) )}" method="POST">
+ <input class="action-button" type="submit" name="make_accessible_via_link" value="Make ${item_class_name} Accessible via Link">
+ <div class="toolParamHelp">Generates a web link that you can share with other people so that they can view and import the ${item_class_name_lc}.</div>
+
<br>
- %else: ## item.published == True
- ## Item is importable and published. User can unpublish or disable import and unpublish.
- <input class="action-button" type="submit" name="unpublish" value="Unpublish ${item_class_name}">
- <div class="toolParamHelp">Removes ${item_class_name_lc} from Galaxy's <a href='${h.url_for( action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section so that it is not publicly listed or searchable.</div>
- <br>
- <input class="action-button" type="submit" name="disable_link_access_and_unpubish" value="Disable Access to ${item_class_name} via Link and Unpublish">
- <div class="toolParamHelp">Disables ${item_class_name_lc}'s link so that it is not accessible and removes ${item_class_name_lc} from Galaxy's <a href='${h.url_for( action='list_published' )}' target='_top'>Published ${item_class_plural_name}</a> section so that it is not publicly listed or searchable.</div>
- %endif
-
- </form>
- </div>
-
- %else:
-
- This ${item_class_name_lc} is currently restricted so that only you and the users listed below can access it. You can:
- <p>
- <form action="${h.url_for( action='sharing', id=trans.security.encode_id(item.id) )}" method="POST">
- <input class="action-button" type="submit" name="make_accessible_via_link" value="Make ${item_class_name} Accessible via Link">
- <div class="toolParamHelp">Generates a web link that you can share with other people so that they can view and import the ${item_class_name_lc}.</div>
-
- <br>
- <input class="action-button" type="submit" name="make_accessible_and_publish" value="Make ${item_class_name} Accessible and Publish" method="POST">
- <div class="toolParamHelp">Makes the ${item_class_name_lc} accessible via link (see above) and publishes the ${item_class_name_lc} to Galaxy's <a href='${h.url_for( action='list_published' )}' target='_top'>Published ${item_class_plural_name}</a> section, where it is publicly listed and searchable.</div>
- </form>
+ <input class="action-button" type="submit" name="make_accessible_and_publish" value="Make ${item_class_name} Accessible and Publish" method="POST">
+ <div class="toolParamHelp">Makes the ${item_class_name_lc} accessible via link (see above) and publishes the ${item_class_name_lc} to Galaxy's <a href='${h.url_for( action='list_published' )}' target='_top'>Published ${item_class_plural_name}</a> section, where it is publicly listed and searchable.</div>
+ </form>
- %endif
+ %endif
+ %endif
</div>
<h3>Sharing ${item_class_name} with Specific Users</h3>
1
0
22 Jan '10
details: http://www.bx.psu.edu/hg/galaxy/rev/4dfbf68c8c7e
changeset: 3254:4dfbf68c8c7e
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Wed Jan 20 13:19:05 2010 -0500
description:
Updated 'Share' option in history menu to 'Share and Publish' and made corresponding controller changes.
diffstat:
lib/galaxy/web/controllers/history.py | 6 +++---
templates/root/index.mako | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diffs (34 lines):
diff -r 0a8d73234704 -r 4dfbf68c8c7e lib/galaxy/web/controllers/history.py
--- a/lib/galaxy/web/controllers/history.py Wed Jan 20 12:26:13 2010 -0500
+++ b/lib/galaxy/web/controllers/history.py Wed Jan 20 13:19:05 2010 -0500
@@ -516,13 +516,13 @@
# Get session and histories.
session = trans.sa_session
+ # Id values take precedence over histories passed in; last resort is current history.
if id:
ids = util.listify( id )
if ids:
histories = [ self.get_history( trans, history_id ) for history_id in ids ]
- else:
- # Use histories passed in.
- pass
+ elif not histories:
+ histories = [ trans.history ]
# Do operation on histories.
for history in histories:
diff -r 0a8d73234704 -r 4dfbf68c8c7e templates/root/index.mako
--- a/templates/root/index.mako Wed Jan 20 12:26:13 2010 -0500
+++ b/templates/root/index.mako Wed Jan 20 13:19:05 2010 -0500
@@ -23,8 +23,8 @@
"Clone": function() {
galaxy_main.location = "${h.url_for( controller='history', action='clone')}";
},
- "Share": function() {
- galaxy_main.location = "${h.url_for( controller='history', action='share' )}";
+ "Share or Publish": function() {
+ galaxy_main.location = "${h.url_for( controller='history', action='sharing' )}";
},
"Extract Workflow": function() {
galaxy_main.location = "${h.url_for( controller='workflow', action='build_from_current_history' )}";
1
0
22 Jan '10
details: http://www.bx.psu.edu/hg/galaxy/rev/0a8d73234704
changeset: 3253:0a8d73234704
user: jeremy goecks <jeremy.goecks(a)emory.edu>
date: Wed Jan 20 12:26:13 2010 -0500
description:
Unified sharing model for histories, workflows, and pages; these items can now be private, shared with a set of users, accessible via link for viewing and importing, or published. Specific features added are: (1) added published flag to histories and workflows, added importable flag to pages; (2) added unified sharing interface for setting sharing options; (3) updated grid framework to use new sharing model; (4) updated functional tests to reflect new sharing model; (5) added legacy support for making pretty URLs for items already made importable. Also, new sharing model does not yet allow sharing of multiple items at once, so functional test for this feature has been commented out. Fixes #229; Fixes #182.
diffstat:
lib/galaxy/model/__init__.py | 4 +
lib/galaxy/model/mapping.py | 7 +-
lib/galaxy/model/migrate/versions/0033_published_cols_for_histories_and_workflows.py | 101 ++++
lib/galaxy/web/base/controller.py | 97 +++-
lib/galaxy/web/controllers/history.py | 225 +++++----
lib/galaxy/web/controllers/workflow.py | 48 +-
lib/galaxy/web/framework/helpers/__init__.py | 1 +
templates/display_base.mako | 74 ++-
templates/history/list_published.mako | 4 +
templates/history/share.mako | 2 +-
templates/sharing_base.mako | 187 ++++++++
templates/workflow/list.mako | 2 +-
templates/workflow/list_published.mako | 4 +
templates/workflow/sharing.mako | 226 ++++++---
test/base/twilltestcase.py | 14 +-
test/functional/test_history_functions.py | 28 +-
16 files changed, 762 insertions(+), 262 deletions(-)
diffs (1401 lines):
diff -r 2916f1b9b82c -r 0a8d73234704 lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py Tue Jan 19 18:15:27 2010 -0500
+++ b/lib/galaxy/model/__init__.py Wed Jan 20 12:26:13 2010 -0500
@@ -184,6 +184,7 @@
self.deleted = False
self.purged = False
self.genome_build = None
+ self.published = False
# Relationships
self.user = user
self.datasets = []
@@ -1115,6 +1116,7 @@
self.user = None
self.name = None
self.slug = None
+ self.published = False
self.latest_workflow_id = None
self.workflows = []
@@ -1391,6 +1393,8 @@
self.slug = None
self.latest_revision_id = None
self.revisions = []
+ self.importable = None
+ self.published = None
class PageRevision( object ):
def __init__( self ):
diff -r 2916f1b9b82c -r 0a8d73234704 lib/galaxy/model/mapping.py
--- a/lib/galaxy/model/mapping.py Tue Jan 19 18:15:27 2010 -0500
+++ b/lib/galaxy/model/mapping.py Wed Jan 20 12:26:13 2010 -0500
@@ -79,7 +79,8 @@
Column( "purged", Boolean, index=True, default=False ),
Column( "genome_build", TrimmedString( 40 ) ),
Column( "importable", Boolean, default=False ),
- Column( "slug", TEXT, index=True ) )
+ Column( "slug", TEXT, index=True ),
+ Column( "published", Boolean, index=True ) )
HistoryUserShareAssociation.table = Table( "history_user_share_association", metadata,
Column( "id", Integer, primary_key=True ),
@@ -513,7 +514,8 @@
Column( "name", TEXT ),
Column( "deleted", Boolean, default=False ),
Column( "importable", Boolean, default=False ),
- Column( "slug", TEXT, index=True )
+ Column( "slug", TEXT, index=True ),
+ Column( "published", Boolean, index=True )
)
Workflow.table = Table( "workflow", metadata,
@@ -667,6 +669,7 @@
ForeignKey( "page_revision.id", use_alter=True, name='page_latest_revision_id_fk' ), index=True ),
Column( "title", TEXT ),
Column( "slug", TEXT, unique=True, index=True ),
+ Column( "importable", Boolean, index=True, default=False ),
Column( "published", Boolean, index=True, default=False ),
Column( "deleted", Boolean, index=True, default=False ),
)
diff -r 2916f1b9b82c -r 0a8d73234704 lib/galaxy/model/migrate/versions/0033_published_cols_for_histories_and_workflows.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/galaxy/model/migrate/versions/0033_published_cols_for_histories_and_workflows.py Wed Jan 20 12:26:13 2010 -0500
@@ -0,0 +1,101 @@
+"""
+Migration script to add necessary columns for distinguishing between viewing/importing and publishing histories, \
+workflows, and pages. Script adds published column to histories and workflows and importable column to pages.
+"""
+
+from sqlalchemy import *
+from sqlalchemy.orm import *
+from migrate import *
+from migrate.changeset import *
+
+import logging
+log = logging.getLogger( __name__ )
+
+metadata = MetaData( migrate_engine )
+db_session = scoped_session( sessionmaker( bind=migrate_engine, autoflush=False, autocommit=True ) )
+
+def upgrade():
+ print __doc__
+ metadata.reflect()
+
+ # Create published column in history table.
+ History_table = Table( "history", metadata, autoload=True )
+ c = Column( "published", Boolean, index=True )
+ try:
+ c.create( History_table )
+ assert c is History_table.c.published
+ except Exception, e:
+ print "Adding published column to history table failed: %s" % str( e )
+ log.debug( "Adding published column to history table failed: %s" % str( e ) )
+
+
+ # Create index for published column in history table.
+ try:
+ i = Index( "ix_history_published", History_table.c.published )
+ i.create()
+ except:
+ # Mysql doesn't have a named index, but alter should work
+ History_table.c.published.alter( unique=False )
+
+ # Create published column in stored workflows table.
+ StoredWorkflow_table = Table( "stored_workflow", metadata, autoload=True )
+ c = Column( "published", Boolean, index=True )
+ try:
+ c.create( StoredWorkflow_table )
+ assert c is StoredWorkflow_table.c.published
+ except Exception, e:
+ print "Adding published column to stored_workflow table failed: %s" % str( e )
+ log.debug( "Adding published column to stored_workflow table failed: %s" % str( e ) )
+
+ # Create index for published column in stored workflows table.
+ try:
+ i = Index( "ix_stored_workflow_published", StoredWorkflow_table.c.published )
+ i.create()
+ except:
+ # Mysql doesn't have a named index, but alter should work
+ StoredWorkflow_table.c.published.alter( unique=False )
+
+ # Create importable column in page table.
+ Page_table = Table( "page", metadata, autoload=True )
+ c = Column( "importable", Boolean, index=True )
+ try:
+ c.create( Page_table )
+ assert c is Page_table.c.importable
+ except Exception, e:
+ print "Adding importable column to page table failed: %s" % str( e )
+ log.debug( "Adding importable column to page table failed: %s" % str( e ) )
+
+ # Create index for importable column in page table.
+ try:
+ i = Index( "ix_page_importable", Page_table.c.importable )
+ i.create()
+ except:
+ # Mysql doesn't have a named index, but alter should work
+ Page_table.c.importable.alter( unique=False )
+
+def downgrade():
+ metadata.reflect()
+
+ # Drop published column from history table.
+ History_table = Table( "history", metadata, autoload=True )
+ try:
+ History_table.c.published.drop()
+ except Exception, e:
+ print "Dropping column published from history table failed: %s" % str( e )
+ log.debug( "Dropping column published from history table failed: %s" % str( e ) )
+
+ # Drop published column from stored_workflow table.
+ StoredWorkflow_table = Table( "stored_workflow", metadata, autoload=True )
+ try:
+ StoredWorkflow_table.c.published.drop()
+ except Exception, e:
+ print "Dropping column published from stored_workflow table failed: %s" % str( e )
+ log.debug( "Dropping column published from stored_workflow table failed: %s" % str( e ) )
+
+ # Drop importable column from page table.
+ Page_table = Table( "page", metadata, autoload=True )
+ try:
+ Page_table.c.importable.drop()
+ except Exception, e:
+ print "Dropping column importable from page table failed: %s" % str( e )
+ log.debug( "Dropping column importable from page table failed: %s" % str( e ) )
\ No newline at end of file
diff -r 2916f1b9b82c -r 0a8d73234704 lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py Tue Jan 19 18:15:27 2010 -0500
+++ b/lib/galaxy/web/base/controller.py Wed Jan 20 12:26:13 2010 -0500
@@ -9,6 +9,7 @@
from galaxy.web import error, form, url_for
from galaxy.model.orm import *
from galaxy.web.framework.helpers import grids
+from galaxy.util.odict import odict
from Cheetah.Template import Template
@@ -57,22 +58,94 @@
if history.user != user:
error( "History is not owned by current user" )
return history
+
+Root = BaseController
+
+class SharingStatusColumn( grids.GridColumn ):
+ """ Grid column to indicate sharing status. """
+ def get_value( self, trans, grid, item ):
+ # Delete items cannot be shared.
+ if item.deleted:
+ return ""
- def make_item_importable( self, sa_session, item ):
- """ Makes item importable and sets item's slug. Does not flush/commit changes, however. Item must have name, user, importable, and slug attributes. """
+ # Build a list of sharing for this item.
+ sharing_statuses = []
+ if item.users_shared_with:
+ sharing_statuses.append( "Shared" )
+ if item.importable:
+ sharing_statuses.append( "Accessible" )
+ if item.published:
+ sharing_statuses.append( "Published" )
+ return ", ".join( sharing_statuses )
+
+ def get_link( self, trans, grid, item ):
+ if not item.deleted and ( item.users_shared_with or item.importable ):
+ return dict( operation="share or publish", id=item.id )
+ return None
+
+ def filter( self, db_session, user, query, column_filter ):
+ """ Modify query to filter histories by sharing status. """
+ if column_filter == "All":
+ pass
+ elif column_filter:
+ if column_filter == "private":
+ query = query.filter( self.model_class.users_shared_with == None )
+ query = query.filter( self.model_class.importable == False )
+ elif column_filter == "shared":
+ query = query.filter( self.model_class.users_shared_with != None )
+ elif column_filter == "accessible":
+ query = query.filter( self.model_class.importable == True )
+ elif column_filter == "published":
+ query = query.filter( self.model_class.published == True )
+ return query
+
+ def get_accepted_filters( self ):
+ """ Returns a list of accepted filters for this column. """
+ accepted_filter_labels_and_vals = odict()
+ accepted_filter_labels_and_vals["private"] = "private"
+ accepted_filter_labels_and_vals["shared"] = "shared"
+ accepted_filter_labels_and_vals["accessible"] = "accessible"
+ accepted_filter_labels_and_vals["published"] = "published"
+ accepted_filter_labels_and_vals["all"] = "All"
+ accepted_filters = []
+ for label, val in accepted_filter_labels_and_vals.items():
+ args = { self.key: val }
+ accepted_filters.append( grids.GridColumnFilter( label, args) )
+ return accepted_filters
+
+class Sharable:
+ """ Mixin for a controller that manages and item that can be shared. """
+
+ # Abstract methods.
+
+ @web.expose
+ @web.require_login( "share Galaxy items" )
+ def sharing( self, trans, id, **kwargs ):
+ """ Handle item sharing. """
+ pass
+
+ @web.expose
+ def display_by_username_and_slug( self, trans, username, slug ):
+ """ Display item by username and slug. """
+ pass
+
+ # Helper methods.
+
+ def _make_item_accessible( self, sa_session, item ):
+ """ Makes item accessible--viewable and importable--and sets item's slug. Does not flush/commit changes, however. Item must have name, user, importable, and slug attributes. """
item.importable = True
- # Set history slug. Slug must be unique among user's importable pages.
- slug_base = re.sub( "\s+", "-", item.name.lower() )
- slug = slug_base
- count = 1
- while sa_session.query( item.__class__ ).filter_by( user=item.user, slug=slug, importable=True ).count() != 0:
- # Slug taken; choose a new slug based on count. This approach can handle numerous histories with the same name gracefully.
- slug = '%s-%i' % ( slug_base, count )
- count += 1
- item.slug = slug
+ # Set item slug. Slug must be unique among user's importable items for item's class.
+ if item.slug is None:
+ slug_base = re.sub( "\s+", "-", item.name.lower() )
+ slug = slug_base
+ count = 1
+ while sa_session.query( item.__class__ ).filter_by( user=item.user, slug=slug, importable=True ).count() != 0:
+ # Slug taken; choose a new slug based on count. This approach can handle numerous histories with the same name gracefully.
+ slug = '%s-%i' % ( slug_base, count )
+ count += 1
+ item.slug = slug
-Root = BaseController
"""
Deprecated: `BaseController` used to be available under the name `Root`
"""
diff -r 2916f1b9b82c -r 0a8d73234704 lib/galaxy/web/controllers/history.py
--- a/lib/galaxy/web/controllers/history.py Tue Jan 19 18:15:27 2010 -0500
+++ b/lib/galaxy/web/controllers/history.py Wed Jan 20 12:26:13 2010 -0500
@@ -4,7 +4,6 @@
from galaxy.model.mapping import desc
from galaxy.model.orm import *
from galaxy.util.json import *
-from galaxy.util.odict import odict
from galaxy.tags.tag_handler import TagHandler
from sqlalchemy.sql.expression import ClauseElement
import webhelpers, logging, operator
@@ -32,20 +31,6 @@
else:
rval.append( '' )
return rval
-
- class StatusColumn( grids.GridColumn ):
- def get_value( self, trans, grid, history ):
- if history.deleted:
- return "deleted"
- elif history.users_shared_with:
- return "shared"
- elif history.importable:
- return "importable"
- return ""
- def get_link( self, trans, grid, item ):
- if item.users_shared_with or item.importable:
- return dict( operation="sharing", id=item.id )
- return None
class DeletedColumn( grids.GridColumn ):
def get_accepted_filters( self ):
@@ -56,33 +41,6 @@
args = { self.key: val }
accepted_filters.append( grids.GridColumnFilter( label, args) )
return accepted_filters
-
- class SharingColumn( grids.GridColumn ):
- def filter( self, db_session, user, query, column_filter ):
- """ Modify query to filter histories by sharing status. """
- if column_filter == "All":
- pass
- elif column_filter:
- if column_filter == "private":
- query = query.filter( model.History.users_shared_with == None )
- query = query.filter( model.History.importable == False )
- elif column_filter == "shared":
- query = query.filter( model.History.users_shared_with != None )
- elif column_filter == "importable":
- query = query.filter( model.History.importable == True )
- return query
- def get_accepted_filters( self ):
- """ Returns a list of accepted filters for this column. """
- accepted_filter_labels_and_vals = odict()
- accepted_filter_labels_and_vals["private"] = "private"
- accepted_filter_labels_and_vals["shared"] = "shared"
- accepted_filter_labels_and_vals["importable"] = "importable"
- accepted_filter_labels_and_vals["all"] = "All"
- accepted_filters = []
- for label, val in accepted_filter_labels_and_vals.items():
- args = { self.key: val }
- accepted_filters.append( grids.GridColumnFilter( label, args) )
- return accepted_filters
# Grid definition
title = "Saved Histories"
@@ -95,12 +53,11 @@
attach_popup=True, filterable="advanced" ),
DatasetsByStateColumn( "Datasets (by state)", ncells=4 ),
grids.IndividualTagsColumn( "Tags", "tags", model.History, model.HistoryTagAssociation, filterable="advanced", grid_name="HistoryListGrid" ),
- StatusColumn( "Status", attach_popup=False ),
+ SharingStatusColumn( "Sharing", key="sharing", model_class=model.History, filterable="advanced", sortable=False ),
grids.GridColumn( "Created", key="create_time", format=time_ago ),
grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
# Columns that are valid for filtering but are not visible.
- DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" ),
- SharingColumn( "Shared", key="shared", visible=False, filterable="advanced" ),
+ DeletedColumn( "Deleted", key="deleted", visible=False, filterable="advanced" )
]
columns.append(
grids.MulticolFilterColumn(
@@ -111,20 +68,17 @@
operations = [
grids.GridOperation( "Switch", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
- grids.GridOperation( "Share", condition=( lambda item: not item.deleted ), async_compatible=False ),
- grids.GridOperation( "Unshare", condition=( lambda item: not item.deleted ), async_compatible=False ),
+ grids.GridOperation( "Share or Publish", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Rename", condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ), async_compatible=True ),
grids.GridOperation( "Undelete", condition=( lambda item: item.deleted ), async_compatible=True ),
- grids.GridOperation( "Enable import via link", condition=( lambda item: item.deleted ), async_compatible=True ),
- grids.GridOperation( "Disable import via link", condition=( lambda item: item.deleted ), async_compatible=True )
]
standard_filters = [
grids.GridColumnFilter( "Active", args=dict( deleted=False ) ),
grids.GridColumnFilter( "Deleted", args=dict( deleted=True ) ),
grids.GridColumnFilter( "All", args=dict( deleted='All' ) ),
]
- default_filter = dict( name="All", deleted="False", tags="All", shared="All" )
+ default_filter = dict( name="All", deleted="False", tags="All", sharing="All" )
num_rows_per_page = 50
preserve_state = False
use_async = True
@@ -198,10 +152,10 @@
# Join so that searching history.user makes sense.
return session.query( self.model_class ).join( model.User.table )
def apply_default_filter( self, trans, query, **kwargs ):
- # A public history is importable, has a slug, and is not deleted.
- return query.filter( self.model_class.importable==True ).filter( self.model_class.slug != None ).filter( self.model_class.deleted == False )
+ # A public history is published, has a slug, and is not deleted.
+ return query.filter( self.model_class.published == True ).filter( self.model_class.slug != None ).filter( self.model_class.deleted == False )
-class HistoryController( BaseController ):
+class HistoryController( BaseController, Sharable ):
@web.expose
def index( self, trans ):
return ""
@@ -231,13 +185,11 @@
status = message = None
if 'operation' in kwargs:
operation = kwargs['operation'].lower()
- if operation == "share":
- return self.share( trans, **kwargs )
+ if operation == "share or publish":
+ return self.sharing( trans, **kwargs )
if operation == "rename":
return self.rename( trans, **kwargs )
history_ids = util.listify( kwargs.get( 'id', [] ) )
- if operation == "sharing":
- return self.sharing( trans, id=history_ids )
# Display no message by default
status, message = None, None
refresh_history = False
@@ -519,9 +471,8 @@
if not history_to_view:
return trans.show_error_message( "The specified history does not exist." )
# Admin users can view any history
- # TODO: Use a new flag to determine if history is viewable?
if not trans.user_is_admin and not history_to_view.importable:
- error( "Either you are not allowed to view this history or the owner of this history has not published it." )
+ error( "Either you are not allowed to view this history or the owner of this history has not made it accessible." )
# View history.
query = trans.sa_session.query( model.HistoryDatasetAssociation ) \
.filter( model.HistoryDatasetAssociation.history == history_to_view ) \
@@ -559,6 +510,111 @@
item = history, item_data = query.all() )
@web.expose
+ @web.require_login( "share Galaxy histories" )
+ def sharing( self, trans, id=None, histories=[], **kwargs ):
+ """ Handle history sharing. """
+
+ # Get session and histories.
+ session = trans.sa_session
+ if id:
+ ids = util.listify( id )
+ if ids:
+ histories = [ self.get_history( trans, history_id ) for history_id in ids ]
+ else:
+ # Use histories passed in.
+ pass
+
+ # Do operation on histories.
+ for history in histories:
+ if 'make_accessible_via_link' in kwargs:
+ self._make_item_accessible( trans.sa_session, history )
+ elif 'make_accessible_and_publish' in kwargs:
+ self._make_item_accessible( trans.sa_session, history )
+ history.published = True
+ elif 'publish' in kwargs:
+ if history.importable:
+ history.published = True
+ else:
+ # TODO: report error here.
+ pass
+ elif 'disable_link_access' in kwargs:
+ history.importable = False
+ elif 'unpublish' in kwargs:
+ history.published = False
+ elif 'disable_link_access_and_unpubish' in kwargs:
+ history.importable = stored.published = False
+ elif 'unshare_user' in kwargs:
+ user = trans.sa_session.query( trans.app.model.User ).get( trans.security.decode_id( kwargs[ 'unshare_user' ] ) )
+ if not user:
+ msg = 'History (%s) does not seem to be shared with user (%s)' % ( history.name, user.email )
+ return trans.fill_template( 'history/sharing.mako', histories=histories, msg=msg, messagetype='error' )
+ husas = trans.sa_session.query( trans.app.model.HistoryUserShareAssociation ).filter_by( user=user, history=history ).all()
+ if husas:
+ for husa in husas:
+ trans.sa_session.delete( husa )
+
+ # Legacy issue: histories made accessible before recent updates may not have a slug. Create slug for any histories that need them.
+ for history in histories:
+ if history.importable and not history.slug:
+ self._make_item_accessible( trans.sa_session, history )
+
+ session.flush()
+
+ return trans.fill_template( "/sharing_base.mako", item=history )
+
+ ## TODO: remove this method when history sharing has been verified to work correctly with new sharing() method.
+ @web.expose
+ @web.require_login( "share histories with other users" )
+ def sharing_old( self, trans, histories=[], id=None, **kwd ):
+ """Performs sharing of histories among users."""
+ # histories looks like: [ historyX, historyY ]
+ params = util.Params( kwd )
+ msg = util.restore_text ( params.get( 'msg', '' ) )
+ if id:
+ ids = util.listify( id )
+ if ids:
+ histories = [ self.get_history( trans, history_id ) for history_id in ids ]
+ for history in histories:
+ trans.sa_session.add( history )
+ if params.get( 'enable_import_via_link', False ):
+ self.make_item_importable( trans.sa_session, history )
+ trans.sa_session.flush()
+ elif params.get( 'disable_import_via_link', False ):
+ history.importable = False
+ trans.sa_session.flush()
+ elif params.get( 'unshare_user', False ):
+ user = trans.sa_session.query( trans.app.model.User ).get( trans.security.decode_id( kwd[ 'unshare_user' ] ) )
+ if not user:
+ msg = 'History (%s) does not seem to be shared with user (%s)' % ( history.name, user.email )
+ return trans.fill_template( 'history/sharing.mako', histories=histories, msg=msg, messagetype='error' )
+ husas = trans.sa_session.query( trans.app.model.HistoryUserShareAssociation ).filter_by( user=user, history=history ).all()
+ if husas:
+ for husa in husas:
+ trans.sa_session.delete( husa )
+ trans.sa_session.flush()
+ histories = []
+ # Get all histories that have been shared with others
+ husas = trans.sa_session.query( trans.app.model.HistoryUserShareAssociation ) \
+ .join( "history" ) \
+ .filter( and_( trans.app.model.History.user == trans.user,
+ trans.app.model.History.deleted == False ) ) \
+ .order_by( trans.app.model.History.table.c.name )
+ for husa in husas:
+ history = husa.history
+ if history not in histories:
+ histories.append( history )
+ # Get all histories that are importable
+ importables = trans.sa_session.query( trans.app.model.History ) \
+ .filter_by( user=trans.user, importable=True, deleted=False ) \
+ .order_by( trans.app.model.History.table.c.name )
+ for importable in importables:
+ if importable not in histories:
+ histories.append( importable )
+ # Sort the list of histories by history.name
+ histories.sort( key=operator.attrgetter( 'name') )
+ return trans.fill_template( 'history/sharing.mako', histories=histories, msg=msg, messagetype='done' )
+
+ @web.expose
@web.require_login( "share histories with other users" )
def share( self, trans, id=None, email="", **kwd ):
# If a history contains both datasets that can be shared and others that cannot be shared with the desired user,
@@ -613,6 +669,7 @@
# User seems to be sharing an empty history
send_to_err = "You cannot share an empty history. "
return trans.fill_template( "/history/share.mako", histories=histories, email=email, send_to_err=send_to_err )
+
@web.expose
@web.require_login( "share restricted histories with other users" )
def share_restricted( self, trans, id=None, email="", **kwd ):
@@ -833,56 +890,6 @@
return self.sharing( trans, histories=shared_histories, msg=msg )
@web.expose
- @web.require_login( "share histories with other users" )
- def sharing( self, trans, histories=[], id=None, **kwd ):
- """Performs sharing of histories among users."""
- # histories looks like: [ historyX, historyY ]
- params = util.Params( kwd )
- msg = util.restore_text ( params.get( 'msg', '' ) )
- if id:
- ids = util.listify( id )
- if ids:
- histories = [ self.get_history( trans, history_id ) for history_id in ids ]
- for history in histories:
- trans.sa_session.add( history )
- if params.get( 'enable_import_via_link', False ):
- self.make_item_importable( trans.sa_session, history )
- trans.sa_session.flush()
- elif params.get( 'disable_import_via_link', False ):
- history.importable = False
- trans.sa_session.flush()
- elif params.get( 'unshare_user', False ):
- user = trans.sa_session.query( trans.app.model.User ).get( trans.security.decode_id( kwd[ 'unshare_user' ] ) )
- if not user:
- msg = 'History (%s) does not seem to be shared with user (%s)' % ( history.name, user.email )
- return trans.fill_template( 'history/sharing.mako', histories=histories, msg=msg, messagetype='error' )
- husas = trans.sa_session.query( trans.app.model.HistoryUserShareAssociation ).filter_by( user=user, history=history ).all()
- if husas:
- for husa in husas:
- trans.sa_session.delete( husa )
- trans.sa_session.flush()
- histories = []
- # Get all histories that have been shared with others
- husas = trans.sa_session.query( trans.app.model.HistoryUserShareAssociation ) \
- .join( "history" ) \
- .filter( and_( trans.app.model.History.user == trans.user,
- trans.app.model.History.deleted == False ) ) \
- .order_by( trans.app.model.History.table.c.name )
- for husa in husas:
- history = husa.history
- if history not in histories:
- histories.append( history )
- # Get all histories that are importable
- importables = trans.sa_session.query( trans.app.model.History ) \
- .filter_by( user=trans.user, importable=True, deleted=False ) \
- .order_by( trans.app.model.History.table.c.name )
- for importable in importables:
- if importable not in histories:
- histories.append( importable )
- # Sort the list of histories by history.name
- histories.sort( key=operator.attrgetter( 'name') )
- return trans.fill_template( 'history/sharing.mako', histories=histories, msg=msg, messagetype='done' )
- @web.expose
@web.require_login( "rename histories" )
def rename( self, trans, id=None, name=None, **kwd ):
user = trans.get_user()
diff -r 2916f1b9b82c -r 0a8d73234704 lib/galaxy/web/controllers/workflow.py
--- a/lib/galaxy/web/controllers/workflow.py Tue Jan 19 18:15:27 2010 -0500
+++ b/lib/galaxy/web/controllers/workflow.py Wed Jan 20 12:26:13 2010 -0500
@@ -51,8 +51,8 @@
def apply_default_filter( self, trans, query, **kwargs ):
return query.filter_by( user=trans.user, deleted=False )
-class PublicStoredWorkflowListGrid( grids.Grid ):
- title = "Public Workflows"
+class StoredWorkflowAllPublishedGrid( grids.Grid ):
+ title = "Published Workflows"
model_class = model.StoredWorkflow
default_sort_key = "-update_time"
default_filter = dict( public_url="All", username="All", tags="All" )
@@ -74,12 +74,12 @@
# Join so that searching stored_workflow.user makes sense.
return session.query( self.model_class ).join( model.User.table )
def apply_default_filter( self, trans, query, **kwargs ):
- # A public workflow is importable, has a slug, and is not deleted.
- return query.filter( self.model_class.importable==True ).filter( self.model_class.slug != None ).filter( self.model_class.deleted == False )
+ # A public workflow is published, has a slug, and is not deleted.
+ return query.filter( self.model_class.published==True ).filter( self.model_class.slug != None ).filter( self.model_class.deleted == False )
-class WorkflowController( BaseController ):
+class WorkflowController( BaseController, Sharable ):
stored_list_grid = StoredWorkflowListGrid()
- public_list_grid = PublicStoredWorkflowListGrid()
+ published_list_grid = StoredWorkflowAllPublishedGrid()
@web.expose
def index( self, trans ):
@@ -146,7 +146,7 @@
@web.expose
def list_published( self, trans, **kwargs ):
- grid = self.public_list_grid( trans, **kwargs )
+ grid = self.published_list_grid( trans, **kwargs )
if 'async' in kwargs:
return grid
else:
@@ -228,15 +228,27 @@
@web.expose
@web.require_login( "use Galaxy workflows" )
def sharing( self, trans, id, **kwargs ):
+ """ Handle workflow sharing. """
+
+ # Get session and workflow.
session = trans.sa_session
stored = get_stored_workflow( trans, id )
session.add( stored )
- if 'enable_import_via_link' in kwargs:
- self.make_item_importable( trans.sa_session, stored )
- session.flush()
- elif 'disable_import_via_link' in kwargs:
+
+ # Do operation on workflow.
+ if 'make_accessible_via_link' in kwargs:
+ self._make_item_accessible( trans.sa_session, stored )
+ elif 'make_accessible_and_publish' in kwargs:
+ self._make_item_accessible( trans.sa_session, stored )
+ stored.published = True
+ elif 'publish' in kwargs:
+ stored.published = True
+ elif 'disable_link_access' in kwargs:
stored.importable = False
- session.flush()
+ elif 'unpublish' in kwargs:
+ stored.published = False
+ elif 'disable_link_access_and_unpubish' in kwargs:
+ stored.importable = stored.published = False
elif 'unshare_user' in kwargs:
user = session.query( model.User ).get( trans.security.decode_id( kwargs['unshare_user' ] ) )
if not user:
@@ -244,10 +256,16 @@
association = session.query( model.StoredWorkflowUserShareAssociation ) \
.filter_by( user=user, stored_workflow=stored ).one()
session.delete( association )
- session.flush()
- return trans.fill_template( "workflow/sharing.mako",
- stored=stored )
+
+ # Legacy issue: workflows made accessible before recent updates may not have a slug. Create slug for any workflows that need them.
+ if stored.importable and not stored.slug:
+ self._make_item_accessible( trans.sa_session, stored )
+
+ session.flush()
+ return trans.fill_template( "/sharing_base.mako",
+ item=stored )
+
@web.expose
@web.require_login( "use Galaxy workflows" )
def imp( self, trans, id, **kwargs ):
diff -r 2916f1b9b82c -r 0a8d73234704 lib/galaxy/web/framework/helpers/__init__.py
--- a/lib/galaxy/web/framework/helpers/__init__.py Tue Jan 19 18:15:27 2010 -0500
+++ b/lib/galaxy/web/framework/helpers/__init__.py Wed Jan 20 12:26:13 2010 -0500
@@ -42,3 +42,4 @@
in a better way.
"""
return "\n".join( [ javascript_include_tag( "/static/scripts/" + name + ".js?v=2" ) for name in args ] )
+
diff -r 2916f1b9b82c -r 0a8d73234704 templates/display_base.mako
--- a/templates/display_base.mako Tue Jan 19 18:15:27 2010 -0500
+++ b/templates/display_base.mako Wed Jan 20 12:26:13 2010 -0500
@@ -3,8 +3,24 @@
<%!
from galaxy.model import History, StoredWorkflow, Page
+ from galaxy.web.framework.helpers import iff
%>
+## Get display name for a class.
+<%def name="get_class_display_name( a_class )">
+<%
+ ## Start with exceptions, end with default.
+ if a_class is StoredWorkflow:
+ return "Workflow"
+ else:
+ return a_class.__name__
+%>
+</%def>
+
+<%def name="title()">
+ Galaxy :: ${iff( item.published, "Published ", "Accessible " ) + self.get_class_display_name( item.__class__ )} : ${item.name}
+</%def>
+
<%def name="init()">
<%
self.has_left_panel=False
@@ -85,10 +101,12 @@
%>
<div class="unified-panel-header" unselectable="on">
- <div class="unified-panel-header-inner">
- <a href="${href_to_all_items}">Published ${item_plural}</a> |
- <a href="${href_to_user_items}">${item.user.username}</a> | ${self.get_item_name( item )}
- </div>
+ %if item.published:
+ <div class="unified-panel-header-inner">
+ <a href="${href_to_all_items}">Published ${item_plural}</a> |
+ <a href="${href_to_user_items}">${item.user.username}</a> | ${self.get_item_name( item )}
+ </div>
+ %endif
</div>
<div class="unified-panel-body">
@@ -101,31 +119,33 @@
${self.render_item( item, item_data )}
</div>
- <div class="page-meta">
- ## Page meta.
- <div><strong>Related ${item_plural}</strong></div>
- <p>
- <a href="${href_to_all_items}">All published ${item_plural.lower()}</a><br>
- <a href="${href_to_user_items}">${item_plural} owned by ${item.user.username}</a>
+ %if item.published:
+ <div class="page-meta">
+ ## Page meta.
+ <div><strong>Related ${item_plural}</strong></div>
+ <p>
+ <a href="${href_to_all_items}">All published ${item_plural.lower()}</a><br>
+ <a href="${href_to_user_items}">${item_plural} owned by ${item.user.username}</a>
- ## Tags.
- <div><strong>Tags</strong></div>
- <p>
- ## Community tags.
- <div>
- Community:
- ${render_community_tagging_element( tagged_item=item, tag_click_fn='community_tag_click', use_toggle_link=False )}
- %if len ( item.tags ) == 0:
- none
- %endif
+ ## Tags.
+ <div><strong>Tags</strong></div>
+ <p>
+ ## Community tags.
+ <div>
+ Community:
+ ${render_community_tagging_element( tagged_item=item, tag_click_fn='community_tag_click', use_toggle_link=False )}
+ %if len ( item.tags ) == 0:
+ none
+ %endif
+ </div>
+ ## Individual tags.
+ <p>
+ <div>
+ Yours:
+ ${render_individual_tagging_element( user=trans.get_user(), tagged_item=item, elt_context='view.mako', use_toggle_link=False, tag_click_fn='community_tag_click' )}
+ </div>
</div>
- ## Individual tags.
- <p>
- <div>
- Yours:
- ${render_individual_tagging_element( user=trans.get_user(), tagged_item=item, elt_context='view.mako', use_toggle_link=False, tag_click_fn='community_tag_click' )}
- </div>
- </div>
+ %endif
</div>
</div>
</%def>
diff -r 2916f1b9b82c -r 0a8d73234704 templates/history/list_published.mako
--- a/templates/history/list_published.mako Tue Jan 19 18:15:27 2010 -0500
+++ b/templates/history/list_published.mako Wed Jan 20 12:26:13 2010 -0500
@@ -9,6 +9,10 @@
%>
</%def>
+<%def name="title()">
+ Galaxy :: Published Histories
+</%def>
+
<%def name="center_panel()">
## <iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;" src="${h.url_for( controller="page", action="list" )}"> </iframe>
diff -r 2916f1b9b82c -r 0a8d73234704 templates/history/share.mako
--- a/templates/history/share.mako Tue Jan 19 18:15:27 2010 -0500
+++ b/templates/history/share.mako Wed Jan 20 12:26:13 2010 -0500
@@ -7,7 +7,7 @@
<div class="toolFormBody">
%if not can_change and not cannot_change and not no_change_needed:
## We are sharing histories that contain only public datasets
- <form name='share' id='share' action="${h.url_for( controller="history", action='share' )}" method="post" >
+ <form name='share' id='share' action="${h.url_for( action='share' )}" method="post" >
<div class="form-title-row"><b>Histories to be shared:</b></div>
<div class="form-row" style="padding-left: 2em;">
<table width="100%">
diff -r 2916f1b9b82c -r 0a8d73234704 templates/sharing_base.mako
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/templates/sharing_base.mako Wed Jan 20 12:26:13 2010 -0500
@@ -0,0 +1,187 @@
+##
+## Base template for sharing an item. Template expects the following parameters:
+## (a) item - item to be shared.
+##
+
+<%inherit file="/base.mako"/>
+<%! from galaxy import model %>
+
+##
+## Page methods.
+##
+
+<%def name="title()">
+ Sharing and Publishing ${get_class_display_name( item.__class__ )} '${item.name}'
+</%def>
+
+<%def name="stylesheets()">
+ ${parent.stylesheets()}
+ <style>
+ div.indent
+ {
+ margin-left: 1em;
+ }
+ input.action-button
+ {
+ margin-left: 0;
+ }
+ </style>
+</%def>
+
+## Get display name for a class.
+<%def name="get_class_display_name( a_class )">
+<%
+ ## Start with exceptions, end with default.
+ if a_class is model.StoredWorkflow:
+ return "Workflow"
+ else:
+ return a_class.__name__
+%>
+</%def>
+
+## Get plural display name for a class.
+<%def name="get_class_plural_display_name( a_class )">
+<%
+ ## Start with exceptions, end with default.
+ if a_class is model.History:
+ return "Histories"
+ else:
+ return get_class_display_name( a_class ) + "s"
+%>
+</%def>
+
+##
+## Page content.
+##
+<%
+ #
+ # Setup and variables needed for page.
+ #
+
+ # Get class name strings.
+ item_class_name = get_class_display_name( item.__class__ )
+ item_class_name_lc = item_class_name.lower()
+ item_class_plural_name = get_class_plural_display_name( item.__class__ )
+ item_class_plural_name_lc = item_class_plural_name.lower()
+%>
+
+<h2>Sharing and Publishing ${item_class_name} '${item.name}'</h2>
+
+<div class="indent" style="margin-top: 2em">
+<h3>Making ${item_class_name} Accessible via Link and Publishing It</h3>
+
+ <div class="indent">
+ %if item.importable:
+ <%
+ item_status = "accessible via link"
+ if item.published:
+ item_status = item_status + " and published"
+ %>
+ This ${item_class_name_lc} <strong>${item_status}</strong>.
+ <div class="indent">
+ <p>Anyone can view and import this ${item_class_name_lc} by visiting the following URL:
+ <% url = h.url_for( action='display_by_username_and_slug', username=trans.get_user().username, slug=item.slug, qualified=True ) %>
+ <blockquote>
+ <a href="${url}" target="_top">${url}</a>
+ </blockquote>
+
+ %if item.published:
+ This ${item_class_name_lc} is publicly listed and searchable in Galaxy's <a href='${h.url_for( action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section.
+ %endif
+ </div>
+
+ <p>You can:
+ <div class="indent">
+ <form action="${h.url_for( action='sharing', id=trans.security.encode_id( item.id ) )}"
+ method="POST">
+ %if not item.published:
+ ## Item is importable but not published. User can disable importable or publish.
+ <input class="action-button" type="submit" name="disable_link_access" value="Disable Access to ${item_class_name} Link">
+ <div class="toolParamHelp">Disables ${item_class_name_lc}'s link so that it is not accessible.</div>
+ <br>
+ <input class="action-button" type="submit" name="publish" value="Publish ${item_class_name}" method="POST">
+ <div class="toolParamHelp">Publishes the ${item_class_name_lc} to Galaxy's <a href='${h.url_for( action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section, where it is publicly listed and searchable.</div>
+
+ <br>
+ %else: ## item.published == True
+ ## Item is importable and published. User can unpublish or disable import and unpublish.
+ <input class="action-button" type="submit" name="unpublish" value="Unpublish ${item_class_name}">
+ <div class="toolParamHelp">Removes ${item_class_name_lc} from Galaxy's <a href='${h.url_for( action='list_published' )}' target="_top">Published ${item_class_plural_name}</a> section so that it is not publicly listed or searchable.</div>
+ <br>
+ <input class="action-button" type="submit" name="disable_link_access_and_unpubish" value="Disable Access to ${item_class_name} via Link and Unpublish">
+ <div class="toolParamHelp">Disables ${item_class_name_lc}'s link so that it is not accessible and removes ${item_class_name_lc} from Galaxy's <a href='${h.url_for( action='list_published' )}' target='_top'>Published ${item_class_plural_name}</a> section so that it is not publicly listed or searchable.</div>
+ %endif
+
+ </form>
+ </div>
+
+ %else:
+
+ This ${item_class_name_lc} is currently restricted so that only you and the users listed below can access it. You can:
+ <p>
+ <form action="${h.url_for( action='sharing', id=trans.security.encode_id(item.id) )}" method="POST">
+ <input class="action-button" type="submit" name="make_accessible_via_link" value="Make ${item_class_name} Accessible via Link">
+ <div class="toolParamHelp">Generates a web link that you can share with other people so that they can view and import the ${item_class_name_lc}.</div>
+
+ <br>
+ <input class="action-button" type="submit" name="make_accessible_and_publish" value="Make ${item_class_name} Accessible and Publish" method="POST">
+ <div class="toolParamHelp">Makes the ${item_class_name_lc} accessible via link (see above) and publishes the ${item_class_name_lc} to Galaxy's <a href='${h.url_for( action='list_published' )}' target='_top'>Published ${item_class_plural_name}</a> section, where it is publicly listed and searchable.</div>
+ </form>
+
+ %endif
+ </div>
+
+<h3>Sharing ${item_class_name} with Specific Users</h3>
+
+ <div class="indent">
+ %if item.users_shared_with:
+
+ <p>
+ The following users will see this ${item_class_name_lc} in their ${item_class_name_lc} list and will be
+ able to run/view and import it.
+ </p>
+
+ <ul class="manage-table-actions">
+ <li>
+ <a class="action-button" href="${h.url_for( action='share', id=trans.security.encode_id(item.id) )}">
+ <span>Share with another user</span>
+ </a>
+ </li>
+ </ul>
+
+ <table class="colored" border="0" cellspacing="0" cellpadding="0" width="100%">
+ <tr class="header">
+ <th>Email</th>
+ <th></th>
+ </tr>
+ %for i, association in enumerate( item.users_shared_with ):
+ <% user = association.user %>
+ <tr>
+ <td>
+ ${user.email}
+ <a id="user-${i}-popup" class="popup-arrow" style="display: none;">▼</a>
+ </td>
+ <td>
+ <div popupmenu="user-${i}-popup">
+ <a class="action-button" href="${h.url_for( action='sharing', id=trans.security.encode_id( item.id ), unshare_user=trans.security.encode_id( user.id ) )}">Unshare</a>
+ </div>
+ </td>
+ </tr>
+ %endfor
+ </table>
+
+ %else:
+
+ <p>You have not shared this ${item_class_name_lc} with any users.</p>
+
+ <a class="action-button" href="${h.url_for( action='share', id=trans.security.encode_id(item.id) )}">
+ <span>Share with a user</span>
+ </a>
+ <br>
+
+ %endif
+ </div>
+</div>
+
+<p><br><br>
+<a href=${h.url_for( action="list" )}>Back to ${item_class_plural_name} List</a>
\ No newline at end of file
diff -r 2916f1b9b82c -r 0a8d73234704 templates/workflow/list.mako
--- a/templates/workflow/list.mako Tue Jan 19 18:15:27 2010 -0500
+++ b/templates/workflow/list.mako Wed Jan 20 12:26:13 2010 -0500
@@ -47,9 +47,9 @@
<div popupmenu="wf-${i}-popup">
<a class="action-button" href="${h.url_for( action='editor', id=trans.security.encode_id(workflow.id) )}" target="_parent">Edit</a>
<a class="action-button" href="${h.url_for( controller='root', action='index', workflow_id=trans.security.encode_id(workflow.id) )}" target="_parent">Run</a>
+ <a class="action-button" href="${h.url_for( action='sharing', id=trans.security.encode_id(workflow.id) )}">Share or Publish</a>
<a class="action-button" href="${h.url_for( action='clone', id=trans.security.encode_id(workflow.id) )}">Clone</a>
<a class="action-button" href="${h.url_for( action='rename', id=trans.security.encode_id(workflow.id) )}">Rename</a>
- <a class="action-button" href="${h.url_for( action='sharing', id=trans.security.encode_id(workflow.id) )}">Sharing</a>
<a class="action-button" confirm="Are you sure you want to delete workflow '${workflow.name}'?" href="${h.url_for( action='delete', id=trans.security.encode_id(workflow.id) )}">Delete</a>
</div>
</td>
diff -r 2916f1b9b82c -r 0a8d73234704 templates/workflow/list_published.mako
--- a/templates/workflow/list_published.mako Tue Jan 19 18:15:27 2010 -0500
+++ b/templates/workflow/list_published.mako Wed Jan 20 12:26:13 2010 -0500
@@ -9,6 +9,10 @@
%>
</%def>
+<%def name="title()">
+ Galaxy :: Published Workflows
+</%def>
+
<%def name="center_panel()">
## <iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;" src="${h.url_for( controller="page", action="list" )}"> </iframe>
diff -r 2916f1b9b82c -r 0a8d73234704 templates/workflow/sharing.mako
--- a/templates/workflow/sharing.mako Tue Jan 19 18:15:27 2010 -0500
+++ b/templates/workflow/sharing.mako Wed Jan 20 12:26:13 2010 -0500
@@ -1,87 +1,161 @@
<%inherit file="/base.mako"/>
+<%! from galaxy import model %>
-<h2>Public access via link</h2>
+##
+## Page methods.
+##
-<p>
- %if stored.importable:
- <p>
- Anyone can view this workflow by visiting the following URL:
- <% url = h.url_for( action='display_by_username_and_slug', username=trans.get_user().username, slug=stored.slug, qualified=True ) %>
- <blockquote>
- <a href="${url}">${url}</a>
- </blockquote>
+<%def name="title()">
+ Sharing Workflow '${stored.name}'
+</%def>
+
+<%def name="stylesheets()">
+ ${parent.stylesheets()}
+ <style>
+ div.indent
+ {
+ margin-left: 1em;
+ }
+ input.action-button
+ {
+ margin-left: 0;
+ }
+ </style>
+</%def>
+
+## Get display name for a class.
+<%def name="get_class_display_name( a_class )">
+<%
+ if a_class is model.History:
+ return "History"
+ elif a_class is model.StoredWorkflow:
+ return "Workflow"
+ elif a_class is model.Page:
+ return "Page"
+%>
+</%def>
+
+##
+## Page content.
+##
+
+<h2>Sharing Workflow '${stored.name}'</h2>
+
+<div class="indent" style="margin-top: 2em">
+<h3>Making Workflow Accessible via Link and Publishing It</h3>
- <p>
- Anyone can import this workflow into their history via the following URL:
- <% url = h.url_for( action='imp', id=trans.security.encode_id(stored.id), qualified=True ) %>
- <blockquote>
- <a href="${url}">${url}</a>
- </blockquote>
- <br>
+ <div class="indent">
+ %if stored.importable:
+ <%
+ item_status = "accessible via link"
+ if stored.published:
+ item_status = item_status + " and published"
+ %>
+ This workflow <strong>${item_status}</strong>.
+ <div class="indent">
+ <p>Anyone can view and import this workflow by visiting the following URL:
+ <% url = h.url_for( action='display_by_username_and_slug', username=trans.get_user().username, slug=stored.slug, qualified=True ) %>
+ <blockquote>
+ <a href="${url}">${url}</a>
+ </blockquote>
+
+ %if stored.published:
+ This workflow is publicly listed and searchable in Galaxy's <a href='${h.url_for( action='list_published' )}'>Published Workflows</a> section.
+ %endif
+ </div>
+
+ <p>You can:
+ <div class="indent">
+ <form action="${h.url_for( action='sharing', id=trans.security.encode_id(stored.id) )}"
+ method="POST">
+ %if not stored.published:
+ ## Item is importable but not published. User can disable importable or publish.
+ <input class="action-button" type="submit" name="disable_link_access" value="Disable Access to Workflow Link">
+ <div class="toolParamHelp">Disables workflow's link so that it is not accessible.</div>
+ <br>
+ <input class="action-button" type="submit" name="publish" value="Publish Workflow" method="POST">
+ <div class="toolParamHelp">Publishes the workflow to Galaxy's <a href='${h.url_for( action='list_published' )}'>Published Workflows</a> section, where it is publicly listed and searchable.</div>
+
+ <br>
+ %else: ## stored.published == True
+ ## Item is importable and published. User can unpublish or disable import and unpublish.
+ <input class="action-button" type="submit" name="unpublish" value="Unpublish Workflow">
+ <div class="toolParamHelp">Removes workflow from Galaxy's <a href='${h.url_for( action='list_published' )}'>Published Workflows</a> section so that it is not publicly listed or searchable.</div>
+ <br>
+ <input class="action-button" type="submit" name="disable_link_access_and_unpubish" value="Disable Access to Workflow via Link and Unpublish">
+ <div class="toolParamHelp">Disables workflow's link so that it is not accessible and removes workflow from Galaxy's <a href='${h.url_for( action='list_published' )}' target='_top'>Published Workflows</a> section so that it is not publicly listed or searchable.</div>
+ %endif
+
+ </form>
+ </div>
+
+ %else:
+
+ This workflow is currently restricted so that only you and the users listed below can access it. You can:
+ <p>
+ <form action="${h.url_for( action='sharing', id=trans.security.encode_id(stored.id) )}" method="POST">
+ <input class="action-button" type="submit" name="make_accessible_via_link" value="Make Workflow Accessible via Link">
+ <div class="toolParamHelp">Generates a web link that you can share with other people so that they can view and import the workflow.</div>
+
+ <br>
+ <input class="action-button" type="submit" name="make_accessible_and_publish" value="Make Workflow Accessible and Publish" method="POST">
+ <div class="toolParamHelp">Makes the workflow accessible via link (see above) and publishes the workflow to Galaxy's <a href='${h.url_for( action='list_published' )}' target='_top'>Published Workflows</a> section, where it is publicly listed and searchable.</div>
+ </form>
- <form action="${h.url_for( action='sharing', id=trans.security.encode_id(stored.id) )}" method="POST">
- <input class="action-button" type="submit" name="disable_import_via_link" value="Disable import via link">
- </form>
+ %endif
+ </div>
+
+<h3>Sharing Workflow with Specific Users</h3>
+
+ <div class="indent">
+ %if stored.users_shared_with:
+
+ <p>
+ The following users will see this workflow in their workflow list and will be
+ able to run/view and import it.
+ </p>
- %else:
+ <ul class="manage-table-actions">
+ <li>
+ <a class="action-button" href="${h.url_for( action='share', id=trans.security.encode_id(stored.id) )}">
+ <span>Share with another user</span>
+ </a>
+ </li>
+ </ul>
+
+ <table class="colored" border="0" cellspacing="0" cellpadding="0" width="100%">
+ <tr class="header">
+ <th>Email</th>
+ <th></th>
+ </tr>
+ %for i, association in enumerate( stored.users_shared_with ):
+ <% user = association.user %>
+ <tr>
+ <td>
+ ${user.email}
+ <a id="user-${i}-popup" class="popup-arrow" style="display: none;">▼</a>
+ </td>
+ <td>
+ <div popupmenu="user-${i}-popup">
+ <a class="action-button" href="${h.url_for( id=trans.security.encode_id( stored.id ), unshare_user=trans.security.encode_id( user.id ) )}">Unshare</a>
+ </div>
+ </td>
+ </tr>
+ %endfor
+ </table>
+
+ %else:
+
+ <p>You have not shared this workflow with any users.</p>
- This workflow is currently restricted (only you and the users listed below
- can access it). Enabling the following option will generate a URL that you
- can give to anyone to allow them to import this workflow.
-
- <br>
-
- <form action="${h.url_for( action='sharing', id=trans.security.encode_id(stored.id) )}" method="POST">
- <input class="action-button" type="submit" name="enable_import_via_link" value="Enable import via link">
- </form>
-
- %endif
-</p>
-
-<h2>Sharing with specific users</h2>
-
-%if stored.users_shared_with:
-
- <p>
- The following users will see this workflow in thier workflow list, and be
- able to run it or create their own copy of it:
- </p>
-
- <ul class="manage-table-actions">
- <li>
<a class="action-button" href="${h.url_for( action='share', id=trans.security.encode_id(stored.id) )}">
<span>Share with another user</span>
</a>
- </li>
- </ul>
-
- <table class="colored" border="0" cellspacing="0" cellpadding="0" width="100%">
- <tr class="header">
- <th>Email</th>
- <th></th>
- </tr>
- %for i, association in enumerate( stored.users_shared_with ):
- <% user = association.user %>
- <tr>
- <td>
- ${user.email}
- <a id="user-${i}-popup" class="popup-arrow" style="display: none;">▼</a>
- </td>
- <td>
- <div popupmenu="user-${i}-popup">
- <a class="action-button" href="${h.url_for( id=trans.security.encode_id( stored.id ), unshare_user=trans.security.encode_id( user.id ) )}">Unshare</a>
- </div>
- </td>
- </tr>
- %endfor
- </table>
+ <br>
+
+ %endif
+ </div>
+</div>
-%else:
-
- <p>You have not shared this workflow with any users.</p>
-
- <a class="action-button" href="${h.url_for( action='share', id=trans.security.encode_id(stored.id) )}">
- <span>Share with another user</span>
- </a>
-
-%endif
\ No newline at end of file
+<p><br><br>
+<a href=${h.url_for( action="list" )}>Back to Workflows List</a>
\ No newline at end of file
diff -r 2916f1b9b82c -r 0a8d73234704 test/base/twilltestcase.py
--- a/test/base/twilltestcase.py Tue Jan 19 18:15:27 2010 -0500
+++ b/test/base/twilltestcase.py Wed Jan 20 12:26:13 2010 -0500
@@ -301,7 +301,7 @@
self.home()
def unshare_history( self, history_id, user_id, check_str1='', check_str2='', check_str_after_submit='' ):
"""Unshare a history that has been shared with another user"""
- self.visit_url( "%s/history/list?id=%s&operation=sharing" % ( self.url, history_id ) )
+ self.visit_url( "%s/history/list?id=%s&operation=share+or+publish" % ( self.url, history_id ) )
if check_str1:
self.check_page_for_string( check_str1 )
if check_str2:
@@ -352,27 +352,27 @@
if check_str_after_submit:
self.check_page_for_string( check_str_after_submit )
self.home()
- def enable_import_via_link( self, history_id, check_str='', check_str_after_submit='' ):
+ def make_accessible_via_link( self, history_id, check_str='', check_str_after_submit='' ):
self.home()
- self.visit_page( "history/list?operation=sharing&id=%s" % history_id )
+ self.visit_page( "history/list?operation=share+or+publish&id=%s" % history_id )
if check_str:
self.check_page_for_string( check_str )
# twill barfs on this form, possibly because it contains no fields, but not sure.
# In any case, we have to mimic the form submission
self.home()
- self.visit_page( 'history/sharing?id=%s&enable_import_via_link=True' % history_id )
+ self.visit_page( 'history/sharing?id=%s&make_accessible_via_link=True' % history_id )
if check_str_after_submit:
self.check_page_for_string( check_str_after_submit )
self.home()
- def disable_import_via_link( self, history_id, check_str='', check_str_after_submit='' ):
+ def disable_access_via_link( self, history_id, check_str='', check_str_after_submit='' ):
self.home()
- self.visit_page( "history/list?operation=sharing&id=%s" % history_id )
+ self.visit_page( "history/list?operation=share+or+publish&id=%s" % history_id )
if check_str:
self.check_page_for_string( check_str )
# twill barfs on this form, possibly because it contains no fields, but not sure.
# In any case, we have to mimic the form submission
self.home()
- self.visit_page( 'history/sharing?id=%s&disable_import_via_link=True' % history_id )
+ self.visit_page( 'history/sharing?id=%s&disable_link_access=True' % history_id )
if check_str_after_submit:
self.check_page_for_string( check_str_after_submit )
self.home()
diff -r 2916f1b9b82c -r 0a8d73234704 test/functional/test_history_functions.py
--- a/test/functional/test_history_functions.py Tue Jan 19 18:15:27 2010 -0500
+++ b/test/functional/test_history_functions.py Wed Jan 20 12:26:13 2010 -0500
@@ -179,24 +179,24 @@
self.share_current_history( regular_user1.email,
check_str=history3.name )
# Check out list of histories to make sure history3 was shared
- self.view_stored_active_histories( check_str='operation=sharing' )
- # Enable importing history3 via a URL
- self.enable_import_via_link( self.security.encode_id( history3.id ),
- check_str='Unshare',
- check_str_after_submit='Send the above link to users' )
- # Make sure history3 is now import-able
+ self.view_stored_active_histories( check_str='operation=share' )
+ # Make history3 accessible via link.
+ self.make_accessible_via_link( self.security.encode_id( history3.id ),
+ check_str='Make History Accessible via Link',
+ check_str_after_submit='Anyone can view and import this history' )
+ # Make sure history3 is now accessible.
sa_session.refresh( history3 )
if not history3.importable:
- raise AssertionError, "History 3 is not marked as importable after enable_import_via_link"
+ raise AssertionError, "History 3 is not marked as importable after make_accessible_via_link"
# Try importing history3
self.import_history_via_url( self.security.encode_id( history3.id ),
admin_user.email,
check_str_after_submit='You cannot import your own history.' )
- # Disable the import link for history3
- self.disable_import_via_link( self.security.encode_id( history3.id ),
- check_str='Send the above link to users',
- check_str_after_submit='Enable import via link' )
- # Try importing history3 after disabling the URL
+ # Disable access via link for history3.
+ self.disable_access_via_link( self.security.encode_id( history3.id ),
+ check_str='Anyone can view and import this history',
+ check_str_after_submit='Make History Accessible via Link' )
+ # Try importing history3 after disabling access via link.
self.import_history_via_url( self.security.encode_id( history3.id ),
admin_user.email,
check_str_after_submit='The owner of this history has disabled imports via this link.' )
@@ -314,6 +314,9 @@
assert history4 is not None, "Problem retrieving history4 from database"
self.rename_history( self.security.encode_id( history4.id ), history4.name, new_name=urllib.quote( 'history 4' ) )
sa_session.refresh( history4 )
+ # Galaxy's new history sharing code does not yet support sharing multiple histories; when support for sharing multiple histories is added,
+ # this test will be uncommented and updated.
+ """
self.upload_file( '2.bed', dbkey='hg18' )
ids = '%s,%s' % ( self.security.encode_id( history3.id ), self.security.encode_id( history4.id ) )
emails = '%s,%s' % ( regular_user2.email, regular_user3.email )
@@ -329,6 +332,7 @@
self.login( email=regular_user3.email )
# Shared history3 should be in regular_user3's list of shared histories
self.view_shared_histories( check_str=history3.name, check_str2=admin_user.email )
+ """
def test_045_change_permissions_on_current_history( self ):
"""Testing changing permissions on the current history"""
# Logged in as regular_user3
1
0
22 Jan '10
details: http://www.bx.psu.edu/hg/galaxy/rev/2916f1b9b82c
changeset: 3252:2916f1b9b82c
user: Kanwei Li <kanwei(a)gmail.com>
date: Tue Jan 19 18:15:27 2010 -0500
description:
Wiki links now point to bitbucket instead of trac
diffstat:
static/welcome.rst | 2 +-
tools/data_source/microbial_import.xml | 2 +-
tools/new_operations/basecoverage.xml | 2 +-
tools/new_operations/cluster.xml | 2 +-
tools/new_operations/complement.xml | 2 +-
tools/new_operations/concat.xml | 2 +-
tools/new_operations/coverage.xml | 2 +-
tools/new_operations/intersect.xml | 2 +-
tools/new_operations/join.xml | 2 +-
tools/new_operations/merge.xml | 2 +-
tools/new_operations/subtract.xml | 2 +-
11 files changed, 11 insertions(+), 11 deletions(-)
diffs (132 lines):
diff -r 2449250fcc13 -r 2916f1b9b82c static/welcome.rst
--- a/static/welcome.rst Tue Jan 19 16:12:31 2010 -0500
+++ b/static/welcome.rst Tue Jan 19 18:15:27 2010 -0500
@@ -30,7 +30,7 @@
.. __: /static/help.html
.. __: http://www.bx.psu.edu/cgi-bin/trac.cgi
-.. __: http://www.bx.psu.edu/cgi-bin/trac.cgi/wiki/GalaxyTeam
+.. __: http://bitbucket.org/galaxy/galaxy-central/wiki/GalaxyTeam
.. __: mailto:galaxy@bx.psu.edu
Version: <b>2.1</b> Revision: <b>$Rev$</b>
diff -r 2449250fcc13 -r 2916f1b9b82c tools/data_source/microbial_import.xml
--- a/tools/data_source/microbial_import.xml Tue Jan 19 16:12:31 2010 -0500
+++ b/tools/data_source/microbial_import.xml Tue Jan 19 18:15:27 2010 -0500
@@ -109,7 +109,7 @@
**Note:** Having trouble locating your organism? Click here_ for a list of available species and their location.
-.. _here: http://www.bx.psu.edu/cgi-bin/trac.cgi/wiki/Microbes
+.. _here: http://bitbucket.org/galaxy/galaxy-central/wiki/Microbes
</help>
</tool>
diff -r 2449250fcc13 -r 2916f1b9b82c tools/new_operations/basecoverage.xml
--- a/tools/new_operations/basecoverage.xml Tue Jan 19 16:12:31 2010 -0500
+++ b/tools/new_operations/basecoverage.xml Tue Jan 19 18:15:27 2010 -0500
@@ -34,7 +34,7 @@
See Galaxy Interval Operation Screencasts_ (right click to open this link in another window).
-.. _Screencasts: http://www.bx.psu.edu/cgi-bin/trac.cgi/wiki/GopsDesc
+.. _Screencasts: http://bitbucket.org/galaxy/galaxy-central/wiki/GopsDesc
</help>
diff -r 2449250fcc13 -r 2916f1b9b82c tools/new_operations/cluster.xml
--- a/tools/new_operations/cluster.xml Tue Jan 19 16:12:31 2010 -0500
+++ b/tools/new_operations/cluster.xml Tue Jan 19 18:15:27 2010 -0500
@@ -67,7 +67,7 @@
See Galaxy Interval Operation Screencasts_ (right click to open this link in another window).
-.. _Screencasts: http://www.bx.psu.edu/cgi-bin/trac.cgi/wiki/GopsDesc
+.. _Screencasts: http://bitbucket.org/galaxy/galaxy-central/wiki/GopsDesc
-----
diff -r 2449250fcc13 -r 2916f1b9b82c tools/new_operations/complement.xml
--- a/tools/new_operations/complement.xml Tue Jan 19 16:12:31 2010 -0500
+++ b/tools/new_operations/complement.xml Tue Jan 19 18:15:27 2010 -0500
@@ -43,7 +43,7 @@
See Galaxy Interval Operation Screencasts_ (right click to open this link in another window).
-.. _Screencasts: http://www.bx.psu.edu/cgi-bin/trac.cgi/wiki/GopsDesc
+.. _Screencasts: http://bitbucket.org/galaxy/galaxy-central/wiki/GopsDesc
-----
diff -r 2449250fcc13 -r 2916f1b9b82c tools/new_operations/concat.xml
--- a/tools/new_operations/concat.xml Tue Jan 19 16:12:31 2010 -0500
+++ b/tools/new_operations/concat.xml Tue Jan 19 18:15:27 2010 -0500
@@ -35,7 +35,7 @@
See Galaxy Interval Operation Screencasts_ (right click to open this link in another window).
-.. _Screencasts: http://www.bx.psu.edu/cgi-bin/trac.cgi/wiki/GopsDesc
+.. _Screencasts: http://bitbucket.org/galaxy/galaxy-central/wiki/GopsDesc
-----
diff -r 2449250fcc13 -r 2916f1b9b82c tools/new_operations/coverage.xml
--- a/tools/new_operations/coverage.xml Tue Jan 19 16:12:31 2010 -0500
+++ b/tools/new_operations/coverage.xml Tue Jan 19 18:15:27 2010 -0500
@@ -44,7 +44,7 @@
See Galaxy Interval Operation Screencasts_ (right click to open this link in another window).
-.. _Screencasts: http://www.bx.psu.edu/cgi-bin/trac.cgi/wiki/GopsDesc
+.. _Screencasts: http://bitbucket.org/galaxy/galaxy-central/wiki/GopsDesc
-----
diff -r 2449250fcc13 -r 2916f1b9b82c tools/new_operations/intersect.xml
--- a/tools/new_operations/intersect.xml Tue Jan 19 16:12:31 2010 -0500
+++ b/tools/new_operations/intersect.xml Tue Jan 19 18:15:27 2010 -0500
@@ -84,7 +84,7 @@
See Galaxy Interval Operation Screencasts_ (right click to open this link in another window).
-.. _Screencasts: http://www.bx.psu.edu/cgi-bin/trac.cgi/wiki/GopsDesc
+.. _Screencasts: http://bitbucket.org/galaxy/galaxy-central/wiki/GopsDesc
-----
diff -r 2449250fcc13 -r 2916f1b9b82c tools/new_operations/join.xml
--- a/tools/new_operations/join.xml Tue Jan 19 16:12:31 2010 -0500
+++ b/tools/new_operations/join.xml Tue Jan 19 18:15:27 2010 -0500
@@ -78,7 +78,7 @@
See Galaxy Interval Operation Screencasts_ (right click to open this link in another window).
-.. _Screencasts: http://www.bx.psu.edu/cgi-bin/trac.cgi/wiki/GopsDesc
+.. _Screencasts: http://bitbucket.org/galaxy/galaxy-central/wiki/GopsDesc
-----
diff -r 2449250fcc13 -r 2916f1b9b82c tools/new_operations/merge.xml
--- a/tools/new_operations/merge.xml Tue Jan 19 16:12:31 2010 -0500
+++ b/tools/new_operations/merge.xml Tue Jan 19 18:15:27 2010 -0500
@@ -44,7 +44,7 @@
See Galaxy Interval Operation Screencasts_ (right click to open this link in another window).
-.. _Screencasts: http://www.bx.psu.edu/cgi-bin/trac.cgi/wiki/GopsDesc
+.. _Screencasts: http://bitbucket.org/galaxy/galaxy-central/wiki/GopsDesc
-----
diff -r 2449250fcc13 -r 2916f1b9b82c tools/new_operations/subtract.xml
--- a/tools/new_operations/subtract.xml Tue Jan 19 16:12:31 2010 -0500
+++ b/tools/new_operations/subtract.xml Tue Jan 19 18:15:27 2010 -0500
@@ -66,7 +66,7 @@
See Galaxy Interval Operation Screencasts_ (right click to open this link in another window).
-.. _Screencasts: http://www.bx.psu.edu/cgi-bin/trac.cgi/wiki/GopsDesc
+.. _Screencasts: http://bitbucket.org/galaxy/galaxy-central/wiki/GopsDesc
-----
1
0
22 Jan '10
details: http://www.bx.psu.edu/hg/galaxy/rev/2449250fcc13
changeset: 3251:2449250fcc13
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Tue Jan 19 16:12:31 2010 -0500
description:
Minor fix for an exception string in rerun method of tool_runner.py
diffstat:
lib/galaxy/web/controllers/tool_runner.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diffs (12 lines):
diff -r 82082fd1da62 -r 2449250fcc13 lib/galaxy/web/controllers/tool_runner.py
--- a/lib/galaxy/web/controllers/tool_runner.py Tue Jan 19 14:22:31 2010 -0500
+++ b/lib/galaxy/web/controllers/tool_runner.py Tue Jan 19 16:12:31 2010 -0500
@@ -104,7 +104,7 @@
try:
params_objects = job.get_param_values( trans.app )
except:
- raise Exception( "Failed to get paramemeters for dataset id %d " % hid )
+ raise Exception( "Failed to get paramemeters for dataset id %d " % data.id )
# Unpack unvalidated values to strings, they'll be validated when the
# form is submitted (this happens when re-running a job that was
# initially run by a workflow)
1
0
details: http://www.bx.psu.edu/hg/galaxy/rev/82082fd1da62
changeset: 3250:82082fd1da62
user: Dan Blankenberg <dan(a)bx.psu.edu>
date: Tue Jan 19 14:22:31 2010 -0500
description:
c.log
diffstat:
lib/galaxy/tools/parameters/validation.py | 8 ++++----
1 files changed, 4 insertions(+), 4 deletions(-)
diffs (26 lines):
diff -r 85d032d94db1 -r 82082fd1da62 lib/galaxy/tools/parameters/validation.py
--- a/lib/galaxy/tools/parameters/validation.py Tue Jan 19 13:41:53 2010 -0500
+++ b/lib/galaxy/tools/parameters/validation.py Tue Jan 19 14:22:31 2010 -0500
@@ -105,18 +105,18 @@
"""
@classmethod
def from_element( cls, param, elem ):
- return cls( elem.get( 'message', None ), elem.get( 'min' ), elem.get( 'max' ) )
+ return cls( elem.get( 'message', None ), elem.get( 'min', '-inf' ), elem.get( 'max', '+inf' ) )
def __init__( self, message, range_min, range_max ):
- self.message = message or ( "Value must be between %f and %f" % ( range_min, range_max ) )
self.min = float( range_min )
- self.max = float( range_max )
+ self.max = float( range_max )
+ self.message = message or ( "Value must be between %f and %f" % ( self.min, self.max ) )
def validate( self, value, history=None ):
if not( self.min <= float( value ) <= self.max ):
raise ValueError( self.message )
class LengthValidator( Validator ):
"""
- Validator that ensures a number is in a specific range
+ Validator that ensures the length of the provided string (value) is in a specific range
>>> from galaxy.tools.parameters import ToolParameter
>>> p = ToolParameter.build( None, XML( '''
1
0